From c57f0bbc87d201d2de36d3ff9e7411bb5050cd1d Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Wed, 2 Jan 2019 09:24:57 +0800 Subject: [PATCH] drm/rockchip/rk618: rgb: Add dithering support for RGB666 LCD panels Change-Id: I359cb841b14ba56d68d42e5bf2f40dae05ff9f62 Signed-off-by: Wyon Bi --- drivers/gpu/drm/rockchip/rk618/rk618_dither.c | 13 ++++++++++++- drivers/gpu/drm/rockchip/rk618/rk618_dither.h | 3 ++- drivers/gpu/drm/rockchip/rk618/rk618_rgb.c | 17 +++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_dither.c b/drivers/gpu/drm/rockchip/rk618/rk618_dither.c index 10e141a59bd6..40e6afd6ef99 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_dither.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_dither.c @@ -25,8 +25,19 @@ void rk618_frc_dither_disable(struct rk618 *rk618) } EXPORT_SYMBOL_GPL(rk618_frc_dither_disable); -void rk618_frc_dither_enable(struct rk618 *rk618) +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); + break; + case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: + regmap_write(rk618->regmap, RK618_FRC_REG, FRC_OUT_MODE_RGB888); + break; + default: + return; + } + regmap_write(rk618->regmap, RK618_FRC_REG, FRC_DITHER_ENABLE); } EXPORT_SYMBOL_GPL(rk618_frc_dither_enable); diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_dither.h b/drivers/gpu/drm/rockchip/rk618/rk618_dither.h index af12fbdb9ab6..2e1e4d793da0 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_dither.h +++ b/drivers/gpu/drm/rockchip/rk618/rk618_dither.h @@ -8,10 +8,11 @@ #ifndef _RK618_DITHER_H_ #define _RK618_DITHER_H_ +#include #include void rk618_frc_dither_disable(struct rk618 *rk618); -void rk618_frc_dither_enable(struct rk618 *rk618); +void rk618_frc_dither_enable(struct rk618 *rk618, u32 bus_format); void rk618_frc_dclk_invert(struct rk618 *rk618); #endif diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c b/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c index 1d0fed11525f..6de7df9daf3e 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_rgb.c @@ -94,12 +94,29 @@ 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); if (rgb->id) {