video/drm: rgb: Add support rk1808

Change-Id: I9e7636fadb10b9652ac69151a6c901735b90bc46
Signed-off-by: Sandy Huang <hjc@rock-chips.com>
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
Sandy Huang 2018-10-10 10:12:20 +08:00 committed by Jianhong Chen
parent edfa043007
commit 6b9c0415e6
1 changed files with 99 additions and 29 deletions

View File

@ -16,38 +16,55 @@
#include "rockchip_crtc.h"
#include "rockchip_connector.h"
#define PX30_GRF_PD_VO_CON1 0x0438
#define PX30_LCDC_DCLK_INV(v) HIWORD_UPDATE(v, 4, 4)
#define PX30_RGB_SYNC_BYPASS(v) HIWORD_UPDATE(v, 3, 3)
#define PX30_RGB_VOP_SEL(v) HIWORD_UPDATE(v, 2, 2)
#define PX30_GRF_PD_VO_CON1 0x0438
#define PX30_RGB_DATA_SYNC_BYPASS(v) HIWORD_UPDATE(v, 3, 3)
#define PX30_RGB_VOP_SEL(v) HIWORD_UPDATE(v, 2, 2)
struct rockchip_rgb_priv {
struct regmap *grf;
#define RK1808_GRF_PD_VO_CON1 0x0444
#define RK1808_RGB_DATA_SYNC_BYPASS(v) HIWORD_UPDATE(v, 3, 3)
struct rockchip_rgb;
struct rockchip_rgb_funcs {
void (*enable)(struct rockchip_rgb *rgb, int pipe);
void (*disable)(struct rockchip_rgb *rgb);
};
static int rockchip_rgb_enable(struct display_state *state)
struct rockchip_rgb {
struct regmap *grf;
const struct rockchip_rgb_funcs *funcs;
};
static inline struct rockchip_rgb *state_to_rgb(struct display_state *state)
{
struct connector_state *conn_state = &state->conn_state;
struct rockchip_rgb_priv *priv = dev_get_priv(conn_state->dev);
return dev_get_priv(conn_state->dev);
}
static int rockchip_rgb_connector_enable(struct display_state *state)
{
struct rockchip_rgb *rgb = state_to_rgb(state);
struct crtc_state *crtc_state = &state->crtc_state;
int pipe = crtc_state->crtc_id;
if (!IS_ERR_OR_NULL(priv->grf)) {
regmap_write(priv->grf, PX30_GRF_PD_VO_CON1,
PX30_RGB_VOP_SEL(pipe));
regmap_write(priv->grf, PX30_GRF_PD_VO_CON1,
PX30_RGB_SYNC_BYPASS(1));
}
if (rgb->funcs && rgb->funcs->enable)
rgb->funcs->enable(rgb, pipe);
return 0;
}
static int rockchip_rgb_disable(struct display_state *state)
static int rockchip_rgb_connector_disable(struct display_state *state)
{
struct rockchip_rgb *rgb = state_to_rgb(state);
if (rgb->funcs && rgb->funcs->disable)
rgb->funcs->disable(rgb);
return 0;
}
static int rockchip_rgb_init(struct display_state *state)
static int rockchip_rgb_connector_init(struct display_state *state)
{
struct connector_state *conn_state = &state->conn_state;
@ -71,41 +88,94 @@ static int rockchip_rgb_init(struct display_state *state)
return 0;
}
static const struct rockchip_connector_funcs rockchip_rgb_funcs = {
.init = rockchip_rgb_init,
.enable = rockchip_rgb_enable,
.disable = rockchip_rgb_disable,
static const struct rockchip_connector_funcs rockchip_rgb_connector_funcs = {
.init = rockchip_rgb_connector_init,
.enable = rockchip_rgb_connector_enable,
.disable = rockchip_rgb_connector_disable,
};
static int rockchip_rgb_probe(struct udevice *dev)
{
struct rockchip_rgb_priv *priv = dev_get_priv(dev);
struct rockchip_rgb *rgb = dev_get_priv(dev);
const struct rockchip_connector *connector =
(const struct rockchip_connector *)dev_get_driver_data(dev);
priv->grf = syscon_get_regmap(dev_get_parent(dev));
rgb->funcs = connector->data;
rgb->grf = syscon_get_regmap(dev_get_parent(dev));
return 0;
}
static const struct rockchip_connector rockchip_rgb_data = {
.funcs = &rockchip_rgb_funcs,
static void px30_rgb_enable(struct rockchip_rgb *rgb, int pipe)
{
regmap_write(rgb->grf, PX30_GRF_PD_VO_CON1,
PX30_RGB_VOP_SEL(pipe));
regmap_write(rgb->grf, PX30_GRF_PD_VO_CON1,
PX30_RGB_DATA_SYNC_BYPASS(1));
}
static void px30_rgb_disable(struct rockchip_rgb *rgb)
{
regmap_write(rgb->grf, PX30_GRF_PD_VO_CON1,
PX30_RGB_DATA_SYNC_BYPASS(0));
}
static const struct rockchip_rgb_funcs px30_rgb_funcs = {
.enable = px30_rgb_enable,
.disable = px30_rgb_disable,
};
static const struct rockchip_connector px30_rgb_driver_data = {
.funcs = &rockchip_rgb_connector_funcs,
.data = &px30_rgb_funcs,
};
static void rk1808_rgb_enable(struct rockchip_rgb *rgb, int pipe)
{
regmap_write(rgb->grf, RK1808_GRF_PD_VO_CON1,
RK1808_RGB_DATA_SYNC_BYPASS(1));
}
static void rk1808_rgb_disable(struct rockchip_rgb *rgb)
{
regmap_write(rgb->grf, RK1808_GRF_PD_VO_CON1,
RK1808_RGB_DATA_SYNC_BYPASS(0));
}
static const struct rockchip_rgb_funcs rk1808_rgb_funcs = {
.enable = rk1808_rgb_enable,
.disable = rk1808_rgb_disable,
};
static const struct rockchip_connector rk1808_rgb_driver_data = {
.funcs = &rockchip_rgb_connector_funcs,
.data = &rk1808_rgb_funcs,
};
static const struct rockchip_connector rockchip_rgb_driver_data = {
.funcs = &rockchip_rgb_connector_funcs,
};
static const struct udevice_id rockchip_rgb_ids[] = {
{
.compatible = "rockchip,px30-rgb",
.data = (ulong)&rockchip_rgb_data,
.data = (ulong)&px30_rgb_driver_data,
},
{
.compatible = "rockchip,rk1808-rgb",
.data = (ulong)&rk1808_rgb_driver_data,
},
{
.compatible = "rockchip,rk3066-rgb",
.data = (ulong)&rockchip_rgb_data,
.data = (ulong)&rockchip_rgb_driver_data,
},
{
.compatible = "rockchip,rk3308-rgb",
.data = (ulong)&rockchip_rgb_data,
.data = (ulong)&rockchip_rgb_driver_data,
},
{
.compatible = "rockchip,rv1108-rgb",
.data = (ulong)&rockchip_rgb_data,
.data = (ulong)&rockchip_rgb_driver_data,
},
{}
};
@ -115,5 +185,5 @@ U_BOOT_DRIVER(rockchip_rgb) = {
.id = UCLASS_DISPLAY,
.of_match = rockchip_rgb_ids,
.probe = rockchip_rgb_probe,
.priv_auto_alloc_size = sizeof(struct rockchip_rgb_priv),
.priv_auto_alloc_size = sizeof(struct rockchip_rgb),
};