diff --git a/drivers/mfd/rkx110_x120/rkx110_x120.h b/drivers/mfd/rkx110_x120/rkx110_x120.h index 319a3286d895..ca875c91eccb 100644 --- a/drivers/mfd/rkx110_x120/rkx110_x120.h +++ b/drivers/mfd/rkx110_x120/rkx110_x120.h @@ -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); diff --git a/drivers/mfd/rkx110_x120/rkx110_x120_display.c b/drivers/mfd/rkx110_x120/rkx110_x120_display.c index 319edd1f38fc..dff07ed21230 100644 --- a/drivers/mfd/rkx110_x120/rkx110_x120_display.c +++ b/drivers/mfd/rkx110_x120/rkx110_x120_display.c @@ -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); diff --git a/drivers/mfd/rkx110_x120/rkx120.c b/drivers/mfd/rkx110_x120/rkx120.c index 2f38af1fe0db..eb7cfaff00a1 100644 --- a/drivers/mfd/rkx110_x120/rkx120.c +++ b/drivers/mfd/rkx110_x120/rkx120.c @@ -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; +} diff --git a/drivers/mfd/rkx110_x120/rkx120_combtxphy.c b/drivers/mfd/rkx110_x120/rkx120_combtxphy.c index 6e516c7826b3..7537c66bdc4e 100644 --- a/drivers/mfd/rkx110_x120/rkx120_combtxphy.c +++ b/drivers/mfd/rkx110_x120/rkx120_combtxphy.c @@ -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;