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的初始化。