aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/common/sa1111.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/arm/common/sa1111.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'arch/arm/common/sa1111.c')
-rw-r--r--arch/arm/common/sa1111.c130
1 files changed, 61 insertions, 69 deletions
diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c
index 517d50ddbeb3..9c49a46a2b7a 100644
--- a/arch/arm/common/sa1111.c
+++ b/arch/arm/common/sa1111.c
@@ -185,14 +185,6 @@ static struct sa1111_dev_info sa1111_devices[] = {
185 }, 185 },
186}; 186};
187 187
188void __init sa1111_adjust_zones(unsigned long *size, unsigned long *holes)
189{
190 unsigned int sz = SZ_1M >> PAGE_SHIFT;
191
192 size[1] = size[0] - sz;
193 size[0] = sz;
194}
195
196/* 188/*
197 * SA1111 interrupt support. Since clearing an IRQ while there are 189 * SA1111 interrupt support. Since clearing an IRQ while there are
198 * active IRQs causes the interrupt output to pulse, the upper levels 190 * active IRQs causes the interrupt output to pulse, the upper levels
@@ -202,7 +194,7 @@ static void
202sa1111_irq_handler(unsigned int irq, struct irq_desc *desc) 194sa1111_irq_handler(unsigned int irq, struct irq_desc *desc)
203{ 195{
204 unsigned int stat0, stat1, i; 196 unsigned int stat0, stat1, i;
205 struct sa1111 *sachip = get_irq_data(irq); 197 struct sa1111 *sachip = irq_get_handler_data(irq);
206 void __iomem *mapbase = sachip->base + SA1111_INTC; 198 void __iomem *mapbase = sachip->base + SA1111_INTC;
207 199
208 stat0 = sa1111_readl(mapbase + SA1111_INTSTATCLR0); 200 stat0 = sa1111_readl(mapbase + SA1111_INTSTATCLR0);
@@ -210,7 +202,7 @@ sa1111_irq_handler(unsigned int irq, struct irq_desc *desc)
210 202
211 sa1111_writel(stat0, mapbase + SA1111_INTSTATCLR0); 203 sa1111_writel(stat0, mapbase + SA1111_INTSTATCLR0);
212 204
213 desc->chip->ack(irq); 205 desc->irq_data.chip->irq_ack(&desc->irq_data);
214 206
215 sa1111_writel(stat1, mapbase + SA1111_INTSTATCLR1); 207 sa1111_writel(stat1, mapbase + SA1111_INTSTATCLR1);
216 208
@@ -228,35 +220,35 @@ sa1111_irq_handler(unsigned int irq, struct irq_desc *desc)
228 generic_handle_irq(i + sachip->irq_base); 220 generic_handle_irq(i + sachip->irq_base);
229 221
230 /* For level-based interrupts */ 222 /* For level-based interrupts */
231 desc->chip->unmask(irq); 223 desc->irq_data.chip->irq_unmask(&desc->irq_data);
232} 224}
233 225
234#define SA1111_IRQMASK_LO(x) (1 << (x - sachip->irq_base)) 226#define SA1111_IRQMASK_LO(x) (1 << (x - sachip->irq_base))
235#define SA1111_IRQMASK_HI(x) (1 << (x - sachip->irq_base - 32)) 227#define SA1111_IRQMASK_HI(x) (1 << (x - sachip->irq_base - 32))
236 228
237static void sa1111_ack_irq(unsigned int irq) 229static void sa1111_ack_irq(struct irq_data *d)
238{ 230{
239} 231}
240 232
241static void sa1111_mask_lowirq(unsigned int irq) 233static void sa1111_mask_lowirq(struct irq_data *d)
242{ 234{
243 struct sa1111 *sachip = get_irq_chip_data(irq); 235 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
244 void __iomem *mapbase = sachip->base + SA1111_INTC; 236 void __iomem *mapbase = sachip->base + SA1111_INTC;
245 unsigned long ie0; 237 unsigned long ie0;
246 238
247 ie0 = sa1111_readl(mapbase + SA1111_INTEN0); 239 ie0 = sa1111_readl(mapbase + SA1111_INTEN0);
248 ie0 &= ~SA1111_IRQMASK_LO(irq); 240 ie0 &= ~SA1111_IRQMASK_LO(d->irq);
249 writel(ie0, mapbase + SA1111_INTEN0); 241 writel(ie0, mapbase + SA1111_INTEN0);
250} 242}
251 243
252static void sa1111_unmask_lowirq(unsigned int irq) 244static void sa1111_unmask_lowirq(struct irq_data *d)
253{ 245{
254 struct sa1111 *sachip = get_irq_chip_data(irq); 246 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
255 void __iomem *mapbase = sachip->base + SA1111_INTC; 247 void __iomem *mapbase = sachip->base + SA1111_INTC;
256 unsigned long ie0; 248 unsigned long ie0;
257 249
258 ie0 = sa1111_readl(mapbase + SA1111_INTEN0); 250 ie0 = sa1111_readl(mapbase + SA1111_INTEN0);
259 ie0 |= SA1111_IRQMASK_LO(irq); 251 ie0 |= SA1111_IRQMASK_LO(d->irq);
260 sa1111_writel(ie0, mapbase + SA1111_INTEN0); 252 sa1111_writel(ie0, mapbase + SA1111_INTEN0);
261} 253}
262 254
@@ -267,11 +259,11 @@ static void sa1111_unmask_lowirq(unsigned int irq)
267 * be triggered. In fact, its very difficult, if not impossible to get 259 * be triggered. In fact, its very difficult, if not impossible to get
268 * INTSET to re-trigger the interrupt. 260 * INTSET to re-trigger the interrupt.
269 */ 261 */
270static int sa1111_retrigger_lowirq(unsigned int irq) 262static int sa1111_retrigger_lowirq(struct irq_data *d)
271{ 263{
272 struct sa1111 *sachip = get_irq_chip_data(irq); 264 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
273 void __iomem *mapbase = sachip->base + SA1111_INTC; 265 void __iomem *mapbase = sachip->base + SA1111_INTC;
274 unsigned int mask = SA1111_IRQMASK_LO(irq); 266 unsigned int mask = SA1111_IRQMASK_LO(d->irq);
275 unsigned long ip0; 267 unsigned long ip0;
276 int i; 268 int i;
277 269
@@ -279,21 +271,21 @@ static int sa1111_retrigger_lowirq(unsigned int irq)
279 for (i = 0; i < 8; i++) { 271 for (i = 0; i < 8; i++) {
280 sa1111_writel(ip0 ^ mask, mapbase + SA1111_INTPOL0); 272 sa1111_writel(ip0 ^ mask, mapbase + SA1111_INTPOL0);
281 sa1111_writel(ip0, mapbase + SA1111_INTPOL0); 273 sa1111_writel(ip0, mapbase + SA1111_INTPOL0);
282 if (sa1111_readl(mapbase + SA1111_INTSTATCLR1) & mask) 274 if (sa1111_readl(mapbase + SA1111_INTSTATCLR0) & mask)
283 break; 275 break;
284 } 276 }
285 277
286 if (i == 8) 278 if (i == 8)
287 printk(KERN_ERR "Danger Will Robinson: failed to " 279 printk(KERN_ERR "Danger Will Robinson: failed to "
288 "re-trigger IRQ%d\n", irq); 280 "re-trigger IRQ%d\n", d->irq);
289 return i == 8 ? -1 : 0; 281 return i == 8 ? -1 : 0;
290} 282}
291 283
292static int sa1111_type_lowirq(unsigned int irq, unsigned int flags) 284static int sa1111_type_lowirq(struct irq_data *d, unsigned int flags)
293{ 285{
294 struct sa1111 *sachip = get_irq_chip_data(irq); 286 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
295 void __iomem *mapbase = sachip->base + SA1111_INTC; 287 void __iomem *mapbase = sachip->base + SA1111_INTC;
296 unsigned int mask = SA1111_IRQMASK_LO(irq); 288 unsigned int mask = SA1111_IRQMASK_LO(d->irq);
297 unsigned long ip0; 289 unsigned long ip0;
298 290
299 if (flags == IRQ_TYPE_PROBE) 291 if (flags == IRQ_TYPE_PROBE)
@@ -313,11 +305,11 @@ static int sa1111_type_lowirq(unsigned int irq, unsigned int flags)
313 return 0; 305 return 0;
314} 306}
315 307
316static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) 308static int sa1111_wake_lowirq(struct irq_data *d, unsigned int on)
317{ 309{
318 struct sa1111 *sachip = get_irq_chip_data(irq); 310 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
319 void __iomem *mapbase = sachip->base + SA1111_INTC; 311 void __iomem *mapbase = sachip->base + SA1111_INTC;
320 unsigned int mask = SA1111_IRQMASK_LO(irq); 312 unsigned int mask = SA1111_IRQMASK_LO(d->irq);
321 unsigned long we0; 313 unsigned long we0;
322 314
323 we0 = sa1111_readl(mapbase + SA1111_WAKEEN0); 315 we0 = sa1111_readl(mapbase + SA1111_WAKEEN0);
@@ -332,33 +324,33 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on)
332 324
333static struct irq_chip sa1111_low_chip = { 325static struct irq_chip sa1111_low_chip = {
334 .name = "SA1111-l", 326 .name = "SA1111-l",
335 .ack = sa1111_ack_irq, 327 .irq_ack = sa1111_ack_irq,
336 .mask = sa1111_mask_lowirq, 328 .irq_mask = sa1111_mask_lowirq,
337 .unmask = sa1111_unmask_lowirq, 329 .irq_unmask = sa1111_unmask_lowirq,
338 .retrigger = sa1111_retrigger_lowirq, 330 .irq_retrigger = sa1111_retrigger_lowirq,
339 .set_type = sa1111_type_lowirq, 331 .irq_set_type = sa1111_type_lowirq,
340 .set_wake = sa1111_wake_lowirq, 332 .irq_set_wake = sa1111_wake_lowirq,
341}; 333};
342 334
343static void sa1111_mask_highirq(unsigned int irq) 335static void sa1111_mask_highirq(struct irq_data *d)
344{ 336{
345 struct sa1111 *sachip = get_irq_chip_data(irq); 337 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
346 void __iomem *mapbase = sachip->base + SA1111_INTC; 338 void __iomem *mapbase = sachip->base + SA1111_INTC;
347 unsigned long ie1; 339 unsigned long ie1;
348 340
349 ie1 = sa1111_readl(mapbase + SA1111_INTEN1); 341 ie1 = sa1111_readl(mapbase + SA1111_INTEN1);
350 ie1 &= ~SA1111_IRQMASK_HI(irq); 342 ie1 &= ~SA1111_IRQMASK_HI(d->irq);
351 sa1111_writel(ie1, mapbase + SA1111_INTEN1); 343 sa1111_writel(ie1, mapbase + SA1111_INTEN1);
352} 344}
353 345
354static void sa1111_unmask_highirq(unsigned int irq) 346static void sa1111_unmask_highirq(struct irq_data *d)
355{ 347{
356 struct sa1111 *sachip = get_irq_chip_data(irq); 348 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
357 void __iomem *mapbase = sachip->base + SA1111_INTC; 349 void __iomem *mapbase = sachip->base + SA1111_INTC;
358 unsigned long ie1; 350 unsigned long ie1;
359 351
360 ie1 = sa1111_readl(mapbase + SA1111_INTEN1); 352 ie1 = sa1111_readl(mapbase + SA1111_INTEN1);
361 ie1 |= SA1111_IRQMASK_HI(irq); 353 ie1 |= SA1111_IRQMASK_HI(d->irq);
362 sa1111_writel(ie1, mapbase + SA1111_INTEN1); 354 sa1111_writel(ie1, mapbase + SA1111_INTEN1);
363} 355}
364 356
@@ -369,11 +361,11 @@ static void sa1111_unmask_highirq(unsigned int irq)
369 * be triggered. In fact, its very difficult, if not impossible to get 361 * be triggered. In fact, its very difficult, if not impossible to get
370 * INTSET to re-trigger the interrupt. 362 * INTSET to re-trigger the interrupt.
371 */ 363 */
372static int sa1111_retrigger_highirq(unsigned int irq) 364static int sa1111_retrigger_highirq(struct irq_data *d)
373{ 365{
374 struct sa1111 *sachip = get_irq_chip_data(irq); 366 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
375 void __iomem *mapbase = sachip->base + SA1111_INTC; 367 void __iomem *mapbase = sachip->base + SA1111_INTC;
376 unsigned int mask = SA1111_IRQMASK_HI(irq); 368 unsigned int mask = SA1111_IRQMASK_HI(d->irq);
377 unsigned long ip1; 369 unsigned long ip1;
378 int i; 370 int i;
379 371
@@ -387,15 +379,15 @@ static int sa1111_retrigger_highirq(unsigned int irq)
387 379
388 if (i == 8) 380 if (i == 8)
389 printk(KERN_ERR "Danger Will Robinson: failed to " 381 printk(KERN_ERR "Danger Will Robinson: failed to "
390 "re-trigger IRQ%d\n", irq); 382 "re-trigger IRQ%d\n", d->irq);
391 return i == 8 ? -1 : 0; 383 return i == 8 ? -1 : 0;
392} 384}
393 385
394static int sa1111_type_highirq(unsigned int irq, unsigned int flags) 386static int sa1111_type_highirq(struct irq_data *d, unsigned int flags)
395{ 387{
396 struct sa1111 *sachip = get_irq_chip_data(irq); 388 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
397 void __iomem *mapbase = sachip->base + SA1111_INTC; 389 void __iomem *mapbase = sachip->base + SA1111_INTC;
398 unsigned int mask = SA1111_IRQMASK_HI(irq); 390 unsigned int mask = SA1111_IRQMASK_HI(d->irq);
399 unsigned long ip1; 391 unsigned long ip1;
400 392
401 if (flags == IRQ_TYPE_PROBE) 393 if (flags == IRQ_TYPE_PROBE)
@@ -415,11 +407,11 @@ static int sa1111_type_highirq(unsigned int irq, unsigned int flags)
415 return 0; 407 return 0;
416} 408}
417 409
418static int sa1111_wake_highirq(unsigned int irq, unsigned int on) 410static int sa1111_wake_highirq(struct irq_data *d, unsigned int on)
419{ 411{
420 struct sa1111 *sachip = get_irq_chip_data(irq); 412 struct sa1111 *sachip = irq_data_get_irq_chip_data(d);
421 void __iomem *mapbase = sachip->base + SA1111_INTC; 413 void __iomem *mapbase = sachip->base + SA1111_INTC;
422 unsigned int mask = SA1111_IRQMASK_HI(irq); 414 unsigned int mask = SA1111_IRQMASK_HI(d->irq);
423 unsigned long we1; 415 unsigned long we1;
424 416
425 we1 = sa1111_readl(mapbase + SA1111_WAKEEN1); 417 we1 = sa1111_readl(mapbase + SA1111_WAKEEN1);
@@ -434,12 +426,12 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on)
434 426
435static struct irq_chip sa1111_high_chip = { 427static struct irq_chip sa1111_high_chip = {
436 .name = "SA1111-h", 428 .name = "SA1111-h",
437 .ack = sa1111_ack_irq, 429 .irq_ack = sa1111_ack_irq,
438 .mask = sa1111_mask_highirq, 430 .irq_mask = sa1111_mask_highirq,
439 .unmask = sa1111_unmask_highirq, 431 .irq_unmask = sa1111_unmask_highirq,
440 .retrigger = sa1111_retrigger_highirq, 432 .irq_retrigger = sa1111_retrigger_highirq,
441 .set_type = sa1111_type_highirq, 433 .irq_set_type = sa1111_type_highirq,
442 .set_wake = sa1111_wake_highirq, 434 .irq_set_wake = sa1111_wake_highirq,
443}; 435};
444 436
445static void sa1111_setup_irq(struct sa1111 *sachip) 437static void sa1111_setup_irq(struct sa1111 *sachip)
@@ -472,25 +464,25 @@ static void sa1111_setup_irq(struct sa1111 *sachip)
472 sa1111_writel(~0, irqbase + SA1111_INTSTATCLR1); 464 sa1111_writel(~0, irqbase + SA1111_INTSTATCLR1);
473 465
474 for (irq = IRQ_GPAIN0; irq <= SSPROR; irq++) { 466 for (irq = IRQ_GPAIN0; irq <= SSPROR; irq++) {
475 set_irq_chip(irq, &sa1111_low_chip); 467 irq_set_chip_and_handler(irq, &sa1111_low_chip,
476 set_irq_chip_data(irq, sachip); 468 handle_edge_irq);
477 set_irq_handler(irq, handle_edge_irq); 469 irq_set_chip_data(irq, sachip);
478 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); 470 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
479 } 471 }
480 472
481 for (irq = AUDXMTDMADONEA; irq <= IRQ_S1_BVD1_STSCHG; irq++) { 473 for (irq = AUDXMTDMADONEA; irq <= IRQ_S1_BVD1_STSCHG; irq++) {
482 set_irq_chip(irq, &sa1111_high_chip); 474 irq_set_chip_and_handler(irq, &sa1111_high_chip,
483 set_irq_chip_data(irq, sachip); 475 handle_edge_irq);
484 set_irq_handler(irq, handle_edge_irq); 476 irq_set_chip_data(irq, sachip);
485 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); 477 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
486 } 478 }
487 479
488 /* 480 /*
489 * Register SA1111 interrupt 481 * Register SA1111 interrupt
490 */ 482 */
491 set_irq_type(sachip->irq, IRQ_TYPE_EDGE_RISING); 483 irq_set_irq_type(sachip->irq, IRQ_TYPE_EDGE_RISING);
492 set_irq_data(sachip->irq, sachip); 484 irq_set_handler_data(sachip->irq, sachip);
493 set_irq_chained_handler(sachip->irq, sa1111_irq_handler); 485 irq_set_chained_handler(sachip->irq, sa1111_irq_handler);
494} 486}
495 487
496/* 488/*
@@ -678,7 +670,7 @@ out:
678 * %-EBUSY physical address already marked in-use. 670 * %-EBUSY physical address already marked in-use.
679 * %0 successful. 671 * %0 successful.
680 */ 672 */
681static int 673static int __devinit
682__sa1111_probe(struct device *me, struct resource *mem, int irq) 674__sa1111_probe(struct device *me, struct resource *mem, int irq)
683{ 675{
684 struct sa1111 *sachip; 676 struct sa1111 *sachip;
@@ -815,8 +807,8 @@ static void __sa1111_remove(struct sa1111 *sachip)
815 clk_disable(sachip->clk); 807 clk_disable(sachip->clk);
816 808
817 if (sachip->irq != NO_IRQ) { 809 if (sachip->irq != NO_IRQ) {
818 set_irq_chained_handler(sachip->irq, NULL); 810 irq_set_chained_handler(sachip->irq, NULL);
819 set_irq_data(sachip->irq, NULL); 811 irq_set_handler_data(sachip->irq, NULL);
820 812
821 release_mem_region(sachip->phys + SA1111_INTC, 512); 813 release_mem_region(sachip->phys + SA1111_INTC, 512);
822 } 814 }