diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index 0750d862f9f3..b1e6705c35f6 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -37,6 +37,15 @@ #include "rockchip_drm_vop.h" #include "rockchip_lvds.h" +#define HIWORD_UPDATE(v, h, l) (((v) << (l)) | (GENMASK(h, l) << 16)) + +#define PX30_GRF_PD_VO_CON1 0x0438 +#define PX30_LVDS_SELECT(x) HIWORD_UPDATE(x, 14, 13) +#define PX30_LVDS_MODE_EN(x) HIWORD_UPDATE(x, 12, 12) +#define PX30_LVDS_MSBSEL(x) HIWORD_UPDATE(x, 11, 11) +#define PX30_LVDS_P2S_EN(x) HIWORD_UPDATE(x, 10, 10) +#define PX30_LVDS_VOP_SEL(x) HIWORD_UPDATE(x, 1, 1) + #define DISPLAY_OUTPUT_RGB 0 #define DISPLAY_OUTPUT_LVDS 1 #define DISPLAY_OUTPUT_DUAL_LVDS 2 @@ -783,42 +792,25 @@ static int innov1_lvds_probe(struct rockchip_lvds *lvds) static int px30_lvds_power_on(struct rockchip_lvds *lvds) { - int pipe; + int pipe = drm_of_encoder_active_endpoint_id(lvds->dev->of_node, + &lvds->encoder); - pipe = drm_of_encoder_active_endpoint_id(lvds->dev->of_node, - &lvds->encoder); + regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, + PX30_LVDS_SELECT(lvds->format) | + PX30_LVDS_MODE_EN(1) | PX30_LVDS_MSBSEL(1) | + PX30_LVDS_P2S_EN(1) | PX30_LVDS_VOP_SEL(pipe)); - if (lvds->output == DISPLAY_OUTPUT_RGB) { - regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, - PX30_RGB_VOP_SEL(pipe)); - regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, - PX30_DPHY_FORCERXMODE(1) | - PX30_RGB_SYNC_BYPASS(1)); - } else if (lvds->output == DISPLAY_OUTPUT_LVDS) { - regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, - PX30_LVDS_VOP_SEL(pipe)); - regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, - PX30_LVDS_PHY_MODE(1) | - PX30_LVDS_OUTPUT_FORMAT(lvds->format) | - PX30_LVDS_MSBSEL(LVDS_MSB_D7) | - PX30_DPHY_FORCERXMODE(1)); - lvds_msk_reg(lvds, MIPIPHY_REG8, - m_SAMPLE_CLK_DIR, v_SAMPLE_CLK_DIR_REVERSE); - } - - return innov1_lvds_power_on(lvds); + return 0; } static void px30_lvds_power_off(struct rockchip_lvds *lvds) { - regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, PX30_LVDS_PHY_MODE(0)); - - innov1_lvds_power_off(lvds); + regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, + PX30_LVDS_MODE_EN(0) | PX30_LVDS_P2S_EN(0)); } static const struct rockchip_lvds_soc_data px30_lvds_soc_data = { .chip_type = PX30, - .probe = innov1_lvds_probe, .power_on = px30_lvds_power_on, .power_off = px30_lvds_power_off, }; diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.h b/drivers/gpu/drm/rockchip/rockchip_lvds.h index 743a8da5b440..acbfcc2d9300 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.h +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.h @@ -108,17 +108,6 @@ #define RK3126_GRF_LVDS_CON0 0x0150 #define RK3126_GRF_CON1 0x0144 -#define PX30_GRF_PD_VO_CON0 0x0434 -#define PX30_GRF_PD_VO_CON1 0x0438 -#define PX30_LVDS_OUTPUT_FORMAT(x) (BITS_MASK(x, 0x3, 13) | BITS_EN(0x3, 13)) -#define PX30_LVDS_PHY_MODE(x) (BITS_MASK(x, 0x1, 12) | BITS_EN(0x1, 12)) -#define PX30_LVDS_MSBSEL(x) (BITS_MASK(x, 0x1, 11) | BITS_EN(0x1, 11)) -#define PX30_DPHY_FORCERXMODE(x) (BITS_MASK(x, 0x1, 6) | BITS_EN(0x1, 6)) -#define PX30_LCDC_DCLK_INV(v) (BITS_MASK(x, 0x1, 4) | BITS_EN(0x1, 4)) -#define PX30_RGB_SYNC_BYPASS(x) (BITS_MASK(x, 0x1, 3) | BITS_EN(0x1, 3)) -#define PX30_RGB_VOP_SEL(x) (BITS_MASK(x, 0x1, 2) | BITS_EN(0x1, 2)) -#define PX30_LVDS_VOP_SEL(x) (BITS_MASK(x, 0x1, 1) | BITS_EN(0x1, 1)) - #define LVDS_FMT_MASK (0x07 << 16) #define LVDS_MSB BIT(3) #define LVDS_DUAL BIT(4)