1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Freescale i.MX drm driver 4 * 5 * bridge driver for legacy DT bindings, utilizing display-timings node 6 */ 7 8 #include <drm/drm_bridge.h> 9 #include <drm/drm_modes.h> 10 #include <drm/drm_probe_helper.h> 11 #include <drm/bridge/imx.h> 12 13 #include <video/of_display_timing.h> 14 #include <video/of_videomode.h> 15 16 struct imx_legacy_bridge { 17 struct drm_bridge base; 18 19 struct drm_display_mode mode; 20 u32 bus_flags; 21 }; 22 23 #define to_imx_legacy_bridge(bridge) container_of(bridge, struct imx_legacy_bridge, base) 24 25 static int imx_legacy_bridge_attach(struct drm_bridge *bridge, 26 struct drm_encoder *encoder, 27 enum drm_bridge_attach_flags flags) 28 { 29 if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) 30 return -EINVAL; 31 32 return 0; 33 } 34 35 static int imx_legacy_bridge_get_modes(struct drm_bridge *bridge, 36 struct drm_connector *connector) 37 { 38 struct imx_legacy_bridge *imx_bridge = to_imx_legacy_bridge(bridge); 39 int ret; 40 41 ret = drm_connector_helper_get_modes_fixed(connector, &imx_bridge->mode); 42 if (ret) 43 return ret; 44 45 connector->display_info.bus_flags = imx_bridge->bus_flags; 46 47 return 0; 48 } 49 50 struct drm_bridge_funcs imx_legacy_bridge_funcs = { 51 .attach = imx_legacy_bridge_attach, 52 .get_modes = imx_legacy_bridge_get_modes, 53 }; 54 55 struct drm_bridge *devm_imx_drm_legacy_bridge(struct device *dev, 56 struct device_node *np, 57 int type) 58 { 59 struct imx_legacy_bridge *imx_bridge; 60 int ret; 61 62 imx_bridge = devm_drm_bridge_alloc(dev, struct imx_legacy_bridge, 63 base, &imx_legacy_bridge_funcs); 64 if (IS_ERR(imx_bridge)) 65 return ERR_CAST(imx_bridge); 66 67 ret = of_get_drm_display_mode(np, 68 &imx_bridge->mode, 69 &imx_bridge->bus_flags, 70 OF_USE_NATIVE_MODE); 71 if (ret) 72 return ERR_PTR(ret); 73 74 imx_bridge->mode.type |= DRM_MODE_TYPE_DRIVER; 75 76 imx_bridge->base.of_node = np; 77 imx_bridge->base.ops = DRM_BRIDGE_OP_MODES; 78 imx_bridge->base.type = type; 79 80 ret = devm_drm_bridge_add(dev, &imx_bridge->base); 81 if (ret) 82 return ERR_PTR(ret); 83 84 return &imx_bridge->base; 85 } 86 EXPORT_SYMBOL_GPL(devm_imx_drm_legacy_bridge); 87 88 MODULE_LICENSE("GPL"); 89 MODULE_DESCRIPTION("Freescale i.MX DRM bridge driver for legacy DT bindings"); 90