Commit 7ee0fe41 authored by Krzysztof Helt's avatar Krzysztof Helt Committed by Linus Torvalds

s3c2410fb: fix missing registers offset

This patch adds missing virtual register offsets where
appropriate. This fixes crashes in the driver.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl
Signed-off-by: default avatarAntonino Daplas <adaplas@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e92e7395
...@@ -123,6 +123,8 @@ static void s3c2410fb_set_lcdaddr(struct fb_info *info) ...@@ -123,6 +123,8 @@ static void s3c2410fb_set_lcdaddr(struct fb_info *info)
{ {
unsigned long saddr1, saddr2, saddr3; unsigned long saddr1, saddr2, saddr3;
int line_length = info->var.xres * info->var.bits_per_pixel; int line_length = info->var.xres * info->var.bits_per_pixel;
struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
saddr1 = info->fix.smem_start >> 1; saddr1 = info->fix.smem_start >> 1;
saddr2 = info->fix.smem_start; saddr2 = info->fix.smem_start;
...@@ -136,9 +138,9 @@ static void s3c2410fb_set_lcdaddr(struct fb_info *info) ...@@ -136,9 +138,9 @@ static void s3c2410fb_set_lcdaddr(struct fb_info *info)
dprintk("LCDSADDR2 = 0x%08lx\n", saddr2); dprintk("LCDSADDR2 = 0x%08lx\n", saddr2);
dprintk("LCDSADDR3 = 0x%08lx\n", saddr3); dprintk("LCDSADDR3 = 0x%08lx\n", saddr3);
writel(saddr1, S3C2410_LCDSADDR1); writel(saddr1, regs + S3C2410_LCDSADDR1);
writel(saddr2, S3C2410_LCDSADDR2); writel(saddr2, regs + S3C2410_LCDSADDR2);
writel(saddr3, S3C2410_LCDSADDR3); writel(saddr3, regs + S3C2410_LCDSADDR3);
} }
/* s3c2410fb_calc_pixclk() /* s3c2410fb_calc_pixclk()
...@@ -409,6 +411,7 @@ static void s3c2410fb_calculate_tft_lcd_regs(const struct fb_info *info, ...@@ -409,6 +411,7 @@ static void s3c2410fb_calculate_tft_lcd_regs(const struct fb_info *info,
static void s3c2410fb_activate_var(struct fb_info *info) static void s3c2410fb_activate_var(struct fb_info *info)
{ {
struct s3c2410fb_info *fbi = info->par; struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
struct fb_var_screeninfo *var = &info->var; struct fb_var_screeninfo *var = &info->var;
struct s3c2410fb_mach_info *mach_info = fbi->mach_info; struct s3c2410fb_mach_info *mach_info = fbi->mach_info;
struct s3c2410fb_display *display = mach_info->displays + struct s3c2410fb_display *display = mach_info->displays +
...@@ -449,16 +452,17 @@ static void s3c2410fb_activate_var(struct fb_info *info) ...@@ -449,16 +452,17 @@ static void s3c2410fb_activate_var(struct fb_info *info)
dprintk("lcdcon[4] = 0x%08lx\n", fbi->regs.lcdcon4); dprintk("lcdcon[4] = 0x%08lx\n", fbi->regs.lcdcon4);
dprintk("lcdcon[5] = 0x%08lx\n", fbi->regs.lcdcon5); dprintk("lcdcon[5] = 0x%08lx\n", fbi->regs.lcdcon5);
writel(fbi->regs.lcdcon1 & ~S3C2410_LCDCON1_ENVID, S3C2410_LCDCON1); writel(fbi->regs.lcdcon1 & ~S3C2410_LCDCON1_ENVID,
writel(fbi->regs.lcdcon2, S3C2410_LCDCON2); regs + S3C2410_LCDCON1);
writel(fbi->regs.lcdcon3, S3C2410_LCDCON3); writel(fbi->regs.lcdcon2, regs + S3C2410_LCDCON2);
writel(fbi->regs.lcdcon4, S3C2410_LCDCON4); writel(fbi->regs.lcdcon3, regs + S3C2410_LCDCON3);
writel(fbi->regs.lcdcon5, S3C2410_LCDCON5); writel(fbi->regs.lcdcon4, regs + S3C2410_LCDCON4);
writel(fbi->regs.lcdcon5, regs + S3C2410_LCDCON5);
/* set lcd address pointers */ /* set lcd address pointers */
s3c2410fb_set_lcdaddr(info); s3c2410fb_set_lcdaddr(info);
writel(fbi->regs.lcdcon1, S3C2410_LCDCON1); writel(fbi->regs.lcdcon1, regs + S3C2410_LCDCON1);
} }
/* /*
...@@ -527,6 +531,7 @@ static int s3c2410fb_setcolreg(unsigned regno, ...@@ -527,6 +531,7 @@ static int s3c2410fb_setcolreg(unsigned regno,
unsigned transp, struct fb_info *info) unsigned transp, struct fb_info *info)
{ {
struct s3c2410fb_info *fbi = info->par; struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
unsigned int val; unsigned int val;
/* dprintk("setcol: regno=%d, rgb=%d,%d,%d\n", /* dprintk("setcol: regno=%d, rgb=%d,%d,%d\n",
...@@ -555,7 +560,7 @@ static int s3c2410fb_setcolreg(unsigned regno, ...@@ -555,7 +560,7 @@ static int s3c2410fb_setcolreg(unsigned regno,
val |= ((green >> 5) & 0x07e0); val |= ((green >> 5) & 0x07e0);
val |= ((blue >> 11) & 0x001f); val |= ((blue >> 11) & 0x001f);
writel(val, S3C2410_TFTPAL(regno)); writel(val, regs + S3C2410_TFTPAL(regno));
schedule_palette_update(fbi, regno, val); schedule_palette_update(fbi, regno, val);
} }
...@@ -586,16 +591,19 @@ static int s3c2410fb_setcolreg(unsigned regno, ...@@ -586,16 +591,19 @@ static int s3c2410fb_setcolreg(unsigned regno,
*/ */
static int s3c2410fb_blank(int blank_mode, struct fb_info *info) static int s3c2410fb_blank(int blank_mode, struct fb_info *info)
{ {
struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
dprintk("blank(mode=%d, info=%p)\n", blank_mode, info); dprintk("blank(mode=%d, info=%p)\n", blank_mode, info);
if (mach_info == NULL) if (mach_info == NULL)
return -EINVAL; return -EINVAL;
if (blank_mode == FB_BLANK_UNBLANK) if (blank_mode == FB_BLANK_UNBLANK)
writel(0x0, S3C2410_TPAL); writel(0x0, regs + S3C2410_TPAL);
else { else {
dprintk("setting TPAL to output 0x000000\n"); dprintk("setting TPAL to output 0x000000\n");
writel(S3C2410_TPAL_EN, S3C2410_TPAL); writel(S3C2410_TPAL_EN, regs + S3C2410_TPAL);
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment