Commit 5f924748 authored by Maxime Ripard's avatar Maxime Ripard Committed by Heiko Stuebner

drm/rockchip: inno_hdmi: Remove tmds rate from structure

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: default avatarMaxime Ripard <mripard@kernel.org>
Tested-by: default avatarAlex Bee <knaerzche@gmail.com>
Signed-off-by: default avatarAlex Bee <knaerzche@gmail.com>
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20231222174220.55249-13-knaerzche@gmail.com
parent 139771b8
...@@ -55,8 +55,6 @@ struct inno_hdmi { ...@@ -55,8 +55,6 @@ struct inno_hdmi {
struct inno_hdmi_i2c *i2c; struct inno_hdmi_i2c *i2c;
struct i2c_adapter *ddc; struct i2c_adapter *ddc;
unsigned int tmds_rate;
struct hdmi_data_info hdmi_data; struct hdmi_data_info hdmi_data;
}; };
...@@ -133,11 +131,11 @@ static inline void hdmi_modb(struct inno_hdmi *hdmi, u16 offset, ...@@ -133,11 +131,11 @@ static inline void hdmi_modb(struct inno_hdmi *hdmi, u16 offset,
hdmi_writeb(hdmi, offset, temp); 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_L, ddc_bus_freq & 0xFF);
hdmi_writeb(hdmi, DDC_BUS_FREQ_H, (ddc_bus_freq >> 8) & 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, ...@@ -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 * DCLK_LCDC, so we need to init the TMDS rate to mode pixel
* clock rate, and reconfigure the DDC clock. * clock rate, and reconfigure the DDC clock.
*/ */
hdmi->tmds_rate = mode->clock * 1000; inno_hdmi_i2c_init(hdmi, mode->clock * 1000);
inno_hdmi_i2c_init(hdmi);
/* Unmute video and audio output */ /* Unmute video and audio output */
hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, 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, ...@@ -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, * PCLK_HDMI, so we need to init the TMDS rate to PCLK rate,
* and reconfigure the DDC clock. * and reconfigure the DDC clock.
*/ */
hdmi->tmds_rate = clk_get_rate(hdmi->pclk); inno_hdmi_i2c_init(hdmi, clk_get_rate(hdmi->pclk));
inno_hdmi_i2c_init(hdmi);
ret = inno_hdmi_register(drm, hdmi); ret = inno_hdmi_register(drm, hdmi);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment