diff options
-rw-r--r-- | drivers/video/amba-clcd.c | 31 | ||||
-rw-r--r-- | include/linux/amba/clcd.h | 33 |
2 files changed, 41 insertions, 23 deletions
diff --git a/drivers/video/amba-clcd.c b/drivers/video/amba-clcd.c index a21efcd10b78..afe21e6eb544 100644 --- a/drivers/video/amba-clcd.c +++ b/drivers/video/amba-clcd.c | |||
@@ -65,16 +65,16 @@ static void clcdfb_disable(struct clcd_fb *fb) | |||
65 | if (fb->board->disable) | 65 | if (fb->board->disable) |
66 | fb->board->disable(fb); | 66 | fb->board->disable(fb); |
67 | 67 | ||
68 | val = readl(fb->regs + CLCD_CNTL); | 68 | val = readl(fb->regs + fb->off_cntl); |
69 | if (val & CNTL_LCDPWR) { | 69 | if (val & CNTL_LCDPWR) { |
70 | val &= ~CNTL_LCDPWR; | 70 | val &= ~CNTL_LCDPWR; |
71 | writel(val, fb->regs + CLCD_CNTL); | 71 | writel(val, fb->regs + fb->off_cntl); |
72 | 72 | ||
73 | clcdfb_sleep(20); | 73 | clcdfb_sleep(20); |
74 | } | 74 | } |
75 | if (val & CNTL_LCDEN) { | 75 | if (val & CNTL_LCDEN) { |
76 | val &= ~CNTL_LCDEN; | 76 | val &= ~CNTL_LCDEN; |
77 | writel(val, fb->regs + CLCD_CNTL); | 77 | writel(val, fb->regs + fb->off_cntl); |
78 | } | 78 | } |
79 | 79 | ||
80 | /* | 80 | /* |
@@ -94,7 +94,7 @@ static void clcdfb_enable(struct clcd_fb *fb, u32 cntl) | |||
94 | * Bring up by first enabling.. | 94 | * Bring up by first enabling.. |
95 | */ | 95 | */ |
96 | cntl |= CNTL_LCDEN; | 96 | cntl |= CNTL_LCDEN; |
97 | writel(cntl, fb->regs + CLCD_CNTL); | 97 | writel(cntl, fb->regs + fb->off_cntl); |
98 | 98 | ||
99 | clcdfb_sleep(20); | 99 | clcdfb_sleep(20); |
100 | 100 | ||
@@ -102,7 +102,7 @@ static void clcdfb_enable(struct clcd_fb *fb, u32 cntl) | |||
102 | * and now apply power. | 102 | * and now apply power. |
103 | */ | 103 | */ |
104 | cntl |= CNTL_LCDPWR; | 104 | cntl |= CNTL_LCDPWR; |
105 | writel(cntl, fb->regs + CLCD_CNTL); | 105 | writel(cntl, fb->regs + fb->off_cntl); |
106 | 106 | ||
107 | /* | 107 | /* |
108 | * finally, enable the interface. | 108 | * finally, enable the interface. |
@@ -233,7 +233,7 @@ static int clcdfb_set_par(struct fb_info *info) | |||
233 | readl(fb->regs + CLCD_TIM0), readl(fb->regs + CLCD_TIM1), | 233 | readl(fb->regs + CLCD_TIM0), readl(fb->regs + CLCD_TIM1), |
234 | readl(fb->regs + CLCD_TIM2), readl(fb->regs + CLCD_TIM3), | 234 | readl(fb->regs + CLCD_TIM2), readl(fb->regs + CLCD_TIM3), |
235 | readl(fb->regs + CLCD_UBAS), readl(fb->regs + CLCD_LBAS), | 235 | readl(fb->regs + CLCD_UBAS), readl(fb->regs + CLCD_LBAS), |
236 | readl(fb->regs + CLCD_IENB), readl(fb->regs + CLCD_CNTL)); | 236 | readl(fb->regs + fb->off_ienb), readl(fb->regs + fb->off_cntl)); |
237 | #endif | 237 | #endif |
238 | 238 | ||
239 | return 0; | 239 | return 0; |
@@ -345,6 +345,23 @@ static int clcdfb_register(struct clcd_fb *fb) | |||
345 | { | 345 | { |
346 | int ret; | 346 | int ret; |
347 | 347 | ||
348 | /* | ||
349 | * ARM PL111 always has IENB at 0x1c; it's only PL110 | ||
350 | * which is reversed on some platforms. | ||
351 | */ | ||
352 | if (amba_manf(fb->dev) == 0x41 && amba_part(fb->dev) == 0x111) { | ||
353 | fb->off_ienb = CLCD_PL111_IENB; | ||
354 | fb->off_cntl = CLCD_PL111_CNTL; | ||
355 | } else { | ||
356 | #ifdef CONFIG_ARCH_VERSATILE | ||
357 | fb->off_ienb = CLCD_PL111_IENB; | ||
358 | fb->off_cntl = CLCD_PL111_CNTL; | ||
359 | #else | ||
360 | fb->off_ienb = CLCD_PL110_IENB; | ||
361 | fb->off_cntl = CLCD_PL110_CNTL; | ||
362 | #endif | ||
363 | } | ||
364 | |||
348 | fb->clk = clk_get(&fb->dev->dev, NULL); | 365 | fb->clk = clk_get(&fb->dev->dev, NULL); |
349 | if (IS_ERR(fb->clk)) { | 366 | if (IS_ERR(fb->clk)) { |
350 | ret = PTR_ERR(fb->clk); | 367 | ret = PTR_ERR(fb->clk); |
@@ -416,7 +433,7 @@ static int clcdfb_register(struct clcd_fb *fb) | |||
416 | /* | 433 | /* |
417 | * Ensure interrupts are disabled. | 434 | * Ensure interrupts are disabled. |
418 | */ | 435 | */ |
419 | writel(0, fb->regs + CLCD_IENB); | 436 | writel(0, fb->regs + fb->off_ienb); |
420 | 437 | ||
421 | fb_set_var(&fb->fb, &fb->fb.var); | 438 | fb_set_var(&fb->fb, &fb->fb.var); |
422 | 439 | ||
diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h index 29c0448265cf..ca16c3801a1e 100644 --- a/include/linux/amba/clcd.h +++ b/include/linux/amba/clcd.h | |||
@@ -21,22 +21,21 @@ | |||
21 | #define CLCD_UBAS 0x00000010 | 21 | #define CLCD_UBAS 0x00000010 |
22 | #define CLCD_LBAS 0x00000014 | 22 | #define CLCD_LBAS 0x00000014 |
23 | 23 | ||
24 | #if !defined(CONFIG_ARCH_VERSATILE) && !defined(CONFIG_ARCH_REALVIEW) | 24 | #define CLCD_PL110_IENB 0x00000018 |
25 | #define CLCD_IENB 0x00000018 | 25 | #define CLCD_PL110_CNTL 0x0000001c |
26 | #define CLCD_CNTL 0x0000001c | 26 | #define CLCD_PL110_STAT 0x00000020 |
27 | #else | 27 | #define CLCD_PL110_INTR 0x00000024 |
28 | /* | 28 | #define CLCD_PL110_UCUR 0x00000028 |
29 | * Someone rearranged these two registers on the Versatile | 29 | #define CLCD_PL110_LCUR 0x0000002C |
30 | * platform... | 30 | |
31 | */ | 31 | #define CLCD_PL111_CNTL 0x00000018 |
32 | #define CLCD_IENB 0x0000001c | 32 | #define CLCD_PL111_IENB 0x0000001c |
33 | #define CLCD_CNTL 0x00000018 | 33 | #define CLCD_PL111_RIS 0x00000020 |
34 | #endif | 34 | #define CLCD_PL111_MIS 0x00000024 |
35 | 35 | #define CLCD_PL111_ICR 0x00000028 | |
36 | #define CLCD_STAT 0x00000020 | 36 | #define CLCD_PL111_UCUR 0x0000002c |
37 | #define CLCD_INTR 0x00000024 | 37 | #define CLCD_PL111_LCUR 0x00000030 |
38 | #define CLCD_UCUR 0x00000028 | 38 | |
39 | #define CLCD_LCUR 0x0000002C | ||
40 | #define CLCD_PALL 0x00000200 | 39 | #define CLCD_PALL 0x00000200 |
41 | #define CLCD_PALETTE 0x00000200 | 40 | #define CLCD_PALETTE 0x00000200 |
42 | 41 | ||
@@ -147,6 +146,8 @@ struct clcd_fb { | |||
147 | struct clcd_board *board; | 146 | struct clcd_board *board; |
148 | void *board_data; | 147 | void *board_data; |
149 | void __iomem *regs; | 148 | void __iomem *regs; |
149 | u16 off_ienb; | ||
150 | u16 off_cntl; | ||
150 | u32 clcd_cntl; | 151 | u32 clcd_cntl; |
151 | u32 cmap[16]; | 152 | u32 cmap[16]; |
152 | }; | 153 | }; |