From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6152EC4332F for ; Mon, 17 Oct 2022 19:57:04 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D34CD10EE0E; Mon, 17 Oct 2022 19:56:33 +0000 (UTC) Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by gabe.freedesktop.org (Postfix) with ESMTPS id 80E4C10E303; Thu, 13 Oct 2022 18:23:55 +0000 (UTC) Received: by mail-ed1-x52b.google.com with SMTP id a67so3749972edf.12; Thu, 13 Oct 2022 11:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=FSJPenagde4qSchQNLIGuKH7m39FqdZYDX4cXscDrSd4DQs0L1KMc4rzYAQdelzOnj UF6Ak0NK52yT8/8DfdNJEj9A6gPHnDn66V7+1VWIUqHsECMy3uBtxD1ZuMqhx07ZGxmH JrBntFO5CY3UNA85w3OBtKxuhgF5e76Lt7ylZMABNDblsdysCHcDVS8mPFZv9H1JdZ/I AKJH0uhU+XEyG10Nd+LEc8vJ0DUGh/1JFMAtnOsnuQLT22u523AH4mmuX/7Zqs6DzjRA bG2+Qr5Isa0Tcz+PCt82cXW69Q2hRvI0SGZdd/KO1uPpP7a67dpLrTUV1TBOjvgtGohS UKkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=JAMfg5Bvy3V5S23i3bvj5+daieW9U/8SUe7TWU1FUGarNC4NcH2hVrP7uqrSNRguPG OFGt0e/5ScZjRSPfkv/vdvUWD/y9inbnbhdwKOSWQhmm1Ys0fyTqGTlfyuhbE57flE16 3NU4sF2DpLRU+TVO1UivLhSLheUHMExD46iKJJAmOlx64zUb6c82pGCbvzVnhcw0Fy7K jqiMo9uInPEAOCoLbr4DIZsWqwxp10mMDsqxPPNk3irmz9iDkovxLT55H9VZPzwk3QxW BDG5Fe8L7AknFNHBmVyZ0TrtMWi32oDpV/xcC3MkyinWLt2wCAy2u0DQuj7/2t5osJl6 jRYA== X-Gm-Message-State: ACrzQf0/4kMhK9vMcc2UGww+Cn6FfqJog3q5QovqKr9Io38VWriXHLS5 9VWe7vJWbXGcTEJqxGECaPI= X-Google-Smtp-Source: AMsMyM7ssKdTrHDlPNauUb77WDG9zWLblYWKO18kRWRI7jkR1dhN23ZFAp3iq6h3HOsgFFKHyT7dhQ== X-Received: by 2002:a05:6402:b3c:b0:458:f680:6ab8 with SMTP id bo28-20020a0564020b3c00b00458f6806ab8mr923431edb.267.1665685433991; Thu, 13 Oct 2022 11:23:53 -0700 (PDT) Received: from kista.localnet (82-149-19-102.dynamic.telemach.net. [82.149.19.102]) by smtp.gmail.com with ESMTPSA id e2-20020a170906314200b00730df07629fsm196329eje.174.2022.10.13.11.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Oct 2022 11:23:53 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Karol Herbst , Jani Nikula , Tvrtko Ursulin , Daniel Vetter , Maarten Lankhorst , David Airlie , Joonas Lahtinen , Lyude Paul , Maxime Ripard , Emma Anholt , Chen-Yu Tsai , Samuel Holland , Ben Skeggs , Thomas Zimmermann , Rodrigo Vivi , Maxime Ripard Date: Thu, 13 Oct 2022 20:23:51 +0200 Message-ID: <6482539.4vTCxPXJkl@kista> In-Reply-To: <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> References: <20220728-rpi-analog-tv-properties-v5-0-d841cc64fe4b@cerno.tech> <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" X-Mailman-Approved-At: Mon, 17 Oct 2022 19:56:17 +0000 Subject: Re: [Intel-gfx] [PATCH v5 22/22] drm/sun4i: tv: Convert to the new TV mode property X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: 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 =?ISO-8859-1?Q?Tr=C3=B8nnes?= , Geert Uytterhoeven , Maxime Ripard , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Hi Maxime, Dne =C4=8Detrtek, 13. oktober 2022 ob 15:19:06 CEST je Maxime Ripard napisa= l(a): > Now that the core can deal fine with analog TV modes, let's convert the > sun4i TV driver to leverage those new features. >=20 > Acked-by: Noralf Tr=C3=B8nnes > Signed-off-by: Maxime Ripard >=20 > --- > Changes in v5: > - Removed the count variable in get_modes > - Removed spurious vc4 change > --- > drivers/gpu/drm/sun4i/sun4i_tv.c | 145 > +++++++++++++-------------------------- 1 file changed, 48 insertions(+), > 97 deletions(-) >=20 > diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c > b/drivers/gpu/drm/sun4i/sun4i_tv.c index c65f0a89b6b0..4f07aff11551 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_tv.c > +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c > @@ -141,23 +141,14 @@ struct resync_parameters { > struct tv_mode { > char *name; >=20 > + unsigned int tv_mode; > + > u32 mode; > u32 chroma_freq; > u16 back_porch; > u16 front_porch; > - u16 line_number; > u16 vblank_level; isn't there a way to get or calculate back_porch, front_porch and vblank_le= vel=20 from mode? From quick glance over removed values below, I would say that at= =20 least back_porch can be removed too? Otherwise this patch looks ok. Best regards, Jernej >=20 > - u32 hdisplay; > - u16 hfront_porch; > - u16 hsync_len; > - u16 hback_porch; > - > - u32 vdisplay; > - u16 vfront_porch; > - u16 vsync_len; > - u16 vback_porch; > - > bool yc_en; > bool dac3_en; > bool dac_bit25_en; > @@ -213,7 +204,7 @@ static const struct resync_parameters > pal_resync_parameters =3D { >=20 > static const struct tv_mode tv_modes[] =3D { > { > - .name =3D "NTSC", > + .tv_mode =3D DRM_MODE_TV_MODE_NTSC, > .mode =3D SUN4I_TVE_CFG0_RES_480i, > .chroma_freq =3D 0x21f07c1f, > .yc_en =3D true, > @@ -222,17 +213,6 @@ static const struct tv_mode tv_modes[] =3D { >=20 > .back_porch =3D 118, > .front_porch =3D 32, > - .line_number =3D 525, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 18, > - .hsync_len =3D 2, > - .hback_porch =3D 118, > - > - .vdisplay =3D 480, > - .vfront_porch =3D 26, > - .vsync_len =3D 2, > - .vback_porch =3D 17, >=20 > .vblank_level =3D 240, >=20 > @@ -242,23 +222,12 @@ static const struct tv_mode tv_modes[] =3D { > .resync_params =3D &ntsc_resync_parameters, > }, > { > - .name =3D "PAL", > + .tv_mode =3D DRM_MODE_TV_MODE_PAL, > .mode =3D SUN4I_TVE_CFG0_RES_576i, > .chroma_freq =3D 0x2a098acb, >=20 > .back_porch =3D 138, > .front_porch =3D 24, > - .line_number =3D 625, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 3, > - .hsync_len =3D 2, > - .hback_porch =3D 139, > - > - .vdisplay =3D 576, > - .vfront_porch =3D 28, > - .vsync_len =3D 2, > - .vback_porch =3D 19, >=20 > .vblank_level =3D 252, >=20 > @@ -276,63 +245,21 @@ drm_encoder_to_sun4i_tv(struct drm_encoder *encoder) > encoder); > } >=20 > -/* > - * FIXME: If only the drm_display_mode private field was usable, this > - * could go away... > - * > - * So far, it doesn't seem to be preserved when the mode is passed by > - * to mode_set for some reason. > - */ > -static const struct tv_mode *sun4i_tv_find_tv_by_mode(const struct > drm_display_mode *mode) +static const struct tv_mode * > +sun4i_tv_find_tv_by_mode(unsigned int mode) > { > int i; >=20 > - /* First try to identify the mode by name */ > for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > const struct tv_mode *tv_mode =3D &tv_modes[i]; >=20 > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s", > - mode->name, tv_mode->name); > - > - if (!strcmp(mode->name, tv_mode->name)) > - return tv_mode; > - } > - > - /* Then by number of lines */ > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s (X: %d vs=20 %d)", > - mode->name, tv_mode->name, > - mode->vdisplay, tv_mode- >vdisplay); > - > - if (mode->vdisplay =3D=3D tv_mode->vdisplay) > + if (tv_mode->tv_mode =3D=3D mode) > return tv_mode; > } >=20 > return NULL; > } >=20 > -static void sun4i_tv_mode_to_drm_mode(const struct tv_mode *tv_mode, > - struct drm_display_mode=20 *mode) > -{ > - DRM_DEBUG_DRIVER("Creating mode %s\n", mode->name); > - > - mode->type =3D DRM_MODE_TYPE_DRIVER; > - mode->clock =3D 13500; > - mode->flags =3D DRM_MODE_FLAG_INTERLACE; > - > - mode->hdisplay =3D tv_mode->hdisplay; > - mode->hsync_start =3D mode->hdisplay + tv_mode->hfront_porch; > - mode->hsync_end =3D mode->hsync_start + tv_mode->hsync_len; > - mode->htotal =3D mode->hsync_end + tv_mode->hback_porch; > - > - mode->vdisplay =3D tv_mode->vdisplay; > - mode->vsync_start =3D mode->vdisplay + tv_mode->vfront_porch; > - mode->vsync_end =3D mode->vsync_start + tv_mode->vsync_len; > - mode->vtotal =3D mode->vsync_end + tv_mode->vback_porch; > -} > - > static void sun4i_tv_disable(struct drm_encoder *encoder, > struct drm_atomic_state *state) > { > @@ -356,7 +283,11 @@ static void sun4i_tv_enable(struct drm_encoder > *encoder, struct drm_crtc_state *crtc_state =3D > drm_atomic_get_new_crtc_state(state, encoder->crtc); > struct drm_display_mode *mode =3D &crtc_state->mode; > - const struct tv_mode *tv_mode =3D sun4i_tv_find_tv_by_mode(mode); > + struct drm_connector *connector =3D &tv->connector; > + struct drm_connector_state *conn_state =3D > + drm_atomic_get_new_connector_state(state, connector); > + const struct tv_mode *tv_mode =3D > + sun4i_tv_find_tv_by_mode(conn_state->tv.mode); >=20 > DRM_DEBUG_DRIVER("Enabling the TV Output\n"); >=20 > @@ -404,7 +335,7 @@ static void sun4i_tv_enable(struct drm_encoder *encod= er, > /* Set the lines setup */ > regmap_write(tv->regs, SUN4I_TVE_LINE_REG, > SUN4I_TVE_LINE_FIRST(22) | > - SUN4I_TVE_LINE_NUMBER(tv_mode->line_number)); > + SUN4I_TVE_LINE_NUMBER(mode->vtotal)); >=20 > regmap_write(tv->regs, SUN4I_TVE_LEVEL_REG, > SUN4I_TVE_LEVEL_BLANK(tv_mode->video_levels- >blank) | > @@ -467,35 +398,43 @@ static const struct drm_encoder_helper_funcs > sun4i_tv_helper_funcs =3D { >=20 > static int sun4i_tv_comp_get_modes(struct drm_connector *connector) > { > - int i; > + struct drm_display_mode *mode; >=20 > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - struct drm_display_mode *mode; > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - mode =3D drm_mode_create(connector->dev); > - if (!mode) { > - DRM_ERROR("Failed to create a new display=20 mode\n"); > - return 0; > - } > + mode =3D drm_mode_analog_ntsc_480i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > + } >=20 > - strcpy(mode->name, tv_mode->name); > + mode->type |=3D DRM_MODE_TYPE_PREFERRED; > + drm_mode_probed_add(connector, mode); >=20 > - sun4i_tv_mode_to_drm_mode(tv_mode, mode); > - drm_mode_probed_add(connector, mode); > + mode =3D drm_mode_analog_pal_576i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > } >=20 > - return i; > + drm_mode_probed_add(connector, mode); > + > + return 2; > } >=20 > static const struct drm_connector_helper_funcs > sun4i_tv_comp_connector_helper_funcs =3D { + .atomic_check =3D > drm_atomic_helper_connector_tv_check, > .get_modes =3D sun4i_tv_comp_get_modes, > }; >=20 > +static void sun4i_tv_connector_reset(struct drm_connector *connector) > +{ > + drm_atomic_helper_connector_reset(connector); > + drm_atomic_helper_connector_tv_reset(connector); > +} > + > static const struct drm_connector_funcs sun4i_tv_comp_connector_funcs = =3D { > .fill_modes =3D drm_helper_probe_single_connector_modes, > .destroy =3D drm_connector_cleanup, > - .reset =3D=20 drm_atomic_helper_connector_reset, > + .reset =3D sun4i_tv_connector_reset, > .atomic_duplicate_state =3D=20 drm_atomic_helper_connector_duplicate_state, > .atomic_destroy_state =3D=20 drm_atomic_helper_connector_destroy_state, > }; > @@ -587,8 +526,20 @@ static int sun4i_tv_bind(struct device *dev, struct > device *master, >=20 > drm_connector_attach_encoder(&tv->connector, &tv->encoder); >=20 > + ret =3D drm_mode_create_tv_properties(drm, > + =20 BIT(DRM_MODE_TV_MODE_NTSC) | > + =20 BIT(DRM_MODE_TV_MODE_PAL)); > + if (ret) > + goto err_cleanup_connector; > + > + drm_object_attach_property(&tv->connector.base, > + drm- >mode_config.tv_mode_property, > + DRM_MODE_TV_MODE_NTSC); > + > return 0; >=20 > +err_cleanup_connector: > + drm_connector_cleanup(&tv->connector); > err_cleanup_encoder: > drm_encoder_cleanup(&tv->encoder); > err_disable_clk: >=20 > -- > b4 0.11.0-dev-7da52 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C8CAD4405 for ; Thu, 13 Oct 2022 18:23:55 +0000 (UTC) Received: by mail-ed1-f54.google.com with SMTP id a13so3855298edj.0 for ; Thu, 13 Oct 2022 11:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=FSJPenagde4qSchQNLIGuKH7m39FqdZYDX4cXscDrSd4DQs0L1KMc4rzYAQdelzOnj UF6Ak0NK52yT8/8DfdNJEj9A6gPHnDn66V7+1VWIUqHsECMy3uBtxD1ZuMqhx07ZGxmH JrBntFO5CY3UNA85w3OBtKxuhgF5e76Lt7ylZMABNDblsdysCHcDVS8mPFZv9H1JdZ/I AKJH0uhU+XEyG10Nd+LEc8vJ0DUGh/1JFMAtnOsnuQLT22u523AH4mmuX/7Zqs6DzjRA bG2+Qr5Isa0Tcz+PCt82cXW69Q2hRvI0SGZdd/KO1uPpP7a67dpLrTUV1TBOjvgtGohS UKkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=JOsFO5fW4Sg9/Z+UJ+WAOiEPfm/7TmmojQ3bW9Bf3wESukpabFeg82Vl0HJoaqh+O5 gu9IDqG8VfFB/2p7FrpoqYXTqwcizXxKAyB+ilVIDkq3MEl1qmWNc9qu+jcbChQZJPAO ZUmtByF66++VRP1OELxYC48V24eSEiQSxsWiZ+GeWPmWIcus9oR3HYwAoa93C38lNgzS RQXdXasKufB1wBFiyyxpko7Yk4BxlULR7U1EieEGjX5OW45oUtBzkeXC+j8zGSZu6NHX gX/vuDD3rTaLLHs/LOxXgEwncbKrYbSWkCUsVwKSP7m8ENcADPxKiJfJivQBy/npzBUd UyPQ== X-Gm-Message-State: ACrzQf3+SWCaEszYZH6VXL5s2WYlyA4Z6YRD4VulL6ZeqAHeqIVpHHBt pI5eeMGxBvXa5J1bYA0x4SM= X-Google-Smtp-Source: AMsMyM7ssKdTrHDlPNauUb77WDG9zWLblYWKO18kRWRI7jkR1dhN23ZFAp3iq6h3HOsgFFKHyT7dhQ== X-Received: by 2002:a05:6402:b3c:b0:458:f680:6ab8 with SMTP id bo28-20020a0564020b3c00b00458f6806ab8mr923431edb.267.1665685433991; Thu, 13 Oct 2022 11:23:53 -0700 (PDT) Received: from kista.localnet (82-149-19-102.dynamic.telemach.net. [82.149.19.102]) by smtp.gmail.com with ESMTPSA id e2-20020a170906314200b00730df07629fsm196329eje.174.2022.10.13.11.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Oct 2022 11:23:53 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Karol Herbst , Jani Nikula , Tvrtko Ursulin , Daniel Vetter , Maarten Lankhorst , David Airlie , Joonas Lahtinen , Lyude Paul , Maxime Ripard , Emma Anholt , Chen-Yu Tsai , Samuel Holland , Ben Skeggs , Thomas Zimmermann , Rodrigo Vivi , Maxime Ripard Cc: Dom Cobley , Maxime Ripard , linux-sunxi@lists.linux.dev, Dave Stevenson , Noralf =?ISO-8859-1?Q?Tr=C3=B8nnes?= , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, nouveau@lists.freedesktop.org, Geert Uytterhoeven , linux-arm-kernel@lists.infradead.org, Mateusz Kwiatkowski , dri-devel@lists.freedesktop.org, Hans de Goede , Phil Elwell Subject: Re: [PATCH v5 22/22] drm/sun4i: tv: Convert to the new TV mode property Date: Thu, 13 Oct 2022 20:23:51 +0200 Message-ID: <6482539.4vTCxPXJkl@kista> In-Reply-To: <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> References: <20220728-rpi-analog-tv-properties-v5-0-d841cc64fe4b@cerno.tech> <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Hi Maxime, Dne =C4=8Detrtek, 13. oktober 2022 ob 15:19:06 CEST je Maxime Ripard napisa= l(a): > Now that the core can deal fine with analog TV modes, let's convert the > sun4i TV driver to leverage those new features. >=20 > Acked-by: Noralf Tr=C3=B8nnes > Signed-off-by: Maxime Ripard >=20 > --- > Changes in v5: > - Removed the count variable in get_modes > - Removed spurious vc4 change > --- > drivers/gpu/drm/sun4i/sun4i_tv.c | 145 > +++++++++++++-------------------------- 1 file changed, 48 insertions(+), > 97 deletions(-) >=20 > diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c > b/drivers/gpu/drm/sun4i/sun4i_tv.c index c65f0a89b6b0..4f07aff11551 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_tv.c > +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c > @@ -141,23 +141,14 @@ struct resync_parameters { > struct tv_mode { > char *name; >=20 > + unsigned int tv_mode; > + > u32 mode; > u32 chroma_freq; > u16 back_porch; > u16 front_porch; > - u16 line_number; > u16 vblank_level; isn't there a way to get or calculate back_porch, front_porch and vblank_le= vel=20 from mode? From quick glance over removed values below, I would say that at= =20 least back_porch can be removed too? Otherwise this patch looks ok. Best regards, Jernej >=20 > - u32 hdisplay; > - u16 hfront_porch; > - u16 hsync_len; > - u16 hback_porch; > - > - u32 vdisplay; > - u16 vfront_porch; > - u16 vsync_len; > - u16 vback_porch; > - > bool yc_en; > bool dac3_en; > bool dac_bit25_en; > @@ -213,7 +204,7 @@ static const struct resync_parameters > pal_resync_parameters =3D { >=20 > static const struct tv_mode tv_modes[] =3D { > { > - .name =3D "NTSC", > + .tv_mode =3D DRM_MODE_TV_MODE_NTSC, > .mode =3D SUN4I_TVE_CFG0_RES_480i, > .chroma_freq =3D 0x21f07c1f, > .yc_en =3D true, > @@ -222,17 +213,6 @@ static const struct tv_mode tv_modes[] =3D { >=20 > .back_porch =3D 118, > .front_porch =3D 32, > - .line_number =3D 525, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 18, > - .hsync_len =3D 2, > - .hback_porch =3D 118, > - > - .vdisplay =3D 480, > - .vfront_porch =3D 26, > - .vsync_len =3D 2, > - .vback_porch =3D 17, >=20 > .vblank_level =3D 240, >=20 > @@ -242,23 +222,12 @@ static const struct tv_mode tv_modes[] =3D { > .resync_params =3D &ntsc_resync_parameters, > }, > { > - .name =3D "PAL", > + .tv_mode =3D DRM_MODE_TV_MODE_PAL, > .mode =3D SUN4I_TVE_CFG0_RES_576i, > .chroma_freq =3D 0x2a098acb, >=20 > .back_porch =3D 138, > .front_porch =3D 24, > - .line_number =3D 625, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 3, > - .hsync_len =3D 2, > - .hback_porch =3D 139, > - > - .vdisplay =3D 576, > - .vfront_porch =3D 28, > - .vsync_len =3D 2, > - .vback_porch =3D 19, >=20 > .vblank_level =3D 252, >=20 > @@ -276,63 +245,21 @@ drm_encoder_to_sun4i_tv(struct drm_encoder *encoder) > encoder); > } >=20 > -/* > - * FIXME: If only the drm_display_mode private field was usable, this > - * could go away... > - * > - * So far, it doesn't seem to be preserved when the mode is passed by > - * to mode_set for some reason. > - */ > -static const struct tv_mode *sun4i_tv_find_tv_by_mode(const struct > drm_display_mode *mode) +static const struct tv_mode * > +sun4i_tv_find_tv_by_mode(unsigned int mode) > { > int i; >=20 > - /* First try to identify the mode by name */ > for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > const struct tv_mode *tv_mode =3D &tv_modes[i]; >=20 > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s", > - mode->name, tv_mode->name); > - > - if (!strcmp(mode->name, tv_mode->name)) > - return tv_mode; > - } > - > - /* Then by number of lines */ > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s (X: %d vs=20 %d)", > - mode->name, tv_mode->name, > - mode->vdisplay, tv_mode- >vdisplay); > - > - if (mode->vdisplay =3D=3D tv_mode->vdisplay) > + if (tv_mode->tv_mode =3D=3D mode) > return tv_mode; > } >=20 > return NULL; > } >=20 > -static void sun4i_tv_mode_to_drm_mode(const struct tv_mode *tv_mode, > - struct drm_display_mode=20 *mode) > -{ > - DRM_DEBUG_DRIVER("Creating mode %s\n", mode->name); > - > - mode->type =3D DRM_MODE_TYPE_DRIVER; > - mode->clock =3D 13500; > - mode->flags =3D DRM_MODE_FLAG_INTERLACE; > - > - mode->hdisplay =3D tv_mode->hdisplay; > - mode->hsync_start =3D mode->hdisplay + tv_mode->hfront_porch; > - mode->hsync_end =3D mode->hsync_start + tv_mode->hsync_len; > - mode->htotal =3D mode->hsync_end + tv_mode->hback_porch; > - > - mode->vdisplay =3D tv_mode->vdisplay; > - mode->vsync_start =3D mode->vdisplay + tv_mode->vfront_porch; > - mode->vsync_end =3D mode->vsync_start + tv_mode->vsync_len; > - mode->vtotal =3D mode->vsync_end + tv_mode->vback_porch; > -} > - > static void sun4i_tv_disable(struct drm_encoder *encoder, > struct drm_atomic_state *state) > { > @@ -356,7 +283,11 @@ static void sun4i_tv_enable(struct drm_encoder > *encoder, struct drm_crtc_state *crtc_state =3D > drm_atomic_get_new_crtc_state(state, encoder->crtc); > struct drm_display_mode *mode =3D &crtc_state->mode; > - const struct tv_mode *tv_mode =3D sun4i_tv_find_tv_by_mode(mode); > + struct drm_connector *connector =3D &tv->connector; > + struct drm_connector_state *conn_state =3D > + drm_atomic_get_new_connector_state(state, connector); > + const struct tv_mode *tv_mode =3D > + sun4i_tv_find_tv_by_mode(conn_state->tv.mode); >=20 > DRM_DEBUG_DRIVER("Enabling the TV Output\n"); >=20 > @@ -404,7 +335,7 @@ static void sun4i_tv_enable(struct drm_encoder *encod= er, > /* Set the lines setup */ > regmap_write(tv->regs, SUN4I_TVE_LINE_REG, > SUN4I_TVE_LINE_FIRST(22) | > - SUN4I_TVE_LINE_NUMBER(tv_mode->line_number)); > + SUN4I_TVE_LINE_NUMBER(mode->vtotal)); >=20 > regmap_write(tv->regs, SUN4I_TVE_LEVEL_REG, > SUN4I_TVE_LEVEL_BLANK(tv_mode->video_levels- >blank) | > @@ -467,35 +398,43 @@ static const struct drm_encoder_helper_funcs > sun4i_tv_helper_funcs =3D { >=20 > static int sun4i_tv_comp_get_modes(struct drm_connector *connector) > { > - int i; > + struct drm_display_mode *mode; >=20 > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - struct drm_display_mode *mode; > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - mode =3D drm_mode_create(connector->dev); > - if (!mode) { > - DRM_ERROR("Failed to create a new display=20 mode\n"); > - return 0; > - } > + mode =3D drm_mode_analog_ntsc_480i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > + } >=20 > - strcpy(mode->name, tv_mode->name); > + mode->type |=3D DRM_MODE_TYPE_PREFERRED; > + drm_mode_probed_add(connector, mode); >=20 > - sun4i_tv_mode_to_drm_mode(tv_mode, mode); > - drm_mode_probed_add(connector, mode); > + mode =3D drm_mode_analog_pal_576i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > } >=20 > - return i; > + drm_mode_probed_add(connector, mode); > + > + return 2; > } >=20 > static const struct drm_connector_helper_funcs > sun4i_tv_comp_connector_helper_funcs =3D { + .atomic_check =3D > drm_atomic_helper_connector_tv_check, > .get_modes =3D sun4i_tv_comp_get_modes, > }; >=20 > +static void sun4i_tv_connector_reset(struct drm_connector *connector) > +{ > + drm_atomic_helper_connector_reset(connector); > + drm_atomic_helper_connector_tv_reset(connector); > +} > + > static const struct drm_connector_funcs sun4i_tv_comp_connector_funcs = =3D { > .fill_modes =3D drm_helper_probe_single_connector_modes, > .destroy =3D drm_connector_cleanup, > - .reset =3D=20 drm_atomic_helper_connector_reset, > + .reset =3D sun4i_tv_connector_reset, > .atomic_duplicate_state =3D=20 drm_atomic_helper_connector_duplicate_state, > .atomic_destroy_state =3D=20 drm_atomic_helper_connector_destroy_state, > }; > @@ -587,8 +526,20 @@ static int sun4i_tv_bind(struct device *dev, struct > device *master, >=20 > drm_connector_attach_encoder(&tv->connector, &tv->encoder); >=20 > + ret =3D drm_mode_create_tv_properties(drm, > + =20 BIT(DRM_MODE_TV_MODE_NTSC) | > + =20 BIT(DRM_MODE_TV_MODE_PAL)); > + if (ret) > + goto err_cleanup_connector; > + > + drm_object_attach_property(&tv->connector.base, > + drm- >mode_config.tv_mode_property, > + DRM_MODE_TV_MODE_NTSC); > + > return 0; >=20 > +err_cleanup_connector: > + drm_connector_cleanup(&tv->connector); > err_cleanup_encoder: > drm_encoder_cleanup(&tv->encoder); > err_disable_clk: >=20 > -- > b4 0.11.0-dev-7da52 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7DA99C433FE for ; Thu, 13 Oct 2022 18:24:06 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D392310E331; Thu, 13 Oct 2022 18:23:58 +0000 (UTC) Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by gabe.freedesktop.org (Postfix) with ESMTPS id 80E4C10E303; Thu, 13 Oct 2022 18:23:55 +0000 (UTC) Received: by mail-ed1-x52b.google.com with SMTP id a67so3749972edf.12; Thu, 13 Oct 2022 11:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=FSJPenagde4qSchQNLIGuKH7m39FqdZYDX4cXscDrSd4DQs0L1KMc4rzYAQdelzOnj UF6Ak0NK52yT8/8DfdNJEj9A6gPHnDn66V7+1VWIUqHsECMy3uBtxD1ZuMqhx07ZGxmH JrBntFO5CY3UNA85w3OBtKxuhgF5e76Lt7ylZMABNDblsdysCHcDVS8mPFZv9H1JdZ/I AKJH0uhU+XEyG10Nd+LEc8vJ0DUGh/1JFMAtnOsnuQLT22u523AH4mmuX/7Zqs6DzjRA bG2+Qr5Isa0Tcz+PCt82cXW69Q2hRvI0SGZdd/KO1uPpP7a67dpLrTUV1TBOjvgtGohS UKkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=JAMfg5Bvy3V5S23i3bvj5+daieW9U/8SUe7TWU1FUGarNC4NcH2hVrP7uqrSNRguPG OFGt0e/5ScZjRSPfkv/vdvUWD/y9inbnbhdwKOSWQhmm1Ys0fyTqGTlfyuhbE57flE16 3NU4sF2DpLRU+TVO1UivLhSLheUHMExD46iKJJAmOlx64zUb6c82pGCbvzVnhcw0Fy7K jqiMo9uInPEAOCoLbr4DIZsWqwxp10mMDsqxPPNk3irmz9iDkovxLT55H9VZPzwk3QxW BDG5Fe8L7AknFNHBmVyZ0TrtMWi32oDpV/xcC3MkyinWLt2wCAy2u0DQuj7/2t5osJl6 jRYA== X-Gm-Message-State: ACrzQf0/4kMhK9vMcc2UGww+Cn6FfqJog3q5QovqKr9Io38VWriXHLS5 9VWe7vJWbXGcTEJqxGECaPI= X-Google-Smtp-Source: AMsMyM7ssKdTrHDlPNauUb77WDG9zWLblYWKO18kRWRI7jkR1dhN23ZFAp3iq6h3HOsgFFKHyT7dhQ== X-Received: by 2002:a05:6402:b3c:b0:458:f680:6ab8 with SMTP id bo28-20020a0564020b3c00b00458f6806ab8mr923431edb.267.1665685433991; Thu, 13 Oct 2022 11:23:53 -0700 (PDT) Received: from kista.localnet (82-149-19-102.dynamic.telemach.net. [82.149.19.102]) by smtp.gmail.com with ESMTPSA id e2-20020a170906314200b00730df07629fsm196329eje.174.2022.10.13.11.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Oct 2022 11:23:53 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Karol Herbst , Jani Nikula , Tvrtko Ursulin , Daniel Vetter , Maarten Lankhorst , David Airlie , Joonas Lahtinen , Lyude Paul , Maxime Ripard , Emma Anholt , Chen-Yu Tsai , Samuel Holland , Ben Skeggs , Thomas Zimmermann , Rodrigo Vivi , Maxime Ripard Date: Thu, 13 Oct 2022 20:23:51 +0200 Message-ID: <6482539.4vTCxPXJkl@kista> In-Reply-To: <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> References: <20220728-rpi-analog-tv-properties-v5-0-d841cc64fe4b@cerno.tech> <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Subject: Re: [Nouveau] [PATCH v5 22/22] drm/sun4i: tv: Convert to the new TV mode property X-BeenThere: nouveau@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Nouveau development list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dom Cobley , 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 =?ISO-8859-1?Q?Tr=C3=B8nnes?= , Geert Uytterhoeven , Maxime Ripard , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: nouveau-bounces@lists.freedesktop.org Sender: "Nouveau" Hi Maxime, Dne =C4=8Detrtek, 13. oktober 2022 ob 15:19:06 CEST je Maxime Ripard napisa= l(a): > Now that the core can deal fine with analog TV modes, let's convert the > sun4i TV driver to leverage those new features. >=20 > Acked-by: Noralf Tr=C3=B8nnes > Signed-off-by: Maxime Ripard >=20 > --- > Changes in v5: > - Removed the count variable in get_modes > - Removed spurious vc4 change > --- > drivers/gpu/drm/sun4i/sun4i_tv.c | 145 > +++++++++++++-------------------------- 1 file changed, 48 insertions(+), > 97 deletions(-) >=20 > diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c > b/drivers/gpu/drm/sun4i/sun4i_tv.c index c65f0a89b6b0..4f07aff11551 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_tv.c > +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c > @@ -141,23 +141,14 @@ struct resync_parameters { > struct tv_mode { > char *name; >=20 > + unsigned int tv_mode; > + > u32 mode; > u32 chroma_freq; > u16 back_porch; > u16 front_porch; > - u16 line_number; > u16 vblank_level; isn't there a way to get or calculate back_porch, front_porch and vblank_le= vel=20 from mode? From quick glance over removed values below, I would say that at= =20 least back_porch can be removed too? Otherwise this patch looks ok. Best regards, Jernej >=20 > - u32 hdisplay; > - u16 hfront_porch; > - u16 hsync_len; > - u16 hback_porch; > - > - u32 vdisplay; > - u16 vfront_porch; > - u16 vsync_len; > - u16 vback_porch; > - > bool yc_en; > bool dac3_en; > bool dac_bit25_en; > @@ -213,7 +204,7 @@ static const struct resync_parameters > pal_resync_parameters =3D { >=20 > static const struct tv_mode tv_modes[] =3D { > { > - .name =3D "NTSC", > + .tv_mode =3D DRM_MODE_TV_MODE_NTSC, > .mode =3D SUN4I_TVE_CFG0_RES_480i, > .chroma_freq =3D 0x21f07c1f, > .yc_en =3D true, > @@ -222,17 +213,6 @@ static const struct tv_mode tv_modes[] =3D { >=20 > .back_porch =3D 118, > .front_porch =3D 32, > - .line_number =3D 525, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 18, > - .hsync_len =3D 2, > - .hback_porch =3D 118, > - > - .vdisplay =3D 480, > - .vfront_porch =3D 26, > - .vsync_len =3D 2, > - .vback_porch =3D 17, >=20 > .vblank_level =3D 240, >=20 > @@ -242,23 +222,12 @@ static const struct tv_mode tv_modes[] =3D { > .resync_params =3D &ntsc_resync_parameters, > }, > { > - .name =3D "PAL", > + .tv_mode =3D DRM_MODE_TV_MODE_PAL, > .mode =3D SUN4I_TVE_CFG0_RES_576i, > .chroma_freq =3D 0x2a098acb, >=20 > .back_porch =3D 138, > .front_porch =3D 24, > - .line_number =3D 625, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 3, > - .hsync_len =3D 2, > - .hback_porch =3D 139, > - > - .vdisplay =3D 576, > - .vfront_porch =3D 28, > - .vsync_len =3D 2, > - .vback_porch =3D 19, >=20 > .vblank_level =3D 252, >=20 > @@ -276,63 +245,21 @@ drm_encoder_to_sun4i_tv(struct drm_encoder *encoder) > encoder); > } >=20 > -/* > - * FIXME: If only the drm_display_mode private field was usable, this > - * could go away... > - * > - * So far, it doesn't seem to be preserved when the mode is passed by > - * to mode_set for some reason. > - */ > -static const struct tv_mode *sun4i_tv_find_tv_by_mode(const struct > drm_display_mode *mode) +static const struct tv_mode * > +sun4i_tv_find_tv_by_mode(unsigned int mode) > { > int i; >=20 > - /* First try to identify the mode by name */ > for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > const struct tv_mode *tv_mode =3D &tv_modes[i]; >=20 > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s", > - mode->name, tv_mode->name); > - > - if (!strcmp(mode->name, tv_mode->name)) > - return tv_mode; > - } > - > - /* Then by number of lines */ > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s (X: %d vs=20 %d)", > - mode->name, tv_mode->name, > - mode->vdisplay, tv_mode- >vdisplay); > - > - if (mode->vdisplay =3D=3D tv_mode->vdisplay) > + if (tv_mode->tv_mode =3D=3D mode) > return tv_mode; > } >=20 > return NULL; > } >=20 > -static void sun4i_tv_mode_to_drm_mode(const struct tv_mode *tv_mode, > - struct drm_display_mode=20 *mode) > -{ > - DRM_DEBUG_DRIVER("Creating mode %s\n", mode->name); > - > - mode->type =3D DRM_MODE_TYPE_DRIVER; > - mode->clock =3D 13500; > - mode->flags =3D DRM_MODE_FLAG_INTERLACE; > - > - mode->hdisplay =3D tv_mode->hdisplay; > - mode->hsync_start =3D mode->hdisplay + tv_mode->hfront_porch; > - mode->hsync_end =3D mode->hsync_start + tv_mode->hsync_len; > - mode->htotal =3D mode->hsync_end + tv_mode->hback_porch; > - > - mode->vdisplay =3D tv_mode->vdisplay; > - mode->vsync_start =3D mode->vdisplay + tv_mode->vfront_porch; > - mode->vsync_end =3D mode->vsync_start + tv_mode->vsync_len; > - mode->vtotal =3D mode->vsync_end + tv_mode->vback_porch; > -} > - > static void sun4i_tv_disable(struct drm_encoder *encoder, > struct drm_atomic_state *state) > { > @@ -356,7 +283,11 @@ static void sun4i_tv_enable(struct drm_encoder > *encoder, struct drm_crtc_state *crtc_state =3D > drm_atomic_get_new_crtc_state(state, encoder->crtc); > struct drm_display_mode *mode =3D &crtc_state->mode; > - const struct tv_mode *tv_mode =3D sun4i_tv_find_tv_by_mode(mode); > + struct drm_connector *connector =3D &tv->connector; > + struct drm_connector_state *conn_state =3D > + drm_atomic_get_new_connector_state(state, connector); > + const struct tv_mode *tv_mode =3D > + sun4i_tv_find_tv_by_mode(conn_state->tv.mode); >=20 > DRM_DEBUG_DRIVER("Enabling the TV Output\n"); >=20 > @@ -404,7 +335,7 @@ static void sun4i_tv_enable(struct drm_encoder *encod= er, > /* Set the lines setup */ > regmap_write(tv->regs, SUN4I_TVE_LINE_REG, > SUN4I_TVE_LINE_FIRST(22) | > - SUN4I_TVE_LINE_NUMBER(tv_mode->line_number)); > + SUN4I_TVE_LINE_NUMBER(mode->vtotal)); >=20 > regmap_write(tv->regs, SUN4I_TVE_LEVEL_REG, > SUN4I_TVE_LEVEL_BLANK(tv_mode->video_levels- >blank) | > @@ -467,35 +398,43 @@ static const struct drm_encoder_helper_funcs > sun4i_tv_helper_funcs =3D { >=20 > static int sun4i_tv_comp_get_modes(struct drm_connector *connector) > { > - int i; > + struct drm_display_mode *mode; >=20 > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - struct drm_display_mode *mode; > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - mode =3D drm_mode_create(connector->dev); > - if (!mode) { > - DRM_ERROR("Failed to create a new display=20 mode\n"); > - return 0; > - } > + mode =3D drm_mode_analog_ntsc_480i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > + } >=20 > - strcpy(mode->name, tv_mode->name); > + mode->type |=3D DRM_MODE_TYPE_PREFERRED; > + drm_mode_probed_add(connector, mode); >=20 > - sun4i_tv_mode_to_drm_mode(tv_mode, mode); > - drm_mode_probed_add(connector, mode); > + mode =3D drm_mode_analog_pal_576i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > } >=20 > - return i; > + drm_mode_probed_add(connector, mode); > + > + return 2; > } >=20 > static const struct drm_connector_helper_funcs > sun4i_tv_comp_connector_helper_funcs =3D { + .atomic_check =3D > drm_atomic_helper_connector_tv_check, > .get_modes =3D sun4i_tv_comp_get_modes, > }; >=20 > +static void sun4i_tv_connector_reset(struct drm_connector *connector) > +{ > + drm_atomic_helper_connector_reset(connector); > + drm_atomic_helper_connector_tv_reset(connector); > +} > + > static const struct drm_connector_funcs sun4i_tv_comp_connector_funcs = =3D { > .fill_modes =3D drm_helper_probe_single_connector_modes, > .destroy =3D drm_connector_cleanup, > - .reset =3D=20 drm_atomic_helper_connector_reset, > + .reset =3D sun4i_tv_connector_reset, > .atomic_duplicate_state =3D=20 drm_atomic_helper_connector_duplicate_state, > .atomic_destroy_state =3D=20 drm_atomic_helper_connector_destroy_state, > }; > @@ -587,8 +526,20 @@ static int sun4i_tv_bind(struct device *dev, struct > device *master, >=20 > drm_connector_attach_encoder(&tv->connector, &tv->encoder); >=20 > + ret =3D drm_mode_create_tv_properties(drm, > + =20 BIT(DRM_MODE_TV_MODE_NTSC) | > + =20 BIT(DRM_MODE_TV_MODE_PAL)); > + if (ret) > + goto err_cleanup_connector; > + > + drm_object_attach_property(&tv->connector.base, > + drm- >mode_config.tv_mode_property, > + DRM_MODE_TV_MODE_NTSC); > + > return 0; >=20 > +err_cleanup_connector: > + drm_connector_cleanup(&tv->connector); > err_cleanup_encoder: > drm_encoder_cleanup(&tv->encoder); > err_disable_clk: >=20 > -- > b4 0.11.0-dev-7da52 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EDD41C433FE for ; Thu, 13 Oct 2022 18:24:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=qos7B4ItcwzEA7IYWgBbJIZJ+41K+6NJlqCq7skIr+Y=; b=SdHVdjxXMeBcxm ayQpCpDCTt9fbljFXlULqS7b/KS8pGZaYyyXZf/7b8SNw7m1RJdEMtdJ0idouedQWtGaHzGubP6wf FPiPqWZdQr3/qlw0E4nfvIV8tDoADR9MufRB9yAaIkonpW12LsASCMVla87Jnlxyf+IOXjw/LX+Wi Q33/8hW/brJG4DDgJ+n/ALem5agqVj0zqwPu/N71xO5ESURzoo1/bTrKiAtA3di90rrSl0LCN644F TjobC5rgcyY/d4DIl7mecARdVyGS8WuZtzaTlnRCRAsdfPQAtWCJnQzZUQ2/QWRmh+R5ec8q0XlK4 sJiJVFVPfo7skMAaDI5g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oj2sC-00CgcP-0c; Thu, 13 Oct 2022 18:24:00 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oj2s8-00CgbJ-DT for linux-arm-kernel@lists.infradead.org; Thu, 13 Oct 2022 18:23:58 +0000 Received: by mail-ed1-x52a.google.com with SMTP id g27so3762672edf.11 for ; Thu, 13 Oct 2022 11:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=FSJPenagde4qSchQNLIGuKH7m39FqdZYDX4cXscDrSd4DQs0L1KMc4rzYAQdelzOnj UF6Ak0NK52yT8/8DfdNJEj9A6gPHnDn66V7+1VWIUqHsECMy3uBtxD1ZuMqhx07ZGxmH JrBntFO5CY3UNA85w3OBtKxuhgF5e76Lt7ylZMABNDblsdysCHcDVS8mPFZv9H1JdZ/I AKJH0uhU+XEyG10Nd+LEc8vJ0DUGh/1JFMAtnOsnuQLT22u523AH4mmuX/7Zqs6DzjRA bG2+Qr5Isa0Tcz+PCt82cXW69Q2hRvI0SGZdd/KO1uPpP7a67dpLrTUV1TBOjvgtGohS UKkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=3DCzs38YM4e5IT1PdvdJxGaX4MPy+FpR7KWZQuPmOnc8fb8NUEMN1GNG3531lu9jEh 2gUHk+aVcHVXRgRLoscRqyIhrxraJF0fccxoYdk+ytMjfViXg1BPDshp3yP0yyeKDgrw HtWUdxVaBOWJ0wrkFQuLENQjNiD9Y1cUVKEHfIjF0ulQjJJOoaqnAEoj3wvP7WvDK91T fjVTjH+Bp9k9Pm90RgCjUNx4EKvJ9wtLhgeBNm2sY99JYMRnrQLftE9EQDo3OnTBc4Xq VgbCBsrPdVHuX0mz0EDSuFyN1OdlqxCPxa3SHGOC41xapzp65DKSaElcy8IA+R9w9q4C rb1Q== X-Gm-Message-State: ACrzQf0Ddt30zquw3i97JWi5+SGMalWx1m0Kj25yi46l6FvdBWddJ8iW jzABoEbPFvsWwJN5Kh5/OJo= X-Google-Smtp-Source: AMsMyM7ssKdTrHDlPNauUb77WDG9zWLblYWKO18kRWRI7jkR1dhN23ZFAp3iq6h3HOsgFFKHyT7dhQ== X-Received: by 2002:a05:6402:b3c:b0:458:f680:6ab8 with SMTP id bo28-20020a0564020b3c00b00458f6806ab8mr923431edb.267.1665685433991; Thu, 13 Oct 2022 11:23:53 -0700 (PDT) Received: from kista.localnet (82-149-19-102.dynamic.telemach.net. [82.149.19.102]) by smtp.gmail.com with ESMTPSA id e2-20020a170906314200b00730df07629fsm196329eje.174.2022.10.13.11.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Oct 2022 11:23:53 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Karol Herbst , Jani Nikula , Tvrtko Ursulin , Daniel Vetter , Maarten Lankhorst , David Airlie , Joonas Lahtinen , Lyude Paul , Maxime Ripard , Emma Anholt , Chen-Yu Tsai , Samuel Holland , Ben Skeggs , Thomas Zimmermann , Rodrigo Vivi , Maxime Ripard Cc: Dom Cobley , Maxime Ripard , linux-sunxi@lists.linux.dev, Dave Stevenson , Noralf =?ISO-8859-1?Q?Tr=C3=B8nnes?= , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, nouveau@lists.freedesktop.org, Geert Uytterhoeven , linux-arm-kernel@lists.infradead.org, Mateusz Kwiatkowski , dri-devel@lists.freedesktop.org, Hans de Goede , Phil Elwell Subject: Re: [PATCH v5 22/22] drm/sun4i: tv: Convert to the new TV mode property Date: Thu, 13 Oct 2022 20:23:51 +0200 Message-ID: <6482539.4vTCxPXJkl@kista> In-Reply-To: <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> References: <20220728-rpi-analog-tv-properties-v5-0-d841cc64fe4b@cerno.tech> <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221013_112356_477195_95F9AA33 X-CRM114-Status: GOOD ( 29.92 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWF4aW1lLAoKRG5lIMSNZXRydGVrLCAxMy4gb2t0b2JlciAyMDIyIG9iIDE1OjE5OjA2IENF U1QgamUgTWF4aW1lIFJpcGFyZCBuYXBpc2FsKGEpOgo+IE5vdyB0aGF0IHRoZSBjb3JlIGNhbiBk ZWFsIGZpbmUgd2l0aCBhbmFsb2cgVFYgbW9kZXMsIGxldCdzIGNvbnZlcnQgdGhlCj4gc3VuNGkg VFYgZHJpdmVyIHRvIGxldmVyYWdlIHRob3NlIG5ldyBmZWF0dXJlcy4KPiAKPiBBY2tlZC1ieTog Tm9yYWxmIFRyw7hubmVzIDxub3JhbGZAdHJvbm5lcy5vcmc+Cj4gU2lnbmVkLW9mZi1ieTogTWF4 aW1lIFJpcGFyZCA8bWF4aW1lQGNlcm5vLnRlY2g+Cj4gCj4gLS0tCj4gQ2hhbmdlcyBpbiB2NToK PiAtIFJlbW92ZWQgdGhlIGNvdW50IHZhcmlhYmxlIGluIGdldF9tb2Rlcwo+IC0gUmVtb3ZlZCBz cHVyaW91cyB2YzQgY2hhbmdlCj4gLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV90 di5jIHwgMTQ1Cj4gKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDEgZmls ZSBjaGFuZ2VkLCA0OCBpbnNlcnRpb25zKCspLAo+IDk3IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfdHYuYwo+IGIvZHJpdmVycy9ncHUv ZHJtL3N1bjRpL3N1bjRpX3R2LmMgaW5kZXggYzY1ZjBhODliNmIwLi40ZjA3YWZmMTE1NTEgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX3R2LmMKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfdHYuYwo+IEBAIC0xNDEsMjMgKzE0MSwxNCBAQCBzdHJ1 Y3QgcmVzeW5jX3BhcmFtZXRlcnMgewo+ICBzdHJ1Y3QgdHZfbW9kZSB7Cj4gIAljaGFyCQkqbmFt ZTsKPiAKPiArCXVuc2lnbmVkIGludAl0dl9tb2RlOwo+ICsKPiAgCXUzMgkJbW9kZTsKPiAgCXUz MgkJY2hyb21hX2ZyZXE7Cj4gIAl1MTYJCWJhY2tfcG9yY2g7Cj4gIAl1MTYJCWZyb250X3BvcmNo Owo+IC0JdTE2CQlsaW5lX251bWJlcjsKPiAgCXUxNgkJdmJsYW5rX2xldmVsOwoKaXNuJ3QgdGhl cmUgYSB3YXkgdG8gZ2V0IG9yIGNhbGN1bGF0ZSBiYWNrX3BvcmNoLCBmcm9udF9wb3JjaCBhbmQg dmJsYW5rX2xldmVsIApmcm9tIG1vZGU/IEZyb20gcXVpY2sgZ2xhbmNlIG92ZXIgcmVtb3ZlZCB2 YWx1ZXMgYmVsb3csIEkgd291bGQgc2F5IHRoYXQgYXQgCmxlYXN0IGJhY2tfcG9yY2ggY2FuIGJl IHJlbW92ZWQgdG9vPwoKT3RoZXJ3aXNlIHRoaXMgcGF0Y2ggbG9va3Mgb2suCgpCZXN0IHJlZ2Fy ZHMsCkplcm5lagoKPiAKPiAtCXUzMgkJaGRpc3BsYXk7Cj4gLQl1MTYJCWhmcm9udF9wb3JjaDsK PiAtCXUxNgkJaHN5bmNfbGVuOwo+IC0JdTE2CQloYmFja19wb3JjaDsKPiAtCj4gLQl1MzIJCXZk aXNwbGF5Owo+IC0JdTE2CQl2ZnJvbnRfcG9yY2g7Cj4gLQl1MTYJCXZzeW5jX2xlbjsKPiAtCXUx NgkJdmJhY2tfcG9yY2g7Cj4gLQo+ICAJYm9vbAkJeWNfZW47Cj4gIAlib29sCQlkYWMzX2VuOwo+ ICAJYm9vbAkJZGFjX2JpdDI1X2VuOwo+IEBAIC0yMTMsNyArMjA0LDcgQEAgc3RhdGljIGNvbnN0 IHN0cnVjdCByZXN5bmNfcGFyYW1ldGVycwo+IHBhbF9yZXN5bmNfcGFyYW1ldGVycyA9IHsKPiAK PiAgc3RhdGljIGNvbnN0IHN0cnVjdCB0dl9tb2RlIHR2X21vZGVzW10gPSB7Cj4gIAl7Cj4gLQkJ Lm5hbWUJCT0gIk5UU0MiLAo+ICsJCS50dl9tb2RlCT0gRFJNX01PREVfVFZfTU9ERV9OVFNDLAo+ ICAJCS5tb2RlCQk9IFNVTjRJX1RWRV9DRkcwX1JFU180ODBpLAo+ICAJCS5jaHJvbWFfZnJlcQk9 IDB4MjFmMDdjMWYsCj4gIAkJLnljX2VuCQk9IHRydWUsCj4gQEAgLTIyMiwxNyArMjEzLDYgQEAg c3RhdGljIGNvbnN0IHN0cnVjdCB0dl9tb2RlIHR2X21vZGVzW10gPSB7Cj4gCj4gIAkJLmJhY2tf cG9yY2gJPSAxMTgsCj4gIAkJLmZyb250X3BvcmNoCT0gMzIsCj4gLQkJLmxpbmVfbnVtYmVyCT0g NTI1LAo+IC0KPiAtCQkuaGRpc3BsYXkJPSA3MjAsCj4gLQkJLmhmcm9udF9wb3JjaAk9IDE4LAo+ IC0JCS5oc3luY19sZW4JPSAyLAo+IC0JCS5oYmFja19wb3JjaAk9IDExOCwKPiAtCj4gLQkJLnZk aXNwbGF5CT0gNDgwLAo+IC0JCS52ZnJvbnRfcG9yY2gJPSAyNiwKPiAtCQkudnN5bmNfbGVuCT0g MiwKPiAtCQkudmJhY2tfcG9yY2gJPSAxNywKPiAKPiAgCQkudmJsYW5rX2xldmVsCT0gMjQwLAo+ IAo+IEBAIC0yNDIsMjMgKzIyMiwxMiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHR2X21vZGUgdHZf bW9kZXNbXSA9IHsKPiAgCQkucmVzeW5jX3BhcmFtcwk9ICZudHNjX3Jlc3luY19wYXJhbWV0ZXJz LAo+ICAJfSwKPiAgCXsKPiAtCQkubmFtZQkJPSAiUEFMIiwKPiArCQkudHZfbW9kZQk9IERSTV9N T0RFX1RWX01PREVfUEFMLAo+ICAJCS5tb2RlCQk9IFNVTjRJX1RWRV9DRkcwX1JFU181NzZpLAo+ ICAJCS5jaHJvbWFfZnJlcQk9IDB4MmEwOThhY2IsCj4gCj4gIAkJLmJhY2tfcG9yY2gJPSAxMzgs Cj4gIAkJLmZyb250X3BvcmNoCT0gMjQsCj4gLQkJLmxpbmVfbnVtYmVyCT0gNjI1LAo+IC0KPiAt CQkuaGRpc3BsYXkJPSA3MjAsCj4gLQkJLmhmcm9udF9wb3JjaAk9IDMsCj4gLQkJLmhzeW5jX2xl bgk9IDIsCj4gLQkJLmhiYWNrX3BvcmNoCT0gMTM5LAo+IC0KPiAtCQkudmRpc3BsYXkJPSA1NzYs Cj4gLQkJLnZmcm9udF9wb3JjaAk9IDI4LAo+IC0JCS52c3luY19sZW4JPSAyLAo+IC0JCS52YmFj a19wb3JjaAk9IDE5LAo+IAo+ICAJCS52YmxhbmtfbGV2ZWwJPSAyNTIsCj4gCj4gQEAgLTI3Niw2 MyArMjQ1LDIxIEBAIGRybV9lbmNvZGVyX3RvX3N1bjRpX3R2KHN0cnVjdCBkcm1fZW5jb2RlciAq ZW5jb2RlcikKPiAgCQkJICAgIGVuY29kZXIpOwo+ICB9Cj4gCj4gLS8qCj4gLSAqIEZJWE1FOiBJ ZiBvbmx5IHRoZSBkcm1fZGlzcGxheV9tb2RlIHByaXZhdGUgZmllbGQgd2FzIHVzYWJsZSwgdGhp cwo+IC0gKiBjb3VsZCBnbyBhd2F5Li4uCj4gLSAqCj4gLSAqIFNvIGZhciwgaXQgZG9lc24ndCBz ZWVtIHRvIGJlIHByZXNlcnZlZCB3aGVuIHRoZSBtb2RlIGlzIHBhc3NlZCBieQo+IC0gKiB0byBt b2RlX3NldCBmb3Igc29tZSByZWFzb24uCj4gLSAqLwo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IHR2 X21vZGUgKnN1bjRpX3R2X2ZpbmRfdHZfYnlfbW9kZShjb25zdCBzdHJ1Y3QKPiBkcm1fZGlzcGxh eV9tb2RlICptb2RlKSArc3RhdGljIGNvbnN0IHN0cnVjdCB0dl9tb2RlICoKPiArc3VuNGlfdHZf ZmluZF90dl9ieV9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQo+ICB7Cj4gIAlpbnQgaTsKPiAKPiAt CS8qIEZpcnN0IHRyeSB0byBpZGVudGlmeSB0aGUgbW9kZSBieSBuYW1lICovCj4gIAlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRSh0dl9tb2Rlcyk7IGkrKykgewo+ICAJCWNvbnN0IHN0cnVjdCB0 dl9tb2RlICp0dl9tb2RlID0gJnR2X21vZGVzW2ldOwo+IAo+IC0JCURSTV9ERUJVR19EUklWRVIo IkNvbXBhcmluZyBtb2RlICVzIHZzICVzIiwKPiAtCQkJCSBtb2RlLT5uYW1lLCB0dl9tb2RlLT5u YW1lKTsKPiAtCj4gLQkJaWYgKCFzdHJjbXAobW9kZS0+bmFtZSwgdHZfbW9kZS0+bmFtZSkpCj4g LQkJCXJldHVybiB0dl9tb2RlOwo+IC0JfQo+IC0KPiAtCS8qIFRoZW4gYnkgbnVtYmVyIG9mIGxp bmVzICovCj4gLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dl9tb2Rlcyk7IGkrKykgewo+ IC0JCWNvbnN0IHN0cnVjdCB0dl9tb2RlICp0dl9tb2RlID0gJnR2X21vZGVzW2ldOwo+IC0KPiAt CQlEUk1fREVCVUdfRFJJVkVSKCJDb21wYXJpbmcgbW9kZSAlcyB2cyAlcyAoWDogJWQgdnMgCiVk KSIsCj4gLQkJCQkgbW9kZS0+bmFtZSwgdHZfbW9kZS0+bmFtZSwKPiAtCQkJCSBtb2RlLT52ZGlz cGxheSwgdHZfbW9kZS0KPnZkaXNwbGF5KTsKPiAtCj4gLQkJaWYgKG1vZGUtPnZkaXNwbGF5ID09 IHR2X21vZGUtPnZkaXNwbGF5KQo+ICsJCWlmICh0dl9tb2RlLT50dl9tb2RlID09IG1vZGUpCj4g IAkJCXJldHVybiB0dl9tb2RlOwo+ICAJfQo+IAo+ICAJcmV0dXJuIE5VTEw7Cj4gIH0KPiAKPiAt c3RhdGljIHZvaWQgc3VuNGlfdHZfbW9kZV90b19kcm1fbW9kZShjb25zdCBzdHJ1Y3QgdHZfbW9k ZSAqdHZfbW9kZSwKPiAtCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIAoqbW9kZSkK PiAtewo+IC0JRFJNX0RFQlVHX0RSSVZFUigiQ3JlYXRpbmcgbW9kZSAlc1xuIiwgbW9kZS0+bmFt ZSk7Cj4gLQo+IC0JbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfRFJJVkVSOwo+IC0JbW9kZS0+ Y2xvY2sgPSAxMzUwMDsKPiAtCW1vZGUtPmZsYWdzID0gRFJNX01PREVfRkxBR19JTlRFUkxBQ0U7 Cj4gLQo+IC0JbW9kZS0+aGRpc3BsYXkgPSB0dl9tb2RlLT5oZGlzcGxheTsKPiAtCW1vZGUtPmhz eW5jX3N0YXJ0ID0gbW9kZS0+aGRpc3BsYXkgKyB0dl9tb2RlLT5oZnJvbnRfcG9yY2g7Cj4gLQlt b2RlLT5oc3luY19lbmQgPSBtb2RlLT5oc3luY19zdGFydCArIHR2X21vZGUtPmhzeW5jX2xlbjsK PiAtCW1vZGUtPmh0b3RhbCA9IG1vZGUtPmhzeW5jX2VuZCAgKyB0dl9tb2RlLT5oYmFja19wb3Jj aDsKPiAtCj4gLQltb2RlLT52ZGlzcGxheSA9IHR2X21vZGUtPnZkaXNwbGF5Owo+IC0JbW9kZS0+ dnN5bmNfc3RhcnQgPSBtb2RlLT52ZGlzcGxheSArIHR2X21vZGUtPnZmcm9udF9wb3JjaDsKPiAt CW1vZGUtPnZzeW5jX2VuZCA9IG1vZGUtPnZzeW5jX3N0YXJ0ICsgdHZfbW9kZS0+dnN5bmNfbGVu Owo+IC0JbW9kZS0+dnRvdGFsID0gbW9kZS0+dnN5bmNfZW5kICArIHR2X21vZGUtPnZiYWNrX3Bv cmNoOwo+IC19Cj4gLQo+ICBzdGF0aWMgdm9pZCBzdW40aV90dl9kaXNhYmxlKHN0cnVjdCBkcm1f ZW5jb2RlciAqZW5jb2RlciwKPiAgCQkJICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0 ZSkKPiAgewo+IEBAIC0zNTYsNyArMjgzLDExIEBAIHN0YXRpYyB2b2lkIHN1bjRpX3R2X2VuYWJs ZShzdHJ1Y3QgZHJtX2VuY29kZXIKPiAqZW5jb2Rlciwgc3RydWN0IGRybV9jcnRjX3N0YXRlICpj cnRjX3N0YXRlID0KPiAgCQlkcm1fYXRvbWljX2dldF9uZXdfY3J0Y19zdGF0ZShzdGF0ZSwgZW5j b2Rlci0+Y3J0Yyk7Cj4gIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjX3N0 YXRlLT5tb2RlOwo+IC0JY29uc3Qgc3RydWN0IHR2X21vZGUgKnR2X21vZGUgPSBzdW40aV90dl9m aW5kX3R2X2J5X21vZGUobW9kZSk7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y ID0gJnR2LT5jb25uZWN0b3I7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9z dGF0ZSA9Cj4gKwkJZHJtX2F0b21pY19nZXRfbmV3X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29u bmVjdG9yKTsKPiArCWNvbnN0IHN0cnVjdCB0dl9tb2RlICp0dl9tb2RlID0KPiArCQlzdW40aV90 dl9maW5kX3R2X2J5X21vZGUoY29ubl9zdGF0ZS0+dHYubW9kZSk7Cj4gCj4gIAlEUk1fREVCVUdf RFJJVkVSKCJFbmFibGluZyB0aGUgVFYgT3V0cHV0XG4iKTsKPiAKPiBAQCAtNDA0LDcgKzMzNSw3 IEBAIHN0YXRpYyB2b2lkIHN1bjRpX3R2X2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29k ZXIsCj4gLyogU2V0IHRoZSBsaW5lcyBzZXR1cCAqLwo+ICAJcmVnbWFwX3dyaXRlKHR2LT5yZWdz LCBTVU40SV9UVkVfTElORV9SRUcsCj4gIAkJICAgICBTVU40SV9UVkVfTElORV9GSVJTVCgyMikg fAo+IC0JCSAgICAgU1VONElfVFZFX0xJTkVfTlVNQkVSKHR2X21vZGUtPmxpbmVfbnVtYmVyKSk7 Cj4gKwkJICAgICBTVU40SV9UVkVfTElORV9OVU1CRVIobW9kZS0+dnRvdGFsKSk7Cj4gCj4gIAly ZWdtYXBfd3JpdGUodHYtPnJlZ3MsIFNVTjRJX1RWRV9MRVZFTF9SRUcsCj4gIAkJICAgICBTVU40 SV9UVkVfTEVWRUxfQkxBTksodHZfbW9kZS0+dmlkZW9fbGV2ZWxzLQo+YmxhbmspIHwKPiBAQCAt NDY3LDM1ICszOTgsNDMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJf ZnVuY3MKPiBzdW40aV90dl9oZWxwZXJfZnVuY3MgPSB7Cj4gCj4gIHN0YXRpYyBpbnQgc3VuNGlf dHZfY29tcF9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiAgewo+ IC0JaW50IGk7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKPiAKPiAtCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR2X21vZGVzKTsgaSsrKSB7Cj4gLQkJc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKm1vZGU7Cj4gLQkJY29uc3Qgc3RydWN0IHR2X21vZGUgKnR2X21vZGUgPSAm dHZfbW9kZXNbaV07Cj4gLQo+IC0JCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoY29ubmVjdG9yLT5k ZXYpOwo+IC0JCWlmICghbW9kZSkgewo+IC0JCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjcmVhdGUg YSBuZXcgZGlzcGxheSAKbW9kZVxuIik7Cj4gLQkJCXJldHVybiAwOwo+IC0JCX0KPiArCW1vZGUg PSBkcm1fbW9kZV9hbmFsb2dfbnRzY180ODBpKGNvbm5lY3Rvci0+ZGV2KTsKPiArCWlmICghbW9k ZSkgewo+ICsJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBkaXNwbGF5IG1vZGVc biIpOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+IAo+IC0JCXN0cmNweShtb2RlLT5uYW1l LCB0dl9tb2RlLT5uYW1lKTsKPiArCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9QUkVGRVJS RUQ7Cj4gKwlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7Cj4gCj4gLQkJc3Vu NGlfdHZfbW9kZV90b19kcm1fbW9kZSh0dl9tb2RlLCBtb2RlKTsKPiAtCQlkcm1fbW9kZV9wcm9i ZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7Cj4gKwltb2RlID0gZHJtX21vZGVfYW5hbG9nX3BhbF81 NzZpKGNvbm5lY3Rvci0+ZGV2KTsKPiArCWlmICghbW9kZSkgewo+ICsJCURSTV9FUlJPUigiRmFp bGVkIHRvIGNyZWF0ZSBhIG5ldyBkaXNwbGF5IG1vZGVcbiIpOwo+ICsJCXJldHVybiAtRU5PTUVN Owo+ICAJfQo+IAo+IC0JcmV0dXJuIGk7Cj4gKwlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3Rv ciwgbW9kZSk7Cj4gKwo+ICsJcmV0dXJuIDI7Cj4gIH0KPiAKPiAgc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcwo+IHN1bjRpX3R2X2NvbXBfY29ubmVjdG9yX2hl bHBlcl9mdW5jcyA9IHsgKwkuYXRvbWljX2NoZWNrCT0KPiBkcm1fYXRvbWljX2hlbHBlcl9jb25u ZWN0b3JfdHZfY2hlY2ssCj4gIAkuZ2V0X21vZGVzCT0gc3VuNGlfdHZfY29tcF9nZXRfbW9kZXMs Cj4gIH07Cj4gCj4gK3N0YXRpYyB2b2lkIHN1bjRpX3R2X2Nvbm5lY3Rvcl9yZXNldChzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlkcm1fYXRvbWljX2hlbHBlcl9jb25u ZWN0b3JfcmVzZXQoY29ubmVjdG9yKTsKPiArCWRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl90 dl9yZXNldChjb25uZWN0b3IpOwo+ICt9Cj4gKwo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9j b25uZWN0b3JfZnVuY3Mgc3VuNGlfdHZfY29tcF9jb25uZWN0b3JfZnVuY3MgPSB7Cj4gIAkuZmls bF9tb2RlcwkJPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCj4gIAku ZGVzdHJveQkJPSBkcm1fY29ubmVjdG9yX2NsZWFudXAsCj4gLQkucmVzZXQJCQk9IApkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCj4gKwkucmVzZXQJCQk9IHN1bjRpX3R2X2Nvbm5l Y3Rvcl9yZXNldCwKPiAgCS5hdG9taWNfZHVwbGljYXRlX3N0YXRlCT0gCmRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9kdXBsaWNhdGVfc3RhdGUsCj4gIAkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUJ PSAKZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gIH07Cj4gQEAg LTU4Nyw4ICs1MjYsMjAgQEAgc3RhdGljIGludCBzdW40aV90dl9iaW5kKHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0Cj4gZGV2aWNlICptYXN0ZXIsCj4gCj4gIAlkcm1fY29ubmVjdG9yX2F0dGFj aF9lbmNvZGVyKCZ0di0+Y29ubmVjdG9yLCAmdHYtPmVuY29kZXIpOwo+IAo+ICsJcmV0ID0gZHJt X21vZGVfY3JlYXRlX3R2X3Byb3BlcnRpZXMoZHJtLAo+ICsJCQkJCSAgICAKQklUKERSTV9NT0RF X1RWX01PREVfTlRTQykgfAo+ICsJCQkJCSAgICAKQklUKERSTV9NT0RFX1RWX01PREVfUEFMKSk7 Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gZXJyX2NsZWFudXBfY29ubmVjdG9yOwo+ICsKPiArCWRy bV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5KCZ0di0+Y29ubmVjdG9yLmJhc2UsCj4gKwkJCQkgICBk cm0tCj5tb2RlX2NvbmZpZy50dl9tb2RlX3Byb3BlcnR5LAo+ICsJCQkJICAgRFJNX01PREVfVFZf TU9ERV9OVFNDKTsKPiArCj4gIAlyZXR1cm4gMDsKPiAKPiArZXJyX2NsZWFudXBfY29ubmVjdG9y Ogo+ICsJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKCZ0di0+Y29ubmVjdG9yKTsKPiAgZXJyX2NsZWFu dXBfZW5jb2RlcjoKPiAgCWRybV9lbmNvZGVyX2NsZWFudXAoJnR2LT5lbmNvZGVyKTsKPiAgZXJy X2Rpc2FibGVfY2xrOgo+IAo+IC0tCj4gYjQgMC4xMS4wLWRldi03ZGE1MgoKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1h aWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A4B9EC433FE for ; Thu, 13 Oct 2022 18:23:59 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id ED8F110E303; Thu, 13 Oct 2022 18:23:57 +0000 (UTC) Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by gabe.freedesktop.org (Postfix) with ESMTPS id 80E4C10E303; Thu, 13 Oct 2022 18:23:55 +0000 (UTC) Received: by mail-ed1-x52b.google.com with SMTP id a67so3749972edf.12; Thu, 13 Oct 2022 11:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=FSJPenagde4qSchQNLIGuKH7m39FqdZYDX4cXscDrSd4DQs0L1KMc4rzYAQdelzOnj UF6Ak0NK52yT8/8DfdNJEj9A6gPHnDn66V7+1VWIUqHsECMy3uBtxD1ZuMqhx07ZGxmH JrBntFO5CY3UNA85w3OBtKxuhgF5e76Lt7ylZMABNDblsdysCHcDVS8mPFZv9H1JdZ/I AKJH0uhU+XEyG10Nd+LEc8vJ0DUGh/1JFMAtnOsnuQLT22u523AH4mmuX/7Zqs6DzjRA bG2+Qr5Isa0Tcz+PCt82cXW69Q2hRvI0SGZdd/KO1uPpP7a67dpLrTUV1TBOjvgtGohS UKkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=80yVJmDj5IDbUK+aqS6l/dUBm+Bwn69DEdWiolHKVEQ=; b=JAMfg5Bvy3V5S23i3bvj5+daieW9U/8SUe7TWU1FUGarNC4NcH2hVrP7uqrSNRguPG OFGt0e/5ScZjRSPfkv/vdvUWD/y9inbnbhdwKOSWQhmm1Ys0fyTqGTlfyuhbE57flE16 3NU4sF2DpLRU+TVO1UivLhSLheUHMExD46iKJJAmOlx64zUb6c82pGCbvzVnhcw0Fy7K jqiMo9uInPEAOCoLbr4DIZsWqwxp10mMDsqxPPNk3irmz9iDkovxLT55H9VZPzwk3QxW BDG5Fe8L7AknFNHBmVyZ0TrtMWi32oDpV/xcC3MkyinWLt2wCAy2u0DQuj7/2t5osJl6 jRYA== X-Gm-Message-State: ACrzQf0/4kMhK9vMcc2UGww+Cn6FfqJog3q5QovqKr9Io38VWriXHLS5 9VWe7vJWbXGcTEJqxGECaPI= X-Google-Smtp-Source: AMsMyM7ssKdTrHDlPNauUb77WDG9zWLblYWKO18kRWRI7jkR1dhN23ZFAp3iq6h3HOsgFFKHyT7dhQ== X-Received: by 2002:a05:6402:b3c:b0:458:f680:6ab8 with SMTP id bo28-20020a0564020b3c00b00458f6806ab8mr923431edb.267.1665685433991; Thu, 13 Oct 2022 11:23:53 -0700 (PDT) Received: from kista.localnet (82-149-19-102.dynamic.telemach.net. [82.149.19.102]) by smtp.gmail.com with ESMTPSA id e2-20020a170906314200b00730df07629fsm196329eje.174.2022.10.13.11.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Oct 2022 11:23:53 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Karol Herbst , Jani Nikula , Tvrtko Ursulin , Daniel Vetter , Maarten Lankhorst , David Airlie , Joonas Lahtinen , Lyude Paul , Maxime Ripard , Emma Anholt , Chen-Yu Tsai , Samuel Holland , Ben Skeggs , Thomas Zimmermann , Rodrigo Vivi , Maxime Ripard Subject: Re: [PATCH v5 22/22] drm/sun4i: tv: Convert to the new TV mode property Date: Thu, 13 Oct 2022 20:23:51 +0200 Message-ID: <6482539.4vTCxPXJkl@kista> In-Reply-To: <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> References: <20220728-rpi-analog-tv-properties-v5-0-d841cc64fe4b@cerno.tech> <20220728-rpi-analog-tv-properties-v5-22-d841cc64fe4b@cerno.tech> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: 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 =?ISO-8859-1?Q?Tr=C3=B8nnes?= , Geert Uytterhoeven , Maxime Ripard , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi Maxime, Dne =C4=8Detrtek, 13. oktober 2022 ob 15:19:06 CEST je Maxime Ripard napisa= l(a): > Now that the core can deal fine with analog TV modes, let's convert the > sun4i TV driver to leverage those new features. >=20 > Acked-by: Noralf Tr=C3=B8nnes > Signed-off-by: Maxime Ripard >=20 > --- > Changes in v5: > - Removed the count variable in get_modes > - Removed spurious vc4 change > --- > drivers/gpu/drm/sun4i/sun4i_tv.c | 145 > +++++++++++++-------------------------- 1 file changed, 48 insertions(+), > 97 deletions(-) >=20 > diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c > b/drivers/gpu/drm/sun4i/sun4i_tv.c index c65f0a89b6b0..4f07aff11551 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_tv.c > +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c > @@ -141,23 +141,14 @@ struct resync_parameters { > struct tv_mode { > char *name; >=20 > + unsigned int tv_mode; > + > u32 mode; > u32 chroma_freq; > u16 back_porch; > u16 front_porch; > - u16 line_number; > u16 vblank_level; isn't there a way to get or calculate back_porch, front_porch and vblank_le= vel=20 from mode? From quick glance over removed values below, I would say that at= =20 least back_porch can be removed too? Otherwise this patch looks ok. Best regards, Jernej >=20 > - u32 hdisplay; > - u16 hfront_porch; > - u16 hsync_len; > - u16 hback_porch; > - > - u32 vdisplay; > - u16 vfront_porch; > - u16 vsync_len; > - u16 vback_porch; > - > bool yc_en; > bool dac3_en; > bool dac_bit25_en; > @@ -213,7 +204,7 @@ static const struct resync_parameters > pal_resync_parameters =3D { >=20 > static const struct tv_mode tv_modes[] =3D { > { > - .name =3D "NTSC", > + .tv_mode =3D DRM_MODE_TV_MODE_NTSC, > .mode =3D SUN4I_TVE_CFG0_RES_480i, > .chroma_freq =3D 0x21f07c1f, > .yc_en =3D true, > @@ -222,17 +213,6 @@ static const struct tv_mode tv_modes[] =3D { >=20 > .back_porch =3D 118, > .front_porch =3D 32, > - .line_number =3D 525, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 18, > - .hsync_len =3D 2, > - .hback_porch =3D 118, > - > - .vdisplay =3D 480, > - .vfront_porch =3D 26, > - .vsync_len =3D 2, > - .vback_porch =3D 17, >=20 > .vblank_level =3D 240, >=20 > @@ -242,23 +222,12 @@ static const struct tv_mode tv_modes[] =3D { > .resync_params =3D &ntsc_resync_parameters, > }, > { > - .name =3D "PAL", > + .tv_mode =3D DRM_MODE_TV_MODE_PAL, > .mode =3D SUN4I_TVE_CFG0_RES_576i, > .chroma_freq =3D 0x2a098acb, >=20 > .back_porch =3D 138, > .front_porch =3D 24, > - .line_number =3D 625, > - > - .hdisplay =3D 720, > - .hfront_porch =3D 3, > - .hsync_len =3D 2, > - .hback_porch =3D 139, > - > - .vdisplay =3D 576, > - .vfront_porch =3D 28, > - .vsync_len =3D 2, > - .vback_porch =3D 19, >=20 > .vblank_level =3D 252, >=20 > @@ -276,63 +245,21 @@ drm_encoder_to_sun4i_tv(struct drm_encoder *encoder) > encoder); > } >=20 > -/* > - * FIXME: If only the drm_display_mode private field was usable, this > - * could go away... > - * > - * So far, it doesn't seem to be preserved when the mode is passed by > - * to mode_set for some reason. > - */ > -static const struct tv_mode *sun4i_tv_find_tv_by_mode(const struct > drm_display_mode *mode) +static const struct tv_mode * > +sun4i_tv_find_tv_by_mode(unsigned int mode) > { > int i; >=20 > - /* First try to identify the mode by name */ > for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > const struct tv_mode *tv_mode =3D &tv_modes[i]; >=20 > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s", > - mode->name, tv_mode->name); > - > - if (!strcmp(mode->name, tv_mode->name)) > - return tv_mode; > - } > - > - /* Then by number of lines */ > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - DRM_DEBUG_DRIVER("Comparing mode %s vs %s (X: %d vs=20 %d)", > - mode->name, tv_mode->name, > - mode->vdisplay, tv_mode- >vdisplay); > - > - if (mode->vdisplay =3D=3D tv_mode->vdisplay) > + if (tv_mode->tv_mode =3D=3D mode) > return tv_mode; > } >=20 > return NULL; > } >=20 > -static void sun4i_tv_mode_to_drm_mode(const struct tv_mode *tv_mode, > - struct drm_display_mode=20 *mode) > -{ > - DRM_DEBUG_DRIVER("Creating mode %s\n", mode->name); > - > - mode->type =3D DRM_MODE_TYPE_DRIVER; > - mode->clock =3D 13500; > - mode->flags =3D DRM_MODE_FLAG_INTERLACE; > - > - mode->hdisplay =3D tv_mode->hdisplay; > - mode->hsync_start =3D mode->hdisplay + tv_mode->hfront_porch; > - mode->hsync_end =3D mode->hsync_start + tv_mode->hsync_len; > - mode->htotal =3D mode->hsync_end + tv_mode->hback_porch; > - > - mode->vdisplay =3D tv_mode->vdisplay; > - mode->vsync_start =3D mode->vdisplay + tv_mode->vfront_porch; > - mode->vsync_end =3D mode->vsync_start + tv_mode->vsync_len; > - mode->vtotal =3D mode->vsync_end + tv_mode->vback_porch; > -} > - > static void sun4i_tv_disable(struct drm_encoder *encoder, > struct drm_atomic_state *state) > { > @@ -356,7 +283,11 @@ static void sun4i_tv_enable(struct drm_encoder > *encoder, struct drm_crtc_state *crtc_state =3D > drm_atomic_get_new_crtc_state(state, encoder->crtc); > struct drm_display_mode *mode =3D &crtc_state->mode; > - const struct tv_mode *tv_mode =3D sun4i_tv_find_tv_by_mode(mode); > + struct drm_connector *connector =3D &tv->connector; > + struct drm_connector_state *conn_state =3D > + drm_atomic_get_new_connector_state(state, connector); > + const struct tv_mode *tv_mode =3D > + sun4i_tv_find_tv_by_mode(conn_state->tv.mode); >=20 > DRM_DEBUG_DRIVER("Enabling the TV Output\n"); >=20 > @@ -404,7 +335,7 @@ static void sun4i_tv_enable(struct drm_encoder *encod= er, > /* Set the lines setup */ > regmap_write(tv->regs, SUN4I_TVE_LINE_REG, > SUN4I_TVE_LINE_FIRST(22) | > - SUN4I_TVE_LINE_NUMBER(tv_mode->line_number)); > + SUN4I_TVE_LINE_NUMBER(mode->vtotal)); >=20 > regmap_write(tv->regs, SUN4I_TVE_LEVEL_REG, > SUN4I_TVE_LEVEL_BLANK(tv_mode->video_levels- >blank) | > @@ -467,35 +398,43 @@ static const struct drm_encoder_helper_funcs > sun4i_tv_helper_funcs =3D { >=20 > static int sun4i_tv_comp_get_modes(struct drm_connector *connector) > { > - int i; > + struct drm_display_mode *mode; >=20 > - for (i =3D 0; i < ARRAY_SIZE(tv_modes); i++) { > - struct drm_display_mode *mode; > - const struct tv_mode *tv_mode =3D &tv_modes[i]; > - > - mode =3D drm_mode_create(connector->dev); > - if (!mode) { > - DRM_ERROR("Failed to create a new display=20 mode\n"); > - return 0; > - } > + mode =3D drm_mode_analog_ntsc_480i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > + } >=20 > - strcpy(mode->name, tv_mode->name); > + mode->type |=3D DRM_MODE_TYPE_PREFERRED; > + drm_mode_probed_add(connector, mode); >=20 > - sun4i_tv_mode_to_drm_mode(tv_mode, mode); > - drm_mode_probed_add(connector, mode); > + mode =3D drm_mode_analog_pal_576i(connector->dev); > + if (!mode) { > + DRM_ERROR("Failed to create a new display mode\n"); > + return -ENOMEM; > } >=20 > - return i; > + drm_mode_probed_add(connector, mode); > + > + return 2; > } >=20 > static const struct drm_connector_helper_funcs > sun4i_tv_comp_connector_helper_funcs =3D { + .atomic_check =3D > drm_atomic_helper_connector_tv_check, > .get_modes =3D sun4i_tv_comp_get_modes, > }; >=20 > +static void sun4i_tv_connector_reset(struct drm_connector *connector) > +{ > + drm_atomic_helper_connector_reset(connector); > + drm_atomic_helper_connector_tv_reset(connector); > +} > + > static const struct drm_connector_funcs sun4i_tv_comp_connector_funcs = =3D { > .fill_modes =3D drm_helper_probe_single_connector_modes, > .destroy =3D drm_connector_cleanup, > - .reset =3D=20 drm_atomic_helper_connector_reset, > + .reset =3D sun4i_tv_connector_reset, > .atomic_duplicate_state =3D=20 drm_atomic_helper_connector_duplicate_state, > .atomic_destroy_state =3D=20 drm_atomic_helper_connector_destroy_state, > }; > @@ -587,8 +526,20 @@ static int sun4i_tv_bind(struct device *dev, struct > device *master, >=20 > drm_connector_attach_encoder(&tv->connector, &tv->encoder); >=20 > + ret =3D drm_mode_create_tv_properties(drm, > + =20 BIT(DRM_MODE_TV_MODE_NTSC) | > + =20 BIT(DRM_MODE_TV_MODE_PAL)); > + if (ret) > + goto err_cleanup_connector; > + > + drm_object_attach_property(&tv->connector.base, > + drm- >mode_config.tv_mode_property, > + DRM_MODE_TV_MODE_NTSC); > + > return 0; >=20 > +err_cleanup_connector: > + drm_connector_cleanup(&tv->connector); > err_cleanup_encoder: > drm_encoder_cleanup(&tv->encoder); > err_disable_clk: >=20 > -- > b4 0.11.0-dev-7da52