mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
drm/rockchip: rk618: Correct the bus format setting
Change-Id: I7a22e2436c37a9c990fd7bf76aa6ddfdc1964241 Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user