drm/atomic-helper: Add a TV properties reset helper
authorMaxime Ripard <maxime@cerno.tech>
Thu, 17 Nov 2022 09:28:56 +0000 (10:28 +0100)
committerMaxime Ripard <maxime@cerno.tech>
Thu, 24 Nov 2022 11:42:40 +0000 (12:42 +0100)
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: Noralf Trønnes <noralf@tronnes.org>
Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
Acked-in-principle-or-something-like-that-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v10-13-256dad125326@cerno.tech
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
drivers/gpu/drm/drm_atomic_state_helper.c
include/drm/drm_atomic_state_helper.h

index dfb5721..e1fc3f2 100644 (file)
@@ -482,6 +482,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
  * @state: atomic connector state
index 1927666..c8fbce7 100644 (file)
@@ -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,