Lines Matching +full:hdmi +full:- +full:bridge
1 // SPDX-License-Identifier: GPL-2.0
19 struct drm_bridge bridge; member
26 to_display_connector(struct drm_bridge *bridge) in to_display_connector() argument
28 return container_of(bridge, struct display_connector, bridge); in to_display_connector()
31 static int display_connector_attach(struct drm_bridge *bridge, in display_connector_attach() argument
34 return flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR ? 0 : -EINVAL; in display_connector_attach()
38 display_connector_detect(struct drm_bridge *bridge) in display_connector_detect() argument
40 struct display_connector *conn = to_display_connector(bridge); in display_connector_detect()
42 if (conn->hpd_gpio) { in display_connector_detect()
43 if (gpiod_get_value_cansleep(conn->hpd_gpio)) in display_connector_detect()
49 if (conn->bridge.ddc && drm_probe_ddc(conn->bridge.ddc)) in display_connector_detect()
52 switch (conn->bridge.type) { in display_connector_detect()
59 * For DVI and HDMI connectors a DDC probe failure indicates in display_connector_detect()
69 * Composite and S-Video connectors have no other detection in display_connector_detect()
79 static struct edid *display_connector_get_edid(struct drm_bridge *bridge, in display_connector_get_edid() argument
82 struct display_connector *conn = to_display_connector(bridge); in display_connector_get_edid()
84 return drm_get_edid(connector, conn->bridge.ddc); in display_connector_get_edid()
96 struct drm_bridge *bridge = &conn->bridge; in display_connector_hpd_irq() local
98 drm_bridge_hpd_notify(bridge, display_connector_detect(bridge)); in display_connector_hpd_irq()
110 conn = devm_kzalloc(&pdev->dev, sizeof(*conn), GFP_KERNEL); in display_connector_probe()
112 return -ENOMEM; in display_connector_probe()
116 type = (uintptr_t)of_device_get_match_data(&pdev->dev); in display_connector_probe()
123 analog = of_property_read_bool(pdev->dev.of_node, "analog"); in display_connector_probe()
124 digital = of_property_read_bool(pdev->dev.of_node, "digital"); in display_connector_probe()
126 conn->bridge.type = DRM_MODE_CONNECTOR_DVIA; in display_connector_probe()
128 conn->bridge.type = DRM_MODE_CONNECTOR_DVID; in display_connector_probe()
130 conn->bridge.type = DRM_MODE_CONNECTOR_DVII; in display_connector_probe()
132 dev_err(&pdev->dev, "DVI connector with no type\n"); in display_connector_probe()
133 return -EINVAL; in display_connector_probe()
141 ret = of_property_read_string(pdev->dev.of_node, "type", in display_connector_probe()
144 dev_err(&pdev->dev, "HDMI connector with no type\n"); in display_connector_probe()
145 return -EINVAL; in display_connector_probe()
150 conn->bridge.type = DRM_MODE_CONNECTOR_HDMIA; in display_connector_probe()
152 conn->bridge.type = DRM_MODE_CONNECTOR_HDMIB; in display_connector_probe()
154 dev_err(&pdev->dev, in display_connector_probe()
155 "Unsupported HDMI connector type '%s'\n", in display_connector_probe()
157 return -EINVAL; in display_connector_probe()
164 conn->bridge.type = type; in display_connector_probe()
169 conn->bridge.interlace_allowed = true; in display_connector_probe()
172 of_property_read_string(pdev->dev.of_node, "label", &label); in display_connector_probe()
175 * Get the HPD GPIO for DVI and HDMI connectors. If the GPIO can provide in display_connector_probe()
180 conn->hpd_gpio = devm_gpiod_get_optional(&pdev->dev, "hpd", in display_connector_probe()
182 if (IS_ERR(conn->hpd_gpio)) { in display_connector_probe()
183 if (PTR_ERR(conn->hpd_gpio) != -EPROBE_DEFER) in display_connector_probe()
184 dev_err(&pdev->dev, in display_connector_probe()
186 return PTR_ERR(conn->hpd_gpio); in display_connector_probe()
189 conn->hpd_irq = gpiod_to_irq(conn->hpd_gpio); in display_connector_probe()
191 conn->hpd_irq = -EINVAL; in display_connector_probe()
194 if (conn->hpd_irq >= 0) { in display_connector_probe()
195 ret = devm_request_threaded_irq(&pdev->dev, conn->hpd_irq, in display_connector_probe()
202 dev_info(&pdev->dev, in display_connector_probe()
204 conn->hpd_irq = -EINVAL; in display_connector_probe()
208 /* Retrieve the DDC I2C adapter for DVI, HDMI and VGA connectors. */ in display_connector_probe()
214 phandle = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0); in display_connector_probe()
216 conn->bridge.ddc = of_get_i2c_adapter_by_node(phandle); in display_connector_probe()
218 if (!conn->bridge.ddc) in display_connector_probe()
219 return -EPROBE_DEFER; in display_connector_probe()
221 dev_dbg(&pdev->dev, in display_connector_probe()
226 conn->bridge.funcs = &display_connector_bridge_funcs; in display_connector_probe()
227 conn->bridge.of_node = pdev->dev.of_node; in display_connector_probe()
229 if (conn->bridge.ddc) in display_connector_probe()
230 conn->bridge.ops |= DRM_BRIDGE_OP_EDID in display_connector_probe()
232 if (conn->hpd_gpio) in display_connector_probe()
233 conn->bridge.ops |= DRM_BRIDGE_OP_DETECT; in display_connector_probe()
234 if (conn->hpd_irq >= 0) in display_connector_probe()
235 conn->bridge.ops |= DRM_BRIDGE_OP_HPD; in display_connector_probe()
237 dev_dbg(&pdev->dev, in display_connector_probe()
239 drm_get_connector_type_name(conn->bridge.type), in display_connector_probe()
241 conn->bridge.ddc ? "with" : "without", in display_connector_probe()
242 conn->hpd_gpio ? "with" : "without", in display_connector_probe()
243 conn->bridge.ops); in display_connector_probe()
245 drm_bridge_add(&conn->bridge); in display_connector_probe()
254 drm_bridge_remove(&conn->bridge); in display_connector_remove()
256 if (!IS_ERR(conn->bridge.ddc)) in display_connector_remove()
257 i2c_put_adapter(conn->bridge.ddc); in display_connector_remove()
264 .compatible = "composite-video-connector",
267 .compatible = "dvi-connector",
270 .compatible = "hdmi-connector",
273 .compatible = "svideo-connector",
276 .compatible = "vga-connector",
287 .name = "display-connector",