mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
drm/rockchip: rgb: add encoder atomic API mode_valid
Signed-off-by: Damon Ding <damon.ding@rock-chips.com> Change-Id: Ibe455d22d0a4af79f37c87a668451af4812a5d0d
This commit is contained in:
@@ -61,8 +61,14 @@ struct rockchip_rgb_funcs {
|
|||||||
void (*disable)(struct rockchip_rgb *rgb);
|
void (*disable)(struct rockchip_rgb *rgb);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct rockchip_rgb_data {
|
||||||
|
u32 max_dclk_rate;
|
||||||
|
const struct rockchip_rgb_funcs *funcs;
|
||||||
|
};
|
||||||
|
|
||||||
struct rockchip_rgb {
|
struct rockchip_rgb {
|
||||||
u8 id;
|
u8 id;
|
||||||
|
u32 max_dclk_rate;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct drm_panel *panel;
|
struct drm_panel *panel;
|
||||||
struct drm_bridge *bridge;
|
struct drm_bridge *bridge;
|
||||||
@@ -248,11 +254,29 @@ static void rockchip_rgb_encoder_loader_protect(struct drm_encoder *encoder,
|
|||||||
panel_simple_loader_protect(rgb->panel);
|
panel_simple_loader_protect(rgb->panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum drm_mode_status
|
||||||
|
rockchip_rgb_encoder_mode_valid(struct drm_encoder *encoder,
|
||||||
|
const struct drm_display_mode *mode)
|
||||||
|
{
|
||||||
|
struct rockchip_rgb *rgb = encoder_to_rgb(encoder);
|
||||||
|
u32 request_clock = mode->clock;
|
||||||
|
u32 max_clock = rgb->max_dclk_rate;
|
||||||
|
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
||||||
|
request_clock *= 2;
|
||||||
|
|
||||||
|
if (max_clock != 0 && request_clock > max_clock)
|
||||||
|
return MODE_CLOCK_HIGH;
|
||||||
|
|
||||||
|
return MODE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static const
|
static const
|
||||||
struct drm_encoder_helper_funcs rockchip_rgb_encoder_helper_funcs = {
|
struct drm_encoder_helper_funcs rockchip_rgb_encoder_helper_funcs = {
|
||||||
.enable = rockchip_rgb_encoder_enable,
|
.enable = rockchip_rgb_encoder_enable,
|
||||||
.disable = rockchip_rgb_encoder_disable,
|
.disable = rockchip_rgb_encoder_disable,
|
||||||
.atomic_check = rockchip_rgb_encoder_atomic_check,
|
.atomic_check = rockchip_rgb_encoder_atomic_check,
|
||||||
|
.mode_valid = rockchip_rgb_encoder_mode_valid,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_encoder_funcs rockchip_rgb_encoder_funcs = {
|
static const struct drm_encoder_funcs rockchip_rgb_encoder_funcs = {
|
||||||
@@ -357,6 +381,7 @@ static int rockchip_rgb_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct rockchip_rgb *rgb;
|
struct rockchip_rgb *rgb;
|
||||||
|
const struct rockchip_rgb_data *rgb_data;
|
||||||
int ret, id;
|
int ret, id;
|
||||||
|
|
||||||
rgb = devm_kzalloc(&pdev->dev, sizeof(*rgb), GFP_KERNEL);
|
rgb = devm_kzalloc(&pdev->dev, sizeof(*rgb), GFP_KERNEL);
|
||||||
@@ -367,9 +392,11 @@ static int rockchip_rgb_probe(struct platform_device *pdev)
|
|||||||
if (id < 0)
|
if (id < 0)
|
||||||
id = 0;
|
id = 0;
|
||||||
|
|
||||||
|
rgb_data = of_device_get_match_data(dev);
|
||||||
rgb->id = id;
|
rgb->id = id;
|
||||||
rgb->dev = dev;
|
rgb->dev = dev;
|
||||||
rgb->funcs = of_device_get_match_data(dev);
|
rgb->max_dclk_rate = rgb_data->max_dclk_rate;
|
||||||
|
rgb->funcs = rgb_data->funcs;
|
||||||
platform_set_drvdata(pdev, rgb);
|
platform_set_drvdata(pdev, rgb);
|
||||||
|
|
||||||
rgb->data_sync_bypass =
|
rgb->data_sync_bypass =
|
||||||
@@ -414,6 +441,10 @@ static const struct rockchip_rgb_funcs px30_rgb_funcs = {
|
|||||||
.enable = px30_rgb_enable,
|
.enable = px30_rgb_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_rgb_data px30_rgb = {
|
||||||
|
.funcs = &px30_rgb_funcs,
|
||||||
|
};
|
||||||
|
|
||||||
static void rk1808_rgb_enable(struct rockchip_rgb *rgb)
|
static void rk1808_rgb_enable(struct rockchip_rgb *rgb)
|
||||||
{
|
{
|
||||||
regmap_write(rgb->grf, RK1808_GRF_PD_VO_CON1,
|
regmap_write(rgb->grf, RK1808_GRF_PD_VO_CON1,
|
||||||
@@ -424,6 +455,10 @@ static const struct rockchip_rgb_funcs rk1808_rgb_funcs = {
|
|||||||
.enable = rk1808_rgb_enable,
|
.enable = rk1808_rgb_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_rgb_data rk1808_rgb = {
|
||||||
|
.funcs = &rk1808_rgb_funcs,
|
||||||
|
};
|
||||||
|
|
||||||
static void rk3288_rgb_enable(struct rockchip_rgb *rgb)
|
static void rk3288_rgb_enable(struct rockchip_rgb *rgb)
|
||||||
{
|
{
|
||||||
int pipe = drm_of_encoder_active_endpoint_id(rgb->dev->of_node,
|
int pipe = drm_of_encoder_active_endpoint_id(rgb->dev->of_node,
|
||||||
@@ -448,6 +483,10 @@ static const struct rockchip_rgb_funcs rk3288_rgb_funcs = {
|
|||||||
.disable = rk3288_rgb_disable,
|
.disable = rk3288_rgb_disable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_rgb_data rk3288_rgb = {
|
||||||
|
.funcs = &rk3288_rgb_funcs,
|
||||||
|
};
|
||||||
|
|
||||||
static void rk3568_rgb_enable(struct rockchip_rgb *rgb)
|
static void rk3568_rgb_enable(struct rockchip_rgb *rgb)
|
||||||
{
|
{
|
||||||
regmap_write(rgb->grf, RK3568_GRF_VO_CON1,
|
regmap_write(rgb->grf, RK3568_GRF_VO_CON1,
|
||||||
@@ -458,6 +497,10 @@ static const struct rockchip_rgb_funcs rk3568_rgb_funcs = {
|
|||||||
.enable = rk3568_rgb_enable,
|
.enable = rk3568_rgb_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_rgb_data rk3568_rgb = {
|
||||||
|
.funcs = &rk3568_rgb_funcs,
|
||||||
|
};
|
||||||
|
|
||||||
static void rv1126_rgb_enable(struct rockchip_rgb *rgb)
|
static void rv1126_rgb_enable(struct rockchip_rgb *rgb)
|
||||||
{
|
{
|
||||||
regmap_write(rgb->grf, RV1126_GRF_IOFUNC_CON3,
|
regmap_write(rgb->grf, RV1126_GRF_IOFUNC_CON3,
|
||||||
@@ -468,6 +511,10 @@ static const struct rockchip_rgb_funcs rv1126_rgb_funcs = {
|
|||||||
.enable = rv1126_rgb_enable,
|
.enable = rv1126_rgb_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_rgb_data rv1126_rgb = {
|
||||||
|
.funcs = &rv1126_rgb_funcs,
|
||||||
|
};
|
||||||
|
|
||||||
static void rv1106_rgb_enable(struct rockchip_rgb *rgb)
|
static void rv1106_rgb_enable(struct rockchip_rgb *rgb)
|
||||||
{
|
{
|
||||||
regmap_write(rgb->grf, RV1106_VENC_GRF_VOP_IO_WRAPPER,
|
regmap_write(rgb->grf, RV1106_VENC_GRF_VOP_IO_WRAPPER,
|
||||||
@@ -480,19 +527,24 @@ static const struct rockchip_rgb_funcs rv1106_rgb_funcs = {
|
|||||||
.enable = rv1106_rgb_enable,
|
.enable = rv1106_rgb_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_rgb_data rv1106_rgb = {
|
||||||
|
.max_dclk_rate = 74250,
|
||||||
|
.funcs = &rv1106_rgb_funcs,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct of_device_id rockchip_rgb_dt_ids[] = {
|
static const struct of_device_id rockchip_rgb_dt_ids[] = {
|
||||||
{ .compatible = "rockchip,px30-rgb", .data = &px30_rgb_funcs },
|
{ .compatible = "rockchip,px30-rgb", .data = &px30_rgb },
|
||||||
{ .compatible = "rockchip,rk1808-rgb", .data = &rk1808_rgb_funcs },
|
{ .compatible = "rockchip,rk1808-rgb", .data = &rk1808_rgb },
|
||||||
{ .compatible = "rockchip,rk3066-rgb", },
|
{ .compatible = "rockchip,rk3066-rgb", },
|
||||||
{ .compatible = "rockchip,rk3128-rgb", },
|
{ .compatible = "rockchip,rk3128-rgb", },
|
||||||
{ .compatible = "rockchip,rk3288-rgb", .data = &rk3288_rgb_funcs },
|
{ .compatible = "rockchip,rk3288-rgb", .data = &rk3288_rgb },
|
||||||
{ .compatible = "rockchip,rk3308-rgb", },
|
{ .compatible = "rockchip,rk3308-rgb", },
|
||||||
{ .compatible = "rockchip,rk3368-rgb", },
|
{ .compatible = "rockchip,rk3368-rgb", },
|
||||||
{ .compatible = "rockchip,rk3568-rgb", .data = &rk3568_rgb_funcs },
|
{ .compatible = "rockchip,rk3568-rgb", .data = &rk3568_rgb },
|
||||||
{ .compatible = "rockchip,rk3588-rgb", },
|
{ .compatible = "rockchip,rk3588-rgb", },
|
||||||
{ .compatible = "rockchip,rv1106-rgb", .data = &rv1106_rgb_funcs},
|
{ .compatible = "rockchip,rv1106-rgb", .data = &rv1106_rgb},
|
||||||
{ .compatible = "rockchip,rv1108-rgb", },
|
{ .compatible = "rockchip,rv1108-rgb", },
|
||||||
{ .compatible = "rockchip,rv1126-rgb", .data = &rv1126_rgb_funcs},
|
{ .compatible = "rockchip,rv1126-rgb", .data = &rv1126_rgb},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, rockchip_rgb_dt_ids);
|
MODULE_DEVICE_TABLE(of, rockchip_rgb_dt_ids);
|
||||||
|
|||||||
Reference in New Issue
Block a user