rockchip_drm_drv.c 分析

static int rockchip_drm_platform_probe(struct platform_device *pdev)

port = of_parse_phandle(np, "ports", i); //遍历subsys 下的ports属性

component_match_add(dev, &match, compare_of, port->parent); //将每个ports属性加入数组中

rockchip_add_endpoints(dev, &match, port); //将ports下的endpoint 属性也加入数组中

component_match_add(dev, &match, compare_of, port); //将backlight属性也加入数组中

component_master_add_with_match(dev, &rockchip_drm_ops, match); //将match数组加入master中

struct master *master; //定义了一个master

master = kzalloc(sizeof(*master), GFP_KERNEL); //为其分配空间

master->dev = dev; //填充master结构体

master->ops = ops; //ops中包括了bind函数

master->match = match; //包括了上面所有ports属性的match数组

try_to_bring_up_master(master, NULL); //尝试初始化该master

总结:rockchip_drm_platform_probe 做了以下工作:

1、遍历所有的prots(VOP设备)并加入到match列表中

2、遍历所有prots下的endpoint(display设备)并加入到matc列表中

3、将bcaklight设备加入match例表中

4、创建了master并将上述的match填充进去后尝试通过match列表bind所有设备。

 

static int rockchip_drm_bind(struct device *dev)

drm_dev = drm_dev_alloc(&rockchip_drm_driver, dev); //申请一个drm设备,对应有驱动

ret = drm_dev_set_unique(drm_dev, "%s", dev_name(dev)); //设置其名字

private->hdmi_pll.pll = devm_clk_get(dev, "hdmi-tmds-pll"); //hdmi-tmds-pll 获取

private->default_pll.pll = devm_clk_get(dev, "default-vop-pll");//default-vop-pll 获取

ret = rockchip_drm_init_iommu(drm_dev); //iommu初始化

drm_mode_config_init(drm_dev); //mode_config 结构体初始化

rockchip_drm_mode_config_init(drm_dev); //宽和高限制

rockchip_drm_create_properties(drm_dev); //创建属性

ret = component_bind_all(dev, drm_dev); //bind match列表中设备(该步会初始化所有设备)

rockchip_attach_connector_property(drm_dev); //给connector的属性赋值

ret = drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc);//初始化vblank

drm_mode_config_reset(drm_dev);//回调所有plane、crtc、endcoder、connector的reset函数

rockchip_drm_set_property_default(drm_dev); //设置connector 的默认值

drm_kms_helper_poll_init(drm_dev); //使能轮询

ret = of_reserved_mem_device_init(drm_dev->dev);//获取dts中mem资源给drm

ret = rockchip_drm_fbdev_init(drm_dev); //framebuffer的初始化,不是fb框架的framebuffer

drm_for_each_crtc(crtc, drm_dev) //检查crtc是否支持热插拔

ret = drm_dev_register(drm_dev, 0); //注册DRM 设备

总结:rockchip_drm_bind 主要是完成了drm dev的创建和注册,并通过component_bind_all调用了match列表中的设备bind完成了整个display sys的初始化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值