drm/rockchip/rk618: rgb: Add dithering support for RGB666 LCD panels

Change-Id: I359cb841b14ba56d68d42e5bf2f40dae05ff9f62
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
Wyon Bi
2019-01-02 09:24:57 +08:00
committed by Tao Huang
parent 7b2a7b73e4
commit c57f0bbc87
3 changed files with 31 additions and 2 deletions

View File

@@ -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);

View File

@@ -8,10 +8,11 @@
#ifndef _RK618_DITHER_H_
#define _RK618_DITHER_H_
#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);
void rk618_frc_dither_enable(struct rk618 *rk618, u32 bus_format);
void rk618_frc_dclk_invert(struct rk618 *rk618);
#endif

View File

@@ -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) {