diff options
author | Wyon Bi <bivvy.bi@rock-chips.com> | 2019-03-13 10:29:34 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2019-03-14 10:00:59 +0800 |
commit | b2cc197cf7c9a36354a112d0cfa9cee17047c1a0 (patch) | |
tree | 6c46e0ec79de61ea144b2ce5ed2083c3c940b29d | |
parent | 306a90793a73a5bfaebb534ac45a6898a285a190 (diff) |
drm/rockchip: rk618: Correct the bus format setting
Change-Id: I7a22e2436c37a9c990fd7bf76aa6ddfdc1964241
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
-rw-r--r-- | drivers/gpu/drm/rockchip/rk618/rk618_dither.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rk618/rk618_dither.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rk618/rk618_lvds.c | 77 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rk618/rk618_rgb.c | 36 |
4 files changed, 68 insertions, 72 deletions
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 <uapi/linux/media-bus-format.h> #include <linux/mfd/rk618.h> -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 105b643ba3bc..3f27088b440d 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_lvds.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_lvds.c @@ -25,10 +25,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 { @@ -40,7 +40,7 @@ struct rk618_lvds { struct clk *clock; struct rk618 *parent; bool dual_channel; - u32 format; + u32 bus_format; }; static inline struct rk618_lvds *bridge_to_lvds(struct drm_bridge *b) @@ -64,8 +64,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; + + 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; - return drm_panel_get_modes(lvds->panel); + drm_display_info_set_bus_formats(&connector->display_info, + &bus_format, 1); + + return num_modes; } static const struct drm_connector_helper_funcs @@ -101,15 +114,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 | @@ -138,37 +169,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); @@ -200,7 +200,6 @@ static int rk618_lvds_bridge_attach(struct drm_bridge *bridge) static const struct drm_bridge_funcs rk618_lvds_bridge_funcs = { .attach = rk618_lvds_bridge_attach, - .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 6de7df9daf3e..733c48d43178 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c @@ -33,6 +33,7 @@ struct rk618_rgb { struct regmap *regmap; struct clk *clock; struct rk618 *parent; + u32 bus_format; u32 id; }; @@ -57,8 +58,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; + + 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 drm_panel_get_modes(rgb->panel); + return num_modes; } static const struct drm_connector_helper_funcs @@ -94,30 +108,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 | |