Lines Matching +full:imx8qxp +full:- +full:pxl2dpi
1 // SPDX-License-Identifier: GPL-2.0+
8 #include <linux/media-bus-format.h>
18 #include <dt-bindings/firmware/imx/rsrc.h>
20 #define DRIVER_NAME "imx8qxp-display-pixel-link"
43 ret = imx_sc_misc_set_control(pl->ipc_handle, pl->sink_rsc, in imx8qxp_pixel_link_enable_mst_en()
44 pl->mst_en_ctrl, true); in imx8qxp_pixel_link_enable_mst_en()
46 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_enable_mst_en()
48 pl->dc_id, pl->stream_id, ret); in imx8qxp_pixel_link_enable_mst_en()
55 ret = imx_sc_misc_set_control(pl->ipc_handle, pl->sink_rsc, in imx8qxp_pixel_link_enable_mst_vld()
56 pl->mst_vld_ctrl, true); in imx8qxp_pixel_link_enable_mst_vld()
58 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_enable_mst_vld()
60 pl->dc_id, pl->stream_id, ret); in imx8qxp_pixel_link_enable_mst_vld()
67 ret = imx_sc_misc_set_control(pl->ipc_handle, pl->sink_rsc, in imx8qxp_pixel_link_enable_sync()
68 pl->sync_ctrl, true); in imx8qxp_pixel_link_enable_sync()
70 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_enable_sync()
72 pl->dc_id, pl->stream_id, ret); in imx8qxp_pixel_link_enable_sync()
79 ret = imx_sc_misc_set_control(pl->ipc_handle, pl->sink_rsc, in imx8qxp_pixel_link_disable_mst_en()
80 pl->mst_en_ctrl, false); in imx8qxp_pixel_link_disable_mst_en()
82 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_disable_mst_en()
84 pl->dc_id, pl->stream_id, ret); in imx8qxp_pixel_link_disable_mst_en()
93 ret = imx_sc_misc_set_control(pl->ipc_handle, pl->sink_rsc, in imx8qxp_pixel_link_disable_mst_vld()
94 pl->mst_vld_ctrl, false); in imx8qxp_pixel_link_disable_mst_vld()
96 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_disable_mst_vld()
98 pl->dc_id, pl->stream_id, ret); in imx8qxp_pixel_link_disable_mst_vld()
107 ret = imx_sc_misc_set_control(pl->ipc_handle, pl->sink_rsc, in imx8qxp_pixel_link_disable_sync()
108 pl->sync_ctrl, false); in imx8qxp_pixel_link_disable_sync()
110 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_disable_sync()
112 pl->dc_id, pl->stream_id, ret); in imx8qxp_pixel_link_disable_sync()
121 ret = imx_sc_misc_set_control(pl->ipc_handle, in imx8qxp_pixel_link_set_mst_addr()
122 pl->sink_rsc, pl->mst_addr_ctrl, in imx8qxp_pixel_link_set_mst_addr()
123 pl->mst_addr); in imx8qxp_pixel_link_set_mst_addr()
125 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_set_mst_addr()
127 pl->dc_id, pl->stream_id, pl->mst_addr, ret); in imx8qxp_pixel_link_set_mst_addr()
133 struct imx8qxp_pixel_link *pl = bridge->driver_private; in imx8qxp_pixel_link_bridge_attach()
136 DRM_DEV_ERROR(pl->dev, in imx8qxp_pixel_link_bridge_attach()
138 return -EINVAL; in imx8qxp_pixel_link_bridge_attach()
141 if (!bridge->encoder) { in imx8qxp_pixel_link_bridge_attach()
142 DRM_DEV_ERROR(pl->dev, "missing encoder\n"); in imx8qxp_pixel_link_bridge_attach()
143 return -ENODEV; in imx8qxp_pixel_link_bridge_attach()
146 return drm_bridge_attach(bridge->encoder, in imx8qxp_pixel_link_bridge_attach()
147 pl->next_bridge, bridge, in imx8qxp_pixel_link_bridge_attach()
156 struct imx8qxp_pixel_link *pl = bridge->driver_private; in imx8qxp_pixel_link_bridge_mode_set()
165 struct imx8qxp_pixel_link *pl = bridge->driver_private; in imx8qxp_pixel_link_bridge_atomic_enable()
176 struct imx8qxp_pixel_link *pl = bridge->driver_private; in imx8qxp_pixel_link_bridge_atomic_disable()
268 struct device_node *np = pl->dev->of_node; in imx8qxp_pixel_link_find_next_bridge()
292 DRM_DEV_ERROR(pl->dev, "no available output port\n"); in imx8qxp_pixel_link_find_next_bridge()
293 return ERR_PTR(-ENODEV); in imx8qxp_pixel_link_find_next_bridge()
301 if (!of_device_is_available(remote->parent)) { in imx8qxp_pixel_link_find_next_bridge()
302 DRM_DEV_DEBUG(pl->dev, in imx8qxp_pixel_link_find_next_bridge()
312 return ERR_PTR(-EPROBE_DEFER); in imx8qxp_pixel_link_find_next_bridge()
315 /* specially select the next bridge with companion PXL2DPI */ in imx8qxp_pixel_link_find_next_bridge()
316 if (of_property_present(remote, "fsl,companion-pxl2dpi")) in imx8qxp_pixel_link_find_next_bridge()
324 pl->mst_addr = port_id - 1; in imx8qxp_pixel_link_find_next_bridge()
332 struct device *dev = &pdev->dev; in imx8qxp_pixel_link_bridge_probe()
333 struct device_node *np = dev->of_node; in imx8qxp_pixel_link_bridge_probe()
338 return -ENOMEM; in imx8qxp_pixel_link_bridge_probe()
340 ret = imx_scu_get_handle(&pl->ipc_handle); in imx8qxp_pixel_link_bridge_probe()
342 if (ret != -EPROBE_DEFER) in imx8qxp_pixel_link_bridge_probe()
348 ret = of_property_read_u8(np, "fsl,dc-id", &pl->dc_id); in imx8qxp_pixel_link_bridge_probe()
354 ret = of_property_read_u8(np, "fsl,dc-stream-id", &pl->stream_id); in imx8qxp_pixel_link_bridge_probe()
360 pl->dev = dev; in imx8qxp_pixel_link_bridge_probe()
362 pl->sink_rsc = pl->dc_id ? IMX_SC_R_DC_1 : IMX_SC_R_DC_0; in imx8qxp_pixel_link_bridge_probe()
364 if (pl->stream_id == 0) { in imx8qxp_pixel_link_bridge_probe()
365 pl->mst_addr_ctrl = IMX_SC_C_PXL_LINK_MST1_ADDR; in imx8qxp_pixel_link_bridge_probe()
366 pl->mst_en_ctrl = IMX_SC_C_PXL_LINK_MST1_ENB; in imx8qxp_pixel_link_bridge_probe()
367 pl->mst_vld_ctrl = IMX_SC_C_PXL_LINK_MST1_VLD; in imx8qxp_pixel_link_bridge_probe()
368 pl->sync_ctrl = IMX_SC_C_SYNC_CTRL0; in imx8qxp_pixel_link_bridge_probe()
370 pl->mst_addr_ctrl = IMX_SC_C_PXL_LINK_MST2_ADDR; in imx8qxp_pixel_link_bridge_probe()
371 pl->mst_en_ctrl = IMX_SC_C_PXL_LINK_MST2_ENB; in imx8qxp_pixel_link_bridge_probe()
372 pl->mst_vld_ctrl = IMX_SC_C_PXL_LINK_MST2_VLD; in imx8qxp_pixel_link_bridge_probe()
373 pl->sync_ctrl = IMX_SC_C_SYNC_CTRL1; in imx8qxp_pixel_link_bridge_probe()
381 pl->next_bridge = imx8qxp_pixel_link_find_next_bridge(pl); in imx8qxp_pixel_link_bridge_probe()
382 if (IS_ERR(pl->next_bridge)) { in imx8qxp_pixel_link_bridge_probe()
383 ret = PTR_ERR(pl->next_bridge); in imx8qxp_pixel_link_bridge_probe()
384 if (ret != -EPROBE_DEFER) in imx8qxp_pixel_link_bridge_probe()
392 pl->bridge.driver_private = pl; in imx8qxp_pixel_link_bridge_probe()
393 pl->bridge.funcs = &imx8qxp_pixel_link_bridge_funcs; in imx8qxp_pixel_link_bridge_probe()
394 pl->bridge.of_node = np; in imx8qxp_pixel_link_bridge_probe()
396 drm_bridge_add(&pl->bridge); in imx8qxp_pixel_link_bridge_probe()
405 drm_bridge_remove(&pl->bridge); in imx8qxp_pixel_link_bridge_remove()
409 { .compatible = "fsl,imx8qm-dc-pixel-link", },
410 { .compatible = "fsl,imx8qxp-dc-pixel-link", },