Message ID | 20220728-rpi-analog-tv-properties-v5-16-d841cc64fe4b@cerno.tech (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm: Analog TV Improvements | expand |
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@tronnes.org> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > --- > 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, >
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; + + 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,