drm/connector: Add support for out-of-band hotplug notification (v3)
[ Upstream commit 72ad49682dde3d9de5708b8699dc8e0b44962322 ] Add a new drm_connector_oob_hotplug_event() function and oob_hotplug_event drm_connector_funcs member. On some hardware a hotplug event notification may come from outside the display driver / device. An example of this is some USB Type-C setups where the hardware muxes the DisplayPort data and aux-lines but does not pass the altmode HPD status bit to the GPU's DP HPD pin. In cases like this the new drm_connector_oob_hotplug_event() function can be used to report these out-of-band events. Changes in v2: - Make drm_connector_oob_hotplug_event() take a fwnode as argument and have it call drm_connector_find_by_fwnode() internally. This allows making drm_connector_find_by_fwnode() a drm-internal function and avoids code outside the drm subsystem potentially holding on the a drm_connector reference for a longer period. Changes in v3: - Drop the data argument to the drm_connector_oob_hotplug_event function since it is not used atm. This can be re-added later when a use for it actually arises. Tested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Link: https://lore.kernel.org/r/20210817215201.795062-5-hdegoede@redhat.com Stable-dep-of: 89434b069e46 ("usb: typec: altmodes/displayport: Signal hpd low when exiting mode") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
372b6dda17
commit
040a07667f
2 changed files with 36 additions and 0 deletions
|
@ -2514,6 +2514,33 @@ struct drm_connector *drm_connector_find_by_fwnode(struct fwnode_handle *fwnode)
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_connector_oob_hotplug_event - Report out-of-band hotplug event to connector
|
||||||
|
* @connector: connector to report the event on
|
||||||
|
*
|
||||||
|
* On some hardware a hotplug event notification may come from outside the display
|
||||||
|
* driver / device. An example of this is some USB Type-C setups where the hardware
|
||||||
|
* muxes the DisplayPort data and aux-lines but does not pass the altmode HPD
|
||||||
|
* status bit to the GPU's DP HPD pin.
|
||||||
|
*
|
||||||
|
* This function can be used to report these out-of-band events after obtaining
|
||||||
|
* a drm_connector reference through calling drm_connector_find_by_fwnode().
|
||||||
|
*/
|
||||||
|
void drm_connector_oob_hotplug_event(struct fwnode_handle *connector_fwnode)
|
||||||
|
{
|
||||||
|
struct drm_connector *connector;
|
||||||
|
|
||||||
|
connector = drm_connector_find_by_fwnode(connector_fwnode);
|
||||||
|
if (IS_ERR(connector))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (connector->funcs->oob_hotplug_event)
|
||||||
|
connector->funcs->oob_hotplug_event(connector);
|
||||||
|
|
||||||
|
drm_connector_put(connector);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_connector_oob_hotplug_event);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DOC: Tile group
|
* DOC: Tile group
|
||||||
|
|
|
@ -1030,6 +1030,14 @@ struct drm_connector_funcs {
|
||||||
*/
|
*/
|
||||||
void (*atomic_print_state)(struct drm_printer *p,
|
void (*atomic_print_state)(struct drm_printer *p,
|
||||||
const struct drm_connector_state *state);
|
const struct drm_connector_state *state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @oob_hotplug_event:
|
||||||
|
*
|
||||||
|
* This will get called when a hotplug-event for a drm-connector
|
||||||
|
* has been received from a source outside the display driver / device.
|
||||||
|
*/
|
||||||
|
void (*oob_hotplug_event)(struct drm_connector *connector);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1612,6 +1620,7 @@ drm_connector_is_unregistered(struct drm_connector *connector)
|
||||||
DRM_CONNECTOR_UNREGISTERED;
|
DRM_CONNECTOR_UNREGISTERED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drm_connector_oob_hotplug_event(struct fwnode_handle *connector_fwnode);
|
||||||
const char *drm_get_connector_type_name(unsigned int connector_type);
|
const char *drm_get_connector_type_name(unsigned int connector_type);
|
||||||
const char *drm_get_connector_status_name(enum drm_connector_status status);
|
const char *drm_get_connector_status_name(enum drm_connector_status status);
|
||||||
const char *drm_get_subpixel_order_name(enum subpixel_order order);
|
const char *drm_get_subpixel_order_name(enum subpixel_order order);
|
||||||
|
|
Loading…
Reference in a new issue