| .. | .. |
|---|
| 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; |
|---|