diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_dither.c b/drivers/gpu/drm/rockchip/rk618/rk618_dither.c index 40e6afd6ef99..60938bf6409f 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_dither.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_dither.c @@ -19,28 +19,30 @@ #define FRC_DITHER_ENABLE HIWORD_UPDATE(1, 0, 0) #define FRC_DITHER_DISABLE HIWORD_UPDATE(0, 0, 0) -void rk618_frc_dither_disable(struct rk618 *rk618) +void rk618_frc_dither_init(struct rk618 *rk618, u32 bus_format) { - regmap_write(rk618->regmap, RK618_FRC_REG, FRC_DITHER_DISABLE); -} -EXPORT_SYMBOL_GPL(rk618_frc_dither_disable); + u32 val; -void rk618_frc_dither_enable(struct rk618 *rk618, u32 bus_format) -{ switch (bus_format) { case MEDIA_BUS_FMT_RGB666_1X18: - regmap_write(rk618->regmap, RK618_FRC_REG, FRC_OUT_MODE_RGB666); + case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: + val = FRC_OUT_MODE_RGB666 | FRC_DITHER_DISABLE; break; case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: - regmap_write(rk618->regmap, RK618_FRC_REG, FRC_OUT_MODE_RGB888); + case MEDIA_BUS_FMT_RGB666_1X7X3_JEIDA: + val = FRC_OUT_MODE_RGB888 | FRC_DITHER_ENABLE; break; + case MEDIA_BUS_FMT_RGB888_1X24: + case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: + case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: default: - return; + val = FRC_OUT_MODE_RGB888 | FRC_DITHER_DISABLE; + break; } - regmap_write(rk618->regmap, RK618_FRC_REG, FRC_DITHER_ENABLE); + regmap_write(rk618->regmap, RK618_FRC_REG, val); } -EXPORT_SYMBOL_GPL(rk618_frc_dither_enable); +EXPORT_SYMBOL_GPL(rk618_frc_dither_init); void rk618_frc_dclk_invert(struct rk618 *rk618) { diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_dither.h b/drivers/gpu/drm/rockchip/rk618/rk618_dither.h index 2e1e4d793da0..c74bb95f0ce4 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_dither.h +++ b/drivers/gpu/drm/rockchip/rk618/rk618_dither.h @@ -11,8 +11,7 @@ #include #include -void rk618_frc_dither_disable(struct rk618 *rk618); -void rk618_frc_dither_enable(struct rk618 *rk618, u32 bus_format); +void rk618_frc_dither_init(struct rk618 *rk618, u32 bus_format); void rk618_frc_dclk_invert(struct rk618 *rk618); #endif diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_lvds.c b/drivers/gpu/drm/rockchip/rk618/rk618_lvds.c index 2b3ae200637a..a0ceeb618328 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_lvds.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_lvds.c @@ -26,10 +26,10 @@ #include "rk618_dither.h" enum { - LVDS_8BIT_MODE_FORMAT_1, - LVDS_8BIT_MODE_FORMAT_2, - LVDS_8BIT_MODE_FORMAT_3, - LVDS_6BIT_MODE, + LVDS_FORMAT_VESA_24BIT, + LVDS_FORMAT_JEIDA_24BIT, + LVDS_FORMAT_JEIDA_18BIT, + LVDS_FORMAT_VESA_18BIT, }; struct rk618_lvds { @@ -41,7 +41,7 @@ struct rk618_lvds { struct clk *clock; struct rk618 *parent; bool dual_channel; - u32 format; + u32 bus_format; struct rockchip_drm_sub_dev sub_dev; }; @@ -66,8 +66,21 @@ rk618_lvds_connector_best_encoder(struct drm_connector *connector) static int rk618_lvds_connector_get_modes(struct drm_connector *connector) { struct rk618_lvds *lvds = connector_to_lvds(connector); + struct drm_display_info *info = &connector->display_info; + u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24; + int num_modes = 0; - return drm_panel_get_modes(lvds->panel); + num_modes = drm_panel_get_modes(lvds->panel); + + if (info->num_bus_formats) + lvds->bus_format = info->bus_formats[0]; + else + lvds->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG; + + drm_display_info_set_bus_formats(&connector->display_info, + &bus_format, 1); + + return num_modes; } static const struct drm_connector_helper_funcs @@ -102,15 +115,33 @@ static const struct drm_connector_funcs rk618_lvds_connector_funcs = { static void rk618_lvds_bridge_enable(struct drm_bridge *bridge) { struct rk618_lvds *lvds = bridge_to_lvds(bridge); + u8 format; u32 value; clk_prepare_enable(lvds->clock); rk618_frc_dclk_invert(lvds->parent); + rk618_frc_dither_init(lvds->parent, lvds->bus_format); + + switch (lvds->bus_format) { + case MEDIA_BUS_FMT_RGB666_1X7X3_JEIDA: + format = LVDS_FORMAT_JEIDA_18BIT; + break; + case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: + format = LVDS_FORMAT_JEIDA_24BIT; + break; + case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: + format = LVDS_FORMAT_VESA_18BIT; + break; + case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: + default: + format = LVDS_FORMAT_VESA_24BIT; + break; + } value = LVDS_CON_CHA0TTL_DISABLE | LVDS_CON_CHA1TTL_DISABLE | LVDS_CON_CHA0_POWER_UP | LVDS_CON_CBG_POWER_UP | - LVDS_CON_PLL_POWER_UP | LVDS_CON_SELECT(lvds->format); + LVDS_CON_PLL_POWER_UP | LVDS_CON_SELECT(format); if (lvds->dual_channel) value |= LVDS_CON_CHA1_POWER_UP | LVDS_DCLK_INV | @@ -139,37 +170,6 @@ static void rk618_lvds_bridge_disable(struct drm_bridge *bridge) clk_disable_unprepare(lvds->clock); } -static void rk618_lvds_bridge_mode_set(struct drm_bridge *bridge, - struct drm_display_mode *mode, - struct drm_display_mode *adj) -{ - struct rk618_lvds *lvds = bridge_to_lvds(bridge); - struct drm_connector *connector = &lvds->connector; - struct drm_display_info *info = &connector->display_info; - u32 bus_format; - - if (info->num_bus_formats) - bus_format = info->bus_formats[0]; - else - bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG; - - switch (bus_format) { - case MEDIA_BUS_FMT_RGB666_1X7X3_JEIDA: /* jeida-18 */ - lvds->format = LVDS_6BIT_MODE; - break; - case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: /* jeida-24 */ - lvds->format = LVDS_8BIT_MODE_FORMAT_2; - break; - case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: /* vesa-18 */ - lvds->format = LVDS_8BIT_MODE_FORMAT_3; - break; - case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: /* vesa-24 */ - default: - lvds->format = LVDS_8BIT_MODE_FORMAT_1; - break; - } -} - static int rk618_lvds_bridge_attach(struct drm_bridge *bridge) { struct rk618_lvds *lvds = bridge_to_lvds(bridge); @@ -210,7 +210,6 @@ static void rk618_lvds_bridge_detach(struct drm_bridge *bridge) static const struct drm_bridge_funcs rk618_lvds_bridge_funcs = { .attach = rk618_lvds_bridge_attach, .detach = rk618_lvds_bridge_detach, - .mode_set = rk618_lvds_bridge_mode_set, .enable = rk618_lvds_bridge_enable, .disable = rk618_lvds_bridge_disable, }; diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c b/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c index 09b7ac578bdc..a0187935008f 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c @@ -34,6 +34,7 @@ struct rk618_rgb { struct regmap *regmap; struct clk *clock; struct rk618 *parent; + u32 bus_format; u32 id; struct rockchip_drm_sub_dev sub_dev; }; @@ -59,8 +60,21 @@ rk618_rgb_connector_best_encoder(struct drm_connector *connector) static int rk618_rgb_connector_get_modes(struct drm_connector *connector) { struct rk618_rgb *rgb = connector_to_rgb(connector); + struct drm_display_info *info = &connector->display_info; + u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24; + int num_modes = 0; - return drm_panel_get_modes(rgb->panel); + num_modes = drm_panel_get_modes(rgb->panel); + + if (info->num_bus_formats) + rgb->bus_format = info->bus_formats[0]; + else + rgb->bus_format = MEDIA_BUS_FMT_RGB888_1X24; + + drm_display_info_set_bus_formats(&connector->display_info, + &bus_format, 1); + + return num_modes; } static const struct drm_connector_helper_funcs @@ -95,30 +109,12 @@ static const struct drm_connector_funcs rk618_rgb_connector_funcs = { static void rk618_rgb_bridge_enable(struct drm_bridge *bridge) { struct rk618_rgb *rgb = bridge_to_rgb(bridge); - struct drm_connector *connector = &rgb->connector; - struct drm_display_info *info = &connector->display_info; - u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24; u32 value; clk_prepare_enable(rgb->clock); rk618_frc_dclk_invert(rgb->parent); - - if (info->num_bus_formats) - bus_format = info->bus_formats[0]; - - switch (bus_format) { - case MEDIA_BUS_FMT_RGB666_1X18: - case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: - rk618_frc_dither_enable(rgb->parent, bus_format); - break; - case MEDIA_BUS_FMT_RGB888_1X24: - default: - rk618_frc_dither_disable(rgb->parent); - break; - } - - dev_dbg(rgb->dev, "id=%d\n", rgb->id); + rk618_frc_dither_init(rgb->parent, rgb->bus_format); if (rgb->id) { value = LVDS_CON_CBG_POWER_DOWN | LVDS_CON_CHA1_POWER_DOWN |