Unverified Commit 00e77a69 authored by Maxime Ripard's avatar Maxime Ripard
Browse files

drm/atomic-helper: Add a TV properties reset helper



The drm_tv_create_properties() function will create a bunch of properties,
but it's up to each and every driver using that function to properly reset
the state of these properties leading to inconsistent behaviours.

Let's create a helper that will take care of it.

Reviewed-by: default avatarNoralf Trønnes <noralf@tronnes.org>
Tested-by: default avatarMateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
Acked-in-principle-or-something-like-that-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v10-13-256dad125326@cerno.tech


Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
parent 1e4a91db
Loading
Loading
Loading
Loading
+75 −0
Original line number Diff line number Diff line
@@ -481,6 +481,81 @@ void drm_atomic_helper_connector_tv_margins_reset(struct drm_connector *connecto
}
EXPORT_SYMBOL(drm_atomic_helper_connector_tv_margins_reset);

/**
 * drm_atomic_helper_connector_tv_reset - Resets Analog TV connector properties
 * @connector: DRM connector
 *
 * Resets the analog TV properties attached to a connector
 */
void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;
	struct drm_connector_state *state = connector->state;
	struct drm_property *prop;
	uint64_t val;

	prop = dev->mode_config.tv_mode_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.mode = val;

	if (cmdline->tv_mode_specified)
		state->tv.mode = cmdline->tv_mode;

	prop = dev->mode_config.tv_select_subconnector_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.select_subconnector = val;

	prop = dev->mode_config.tv_subconnector_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.subconnector = val;

	prop = dev->mode_config.tv_brightness_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.brightness = val;

	prop = dev->mode_config.tv_contrast_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.contrast = val;

	prop = dev->mode_config.tv_flicker_reduction_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.flicker_reduction = val;

	prop = dev->mode_config.tv_overscan_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.overscan = val;

	prop = dev->mode_config.tv_saturation_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.saturation = val;

	prop = dev->mode_config.tv_hue_property;
	if (prop)
		if (!drm_object_property_get_default_value(&connector->base,
							   prop, &val))
			state->tv.hue = val;

	drm_atomic_helper_connector_tv_margins_reset(connector);
}
EXPORT_SYMBOL(drm_atomic_helper_connector_tv_reset);

/**
 * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
 * @connector: connector object
+1 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ void __drm_atomic_helper_connector_state_reset(struct drm_connector_state *conn_
void __drm_atomic_helper_connector_reset(struct drm_connector *connector,
					 struct drm_connector_state *conn_state);
void drm_atomic_helper_connector_reset(struct drm_connector *connector);
void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector);
void drm_atomic_helper_connector_tv_margins_reset(struct drm_connector *connector);
void
__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,