mfd: rkx110_x120: disable phy when stop video stream

Change-Id: I4efe4873dafc74d549fc8322fdb35490140eba5b
Signed-off-by: Zhang Yubing <yubing.zhang@rock-chips.com>
This commit is contained in:
Zhang Yubing
2023-12-27 16:49:00 +08:00
committed by Tao Huang
parent 80bc7372a8
commit 9d4ae424d0
4 changed files with 85 additions and 4 deletions

View File

@@ -363,6 +363,8 @@ int rkx120_display_linkrx_enable(struct rk_serdes *serdes,
int rkx120_rgb_tx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id);
int rkx120_lvds_tx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id,
u8 phy_id);
int rkx120_lvds_tx_disable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id,
u8 phy_id);
void rkx120_linkrx_gpi_gpo_mux_cfg(struct rk_serdes *serdes, u32 mux, u8 remote_id);
void rkx110_linktx_gpi_gpo_mux_cfg(struct rk_serdes *serdes, u32 mux, u8 remote_id);
int rkx110_rgb_rx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route);

View File

@@ -185,11 +185,65 @@ int rk_serdes_display_route_enable(struct rk_serdes *serdes, struct rk_serdes_ro
int rk_serdes_display_route_disable(struct rk_serdes *serdes, struct rk_serdes_route *route)
{
if (route->remote0_port0 & RK_SERDES_DSI_TX0)
rkx120_dsi_tx_disable(serdes, route, DEVICE_REMOTE0);
if (route->remote0_port0) {
switch (route->remote0_port0) {
case RK_SERDES_RGB_TX:
break;
case RK_SERDES_LVDS_TX0:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE0, 0);
break;
case RK_SERDES_LVDS_TX1:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE0, 1);
break;
case RK_SERDES_DUAL_LVDS_TX:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE0, 0);
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE0, 1);
break;
case RK_SERDES_DSI_TX0:
rkx120_dsi_tx_disable(serdes, route, DEVICE_REMOTE0);
break;
default:
dev_err(serdes->dev, "undefined remote0_port0\n");
break;
}
}
if (route->remote1_port0 & RK_SERDES_DSI_TX0)
rkx120_dsi_tx_disable(serdes, route, DEVICE_REMOTE1);
if (route->remote1_port0) {
switch (route->remote1_port0) {
case RK_SERDES_RGB_TX:
break;
case RK_SERDES_LVDS_TX0:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE1, 0);
break;
case RK_SERDES_LVDS_TX1:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE1, 1);
break;
case RK_SERDES_DUAL_LVDS_TX:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE1, 0);
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE1, 1);
break;
case RK_SERDES_DSI_TX0:
rkx120_dsi_tx_disable(serdes, route, DEVICE_REMOTE1);
break;
default:
dev_err(serdes->dev, "undefined remote1_port0\n");
break;
}
}
if (route->remote0_port1) {
switch (route->remote0_port1) {
case RK_SERDES_LVDS_TX0:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE0, 0);
break;
case RK_SERDES_LVDS_TX1:
rkx120_lvds_tx_disable(serdes, route, DEVICE_REMOTE0, 1);
break;
default:
dev_err(serdes->dev, "undefined remote0_port1\n");
break;
}
}
if (serdes->version == SERDES_V1) {
rk_serdes_display_video_start(serdes, route, false);

View File

@@ -327,3 +327,14 @@ int rkx120_lvds_tx_enable(struct rk_serdes *serdes, struct rk_serdes_route *rout
return 0;
}
int rkx120_lvds_tx_disable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id,
u8 phy_id)
{
struct rk_serdes_panel *sd_panel = container_of(route, struct rk_serdes_panel, route);
struct rkx120_combtxphy *combtxphy = &sd_panel->combtxphy;
rkx120_combtxphy_power_off(serdes, combtxphy, remote_id, phy_id);
return 0;
}

View File

@@ -307,6 +307,19 @@ static void rkx120_combtxphy_lvds_power_on(struct rk_serdes *des,
des->i2c_write_reg(client, grf_base + GRF_MIPITX_CON13, TX_IDLE(0));
}
static void rkx120_combtxphy_lvds_power_off(struct rk_serdes *des,
struct rkx120_combtxphy *combtxphy,
u8 dev_id, u8 phy_id)
{
struct i2c_client *client = des->chip[dev_id].client;
u32 grf_base = (phy_id == 0) ?
RKX120_GRF_MIPI0_BASE : RKX120_GRF_MIPI1_BASE;
des->i2c_write_reg(client, grf_base + GRF_MIPITX_CON14, TX_PD(0));
des->i2c_write_reg(client, grf_base + GRF_MIPITX_CON0, PHYSHUTDWN(0));
des->i2c_write_reg(client, grf_base + GRF_MIPITX_CON1, PWON_PLL(0));
}
void rkx120_combtxphy_power_on(struct rk_serdes *des, struct rkx120_combtxphy *combtxphy,
u8 dev_id, u8 phy_id)
{
@@ -330,6 +343,7 @@ void rkx120_combtxphy_power_off(struct rk_serdes *des, struct rkx120_combtxphy *
rkx120_combtxphy_dsi_power_off(des, dev_id);
break;
case COMBTX_PHY_MODE_VIDEO_LVDS:
rkx120_combtxphy_lvds_power_off(des, combtxphy, dev_id, phy_id);
break;
case COMBTX_PHY_MODE_GPIO:
break;