55
66#include <linux/kernel.h>
77#include <linux/module.h>
8+ #include <linux/of.h>
9+ #include <linux/property.h>
810#include <linux/slab.h>
911
1012#include <drm/drm_atomic_state_helper.h>
@@ -107,10 +109,9 @@ static void drm_bridge_connector_hpd_notify(struct drm_connector *connector,
107109 }
108110}
109111
110- static void drm_bridge_connector_hpd_cb ( void * cb_data ,
111- enum drm_connector_status status )
112+ static void drm_bridge_connector_handle_hpd ( struct drm_bridge_connector * drm_bridge_connector ,
113+ enum drm_connector_status status )
112114{
113- struct drm_bridge_connector * drm_bridge_connector = cb_data ;
114115 struct drm_connector * connector = & drm_bridge_connector -> base ;
115116 struct drm_device * dev = connector -> dev ;
116117
@@ -123,6 +124,21 @@ static void drm_bridge_connector_hpd_cb(void *cb_data,
123124 drm_kms_helper_connector_hotplug_event (connector );
124125}
125126
127+ static void drm_bridge_connector_hpd_cb (void * cb_data ,
128+ enum drm_connector_status status )
129+ {
130+ drm_bridge_connector_handle_hpd (cb_data , status );
131+ }
132+
133+ static void drm_bridge_connector_oob_hotplug_event (struct drm_connector * connector ,
134+ enum drm_connector_status status )
135+ {
136+ struct drm_bridge_connector * bridge_connector =
137+ to_drm_bridge_connector (connector );
138+
139+ drm_bridge_connector_handle_hpd (bridge_connector , status );
140+ }
141+
126142static void drm_bridge_connector_enable_hpd (struct drm_connector * connector )
127143{
128144 struct drm_bridge_connector * bridge_connector =
@@ -191,6 +207,8 @@ static void drm_bridge_connector_destroy(struct drm_connector *connector)
191207 drm_connector_unregister (connector );
192208 drm_connector_cleanup (connector );
193209
210+ fwnode_handle_put (connector -> fwnode );
211+
194212 kfree (bridge_connector );
195213}
196214
@@ -216,6 +234,7 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = {
216234 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state ,
217235 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
218236 .debugfs_init = drm_bridge_connector_debugfs_init ,
237+ .oob_hotplug_event = drm_bridge_connector_oob_hotplug_event ,
219238};
220239
221240/* -----------------------------------------------------------------------------
@@ -352,6 +371,12 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
352371 if (!drm_bridge_get_next_bridge (bridge ))
353372 connector_type = bridge -> type ;
354373
374+ #ifdef CONFIG_OF
375+ if (!drm_bridge_get_next_bridge (bridge ) &&
376+ bridge -> of_node )
377+ connector -> fwnode = fwnode_handle_get (of_fwnode_handle (bridge -> of_node ));
378+ #endif
379+
355380 if (bridge -> ddc )
356381 ddc = bridge -> ddc ;
357382
0 commit comments