xref: /linux/drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c (revision 7b1166dee847d5018c1f3cc781218e806078f752)
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