Skip to content

Commit

Permalink
sm501fb: control panel pin usage with platform data flags
Browse files Browse the repository at this point in the history
This patch makes it possible to control panel pins usage with flags passed
from the platform data.  Without this patch the sm501fb driver always controls
the VBIASEN and FPEN pins.  The polarity and use of these pins are very
platform specific, so this patch introduces the flags
SM501FB_FLAG_PANEL_USE_VBIASEN and SM501FB_FLAG_PANEL_USE_FPEN which enable
the use of these pins.

This patch is needed to support the a Sharp LQ104V1DG21 lcd panel on SuperH
platforms such as R2D-1 and R2D-PLUS boards.  Letting the sm501fb driver
control the FPEN and VBIASEN pins like today just results in lcd panel
flicker.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Magnus Damm authored and Linus Torvalds committed Feb 6, 2008
1 parent 625fcaf commit dfcffa4
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 16 deletions.
41 changes: 25 additions & 16 deletions drivers/video/sm501fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
{
unsigned long control;
void __iomem *ctrl_reg = fbi->regs + SM501_DC_PANEL_CONTROL;
struct sm501_platdata_fbsub *pd = fbi->pdata->fb_pnl;

control = readl(ctrl_reg);

Expand All @@ -657,26 +658,34 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
sm501fb_sync_regs(fbi);
mdelay(10);

control |= SM501_DC_PANEL_CONTROL_BIAS; /* VBIASEN */
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);

control |= SM501_DC_PANEL_CONTROL_FPEN;
writel(control, ctrl_reg);
if (pd->flags & SM501FB_FLAG_PANEL_USE_VBIASEN) {
control |= SM501_DC_PANEL_CONTROL_BIAS; /* VBIASEN */
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}

if (pd->flags & SM501FB_FLAG_PANEL_USE_FPEN) {
control |= SM501_DC_PANEL_CONTROL_FPEN;
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}
} else if (!to && (control & SM501_DC_PANEL_CONTROL_VDD) != 0) {
/* disable panel power */
if (pd->flags & SM501FB_FLAG_PANEL_USE_FPEN) {
control &= ~SM501_DC_PANEL_CONTROL_FPEN;
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}

control &= ~SM501_DC_PANEL_CONTROL_FPEN;
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);

control &= ~SM501_DC_PANEL_CONTROL_BIAS;
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
if (pd->flags & SM501FB_FLAG_PANEL_USE_VBIASEN) {
control &= ~SM501_DC_PANEL_CONTROL_BIAS;
writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}

control &= ~SM501_DC_PANEL_CONTROL_DATA;
writel(control, ctrl_reg);
Expand Down
2 changes: 2 additions & 0 deletions include/linux/sm501.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ extern unsigned long sm501_gpio_get(struct device *dev,
#define SM501FB_FLAG_DISABLE_AT_EXIT (1<<1)
#define SM501FB_FLAG_USE_HWCURSOR (1<<2)
#define SM501FB_FLAG_USE_HWACCEL (1<<3)
#define SM501FB_FLAG_PANEL_USE_FPEN (1<<4)
#define SM501FB_FLAG_PANEL_USE_VBIASEN (1<<5)

struct sm501_platdata_fbsub {
struct fb_videomode *def_mode;
Expand Down

0 comments on commit dfcffa4

Please sign in to comment.