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:
parent
edfa043007
commit
6b9c0415e6
|
|
@ -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),
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue