Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp2168224rwb; Thu, 17 Nov 2022 07:22:48 -0800 (PST) X-Google-Smtp-Source: AA0mqf6aaZygAqvoq89L5qP5w0q67ar+20HjI2XA+6yahetic/8W8ipdcnEhlzXnkDfgkWcPzUfE X-Received: by 2002:a17:90a:7304:b0:20a:9810:86ab with SMTP id m4-20020a17090a730400b0020a981086abmr9150360pjk.10.1668698568095; Thu, 17 Nov 2022 07:22:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668698568; cv=none; d=google.com; s=arc-20160816; b=U8EXq4RsAIf9SyCeDSO2sSSqx3nCh/+Ji+Gj7dmrOWuTGVpHpqaJkpRFfarKHWjKji kEsY+GuZUHy4KupXZvsPQ/oAhU5eF6G34TdvWNZ8R0j3kGjU9qB+9pfGnsfncCOfP60T mH3g1VNXqc64WqreYFEVIISKiXB6gGEQOF6ydG7b8wXphE4qGYFpRr8wpf8Axahn1r3x 9OW3jSap5J5xHFiQUtP9j7NChqgyfFIWJXoZh7kNKlGxB1rCC4ypX0zQeuvWMNiDYYbQ O8FWYldYD1c+BoTPn8ejOVDz7Th6HzDE6ir6Ui/DF/ie8YZBpVrfuNUHGuB8x2YY4Fm+ yq5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=0HQ3g5/VTsAWqLp0uyv51gmBCvRn1mN//uKWIszzDfU=; b=A3x2WipO27aTHWKfDFzMxW4XGFSghqNbLcKhyGy0C6k6lkJT0iTgjAThvuWqyKpJha w/QBp1HWHP2+P+8UgTYIB0Ot6Hx3oYUh1HDTlL+2NTLwfTGsJMhVIKN8zdMl8+Z/2MFK 3l2V4gWwdLegupVMsnqbk1Dn18g4G8QYy9kZf2pnb4Awh6/ImazJ+/eAbiQoaT+ltBbo Ss+9VL8u1UW2wcwMMfPx9ZTigTdXnedMcjeI4b9FMWy0mXhVDsE6ie63u57FXUIiFv45 O4JQrEO+R8AICgDFNzEU4vaANKgxEbbK1+oq28BUcS9BaKVulXfB3WcpiK3shDx4681U B4iA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=V12N4icV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s1-20020a170902c64100b001870464adb6si1042191pls.183.2022.11.17.07.22.23; Thu, 17 Nov 2022 07:22:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=V12N4icV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240573AbiKQOjk (ORCPT + 92 others); Thu, 17 Nov 2022 09:39:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37850 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240515AbiKQOjP (ORCPT ); Thu, 17 Nov 2022 09:39:15 -0500 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B56697A37E for ; Thu, 17 Nov 2022 06:36:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1668695790; x=1700231790; h=date:from:to:cc:subject:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yh1vQtNHN6llzq1Dyn3Pw9I09GTqkyaQhV2cPEB6AzQ=; b=V12N4icVMYO2LRp16hbJBHc/gnoavsoI4wrez5LgctQy89uwdWD4XOvC zlKoYZ1cEFc0fLH7HJ4/HUuYq79CxQFmyAhM1Yw2YCP8gOJiHeCbJm6AY E6BQ2lUDWBEl+ccnxBO+iKxv8Zk9ieluxEBAxzdlB39fj702iRvmNjqcK ZWVATaJdRm5OHA7mD70WwkGOj79r9JyPPBqCAKrrDSiRDQkmEXDgcxIv8 BHF6ub2Ua+08xOf4K/HvjLR7zqsjeSlvEt+00UAQMPn+LcM7/o7Sszvsu c+sGimkL7PUqIOnlts7Iuir5+NO3r8YX55SWGqzzS8/YseBivn9QBBztm w==; X-IronPort-AV: E=McAfee;i="6500,9779,10534"; a="399153168" X-IronPort-AV: E=Sophos;i="5.96,171,1665471600"; d="scan'208";a="399153168" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2022 06:36:25 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10534"; a="670941025" X-IronPort-AV: E=Sophos;i="5.96,171,1665471600"; d="scan'208";a="670941025" Received: from linux.intel.com ([10.54.29.200]) by orsmga008.jf.intel.com with ESMTP; 17 Nov 2022 06:36:21 -0800 Received: from maurocar-mobl2 (maurocar-mobl2.ger.corp.intel.com [10.249.130.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by linux.intel.com (Postfix) with ESMTPS id 738DB580DFD; Thu, 17 Nov 2022 06:36:03 -0800 (PST) Date: Thu, 17 Nov 2022 15:35:57 +0100 From: Mauro Carvalho Chehab To: Maxime Ripard Cc: Samuel Holland , Jernej Skrabec , Maarten Lankhorst , Rodrigo Vivi , Joonas Lahtinen , Maxime Ripard , Ben Skeggs , Chen-Yu Tsai , David Airlie , Jani Nikula , Tvrtko Ursulin , Emma Anholt , Karol Herbst , Lyude Paul , Thomas Zimmermann , Daniel Vetter , Dom Cobley , Dave Stevenson , Phil Elwell , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Mateusz Kwiatkowski , Hans de Goede , Noralf =?UTF-8?B?VHLDuG5uZXM=?= , Geert Uytterhoeven , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v10 05/19] drm/connector: Add TV standard property Message-ID: <20221117153557.75c5dba1@maurocar-mobl2> In-Reply-To: <20220728-rpi-analog-tv-properties-v10-5-256dad125326@cerno.tech> References: <20220728-rpi-analog-tv-properties-v10-0-256dad125326@cerno.tech> <20220728-rpi-analog-tv-properties-v10-5-256dad125326@cerno.tech> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 17 Nov 2022 10:28:48 +0100 Maxime Ripard wrote: > The TV mode property has been around for a while now to select and get the > current TV mode output on an analog TV connector. > > Despite that property name being generic, its content isn't and has been > driver-specific which makes it hard to build any generic behaviour on top > of it, both in kernel and user-space. > > Let's create a new enum tv norm property, that can contain any of the > analog TV standards currently supported by kernel drivers. Each driver can > then pass in a bitmask of the modes it supports, and the property > creation function will filter out the modes not supported. > > We'll then be able to phase out the older tv mode property. > > Tested-by: Mateusz Kwiatkowski > Signed-off-by: Maxime Ripard > > --- > Changes in v10: > - Fix checkpatch warning > > Changes in v5: > - Create an analog TV properties documentation section, and document TV > Mode there instead of the csv file > > Changes in v4: > - Add property documentation to kms-properties.csv > - Fix documentation > --- > Documentation/gpu/drm-kms.rst | 6 ++ > drivers/gpu/drm/drm_atomic_uapi.c | 4 ++ > drivers/gpu/drm/drm_connector.c | 122 +++++++++++++++++++++++++++++++++++++- > include/drm/drm_connector.h | 64 ++++++++++++++++++++ > include/drm/drm_mode_config.h | 8 +++ > 5 files changed, 203 insertions(+), 1 deletion(-) > > diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-kms.rst > index b4377a545425..321f2f582c64 100644 > --- a/Documentation/gpu/drm-kms.rst > +++ b/Documentation/gpu/drm-kms.rst > @@ -520,6 +520,12 @@ HDMI Specific Connector Properties > .. kernel-doc:: drivers/gpu/drm/drm_connector.c > :doc: HDMI connector properties > > +Analog TV Specific Connector Properties > +---------------------------------- > + > +.. kernel-doc:: drivers/gpu/drm/drm_connector.c > + :doc: Analog TV Connector Properties > + > Standard CRTC Properties > ------------------------ > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index 7f2b9a07fbdf..d867e7f9f2cd 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -700,6 +700,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, > state->tv.margins.bottom = val; > } else if (property == config->legacy_tv_mode_property) { > state->tv.legacy_mode = val; > + } else if (property == config->tv_mode_property) { > + state->tv.mode = val; > } else if (property == config->tv_brightness_property) { > state->tv.brightness = val; > } else if (property == config->tv_contrast_property) { > @@ -810,6 +812,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > *val = state->tv.margins.bottom; > } else if (property == config->legacy_tv_mode_property) { > *val = state->tv.legacy_mode; > + } else if (property == config->tv_mode_property) { > + *val = state->tv.mode; > } else if (property == config->tv_brightness_property) { > *val = state->tv.brightness; > } else if (property == config->tv_contrast_property) { > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index 06e737ed15f5..07d449736956 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -984,6 +984,17 @@ static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = { > DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name, > drm_dvi_i_subconnector_enum_list) > > +static const struct drm_prop_enum_list drm_tv_mode_enum_list[] = { > + { DRM_MODE_TV_MODE_NTSC, "NTSC" }, > + { DRM_MODE_TV_MODE_NTSC_443, "NTSC-443" }, > + { DRM_MODE_TV_MODE_NTSC_J, "NTSC-J" }, > + { DRM_MODE_TV_MODE_PAL, "PAL" }, > + { DRM_MODE_TV_MODE_PAL_M, "PAL-M" }, > + { DRM_MODE_TV_MODE_PAL_N, "PAL-N" }, > + { DRM_MODE_TV_MODE_SECAM, "SECAM" }, > +}; Nack. It sounds a very bad idea to have standards as generic as NTSC, PAL, SECAM. If you take a look at the CCIR/ITU-R specs that define video standards, you'll see that the standard has actually two components: 1. the composite color TV signal: PAL, NTSC, SECAM, defined in ITU-R BT1700[1] 2. and the conventional analogue TV (the "monochromatic" part), as defined in ITU-R BT.1701[2], which is, basically, a letter from A to N (with some country-specific variants, like Nc). Two of those standards (M and J) are used on Countries with a power grid of 60Hz, as they have a frame rate of either 30fps or 29.997fps. [1] https://www.itu.int/rec/R-REC-BT.1700-0-200502-I/en [2] https://www.itu.int/rec/R-REC-BT.1701-1-200508-I/en The actual combination is defined within Country-specific laws, which selects a conventional analogue signal with a composite color one. So, for instance, US uses NTSC/M (because it uses a 60Hz power grid). There is a 50Hz variant, called NTSC/443 (not used on any Country, but present on some European VCR equipments capable of recording at 25fps, using NTSC). Btw, some VCR equipments in US may also have PAL/60 with has the same timings as NTSC, but uses PAL instead. What happens is that, in Europe, different PAL standards got used, but: - most TV sets and their chipsets were developed to auto-detect and support the differences between different systems PAL/B, PAL/G, PAL/D,... - several of those standards have a difference only at the audio sub-carriers. So, they look identical for the video decoding part. - standards may have a different inter-channel space (it can vary from 5 to 8 MHz) to minimize cross-signal interference. --- Anyway, I strongly suggest to either: 1. align the standards there to what we defined in V4L2. See: https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/vidioc-enumstd.html#v4l2-std-id and: https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/standard.html You can probably start with a subset of those, e. g. with: - PAL/I, PAL/BG, PAL/DK, PAL/M, PAL/N, PAL/Nc, PAL/60 - NTSC/M, NTSC/M Japan, NTSC/M Korea, NTSC/443 - SECAM/BG, SECAM/DK, SECAM/I, SECAM/L, SECAM/LP Btw, for decoders, this should actually be a bitmask, as most decoding chipsets can auto-detect among several different video standards. 2. split into two different properties: - the "monochromatic" one: A to N, M_Japan, M_Korea, Nc, 60 and 443; - the composite signal encoding: NTSC, PAL, SECAM. If I were to design V4L2 again back the days where commercial digital TV were not present, I would probably have opted to have two different properties. Regards, Mauro > +DRM_ENUM_NAME_FN(drm_get_tv_mode_name, drm_tv_mode_enum_list) > + > static const struct drm_prop_enum_list drm_tv_select_enum_list[] = { > { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ > { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ > @@ -1552,6 +1563,71 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); > * infoframe values is done through drm_hdmi_avi_infoframe_content_type(). > */ > > +/* > + * TODO: Document the properties: > + * - left margin > + * - right margin > + * - top margin > + * - bottom margin > + * - brightness > + * - contrast > + * - flicker reduction > + * - hue > + * - mode > + * - overscan > + * - saturation > + * - select subconnector > + * - subconnector > + */ > +/** > + * DOC: Analog TV Connector Properties > + * > + * TV Mode: > + * Indicates the TV Mode used on an analog TV connector. The value > + * of this property can be one of the following: > + * > + * NTSC: > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding. > + * > + * NTSC-443: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding, but with a color subcarrier > + * frequency of 4.43MHz > + * > + * NTSC-J: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding, but with a black level equal to > + * the blanking level. > + * > + * PAL: > + * > + * TV Mode is CCIR System B (aka 625-lines) together with > + * the PAL Color Encoding. > + * > + * PAL-M: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the PAL Color Encoding. > + * > + * PAL-N: > + * > + * TV Mode is CCIR System N together with the PAL Color > + * Encoding, a color subcarrier frequency of 3.58MHz, the > + * SECAM color space, and narrower channels than other PAL > + * variants. > + * > + * SECAM: > + * > + * TV Mode is CCIR System B (aka 625-lines) together with > + * the SECAM Color Encoding. > + * > + * Drivers can set up this property by calling > + * drm_mode_create_tv_properties(). > + */ > + > /** > * drm_connector_attach_content_type_property - attach content-type property > * @connector: connector to attach content type property on. > @@ -1649,6 +1725,10 @@ EXPORT_SYMBOL(drm_mode_create_tv_margin_properties); > * responsible for allocating a list of format names and passing them to > * this routine. > * > + * NOTE: This functions registers the deprecated "mode" connector > + * property to select the analog TV mode (ie, NTSC, PAL, etc.). New > + * drivers must use drm_mode_create_tv_properties() instead. > + * > * Returns: > * 0 on success or a negative error code on failure. > */ > @@ -1690,7 +1770,6 @@ int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > if (drm_mode_create_tv_margin_properties(dev)) > goto nomem; > > - > if (num_modes) { > dev->mode_config.legacy_tv_mode_property = > drm_property_create(dev, DRM_MODE_PROP_ENUM, > @@ -1739,6 +1818,47 @@ int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > } > EXPORT_SYMBOL(drm_mode_create_tv_properties_legacy); > > +/** > + * drm_mode_create_tv_properties - create TV specific connector properties > + * @dev: DRM device > + * @supported_tv_modes: Bitmask of TV modes supported (See DRM_MODE_TV_MODE_*) > + > + * Called by a driver's TV initialization routine, this function creates > + * the TV specific connector properties for a given device. > + * > + * Returns: > + * 0 on success or a negative error code on failure. > + */ > +int drm_mode_create_tv_properties(struct drm_device *dev, > + unsigned int supported_tv_modes) > +{ > + struct drm_prop_enum_list tv_mode_list[DRM_MODE_TV_MODE_MAX]; > + struct drm_property *tv_mode; > + unsigned int i, len = 0; > + > + if (dev->mode_config.tv_mode_property) > + return 0; > + > + for (i = 0; i < DRM_MODE_TV_MODE_MAX; i++) { > + if (!(supported_tv_modes & BIT(i))) > + continue; > + > + tv_mode_list[len].type = i; > + tv_mode_list[len].name = drm_get_tv_mode_name(i); > + len++; > + } > + > + tv_mode = drm_property_create_enum(dev, 0, "TV mode", > + tv_mode_list, len); > + if (!tv_mode) > + return -ENOMEM; > + > + dev->mode_config.tv_mode_property = tv_mode; > + > + return drm_mode_create_tv_properties_legacy(dev, 0, NULL); > +} > +EXPORT_SYMBOL(drm_mode_create_tv_properties); > + > /** > * drm_mode_create_scaling_mode_property - create scaling mode property > * @dev: DRM device > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index 15cb58117a94..4927dcb2573f 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -143,6 +143,65 @@ enum subpixel_order { > > }; > > +/** > + * enum drm_connector_tv_mode - Analog TV output mode > + * > + * This enum is used to indicate the TV output mode used on an analog TV > + * connector. > + * > + * WARNING: The values of this enum is uABI since they're exposed in the > + * "TV mode" connector property. > + */ > +enum drm_connector_tv_mode { > + /** > + * @DRM_MODE_TV_MODE_NTSC: CCIR System M (aka 525-lines) > + * together with the NTSC Color Encoding. > + */ > + DRM_MODE_TV_MODE_NTSC, > + > + /** > + * @DRM_MODE_TV_MODE_NTSC_443: Variant of > + * @DRM_MODE_TV_MODE_NTSC. Uses a color subcarrier frequency > + * of 4.43 MHz. > + */ > + DRM_MODE_TV_MODE_NTSC_443, > + > + /** > + * @DRM_MODE_TV_MODE_NTSC_J: Variant of @DRM_MODE_TV_MODE_NTSC > + * used in Japan. Uses a black level equals to the blanking > + * level. > + */ > + DRM_MODE_TV_MODE_NTSC_J, > + > + /** > + * @DRM_MODE_TV_MODE_PAL: CCIR System B together with the PAL > + * color system. > + */ > + DRM_MODE_TV_MODE_PAL, > + > + /** > + * @DRM_MODE_TV_MODE_PAL_M: CCIR System M (aka 525-lines) > + * together with the PAL color encoding > + */ > + DRM_MODE_TV_MODE_PAL_M, > + > + /** > + * @DRM_MODE_TV_MODE_PAL_N: CCIR System N together with the PAL > + * color encoding. It uses 625 lines, but has a color subcarrier > + * frequency of 3.58MHz, the SECAM color space, and narrower > + * channels compared to most of the other PAL variants. > + */ > + DRM_MODE_TV_MODE_PAL_N, > + > + /** > + * @DRM_MODE_TV_MODE_SECAM: CCIR System B together with the > + * SECAM color system. > + */ > + DRM_MODE_TV_MODE_SECAM, > + > + DRM_MODE_TV_MODE_MAX, > +}; > + > /** > * struct drm_scrambling: sink's scrambling support. > */ > @@ -696,6 +755,7 @@ struct drm_connector_tv_margins { > * @subconnector: detected subconnector > * @margins: TV margins > * @legacy_mode: Legacy TV mode, driver specific value > + * @mode: TV mode > * @brightness: brightness in percent > * @contrast: contrast in percent > * @flicker_reduction: flicker reduction in percent > @@ -708,6 +768,7 @@ struct drm_tv_connector_state { > enum drm_mode_subconnector subconnector; > struct drm_connector_tv_margins margins; > unsigned int legacy_mode; > + unsigned int mode; > unsigned int brightness; > unsigned int contrast; > unsigned int flicker_reduction; > @@ -1804,6 +1865,7 @@ const char *drm_get_subpixel_order_name(enum subpixel_order order); > const char *drm_get_dpms_name(int val); > const char *drm_get_dvi_i_subconnector_name(int val); > const char *drm_get_dvi_i_select_name(int val); > +const char *drm_get_tv_mode_name(int val); > const char *drm_get_tv_subconnector_name(int val); > const char *drm_get_tv_select_name(int val); > const char *drm_get_dp_subconnector_name(int val); > @@ -1817,6 +1879,8 @@ int drm_mode_create_tv_margin_properties(struct drm_device *dev); > int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > unsigned int num_modes, > const char * const modes[]); > +int drm_mode_create_tv_properties(struct drm_device *dev, > + unsigned int supported_tv_modes); > void drm_connector_attach_tv_margin_properties(struct drm_connector *conn); > int drm_mode_create_scaling_mode_property(struct drm_device *dev); > int drm_connector_attach_content_type_property(struct drm_connector *dev); > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h > index c47b29e80108..e5b053001d22 100644 > --- a/include/drm/drm_mode_config.h > +++ b/include/drm/drm_mode_config.h > @@ -716,9 +716,17 @@ struct drm_mode_config { > /** > * @legacy_tv_mode_property: Optional TV property to select > * the output TV mode. > + * > + * Superseded by @tv_mode_property > */ > struct drm_property *legacy_tv_mode_property; > > + /** > + * @tv_mode_property: Optional TV property to select the TV > + * standard output on the connector. > + */ > + struct drm_property *tv_mode_property; > + > /** > * @tv_left_margin_property: Optional TV property to set the left > * margin (expressed in pixels). >