This change adds support for display color dithering configuration in the display control structure. Two dithering modes are possible: ordered and error-diffusion mode. Error-diffusion dithering is usually considered higher quality, but can only be used when the active region is less than 640 pixels wide. This is based on patches from Chao Jiang <chaoj@xxxxxxxxxx> Signed-off-by: Robert Morell <rmorell@xxxxxxxxxx> --- Version 2 adds a default case and removes redundant BUG_ON(). arch/arm/mach-tegra/include/mach/dc.h | 7 +++++++ drivers/video/tegra/dc/dc.c | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-tegra/include/mach/dc.h b/arch/arm/mach-tegra/include/mach/dc.h index 254b732..696e6ed 100644 --- a/arch/arm/mach-tegra/include/mach/dc.h +++ b/arch/arm/mach-tegra/include/mach/dc.h @@ -44,6 +44,12 @@ enum { TEGRA_DC_OUT_HDMI, }; +enum { + TEGRA_DC_DISABLE_DITHER = 1, + TEGRA_DC_ORDERED_DITHER, + TEGRA_DC_ERRDIFF_DITHER, +}; + struct tegra_dc_out { int type; unsigned flags; @@ -58,6 +64,7 @@ struct tegra_dc_out { unsigned order; unsigned align; unsigned depth; + unsigned dither; struct tegra_dc_mode *modes; int n_modes; diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c index 16789c2..658cabd 100644 --- a/drivers/video/tegra/dc/dc.c +++ b/drivers/video/tegra/dc/dc.c @@ -890,6 +890,30 @@ static void tegra_dc_set_color_control(struct tegra_dc *dc) break; } + /* + * The line buffer for error-diffusion dither is limited to 640 pixels + * per line, so we can't use it if the active region is larger than 640 + * pixels. Be nice and fall back to ordered dithering, but warn so the + * platform data can be corrected. + */ + if (WARN_ON(dc->out->dither == TEGRA_DC_ERRDIFF_DITHER && + dc->mode.h_active > 640)) { + dc->out->dither = TEGRA_DC_ORDERED_DITHER; + } + + switch (dc->out->dither) { + default: + case TEGRA_DC_DISABLE_DITHER: + color_control |= DITHER_CONTROL_DISABLE; + break; + case TEGRA_DC_ORDERED_DITHER: + color_control |= DITHER_CONTROL_ORDERED; + break; + case TEGRA_DC_ERRDIFF_DITHER: + color_control |= DITHER_CONTROL_ERRDIFF; + break; + } + tegra_dc_writel(dc, color_control, DC_DISP_DISP_COLOR_CONTROL); } -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-tegra" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html