Lines Matching +full:display +full:- +full:bridge
1 // SPDX-License-Identifier: GPL-2.0+
3 * i.MX drm driver - parallel display implementation
9 #include <linux/media-bus-format.h>
22 #include <drm/bridge/imx.h>
24 #include "imx-drm.h"
28 struct drm_bridge bridge; member
40 return container_of(b, struct imx_parallel_display_encoder, bridge)->pd; in bridge_to_imxpd()
53 imx_pd_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, in imx_pd_bridge_atomic_get_output_bus_fmts() argument
59 struct drm_display_info *di = &conn_state->connector->display_info; in imx_pd_bridge_atomic_get_output_bus_fmts()
60 struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge); in imx_pd_bridge_atomic_get_output_bus_fmts()
63 if (!imxpd->bus_format && !di->num_bus_formats) { in imx_pd_bridge_atomic_get_output_bus_fmts()
74 if (!imxpd->bus_format && di->num_bus_formats) in imx_pd_bridge_atomic_get_output_bus_fmts()
75 output_fmts[0] = di->bus_formats[0]; in imx_pd_bridge_atomic_get_output_bus_fmts()
77 output_fmts[0] = imxpd->bus_format; in imx_pd_bridge_atomic_get_output_bus_fmts()
95 imx_pd_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge, in imx_pd_bridge_atomic_get_input_bus_fmts() argument
102 struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge); in imx_pd_bridge_atomic_get_input_bus_fmts()
106 * If the next bridge does not support bus format negotiation, let's in imx_pd_bridge_atomic_get_input_bus_fmts()
107 * use the static bus format definition (imxpd->bus_format) if it's in imx_pd_bridge_atomic_get_input_bus_fmts()
111 output_fmt = imxpd->bus_format ? : MEDIA_BUS_FMT_RGB888_1X24; in imx_pd_bridge_atomic_get_input_bus_fmts()
114 if ((imxpd->bus_format && imxpd->bus_format != output_fmt) || in imx_pd_bridge_atomic_get_input_bus_fmts()
129 static int imx_pd_bridge_atomic_check(struct drm_bridge *bridge, in imx_pd_bridge_atomic_check() argument
135 struct drm_display_info *di = &conn_state->connector->display_info; in imx_pd_bridge_atomic_check()
140 next_bridge = drm_bridge_get_next_bridge(bridge); in imx_pd_bridge_atomic_check()
142 next_bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in imx_pd_bridge_atomic_check()
146 bus_flags = next_bridge_state->input_bus_cfg.flags; in imx_pd_bridge_atomic_check()
148 bus_flags = di->bus_flags; in imx_pd_bridge_atomic_check()
150 bus_fmt = bridge_state->input_bus_cfg.format; in imx_pd_bridge_atomic_check()
152 return -EINVAL; in imx_pd_bridge_atomic_check()
154 bridge_state->output_bus_cfg.flags = bus_flags; in imx_pd_bridge_atomic_check()
155 bridge_state->input_bus_cfg.flags = bus_flags; in imx_pd_bridge_atomic_check()
156 imx_crtc_state->bus_flags = bus_flags; in imx_pd_bridge_atomic_check()
157 imx_crtc_state->bus_format = bridge_state->input_bus_cfg.format; in imx_pd_bridge_atomic_check()
158 imx_crtc_state->di_hsync_pin = 2; in imx_pd_bridge_atomic_check()
159 imx_crtc_state->di_vsync_pin = 3; in imx_pd_bridge_atomic_check()
164 static int imx_pd_bridge_attach(struct drm_bridge *bridge, in imx_pd_bridge_attach() argument
167 struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge); in imx_pd_bridge_attach()
169 return drm_bridge_attach(bridge->encoder, imxpd->next_bridge, bridge, flags); in imx_pd_bridge_attach()
189 struct drm_bridge *bridge; in imx_pd_bind() local
197 imxpd_encoder->pd = imxpd; in imx_pd_bind()
198 encoder = &imxpd_encoder->encoder; in imx_pd_bind()
199 bridge = &imxpd_encoder->bridge; in imx_pd_bind()
201 ret = imx_drm_encoder_parse_of(drm, encoder, imxpd->dev->of_node); in imx_pd_bind()
205 bridge->funcs = &imx_pd_bridge_funcs; in imx_pd_bind()
206 drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); in imx_pd_bind()
223 struct device *dev = &pdev->dev; in imx_pd_probe()
224 struct device_node *np = dev->of_node; in imx_pd_probe()
232 return -ENOMEM; in imx_pd_probe()
235 imxpd->next_bridge = devm_drm_of_get_bridge(dev, np, 1, 0); in imx_pd_probe()
236 if (imxpd->next_bridge == ERR_PTR(-ENODEV)) in imx_pd_probe()
237 imxpd->next_bridge = devm_imx_drm_legacy_bridge(dev, np, DRM_MODE_CONNECTOR_DPI); in imx_pd_probe()
238 if (IS_ERR(imxpd->next_bridge)) { in imx_pd_probe()
239 ret = PTR_ERR(imxpd->next_bridge); in imx_pd_probe()
243 ret = of_property_read_string(np, "interface-pix-fmt", &fmt); in imx_pd_probe()
254 imxpd->bus_format = bus_format; in imx_pd_probe()
256 imxpd->dev = dev; in imx_pd_probe()
265 component_del(&pdev->dev, &imx_pd_ops); in imx_pd_remove()
269 { .compatible = "fsl,imx-parallel-display", },
279 .name = "imx-parallel-display",
285 MODULE_DESCRIPTION("i.MX parallel display driver");
288 MODULE_ALIAS("platform:imx-parallel-display");