From: Alex Bee <knaerzche@gmail.com>
To: Maxime Ripard <mripard@kernel.org>
Cc: "Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>, "Andy Yan" <andyshrk@163.com>,
"Rob Herring" <robh+dt@kernel.org>,
"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Daniel Vetter" <daniel@ffwll.ch>,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 19/27] drm/rockchip: inno_hdmi: Move tmds rate to connector state subclass
Date: Mon, 18 Dec 2023 13:49:52 +0100 [thread overview]
Message-ID: <cbb7866c-5e72-4656-966e-9c2244afedbd@gmail.com> (raw)
In-Reply-To: <xte5vjc3o77wnlozz6sy5yysiezdxbzvbwdblhbqb5s2nwnnv5@xxknftdeo6uk>
Am 18.12.23 um 11:06 schrieb Maxime Ripard:
> Hi,
>
> On Sat, Dec 16, 2023 at 05:26:30PM +0100, Alex Bee wrote:
>> Similar to the othter members of inno_hdmi_connector_state the tmds_rate is
>> not a property of the device, but of the connector state. Move it to
>> inno_hdmi_connector_state and make it a long to comply with the clock
>> framework. To get arround the issue of not having the connector state when
>> inno_hdmi_i2c_init is called in the bind path, getting the tmds rate is
>> wrapped in function which returns the fallback rate if the connector
>> doesn't have a state yet.
>>
>> Signed-off-by: Alex Bee <knaerzche@gmail.com>
>> ---
>> changes in v2:
>> - new patch
>>
>> drivers/gpu/drm/rockchip/inno_hdmi.c | 36 +++++++++++++++++++---------
>> 1 file changed, 25 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c
>> index f9bfae1e97a2..6799d24501b8 100644
>> --- a/drivers/gpu/drm/rockchip/inno_hdmi.c
>> +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c
>> @@ -47,14 +47,13 @@ struct inno_hdmi {
>>
>> struct inno_hdmi_i2c *i2c;
>> struct i2c_adapter *ddc;
>> -
>> - unsigned int tmds_rate;
>> };
>>
>> struct inno_hdmi_connector_state {
>> struct drm_connector_state base;
>> unsigned int enc_out_format;
>> unsigned int colorimetry;
>> + unsigned long tmds_rate;
>> };
>>
>> static struct inno_hdmi *encoder_to_inno_hdmi(struct drm_encoder *encoder)
>> @@ -133,11 +132,33 @@ static inline void hdmi_modb(struct inno_hdmi *hdmi, u16 offset,
>> hdmi_writeb(hdmi, offset, temp);
>> }
>>
>> +static unsigned long inno_hdmi_tmds_rate(struct inno_hdmi *hdmi)
>> +{
>> + struct drm_connector *connector = &hdmi->connector;
>> + struct drm_connector_state *conn_state = connector->state;
>> + struct inno_hdmi_connector_state *inno_conn_state;
>> +
>> + if (conn_state) {
>> + inno_conn_state = to_inno_hdmi_conn_state(conn_state);
>> + return inno_conn_state->tmds_rate;
>> + }
>> +
>> + /*
>> + * When IP controller haven't configured to an accurate video
>> + * timing, then the TMDS clock source would be switched to
>> + * PCLK_HDMI, so we need to init the TMDS rate to PCLK rate,
>> + * and reconfigure the DDC clock.
>> + */
>> +
>> + return clk_get_rate(hdmi->pclk);
>> +}
>> +
>> static void inno_hdmi_i2c_init(struct inno_hdmi *hdmi)
>> {
>> int ddc_bus_freq;
>> + unsigned long tmds_rate = inno_hdmi_tmds_rate(hdmi);
>>
>> - ddc_bus_freq = (hdmi->tmds_rate >> 2) / HDMI_SCL_RATE;
>> + ddc_bus_freq = (tmds_rate >> 2) / HDMI_SCL_RATE;
>>
>> hdmi_writeb(hdmi, DDC_BUS_FREQ_L, ddc_bus_freq & 0xFF);
>> hdmi_writeb(hdmi, DDC_BUS_FREQ_H, (ddc_bus_freq >> 8) & 0xFF);
>> @@ -431,7 +452,7 @@ static int inno_hdmi_setup(struct inno_hdmi *hdmi,
>> * DCLK_LCDC, so we need to init the TMDS rate to mode pixel
>> * clock rate, and reconfigure the DDC clock.
>> */
>> - hdmi->tmds_rate = mode->clock * 1000;
>> + inno_conn_state->tmds_rate = mode->clock * 1000;
>> inno_hdmi_i2c_init(hdmi);
>>
>> /* Unmute video and audio output */
>> @@ -823,13 +844,6 @@ static int inno_hdmi_bind(struct device *dev, struct device *master,
>> goto err_disable_clk;
>> }
>>
>> - /*
>> - * When IP controller haven't configured to an accurate video
>> - * timing, then the TMDS clock source would be switched to
>> - * PCLK_HDMI, so we need to init the TMDS rate to PCLK rate,
>> - * and reconfigure the DDC clock.
>> - */
>> - hdmi->tmds_rate = clk_get_rate(hdmi->pclk);
>> inno_hdmi_i2c_init(hdmi);
> I still think my patch is better there.
>
> There's two places that use the inno_hdmi.tmds_rate field: the two
> callers of inno_hdmi_i2c_init(). One is at bind time and needs to
> initialise it with a sane default since we don't have a mode set yet,
> the other is to update the internal clock rate while we have a mode set.
That’s, unfortunately, not fully true: inno_hdmi_set_pwr_mode not only
called at mode_set-time, but also in inno_hdmi_reset which is called in the
bind path (where we do not have a mode). That’s the point why I thought
extracting this in function makes sense. Otherwise I would have to pass the
tmds_rate to inno_hdmi_set_pwr_mode (also for the LOWER_PWR-case where I
don't need it) or do that whole fallback-if-no-mode thing in
inno_hdmi_set_pwr_mode directly. Neither would make the code easier to
follow. Being able to use it in inno_hdmi_i2c_init also is a nice gimmick.
I agree, having it in the custom connector state is not strictly required,
but I'd really like to keep the wrapping function.
Alex
> Since there's a single "modeset" user, there's no need to store it in
> the state structure at all: it can be a local variable.
>
> And in the bind function, you're not going to use the state structure
> either since there's no state, and it's just a default that has no
> relation to the modeset code at all.
>
> Your function on the other end tries to reconcile and handle the two.
> But there's no reason to, it just makes the code harder to follow. Just
> pass the parent rate you want to init with as an argument and it's easy
> to read and maintain.
>
> Maxime
next prev parent reply other threads:[~2023-12-18 12:49 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-16 16:26 [PATCH v2 00/27] Add HDMI support for RK3128 Alex Bee
2023-12-16 16:26 ` [PATCH v2 01/27] dt-bindings: display: rockchip,inno-hdmi: Document RK3128 compatible Alex Bee
2023-12-17 21:00 ` Conor Dooley
2023-12-16 16:26 ` [PATCH v2 02/27] drm/rockchip: vop: Add output selection registers for RK312x Alex Bee
2023-12-16 16:26 ` [PATCH v2 03/27] drm/rockchip: inno_hdmi: Fix video timing Alex Bee
2023-12-16 16:26 ` [PATCH v2 04/27] drm/rockchip: inno_hdmi: Remove useless mode_fixup Alex Bee
2023-12-18 8:38 ` Maxime Ripard
2023-12-16 16:26 ` [PATCH v2 05/27] drm/rockchip: inno_hdmi: Remove useless copy of drm_display_mode Alex Bee
2023-12-16 16:26 ` [PATCH v2 06/27] drm/rockchip: inno_hdmi: Switch encoder hooks to atomic Alex Bee
2023-12-16 16:26 ` [PATCH v2 07/27] drm/rockchip: inno_hdmi: Get rid of mode_set Alex Bee
2023-12-16 16:26 ` [PATCH v2 08/27] drm/rockchip: inno_hdmi: no need to store vic Alex Bee
2023-12-16 16:26 ` [PATCH v2 09/27] drm/rockchip: inno_hdmi: Remove unneeded has audio flag Alex Bee
2023-12-16 16:26 ` [PATCH v2 10/27] drm/rockchip: inno_hdmi: Remove useless input format Alex Bee
2023-12-16 16:26 ` [PATCH v2 11/27] drm/rockchip: inno_hdmi: Remove YUV-based csc coefficents Alex Bee
2023-12-16 16:26 ` [PATCH v2 12/27] drm/rockchip: inno_hdmi: Drop HDMI Vendor Infoframe support Alex Bee
2023-12-16 16:26 ` [PATCH v2 13/27] drm/rockchip: inno_hdmi: Move infoframe disable to separate function Alex Bee
2023-12-16 16:26 ` [PATCH v2 14/27] drm/rockchip: inno_hdmi: Switch to infoframe type Alex Bee
2023-12-16 16:26 ` [PATCH v2 15/27] drm/rockchip: inno_hdmi: Remove unused drm device pointer Alex Bee
2023-12-16 16:26 ` [PATCH v2 16/27] drm/rockchip: inno_hdmi: Drop irq struct member Alex Bee
2023-12-18 9:00 ` Maxime Ripard
2023-12-16 16:26 ` [PATCH v2 17/27] drm/rockchip: inno_hdmi: Remove useless include Alex Bee
2023-12-18 9:00 ` Maxime Ripard
2023-12-16 16:26 ` [PATCH v2 18/27] drm/rockchip: inno_hdmi: Subclass connector state Alex Bee
2023-12-18 9:02 ` Maxime Ripard
2023-12-18 12:32 ` Alex Bee
2023-12-16 16:26 ` [PATCH v2 19/27] drm/rockchip: inno_hdmi: Move tmds rate to connector state subclass Alex Bee
2023-12-18 10:06 ` Maxime Ripard
2023-12-18 12:49 ` Alex Bee [this message]
2023-12-22 17:51 ` Alex Bee
2023-12-16 16:26 ` [PATCH v2 20/27] drm/rockchip: inno_hdmi: Correctly setup HDMI quantization range Alex Bee
2023-12-18 9:05 ` Maxime Ripard
2023-12-18 12:37 ` Alex Bee
2023-12-18 13:13 ` Maxime Ripard
2023-12-16 16:26 ` [PATCH v2 21/27] drm/rockchip: inno_hdmi: Add variant support Alex Bee
2023-12-16 16:26 ` [PATCH v2 22/27] drm/rockchip: inno_hdmi: Add RK3128 support Alex Bee
2023-12-16 16:26 ` [PATCH v2 23/27] drm/rockchip: inno_hdmi: Add basic mode validation Alex Bee
2023-12-18 9:06 ` Maxime Ripard
2023-12-16 16:26 ` [PATCH v2 24/27] drm/rockchip: inno_hdmi: Drop custom fill_modes hook Alex Bee
2023-12-18 9:06 ` Maxime Ripard
2023-12-16 16:26 ` [PATCH v2 25/27] ARM: dts: rockchip: Add display subsystem for RK3128 Alex Bee
2023-12-16 16:26 ` [PATCH v2 26/27] ARM: dts: rockchip: Add HDMI node " Alex Bee
2023-12-16 16:26 ` [PATCH v2 27/27] ARM: dts: rockchip: Enable HDMI output for XPI-3128 Alex Bee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cbb7866c-5e72-4656-966e-9c2244afedbd@gmail.com \
--to=knaerzche@gmail.com \
--cc=airlied@gmail.com \
--cc=andyshrk@163.com \
--cc=conor+dt@kernel.org \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=heiko@sntech.de \
--cc=hjc@rock-chips.com \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=robh+dt@kernel.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox