Skip to content

Commit

Permalink
drm/pl111: Support grayscale
Browse files Browse the repository at this point in the history
Migrating the TI nspire calculators to use the PL111 driver for
framebuffer requires grayscale support for the elder panel
which uses 8bit grayscale only.

DRM does not support 8bit grayscale framebuffers in memory,
but by defining the bus format to be MEDIA_BUS_FMT_Y8_1X8 we
can get the hardware to turn on a grayscaling feature and
convert the RGB framebuffer to grayscale for us.

Cc: Daniel Tang <dt.tangr@gmail.com>
Cc: Fabian Vogt <fabian@ritter-vogt.de>
Tested-by: Fabian Vogt <fabian@ritter-vogt.de>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190805085847.25554-2-linus.walleij@linaro.org
  • Loading branch information
Linus Walleij committed Aug 9, 2019
1 parent 013b651 commit 43f847d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
29 changes: 27 additions & 2 deletions drivers/gpu/drm/pl111/pl111_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ static void pl111_display_enable(struct drm_simple_display_pipe *pipe,
struct drm_framebuffer *fb = plane->state->fb;
struct drm_connector *connector = priv->connector;
struct drm_bridge *bridge = priv->bridge;
bool grayscale = false;
u32 cntl;
u32 ppl, hsw, hfp, hbp;
u32 lpp, vsw, vfp, vbp;
Expand Down Expand Up @@ -187,6 +188,20 @@ static void pl111_display_enable(struct drm_simple_display_pipe *pipe,
if (connector->display_info.bus_flags &
DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
tim2 |= TIM2_IPC;

if (connector->display_info.num_bus_formats == 1 &&
connector->display_info.bus_formats[0] ==
MEDIA_BUS_FMT_Y8_1X8)
grayscale = true;

/*
* The AC pin bias frequency is set to max count when using
* grayscale so at least once in a while we will reverse
* polarity and get rid of any DC built up that could
* damage the display.
*/
if (grayscale)
tim2 |= TIM2_ACB_MASK;
}

if (bridge) {
Expand Down Expand Up @@ -218,8 +233,18 @@ static void pl111_display_enable(struct drm_simple_display_pipe *pipe,

writel(0, priv->regs + CLCD_TIM3);

/* Hard-code TFT panel */
cntl = CNTL_LCDEN | CNTL_LCDTFT | CNTL_LCDVCOMP(1);
/*
* Detect grayscale bus format. We do not support a grayscale mode
* toward userspace, instead we expose an RGB24 buffer and then the
* hardware will activate its grayscaler to convert to the grayscale
* format.
*/
if (grayscale)
cntl = CNTL_LCDEN | CNTL_LCDMONO8;
else
/* Else we assume TFT display */
cntl = CNTL_LCDEN | CNTL_LCDTFT | CNTL_LCDVCOMP(1);

/* On the ST Micro variant, assume all 24 bits are connected */
if (priv->variant->st_bitmux_control)
cntl |= CNTL_ST_CDWID_24;
Expand Down
1 change: 1 addition & 0 deletions include/linux/amba/clcd-regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#define TIM2_PCD_LO_MASK GENMASK(4, 0)
#define TIM2_PCD_LO_BITS 5
#define TIM2_CLKSEL (1 << 5)
#define TIM2_ACB_MASK GENMASK(10, 6)
#define TIM2_IVS (1 << 11)
#define TIM2_IHS (1 << 12)
#define TIM2_IPC (1 << 13)
Expand Down

0 comments on commit 43f847d

Please sign in to comment.