summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWyon Bi <bivvy.bi@rock-chips.com>2019-03-13 10:29:34 +0800
committerTao Huang <huangtao@rock-chips.com>2019-03-14 10:00:59 +0800
commitb2cc197cf7c9a36354a112d0cfa9cee17047c1a0 (patch)
tree6c46e0ec79de61ea144b2ce5ed2083c3c940b29d
parent306a90793a73a5bfaebb534ac45a6898a285a190 (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.c24
-rw-r--r--drivers/gpu/drm/rockchip/rk618/rk618_dither.h3
-rw-r--r--drivers/gpu/drm/rockchip/rk618/rk618_lvds.c77
-rw-r--r--drivers/gpu/drm/rockchip/rk618/rk618_rgb.c36
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 |