Commit f01e33cb authored by Alex Bee's avatar Alex Bee Committed by Heiko Stuebner

drm/rockchip: inno_hdmi: Split power mode setting

This splits setting the power mode of the controller / phy in two
functions. It's done in preparation of setting up the phy based on the
pixelclock.

No functional changes intended.
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-23-knaerzche@gmail.com
parent 71892cee
...@@ -153,15 +153,22 @@ static void inno_hdmi_sys_power(struct inno_hdmi *hdmi, bool enable) ...@@ -153,15 +153,22 @@ static void inno_hdmi_sys_power(struct inno_hdmi *hdmi, bool enable)
hdmi_modb(hdmi, HDMI_SYS_CTRL, m_POWER, v_PWR_OFF); hdmi_modb(hdmi, HDMI_SYS_CTRL, m_POWER, v_PWR_OFF);
} }
static void inno_hdmi_set_pwr_mode(struct inno_hdmi *hdmi, int mode) static void inno_hdmi_standby(struct inno_hdmi *hdmi)
{
inno_hdmi_sys_power(hdmi, false);
hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0x00);
hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x00);
hdmi_writeb(hdmi, HDMI_PHY_CHG_PWR, 0x00);
hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15);
};
static void inno_hdmi_power_up(struct inno_hdmi *hdmi)
{ {
switch (mode) {
case NORMAL:
inno_hdmi_sys_power(hdmi, false); inno_hdmi_sys_power(hdmi, false);
hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x6f); hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x6f);
hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0xbb); hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0xbb);
hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15); hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15);
hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x14); hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x14);
hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x10); hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x10);
...@@ -170,21 +177,7 @@ static void inno_hdmi_set_pwr_mode(struct inno_hdmi *hdmi, int mode) ...@@ -170,21 +177,7 @@ static void inno_hdmi_set_pwr_mode(struct inno_hdmi *hdmi, int mode)
hdmi_writeb(hdmi, HDMI_PHY_SYNC, 0x01); hdmi_writeb(hdmi, HDMI_PHY_SYNC, 0x01);
inno_hdmi_sys_power(hdmi, true); inno_hdmi_sys_power(hdmi, true);
break; };
case LOWER_PWR:
inno_hdmi_sys_power(hdmi, false);
hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0x00);
hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x00);
hdmi_writeb(hdmi, HDMI_PHY_CHG_PWR, 0x00);
hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15);
break;
default:
DRM_DEV_ERROR(hdmi->dev, "Unknown power mode %d\n", mode);
}
}
static void inno_hdmi_reset(struct inno_hdmi *hdmi) static void inno_hdmi_reset(struct inno_hdmi *hdmi)
{ {
...@@ -201,7 +194,7 @@ static void inno_hdmi_reset(struct inno_hdmi *hdmi) ...@@ -201,7 +194,7 @@ static void inno_hdmi_reset(struct inno_hdmi *hdmi)
val = v_REG_CLK_INV | v_REG_CLK_SOURCE_SYS | v_PWR_ON | v_INT_POL_HIGH; val = v_REG_CLK_INV | v_REG_CLK_SOURCE_SYS | v_PWR_ON | v_INT_POL_HIGH;
hdmi_modb(hdmi, HDMI_SYS_CTRL, msk, val); hdmi_modb(hdmi, HDMI_SYS_CTRL, msk, val);
inno_hdmi_set_pwr_mode(hdmi, LOWER_PWR); inno_hdmi_standby(hdmi);
} }
static void inno_hdmi_disable_frame(struct inno_hdmi *hdmi, static void inno_hdmi_disable_frame(struct inno_hdmi *hdmi,
...@@ -440,6 +433,8 @@ static int inno_hdmi_setup(struct inno_hdmi *hdmi, ...@@ -440,6 +433,8 @@ static int inno_hdmi_setup(struct inno_hdmi *hdmi,
hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK,
v_AUDIO_MUTE(0) | v_VIDEO_MUTE(0)); v_AUDIO_MUTE(0) | v_VIDEO_MUTE(0));
inno_hdmi_power_up(hdmi);
return 0; return 0;
} }
...@@ -459,7 +454,6 @@ static void inno_hdmi_encoder_enable(struct drm_encoder *encoder, ...@@ -459,7 +454,6 @@ static void inno_hdmi_encoder_enable(struct drm_encoder *encoder,
return; return;
inno_hdmi_setup(hdmi, &crtc_state->adjusted_mode); inno_hdmi_setup(hdmi, &crtc_state->adjusted_mode);
inno_hdmi_set_pwr_mode(hdmi, NORMAL);
} }
static void inno_hdmi_encoder_disable(struct drm_encoder *encoder, static void inno_hdmi_encoder_disable(struct drm_encoder *encoder,
...@@ -467,7 +461,7 @@ static void inno_hdmi_encoder_disable(struct drm_encoder *encoder, ...@@ -467,7 +461,7 @@ static void inno_hdmi_encoder_disable(struct drm_encoder *encoder,
{ {
struct inno_hdmi *hdmi = encoder_to_inno_hdmi(encoder); struct inno_hdmi *hdmi = encoder_to_inno_hdmi(encoder);
inno_hdmi_set_pwr_mode(hdmi, LOWER_PWR); inno_hdmi_standby(hdmi);
} }
static int static int
......
...@@ -10,11 +10,6 @@ ...@@ -10,11 +10,6 @@
#define DDC_SEGMENT_ADDR 0x30 #define DDC_SEGMENT_ADDR 0x30
enum PWR_MODE {
NORMAL,
LOWER_PWR,
};
#define HDMI_SCL_RATE (100*1000) #define HDMI_SCL_RATE (100*1000)
#define DDC_BUS_FREQ_L 0x4b #define DDC_BUS_FREQ_L 0x4b
#define DDC_BUS_FREQ_H 0x4c #define DDC_BUS_FREQ_H 0x4c
......
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