static int imx_pd_bind(struct device *dev, struct device *master, void *data) { struct drm_device *drm = data; struct device_node *np = dev->of_node; struct device_node *port; const u8 *edidp; struct imx_parallel_display *imxpd; int ret; const char *fmt; imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL); if (!imxpd) return -ENOMEM; edidp = of_get_property(np, "edid", &imxpd->edid_len); if (edidp) imxpd->edid = kmemdup(edidp, imxpd->edid_len, GFP_KERNEL); ret = of_property_read_string(np, "interface-pix-fmt", &fmt); if (!ret) { if (!strcmp(fmt, "rgb24")) imxpd->bus_format = MEDIA_BUS_FMT_RGB888_1X24; else if (!strcmp(fmt, "rgb565")) imxpd->bus_format = MEDIA_BUS_FMT_RGB565_1X16; else if (!strcmp(fmt, "bgr666")) imxpd->bus_format = MEDIA_BUS_FMT_RGB666_1X18; else if (!strcmp(fmt, "lvds666")) imxpd->bus_format = MEDIA_BUS_FMT_RGB666_1X24_CPADHI; } /* port@1 is the output port */ port = of_graph_get_port_by_id(np, 1); if (port) { struct device_node *endpoint, *remote; endpoint = of_get_child_by_name(port, "endpoint"); if (endpoint) { remote = of_graph_get_remote_port_parent(endpoint); if (remote) imxpd->panel = of_drm_find_panel(remote); if (!imxpd->panel) return -EPROBE_DEFER; } } imxpd->dev = dev; ret = imx_pd_register(drm, imxpd); if (ret) return ret; dev_set_drvdata(dev, imxpd); return 0; }
static int imx_pd_bind(struct device *dev, struct device *master, void *data) { struct drm_device *drm = data; struct device_node *np = dev->of_node; struct device_node *panel_node; const u8 *edidp; struct imx_parallel_display *imxpd; int ret; const char *fmt; imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL); if (!imxpd) return -ENOMEM; edidp = of_get_property(np, "edid", &imxpd->edid_len); if (edidp) imxpd->edid = kmemdup(edidp, imxpd->edid_len, GFP_KERNEL); ret = of_property_read_string(np, "interface-pix-fmt", &fmt); if (!ret) { if (!strcmp(fmt, "rgb24")) imxpd->interface_pix_fmt = V4L2_PIX_FMT_RGB24; else if (!strcmp(fmt, "rgb565")) imxpd->interface_pix_fmt = V4L2_PIX_FMT_RGB565; else if (!strcmp(fmt, "bgr666")) imxpd->interface_pix_fmt = V4L2_PIX_FMT_BGR666; else if (!strcmp(fmt, "lvds666")) imxpd->interface_pix_fmt = v4l2_fourcc('L', 'V', 'D', '6'); } panel_node = of_parse_phandle(np, "fsl,panel", 0); if (panel_node) imxpd->panel = of_drm_find_panel(panel_node); imxpd->dev = dev; ret = imx_pd_register(drm, imxpd); if (ret) return ret; dev_set_drvdata(dev, imxpd); return 0; }
static int imx_pd_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; const u8 *edidp; struct imx_parallel_display *imxpd; int ret; const char *fmt; imxpd = devm_kzalloc(&pdev->dev, sizeof(*imxpd), GFP_KERNEL); if (!imxpd) return -ENOMEM; edidp = of_get_property(np, "edid", &imxpd->edid_len); if (edidp) imxpd->edid = kmemdup(edidp, imxpd->edid_len, GFP_KERNEL); ret = of_property_read_string(np, "interface-pix-fmt", &fmt); if (!ret) { if (!strcmp(fmt, "rgb24")) imxpd->interface_pix_fmt = V4L2_PIX_FMT_RGB24; else if (!strcmp(fmt, "rgb565")) imxpd->interface_pix_fmt = V4L2_PIX_FMT_RGB565; else if (!strcmp(fmt, "bgr666")) imxpd->interface_pix_fmt = V4L2_PIX_FMT_BGR666; } imxpd->dev = &pdev->dev; ret = imx_pd_register(imxpd); if (ret) return ret; ret = imx_drm_encoder_add_possible_crtcs(imxpd->imx_drm_encoder, np); platform_set_drvdata(pdev, imxpd); return 0; }