Den 13.10.2022 15.19, skrev Maxime Ripard: > 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@xxxxxxxxxxx> > Signed-off-by: Maxime Ripard <maxime@xxxxxxxxxx> > --- > drivers/gpu/drm/drm_atomic_state_helper.c | 75 +++++++++++++++++++++++++++++++ > include/drm/drm_atomic_state_helper.h | 1 + > 2 files changed, 76 insertions(+) > > diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c > index dfb57217253b..0373c3dc824b 100644 > --- a/drivers/gpu/drm/drm_atomic_state_helper.c > +++ b/drivers/gpu/drm/drm_atomic_state_helper.c > @@ -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) > + state->tv.mode = cmdline->tv_mode; This can't set ntsc now that the none value is gone. But we need a tv_mode_specified flag as mentioned in the other patch. Noralf. > + > + 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 > diff --git a/include/drm/drm_atomic_state_helper.h b/include/drm/drm_atomic_state_helper.h > index 192766656b88..c8fbce795ee7 100644 > --- a/include/drm/drm_atomic_state_helper.h > +++ b/include/drm/drm_atomic_state_helper.h > @@ -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, >