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