diff options
-rw-r--r-- | arch/sh/boards/board-ap325rxa.c | 2 | ||||
-rw-r--r-- | arch/sh/boards/mach-ecovec24/setup.c | 2 | ||||
-rw-r--r-- | arch/sh/boards/mach-kfr2r09/setup.c | 2 | ||||
-rw-r--r-- | arch/sh/boards/mach-migor/setup.c | 2 | ||||
-rw-r--r-- | arch/sh/boards/mach-se/7724/setup.c | 2 | ||||
-rw-r--r-- | drivers/video/sh_mobile_lcdcfb.c | 47 |
6 files changed, 49 insertions, 8 deletions
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index bcf1f40bcc6c..327d47c25a57 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -211,7 +211,7 @@ static struct resource lcdc_resources[] = { | |||
211 | [0] = { | 211 | [0] = { |
212 | .name = "LCDC", | 212 | .name = "LCDC", |
213 | .start = 0xfe940000, /* P4-only space */ | 213 | .start = 0xfe940000, /* P4-only space */ |
214 | .end = 0xfe941fff, | 214 | .end = 0xfe942fff, |
215 | .flags = IORESOURCE_MEM, | 215 | .flags = IORESOURCE_MEM, |
216 | }, | 216 | }, |
217 | [1] = { | 217 | [1] = { |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 7da274ae7440..bbe601d4209f 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
@@ -239,7 +239,7 @@ static struct resource lcdc_resources[] = { | |||
239 | [0] = { | 239 | [0] = { |
240 | .name = "LCDC", | 240 | .name = "LCDC", |
241 | .start = 0xfe940000, | 241 | .start = 0xfe940000, |
242 | .end = 0xfe941fff, | 242 | .end = 0xfe942fff, |
243 | .flags = IORESOURCE_MEM, | 243 | .flags = IORESOURCE_MEM, |
244 | }, | 244 | }, |
245 | [1] = { | 245 | [1] = { |
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index 7155be0d1154..c08d33fe2104 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c | |||
@@ -162,7 +162,7 @@ static struct resource kfr2r09_sh_lcdc_resources[] = { | |||
162 | [0] = { | 162 | [0] = { |
163 | .name = "LCDC", | 163 | .name = "LCDC", |
164 | .start = 0xfe940000, /* P4-only space */ | 164 | .start = 0xfe940000, /* P4-only space */ |
165 | .end = 0xfe941fff, | 165 | .end = 0xfe942fff, |
166 | .flags = IORESOURCE_MEM, | 166 | .flags = IORESOURCE_MEM, |
167 | }, | 167 | }, |
168 | [1] = { | 168 | [1] = { |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index be8f0d94f6f1..6ed1fd32369e 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
@@ -279,7 +279,7 @@ static struct resource migor_lcdc_resources[] = { | |||
279 | [0] = { | 279 | [0] = { |
280 | .name = "LCDC", | 280 | .name = "LCDC", |
281 | .start = 0xfe940000, /* P4-only space */ | 281 | .start = 0xfe940000, /* P4-only space */ |
282 | .end = 0xfe941fff, | 282 | .end = 0xfe942fff, |
283 | .flags = IORESOURCE_MEM, | 283 | .flags = IORESOURCE_MEM, |
284 | }, | 284 | }, |
285 | [1] = { | 285 | [1] = { |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 1876c8306c85..00973e0f8c63 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
@@ -166,7 +166,7 @@ static struct resource lcdc_resources[] = { | |||
166 | [0] = { | 166 | [0] = { |
167 | .name = "LCDC", | 167 | .name = "LCDC", |
168 | .start = 0xfe940000, | 168 | .start = 0xfe940000, |
169 | .end = 0xfe941fff, | 169 | .end = 0xfe942fff, |
170 | .flags = IORESOURCE_MEM, | 170 | .flags = IORESOURCE_MEM, |
171 | }, | 171 | }, |
172 | [1] = { | 172 | [1] = { |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index 7f30cb33a203..3ad5157f9899 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <asm/atomic.h> | 23 | #include <asm/atomic.h> |
24 | 24 | ||
25 | #define PALETTE_NR 16 | 25 | #define PALETTE_NR 16 |
26 | #define SIDE_B_OFFSET 0x1000 | ||
27 | #define MIRROR_OFFSET 0x2000 | ||
26 | 28 | ||
27 | /* shared registers */ | 29 | /* shared registers */ |
28 | #define _LDDCKR 0x410 | 30 | #define _LDDCKR 0x410 |
@@ -100,6 +102,10 @@ static unsigned long lcdc_offs_sublcd[NR_CH_REGS] = { | |||
100 | #define LDINTR_FS 0x00000004 | 102 | #define LDINTR_FS 0x00000004 |
101 | #define LDINTR_VSS 0x00000002 | 103 | #define LDINTR_VSS 0x00000002 |
102 | #define LDINTR_VES 0x00000001 | 104 | #define LDINTR_VES 0x00000001 |
105 | #define LDRCNTR_SRS 0x00020000 | ||
106 | #define LDRCNTR_SRC 0x00010000 | ||
107 | #define LDRCNTR_MRS 0x00000002 | ||
108 | #define LDRCNTR_MRC 0x00000001 | ||
103 | 109 | ||
104 | struct sh_mobile_lcdc_priv; | 110 | struct sh_mobile_lcdc_priv; |
105 | struct sh_mobile_lcdc_chan { | 111 | struct sh_mobile_lcdc_chan { |
@@ -132,10 +138,39 @@ struct sh_mobile_lcdc_priv { | |||
132 | int started; | 138 | int started; |
133 | }; | 139 | }; |
134 | 140 | ||
141 | static bool banked(int reg_nr) | ||
142 | { | ||
143 | switch (reg_nr) { | ||
144 | case LDMT1R: | ||
145 | case LDMT2R: | ||
146 | case LDMT3R: | ||
147 | case LDDFR: | ||
148 | case LDSM1R: | ||
149 | case LDSA1R: | ||
150 | case LDMLSR: | ||
151 | case LDHCNR: | ||
152 | case LDHSYNR: | ||
153 | case LDVLNR: | ||
154 | case LDVSYNR: | ||
155 | return true; | ||
156 | } | ||
157 | return false; | ||
158 | } | ||
159 | |||
135 | static void lcdc_write_chan(struct sh_mobile_lcdc_chan *chan, | 160 | static void lcdc_write_chan(struct sh_mobile_lcdc_chan *chan, |
136 | int reg_nr, unsigned long data) | 161 | int reg_nr, unsigned long data) |
137 | { | 162 | { |
138 | iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr]); | 163 | iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr]); |
164 | if (banked(reg_nr)) | ||
165 | iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr] + | ||
166 | SIDE_B_OFFSET); | ||
167 | } | ||
168 | |||
169 | static void lcdc_write_chan_mirror(struct sh_mobile_lcdc_chan *chan, | ||
170 | int reg_nr, unsigned long data) | ||
171 | { | ||
172 | iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr] + | ||
173 | MIRROR_OFFSET); | ||
139 | } | 174 | } |
140 | 175 | ||
141 | static unsigned long lcdc_read_chan(struct sh_mobile_lcdc_chan *chan, | 176 | static unsigned long lcdc_read_chan(struct sh_mobile_lcdc_chan *chan, |
@@ -308,10 +343,16 @@ static irqreturn_t sh_mobile_lcdc_irq(int irq, void *data) | |||
308 | 343 | ||
309 | /* VSYNC End */ | 344 | /* VSYNC End */ |
310 | if (ldintr & LDINTR_VES) { | 345 | if (ldintr & LDINTR_VES) { |
346 | unsigned long ldrcntr = lcdc_read(priv, _LDRCNTR); | ||
311 | /* Set the source address for the next refresh */ | 347 | /* Set the source address for the next refresh */ |
312 | lcdc_write_chan(ch, LDSA1R, ch->dma_handle + | 348 | lcdc_write_chan_mirror(ch, LDSA1R, ch->dma_handle + |
313 | ch->new_pan_offset); | 349 | ch->new_pan_offset); |
314 | lcdc_write(ch->lcdc, _LDRCNTR, 0); | 350 | if (lcdc_chan_is_sublcd(ch)) |
351 | lcdc_write(ch->lcdc, _LDRCNTR, | ||
352 | ldrcntr ^ LDRCNTR_SRS); | ||
353 | else | ||
354 | lcdc_write(ch->lcdc, _LDRCNTR, | ||
355 | ldrcntr ^ LDRCNTR_MRS); | ||
315 | ch->pan_offset = ch->new_pan_offset; | 356 | ch->pan_offset = ch->new_pan_offset; |
316 | } | 357 | } |
317 | } | 358 | } |