Lines Matching +full:dp +full:- +full:connector
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for MegaChips STDP4028 with GE B850v3 firmware (LVDS-DP)
4 * Driver for MegaChips STDP2690 with GE B850v3 firmware (DP-DP++)
10 * This driver creates a drm_bridge and a drm_connector for the LVDS to DP++
12 * signal pipeline: a STDP4028(LVDS to DP) and a STDP2690(DP to DP++). The
19 * Host -> LVDS|--(STDP4028)--|DP -> DP|--(STDP2690)--|DP++ -> Video output
60 struct drm_connector connector; member
71 struct i2c_adapter *adapter = client->adapter; in stdp2690_read_block()
76 .addr = client->addr, in stdp2690_read_block()
81 .addr = client->addr, in stdp2690_read_block()
89 return -1; in stdp2690_read_block()
95 struct drm_connector *connector) in ge_b850v3_lvds_get_edid() argument
99 client = ge_b850v3_lvds_ptr->stdp2690_i2c; in ge_b850v3_lvds_get_edid()
101 return drm_do_get_edid(connector, stdp2690_read_block, client); in ge_b850v3_lvds_get_edid()
104 static int ge_b850v3_lvds_get_modes(struct drm_connector *connector) in ge_b850v3_lvds_get_modes() argument
109 edid = ge_b850v3_lvds_get_edid(&ge_b850v3_lvds_ptr->bridge, connector); in ge_b850v3_lvds_get_modes()
111 drm_connector_update_edid_property(connector, edid); in ge_b850v3_lvds_get_modes()
112 num_modes = drm_add_edid_modes(connector, edid); in ge_b850v3_lvds_get_modes()
119 struct drm_connector *connector, struct drm_display_mode *mode) in ge_b850v3_lvds_mode_valid() argument
133 ge_b850v3_lvds_ptr->stdp4028_i2c; in ge_b850v3_lvds_bridge_detect()
148 static enum drm_connector_status ge_b850v3_lvds_detect(struct drm_connector *connector, in ge_b850v3_lvds_detect() argument
151 return ge_b850v3_lvds_bridge_detect(&ge_b850v3_lvds_ptr->bridge); in ge_b850v3_lvds_detect()
165 struct drm_connector *connector = &ge_b850v3_lvds_ptr->connector; in ge_b850v3_lvds_create_connector() local
168 if (!bridge->encoder) { in ge_b850v3_lvds_create_connector()
170 return -ENODEV; in ge_b850v3_lvds_create_connector()
173 connector->polled = DRM_CONNECTOR_POLL_HPD; in ge_b850v3_lvds_create_connector()
175 drm_connector_helper_add(connector, in ge_b850v3_lvds_create_connector()
178 ret = drm_connector_init(bridge->dev, connector, in ge_b850v3_lvds_create_connector()
182 DRM_ERROR("Failed to initialize connector with drm\n"); in ge_b850v3_lvds_create_connector()
186 return drm_connector_attach_encoder(connector, bridge->encoder); in ge_b850v3_lvds_create_connector()
192 = ge_b850v3_lvds_ptr->stdp4028_i2c; in ge_b850v3_lvds_irq_handler()
198 if (ge_b850v3_lvds_ptr->bridge.dev) in ge_b850v3_lvds_irq_handler()
199 drm_kms_helper_hotplug_event(ge_b850v3_lvds_ptr->bridge.dev); in ge_b850v3_lvds_irq_handler()
208 = ge_b850v3_lvds_ptr->stdp4028_i2c; in ge_b850v3_lvds_attach()
210 /* Configures the bridge to re-enable interrupts after each ack. */ in ge_b850v3_lvds_attach()
245 return -ENOMEM; in ge_b850v3_lvds_init()
261 !ge_b850v3_lvds_ptr->stdp2690_i2c || in ge_b850v3_lvds_remove()
262 !ge_b850v3_lvds_ptr->stdp4028_i2c) in ge_b850v3_lvds_remove()
265 drm_bridge_remove(&ge_b850v3_lvds_ptr->bridge); in ge_b850v3_lvds_remove()
274 struct i2c_client *stdp4028_i2c = ge_b850v3_lvds_ptr->stdp4028_i2c; in ge_b850v3_register()
275 struct device *dev = &stdp4028_i2c->dev; in ge_b850v3_register()
278 ge_b850v3_lvds_ptr->bridge.funcs = &ge_b850v3_lvds_funcs; in ge_b850v3_register()
279 ge_b850v3_lvds_ptr->bridge.ops = DRM_BRIDGE_OP_DETECT | in ge_b850v3_register()
281 ge_b850v3_lvds_ptr->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; in ge_b850v3_register()
282 ge_b850v3_lvds_ptr->bridge.of_node = dev->of_node; in ge_b850v3_register()
283 drm_bridge_add(&ge_b850v3_lvds_ptr->bridge); in ge_b850v3_register()
290 if (!stdp4028_i2c->irq) in ge_b850v3_register()
293 return devm_request_threaded_irq(&stdp4028_i2c->dev, in ge_b850v3_register()
294 stdp4028_i2c->irq, NULL, in ge_b850v3_register()
297 "ge-b850v3-lvds-dp", ge_b850v3_lvds_ptr); in ge_b850v3_register()
302 struct device *dev = &stdp4028_i2c->dev; in stdp4028_ge_b850v3_fw_probe()
310 ge_b850v3_lvds_ptr->stdp4028_i2c = stdp4028_i2c; in stdp4028_ge_b850v3_fw_probe()
314 if (!ge_b850v3_lvds_ptr->stdp2690_i2c) in stdp4028_ge_b850v3_fw_probe()
332 { .compatible = "megachips,stdp4028-ge-b850v3-fw" },
342 .name = "stdp4028-ge-b850v3-fw",
349 struct device *dev = &stdp2690_i2c->dev; in stdp2690_ge_b850v3_fw_probe()
357 ge_b850v3_lvds_ptr->stdp2690_i2c = stdp2690_i2c; in stdp2690_ge_b850v3_fw_probe()
361 if (!ge_b850v3_lvds_ptr->stdp4028_i2c) in stdp2690_ge_b850v3_fw_probe()
379 { .compatible = "megachips,stdp2690-ge-b850v3-fw" },
389 .name = "stdp2690-ge-b850v3-fw",
419 MODULE_DESCRIPTION("GE LVDS to DP++ display bridge)");