mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user