drm/rockchip: inno_hdmi: Remove tmds rate from structure
authorMaxime Ripard <mripard@kernel.org>
Fri, 22 Dec 2023 17:42:03 +0000 (18:42 +0100)
committerHeiko Stuebner <heiko@sntech.de>
Fri, 29 Dec 2023 23:33:21 +0000 (00:33 +0100)
The tmds_rate field in the inno_hdmi structure is used mostly to
configure the internal i2c controller divider through a call to the
inno_hdmi_i2c_init() function.

We can simply make that rate an argument to that function, which also
removes a workaround to initialize the divider at probe time when we
don't have a mode yet.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
Tested-by: Alex Bee <knaerzche@gmail.com>
Signed-off-by: Alex Bee <knaerzche@gmail.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20231222174220.55249-13-knaerzche@gmail.com
drivers/gpu/drm/rockchip/inno_hdmi.c

index b5ba5fecbec970c45c017fc5ca96c218a9728eca..682087275aeb57688f94517c922c4bc3162b67fd 100644 (file)
@@ -55,8 +55,6 @@ struct inno_hdmi {
        struct inno_hdmi_i2c *i2c;
        struct i2c_adapter *ddc;
 
-       unsigned int tmds_rate;
-
        struct hdmi_data_info   hdmi_data;
 };
 
@@ -133,11 +131,11 @@ static inline void hdmi_modb(struct inno_hdmi *hdmi, u16 offset,
        hdmi_writeb(hdmi, offset, temp);
 }
 
-static void inno_hdmi_i2c_init(struct inno_hdmi *hdmi)
+static void inno_hdmi_i2c_init(struct inno_hdmi *hdmi, unsigned long long rate)
 {
-       int ddc_bus_freq;
+       unsigned long long ddc_bus_freq = rate >> 2;
 
-       ddc_bus_freq = (hdmi->tmds_rate >> 2) / HDMI_SCL_RATE;
+       do_div(ddc_bus_freq, 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);
@@ -420,8 +418,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_hdmi_i2c_init(hdmi);
+       inno_hdmi_i2c_init(hdmi, mode->clock * 1000);
 
        /* Unmute video and audio output */
        hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK,
@@ -799,8 +796,7 @@ static int inno_hdmi_bind(struct device *dev, struct device *master,
         * 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);
+       inno_hdmi_i2c_init(hdmi, clk_get_rate(hdmi->pclk));
 
        ret = inno_hdmi_register(drm, hdmi);
        if (ret)