drm/probe-helper: enable and disable HPD on connectors
Introduce two drm_connector_helper_funcs: enable_hpd() and disable_hpd(). They are called by drm_kms_helper_poll_enable() and drm_kms_helper_poll_disable() (and thus drm_kms_helper_poll_init() and drm_kms_helper_poll_fini()) respectively. This allows DRM drivers to rely on drm_kms_helper_poll for enabling and disabling HPD detection rather than doing that manually. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/20221102180705.459294-3-dmitry.baryshkov@linaro.org
This commit is contained in:
parent
78b991ccfa
commit
c8268795c9
2 changed files with 41 additions and 0 deletions
|
@ -250,6 +250,12 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
|
||||||
|
|
||||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||||
|
const struct drm_connector_helper_funcs *funcs =
|
||||||
|
connector->helper_private;
|
||||||
|
|
||||||
|
if (funcs && funcs->enable_hpd)
|
||||||
|
funcs->enable_hpd(connector);
|
||||||
|
|
||||||
if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |
|
if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |
|
||||||
DRM_CONNECTOR_POLL_DISCONNECT))
|
DRM_CONNECTOR_POLL_DISCONNECT))
|
||||||
poll = true;
|
poll = true;
|
||||||
|
@ -804,12 +810,25 @@ EXPORT_SYMBOL(drm_kms_helper_is_poll_worker);
|
||||||
|
|
||||||
static void drm_kms_helper_poll_disable_fini(struct drm_device *dev, bool fini)
|
static void drm_kms_helper_poll_disable_fini(struct drm_device *dev, bool fini)
|
||||||
{
|
{
|
||||||
|
struct drm_connector *connector;
|
||||||
|
struct drm_connector_list_iter conn_iter;
|
||||||
|
|
||||||
if (!dev->mode_config.poll_enabled)
|
if (!dev->mode_config.poll_enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (fini)
|
if (fini)
|
||||||
dev->mode_config.poll_enabled = false;
|
dev->mode_config.poll_enabled = false;
|
||||||
|
|
||||||
|
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||||
|
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||||
|
const struct drm_connector_helper_funcs *funcs =
|
||||||
|
connector->helper_private;
|
||||||
|
|
||||||
|
if (funcs && funcs->disable_hpd)
|
||||||
|
funcs->disable_hpd(connector);
|
||||||
|
}
|
||||||
|
drm_connector_list_iter_end(&conn_iter);
|
||||||
|
|
||||||
cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
|
cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1143,6 +1143,28 @@ struct drm_connector_helper_funcs {
|
||||||
*/
|
*/
|
||||||
void (*cleanup_writeback_job)(struct drm_writeback_connector *connector,
|
void (*cleanup_writeback_job)(struct drm_writeback_connector *connector,
|
||||||
struct drm_writeback_job *job);
|
struct drm_writeback_job *job);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enable_hpd:
|
||||||
|
*
|
||||||
|
* Enable hot-plug detection for the connector.
|
||||||
|
*
|
||||||
|
* This operation is optional.
|
||||||
|
*
|
||||||
|
* This callback is used by the drm_kms_helper_poll_enable() helpers.
|
||||||
|
*/
|
||||||
|
void (*enable_hpd)(struct drm_connector *connector);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @disable_hpd:
|
||||||
|
*
|
||||||
|
* Disable hot-plug detection for the connector.
|
||||||
|
*
|
||||||
|
* This operation is optional.
|
||||||
|
*
|
||||||
|
* This callback is used by the drm_kms_helper_poll_disable() helpers.
|
||||||
|
*/
|
||||||
|
void (*disable_hpd)(struct drm_connector *connector);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue