.. | .. |
---|
1 | 1 | /* |
---|
2 | | - * TI DaVinci DM644x chip specific setup |
---|
| 2 | + * TI DaVinci DM646x chip specific setup |
---|
3 | 3 | * |
---|
4 | 4 | * Author: Kevin Hilman, Deep Root Systems, LLC |
---|
5 | 5 | * |
---|
.. | .. |
---|
15 | 15 | #include <linux/dma-mapping.h> |
---|
16 | 16 | #include <linux/dmaengine.h> |
---|
17 | 17 | #include <linux/init.h> |
---|
| 18 | +#include <linux/io.h> |
---|
| 19 | +#include <linux/irqchip/irq-davinci-aintc.h> |
---|
18 | 20 | #include <linux/platform_data/edma.h> |
---|
19 | 21 | #include <linux/platform_data/gpio-davinci.h> |
---|
20 | 22 | #include <linux/platform_device.h> |
---|
.. | .. |
---|
24 | 26 | |
---|
25 | 27 | #include <mach/common.h> |
---|
26 | 28 | #include <mach/cputype.h> |
---|
27 | | -#include <mach/irqs.h> |
---|
28 | 29 | #include <mach/mux.h> |
---|
29 | 30 | #include <mach/serial.h> |
---|
30 | | -#include <mach/time.h> |
---|
| 31 | + |
---|
| 32 | +#include <clocksource/timer-davinci.h> |
---|
31 | 33 | |
---|
32 | 34 | #include "asp.h" |
---|
33 | 35 | #include "davinci.h" |
---|
| 36 | +#include "irqs.h" |
---|
34 | 37 | #include "mux.h" |
---|
35 | 38 | |
---|
36 | 39 | #define DAVINCI_VPIF_BASE (0x01C12000) |
---|
.. | .. |
---|
62 | 65 | .flags = IORESOURCE_MEM, |
---|
63 | 66 | }, |
---|
64 | 67 | { |
---|
65 | | - .start = IRQ_DM646X_EMACRXTHINT, |
---|
66 | | - .end = IRQ_DM646X_EMACRXTHINT, |
---|
| 68 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXTHINT), |
---|
| 69 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXTHINT), |
---|
67 | 70 | .flags = IORESOURCE_IRQ, |
---|
68 | 71 | }, |
---|
69 | 72 | { |
---|
70 | | - .start = IRQ_DM646X_EMACRXINT, |
---|
71 | | - .end = IRQ_DM646X_EMACRXINT, |
---|
| 73 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXINT), |
---|
| 74 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXINT), |
---|
72 | 75 | .flags = IORESOURCE_IRQ, |
---|
73 | 76 | }, |
---|
74 | 77 | { |
---|
75 | | - .start = IRQ_DM646X_EMACTXINT, |
---|
76 | | - .end = IRQ_DM646X_EMACTXINT, |
---|
| 78 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACTXINT), |
---|
| 79 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACTXINT), |
---|
77 | 80 | .flags = IORESOURCE_IRQ, |
---|
78 | 81 | }, |
---|
79 | 82 | { |
---|
80 | | - .start = IRQ_DM646X_EMACMISCINT, |
---|
81 | | - .end = IRQ_DM646X_EMACMISCINT, |
---|
| 83 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACMISCINT), |
---|
| 84 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACMISCINT), |
---|
82 | 85 | .flags = IORESOURCE_IRQ, |
---|
83 | 86 | }, |
---|
84 | 87 | }; |
---|
.. | .. |
---|
273 | 276 | }, |
---|
274 | 277 | { |
---|
275 | 278 | .name = "edma3_ccint", |
---|
276 | | - .start = IRQ_CCINT0, |
---|
| 279 | + .start = DAVINCI_INTC_IRQ(IRQ_CCINT0), |
---|
277 | 280 | .flags = IORESOURCE_IRQ, |
---|
278 | 281 | }, |
---|
279 | 282 | { |
---|
280 | 283 | .name = "edma3_ccerrint", |
---|
281 | | - .start = IRQ_CCERRINT, |
---|
| 284 | + .start = DAVINCI_INTC_IRQ(IRQ_CCERRINT), |
---|
282 | 285 | .flags = IORESOURCE_IRQ, |
---|
283 | 286 | }, |
---|
284 | 287 | /* not using TC*_ERR */ |
---|
.. | .. |
---|
315 | 318 | }, |
---|
316 | 319 | { |
---|
317 | 320 | .name = "tx", |
---|
318 | | - .start = IRQ_DM646X_MCASP0TXINT, |
---|
| 321 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_MCASP0TXINT), |
---|
319 | 322 | .flags = IORESOURCE_IRQ, |
---|
320 | 323 | }, |
---|
321 | 324 | { |
---|
322 | 325 | .name = "rx", |
---|
323 | | - .start = IRQ_DM646X_MCASP0RXINT, |
---|
| 326 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_MCASP0RXINT), |
---|
324 | 327 | .flags = IORESOURCE_IRQ, |
---|
325 | 328 | }, |
---|
326 | 329 | }; |
---|
.. | .. |
---|
341 | 344 | }, |
---|
342 | 345 | { |
---|
343 | 346 | .name = "tx", |
---|
344 | | - .start = IRQ_DM646X_MCASP1TXINT, |
---|
| 347 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_MCASP1TXINT), |
---|
345 | 348 | .flags = IORESOURCE_IRQ, |
---|
346 | 349 | }, |
---|
347 | 350 | }; |
---|
.. | .. |
---|
388 | 391 | |
---|
389 | 392 | static struct resource vpif_display_resource[] = { |
---|
390 | 393 | { |
---|
391 | | - .start = IRQ_DM646X_VP_VERTINT2, |
---|
392 | | - .end = IRQ_DM646X_VP_VERTINT2, |
---|
| 394 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT2), |
---|
| 395 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT2), |
---|
393 | 396 | .flags = IORESOURCE_IRQ, |
---|
394 | 397 | }, |
---|
395 | 398 | { |
---|
396 | | - .start = IRQ_DM646X_VP_VERTINT3, |
---|
397 | | - .end = IRQ_DM646X_VP_VERTINT3, |
---|
| 399 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT3), |
---|
| 400 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT3), |
---|
398 | 401 | .flags = IORESOURCE_IRQ, |
---|
399 | 402 | }, |
---|
400 | 403 | }; |
---|
.. | .. |
---|
412 | 415 | |
---|
413 | 416 | static struct resource vpif_capture_resource[] = { |
---|
414 | 417 | { |
---|
415 | | - .start = IRQ_DM646X_VP_VERTINT0, |
---|
416 | | - .end = IRQ_DM646X_VP_VERTINT0, |
---|
| 418 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT0), |
---|
| 419 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT0), |
---|
417 | 420 | .flags = IORESOURCE_IRQ, |
---|
418 | 421 | }, |
---|
419 | 422 | { |
---|
420 | | - .start = IRQ_DM646X_VP_VERTINT1, |
---|
421 | | - .end = IRQ_DM646X_VP_VERTINT1, |
---|
| 423 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT1), |
---|
| 424 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT1), |
---|
422 | 425 | .flags = IORESOURCE_IRQ, |
---|
423 | 426 | }, |
---|
424 | 427 | }; |
---|
.. | .. |
---|
441 | 444 | .flags = IORESOURCE_MEM, |
---|
442 | 445 | }, |
---|
443 | 446 | { /* interrupt */ |
---|
444 | | - .start = IRQ_DM646X_GPIOBNK0, |
---|
445 | | - .end = IRQ_DM646X_GPIOBNK0, |
---|
| 447 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK0), |
---|
| 448 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK0), |
---|
446 | 449 | .flags = IORESOURCE_IRQ, |
---|
447 | 450 | }, |
---|
448 | 451 | { |
---|
449 | | - .start = IRQ_DM646X_GPIOBNK1, |
---|
450 | | - .end = IRQ_DM646X_GPIOBNK1, |
---|
| 452 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK1), |
---|
| 453 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK1), |
---|
451 | 454 | .flags = IORESOURCE_IRQ, |
---|
452 | 455 | }, |
---|
453 | 456 | { |
---|
454 | | - .start = IRQ_DM646X_GPIOBNK2, |
---|
455 | | - .end = IRQ_DM646X_GPIOBNK2, |
---|
| 457 | + .start = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK2), |
---|
| 458 | + .end = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK2), |
---|
456 | 459 | .flags = IORESOURCE_IRQ, |
---|
457 | 460 | }, |
---|
458 | 461 | }; |
---|
459 | 462 | |
---|
460 | 463 | static struct davinci_gpio_platform_data dm646x_gpio_platform_data = { |
---|
| 464 | + .no_auto_base = true, |
---|
| 465 | + .base = 0, |
---|
461 | 466 | .ngpio = 43, |
---|
462 | 467 | }; |
---|
463 | 468 | |
---|
.. | .. |
---|
497 | 502 | }; |
---|
498 | 503 | |
---|
499 | 504 | /* |
---|
500 | | - * T0_BOT: Timer 0, bottom: clockevent source for hrtimers |
---|
501 | | - * T0_TOP: Timer 0, top : clocksource for generic timekeeping |
---|
502 | | - * T1_BOT: Timer 1, bottom: (used by DSP in TI DSPLink code) |
---|
503 | | - * T1_TOP: Timer 1, top : <unused> |
---|
| 505 | + * Bottom half of timer0 is used for clockevent, top half is used for |
---|
| 506 | + * clocksource. |
---|
504 | 507 | */ |
---|
505 | | -static struct davinci_timer_info dm646x_timer_info = { |
---|
506 | | - .timers = davinci_timer_instance, |
---|
507 | | - .clockevent_id = T0_BOT, |
---|
508 | | - .clocksource_id = T0_TOP, |
---|
| 508 | +static const struct davinci_timer_cfg dm646x_timer_cfg = { |
---|
| 509 | + .reg = DEFINE_RES_IO(DAVINCI_TIMER0_BASE, SZ_4K), |
---|
| 510 | + .irq = { |
---|
| 511 | + DEFINE_RES_IRQ(DAVINCI_INTC_IRQ(IRQ_TINT0_TINT12)), |
---|
| 512 | + DEFINE_RES_IRQ(DAVINCI_INTC_IRQ(IRQ_TINT0_TINT34)), |
---|
| 513 | + }, |
---|
509 | 514 | }; |
---|
510 | 515 | |
---|
511 | 516 | static struct plat_serial8250_port dm646x_serial0_platform_data[] = { |
---|
512 | 517 | { |
---|
513 | 518 | .mapbase = DAVINCI_UART0_BASE, |
---|
514 | | - .irq = IRQ_UARTINT0, |
---|
| 519 | + .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT0), |
---|
515 | 520 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | |
---|
516 | 521 | UPF_IOREMAP, |
---|
517 | 522 | .iotype = UPIO_MEM32, |
---|
.. | .. |
---|
524 | 529 | static struct plat_serial8250_port dm646x_serial1_platform_data[] = { |
---|
525 | 530 | { |
---|
526 | 531 | .mapbase = DAVINCI_UART1_BASE, |
---|
527 | | - .irq = IRQ_UARTINT1, |
---|
| 532 | + .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT1), |
---|
528 | 533 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | |
---|
529 | 534 | UPF_IOREMAP, |
---|
530 | 535 | .iotype = UPIO_MEM32, |
---|
.. | .. |
---|
537 | 542 | static struct plat_serial8250_port dm646x_serial2_platform_data[] = { |
---|
538 | 543 | { |
---|
539 | 544 | .mapbase = DAVINCI_UART2_BASE, |
---|
540 | | - .irq = IRQ_DM646X_UARTINT2, |
---|
| 545 | + .irq = DAVINCI_INTC_IRQ(IRQ_DM646X_UARTINT2), |
---|
541 | 546 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | |
---|
542 | 547 | UPF_IOREMAP, |
---|
543 | 548 | .iotype = UPIO_MEM32, |
---|
.. | .. |
---|
583 | 588 | .pinmux_base = DAVINCI_SYSTEM_MODULE_BASE, |
---|
584 | 589 | .pinmux_pins = dm646x_pins, |
---|
585 | 590 | .pinmux_pins_num = ARRAY_SIZE(dm646x_pins), |
---|
586 | | - .intc_base = DAVINCI_ARM_INTC_BASE, |
---|
587 | | - .intc_type = DAVINCI_INTC_TYPE_AINTC, |
---|
588 | | - .intc_irq_prios = dm646x_default_priorities, |
---|
589 | | - .intc_irq_num = DAVINCI_N_AINTC_IRQ, |
---|
590 | | - .timer_info = &dm646x_timer_info, |
---|
591 | 591 | .emac_pdata = &dm646x_emac_pdata, |
---|
592 | 592 | .sram_dma = 0x10010000, |
---|
593 | 593 | .sram_len = SZ_32K, |
---|
.. | .. |
---|
652 | 652 | { |
---|
653 | 653 | void __iomem *pll1, *psc; |
---|
654 | 654 | struct clk *clk; |
---|
| 655 | + int rv; |
---|
655 | 656 | |
---|
656 | 657 | clk_register_fixed_rate(NULL, "ref_clk", NULL, 0, ref_clk_rate); |
---|
657 | 658 | clk_register_fixed_rate(NULL, "aux_clkin", NULL, 0, aux_clkin_rate); |
---|
.. | .. |
---|
663 | 664 | dm646x_psc_init(NULL, psc); |
---|
664 | 665 | |
---|
665 | 666 | clk = clk_get(NULL, "timer0"); |
---|
| 667 | + if (WARN_ON(IS_ERR(clk))) { |
---|
| 668 | + pr_err("Unable to get the timer clock\n"); |
---|
| 669 | + return; |
---|
| 670 | + } |
---|
666 | 671 | |
---|
667 | | - davinci_timer_init(clk); |
---|
| 672 | + rv = davinci_timer_register(clk, &dm646x_timer_cfg); |
---|
| 673 | + WARN(rv, "Unable to register the timer: %d\n", rv); |
---|
668 | 674 | } |
---|
669 | 675 | |
---|
670 | 676 | static struct resource dm646x_pll2_resources[] = { |
---|
.. | .. |
---|
688 | 694 | platform_device_register(&dm646x_pll2_device); |
---|
689 | 695 | } |
---|
690 | 696 | |
---|
| 697 | +static const struct davinci_aintc_config dm646x_aintc_config = { |
---|
| 698 | + .reg = { |
---|
| 699 | + .start = DAVINCI_ARM_INTC_BASE, |
---|
| 700 | + .end = DAVINCI_ARM_INTC_BASE + SZ_4K - 1, |
---|
| 701 | + .flags = IORESOURCE_MEM, |
---|
| 702 | + }, |
---|
| 703 | + .num_irqs = 64, |
---|
| 704 | + .prios = dm646x_default_priorities, |
---|
| 705 | +}; |
---|
| 706 | + |
---|
| 707 | +void __init dm646x_init_irq(void) |
---|
| 708 | +{ |
---|
| 709 | + davinci_aintc_init(&dm646x_aintc_config); |
---|
| 710 | +} |
---|
| 711 | + |
---|
691 | 712 | static int __init dm646x_init_devices(void) |
---|
692 | 713 | { |
---|
693 | 714 | int ret = 0; |
---|