Commit c8268795 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov Committed by Neil Armstrong
Browse files

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: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20221102180705.459294-3-dmitry.baryshkov@linaro.org
parent 78b991cc
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -250,6 +250,12 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)

	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->enable_hpd)
			funcs->enable_hpd(connector);

		if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |
					 DRM_CONNECTOR_POLL_DISCONNECT))
			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)
{
	struct drm_connector *connector;
	struct drm_connector_list_iter conn_iter;

	if (!dev->mode_config.poll_enabled)
		return;

	if (fini)
		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);
}

+22 −0
Original line number Diff line number Diff line
@@ -1143,6 +1143,28 @@ struct drm_connector_helper_funcs {
	 */
	void (*cleanup_writeback_job)(struct drm_writeback_connector *connector,
				      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);
};

/**