diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/arm/common/sa1111.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 130 |
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 | ||
188 | void __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 | |||
202 | sa1111_irq_handler(unsigned int irq, struct irq_desc *desc) | 194 | sa1111_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 | ||
237 | static void sa1111_ack_irq(unsigned int irq) | 229 | static void sa1111_ack_irq(struct irq_data *d) |
238 | { | 230 | { |
239 | } | 231 | } |
240 | 232 | ||
241 | static void sa1111_mask_lowirq(unsigned int irq) | 233 | static 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 | ||
252 | static void sa1111_unmask_lowirq(unsigned int irq) | 244 | static 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 | */ |
270 | static int sa1111_retrigger_lowirq(unsigned int irq) | 262 | static 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 | ||
292 | static int sa1111_type_lowirq(unsigned int irq, unsigned int flags) | 284 | static 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 | ||
316 | static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) | 308 | static 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 | ||
333 | static struct irq_chip sa1111_low_chip = { | 325 | static 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 | ||
343 | static void sa1111_mask_highirq(unsigned int irq) | 335 | static 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 | ||
354 | static void sa1111_unmask_highirq(unsigned int irq) | 346 | static 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 | */ |
372 | static int sa1111_retrigger_highirq(unsigned int irq) | 364 | static 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 | ||
394 | static int sa1111_type_highirq(unsigned int irq, unsigned int flags) | 386 | static 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 | ||
418 | static int sa1111_wake_highirq(unsigned int irq, unsigned int on) | 410 | static 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 | ||
435 | static struct irq_chip sa1111_high_chip = { | 427 | static 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 | ||
445 | static void sa1111_setup_irq(struct sa1111 *sachip) | 437 | static 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 | */ |
681 | static int | 673 | static 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 | } |