| .. | .. |
|---|
| 1 | 1 | /* |
|---|
| 2 | 2 | * TI DA850/OMAP-L138 chip specific setup |
|---|
| 3 | 3 | * |
|---|
| 4 | | - * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ |
|---|
| 4 | + * Copyright (C) 2009 Texas Instruments Incorporated - https://www.ti.com/ |
|---|
| 5 | 5 | * |
|---|
| 6 | 6 | * Derived from: arch/arm/mach-davinci/da830.c |
|---|
| 7 | 7 | * Original Copyrights follow: |
|---|
| .. | .. |
|---|
| 18 | 18 | #include <linux/cpufreq.h> |
|---|
| 19 | 19 | #include <linux/gpio.h> |
|---|
| 20 | 20 | #include <linux/init.h> |
|---|
| 21 | +#include <linux/io.h> |
|---|
| 22 | +#include <linux/irqchip/irq-davinci-cp-intc.h> |
|---|
| 21 | 23 | #include <linux/mfd/da8xx-cfgchip.h> |
|---|
| 22 | 24 | #include <linux/platform_data/clk-da8xx-cfgchip.h> |
|---|
| 23 | 25 | #include <linux/platform_data/clk-davinci-pll.h> |
|---|
| 26 | +#include <linux/platform_data/davinci-cpufreq.h> |
|---|
| 24 | 27 | #include <linux/platform_data/gpio-davinci.h> |
|---|
| 25 | 28 | #include <linux/platform_device.h> |
|---|
| 26 | 29 | #include <linux/regmap.h> |
|---|
| .. | .. |
|---|
| 29 | 32 | #include <asm/mach/map.h> |
|---|
| 30 | 33 | |
|---|
| 31 | 34 | #include <mach/common.h> |
|---|
| 32 | | -#include <mach/cpufreq.h> |
|---|
| 33 | 35 | #include <mach/cputype.h> |
|---|
| 34 | 36 | #include <mach/da8xx.h> |
|---|
| 35 | | -#include <mach/irqs.h> |
|---|
| 36 | 37 | #include <mach/pm.h> |
|---|
| 37 | | -#include <mach/time.h> |
|---|
| 38 | 38 | |
|---|
| 39 | +#include <clocksource/timer-davinci.h> |
|---|
| 40 | + |
|---|
| 41 | +#include "irqs.h" |
|---|
| 39 | 42 | #include "mux.h" |
|---|
| 40 | 43 | |
|---|
| 41 | 44 | #define DA850_PLL1_BASE 0x01e1a000 |
|---|
| .. | .. |
|---|
| 298 | 301 | -1 |
|---|
| 299 | 302 | }; |
|---|
| 300 | 303 | |
|---|
| 301 | | -/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */ |
|---|
| 302 | | -static u8 da850_default_priorities[DA850_N_CP_INTC_IRQ] = { |
|---|
| 303 | | - [IRQ_DA8XX_COMMTX] = 7, |
|---|
| 304 | | - [IRQ_DA8XX_COMMRX] = 7, |
|---|
| 305 | | - [IRQ_DA8XX_NINT] = 7, |
|---|
| 306 | | - [IRQ_DA8XX_EVTOUT0] = 7, |
|---|
| 307 | | - [IRQ_DA8XX_EVTOUT1] = 7, |
|---|
| 308 | | - [IRQ_DA8XX_EVTOUT2] = 7, |
|---|
| 309 | | - [IRQ_DA8XX_EVTOUT3] = 7, |
|---|
| 310 | | - [IRQ_DA8XX_EVTOUT4] = 7, |
|---|
| 311 | | - [IRQ_DA8XX_EVTOUT5] = 7, |
|---|
| 312 | | - [IRQ_DA8XX_EVTOUT6] = 7, |
|---|
| 313 | | - [IRQ_DA8XX_EVTOUT7] = 7, |
|---|
| 314 | | - [IRQ_DA8XX_CCINT0] = 7, |
|---|
| 315 | | - [IRQ_DA8XX_CCERRINT] = 7, |
|---|
| 316 | | - [IRQ_DA8XX_TCERRINT0] = 7, |
|---|
| 317 | | - [IRQ_DA8XX_AEMIFINT] = 7, |
|---|
| 318 | | - [IRQ_DA8XX_I2CINT0] = 7, |
|---|
| 319 | | - [IRQ_DA8XX_MMCSDINT0] = 7, |
|---|
| 320 | | - [IRQ_DA8XX_MMCSDINT1] = 7, |
|---|
| 321 | | - [IRQ_DA8XX_ALLINT0] = 7, |
|---|
| 322 | | - [IRQ_DA8XX_RTC] = 7, |
|---|
| 323 | | - [IRQ_DA8XX_SPINT0] = 7, |
|---|
| 324 | | - [IRQ_DA8XX_TINT12_0] = 7, |
|---|
| 325 | | - [IRQ_DA8XX_TINT34_0] = 7, |
|---|
| 326 | | - [IRQ_DA8XX_TINT12_1] = 7, |
|---|
| 327 | | - [IRQ_DA8XX_TINT34_1] = 7, |
|---|
| 328 | | - [IRQ_DA8XX_UARTINT0] = 7, |
|---|
| 329 | | - [IRQ_DA8XX_KEYMGRINT] = 7, |
|---|
| 330 | | - [IRQ_DA850_MPUADDRERR0] = 7, |
|---|
| 331 | | - [IRQ_DA8XX_CHIPINT0] = 7, |
|---|
| 332 | | - [IRQ_DA8XX_CHIPINT1] = 7, |
|---|
| 333 | | - [IRQ_DA8XX_CHIPINT2] = 7, |
|---|
| 334 | | - [IRQ_DA8XX_CHIPINT3] = 7, |
|---|
| 335 | | - [IRQ_DA8XX_TCERRINT1] = 7, |
|---|
| 336 | | - [IRQ_DA8XX_C0_RX_THRESH_PULSE] = 7, |
|---|
| 337 | | - [IRQ_DA8XX_C0_RX_PULSE] = 7, |
|---|
| 338 | | - [IRQ_DA8XX_C0_TX_PULSE] = 7, |
|---|
| 339 | | - [IRQ_DA8XX_C0_MISC_PULSE] = 7, |
|---|
| 340 | | - [IRQ_DA8XX_C1_RX_THRESH_PULSE] = 7, |
|---|
| 341 | | - [IRQ_DA8XX_C1_RX_PULSE] = 7, |
|---|
| 342 | | - [IRQ_DA8XX_C1_TX_PULSE] = 7, |
|---|
| 343 | | - [IRQ_DA8XX_C1_MISC_PULSE] = 7, |
|---|
| 344 | | - [IRQ_DA8XX_MEMERR] = 7, |
|---|
| 345 | | - [IRQ_DA8XX_GPIO0] = 7, |
|---|
| 346 | | - [IRQ_DA8XX_GPIO1] = 7, |
|---|
| 347 | | - [IRQ_DA8XX_GPIO2] = 7, |
|---|
| 348 | | - [IRQ_DA8XX_GPIO3] = 7, |
|---|
| 349 | | - [IRQ_DA8XX_GPIO4] = 7, |
|---|
| 350 | | - [IRQ_DA8XX_GPIO5] = 7, |
|---|
| 351 | | - [IRQ_DA8XX_GPIO6] = 7, |
|---|
| 352 | | - [IRQ_DA8XX_GPIO7] = 7, |
|---|
| 353 | | - [IRQ_DA8XX_GPIO8] = 7, |
|---|
| 354 | | - [IRQ_DA8XX_I2CINT1] = 7, |
|---|
| 355 | | - [IRQ_DA8XX_LCDINT] = 7, |
|---|
| 356 | | - [IRQ_DA8XX_UARTINT1] = 7, |
|---|
| 357 | | - [IRQ_DA8XX_MCASPINT] = 7, |
|---|
| 358 | | - [IRQ_DA8XX_ALLINT1] = 7, |
|---|
| 359 | | - [IRQ_DA8XX_SPINT1] = 7, |
|---|
| 360 | | - [IRQ_DA8XX_UHPI_INT1] = 7, |
|---|
| 361 | | - [IRQ_DA8XX_USB_INT] = 7, |
|---|
| 362 | | - [IRQ_DA8XX_IRQN] = 7, |
|---|
| 363 | | - [IRQ_DA8XX_RWAKEUP] = 7, |
|---|
| 364 | | - [IRQ_DA8XX_UARTINT2] = 7, |
|---|
| 365 | | - [IRQ_DA8XX_DFTSSINT] = 7, |
|---|
| 366 | | - [IRQ_DA8XX_EHRPWM0] = 7, |
|---|
| 367 | | - [IRQ_DA8XX_EHRPWM0TZ] = 7, |
|---|
| 368 | | - [IRQ_DA8XX_EHRPWM1] = 7, |
|---|
| 369 | | - [IRQ_DA8XX_EHRPWM1TZ] = 7, |
|---|
| 370 | | - [IRQ_DA850_SATAINT] = 7, |
|---|
| 371 | | - [IRQ_DA850_TINTALL_2] = 7, |
|---|
| 372 | | - [IRQ_DA8XX_ECAP0] = 7, |
|---|
| 373 | | - [IRQ_DA8XX_ECAP1] = 7, |
|---|
| 374 | | - [IRQ_DA8XX_ECAP2] = 7, |
|---|
| 375 | | - [IRQ_DA850_MMCSDINT0_1] = 7, |
|---|
| 376 | | - [IRQ_DA850_MMCSDINT1_1] = 7, |
|---|
| 377 | | - [IRQ_DA850_T12CMPINT0_2] = 7, |
|---|
| 378 | | - [IRQ_DA850_T12CMPINT1_2] = 7, |
|---|
| 379 | | - [IRQ_DA850_T12CMPINT2_2] = 7, |
|---|
| 380 | | - [IRQ_DA850_T12CMPINT3_2] = 7, |
|---|
| 381 | | - [IRQ_DA850_T12CMPINT4_2] = 7, |
|---|
| 382 | | - [IRQ_DA850_T12CMPINT5_2] = 7, |
|---|
| 383 | | - [IRQ_DA850_T12CMPINT6_2] = 7, |
|---|
| 384 | | - [IRQ_DA850_T12CMPINT7_2] = 7, |
|---|
| 385 | | - [IRQ_DA850_T12CMPINT0_3] = 7, |
|---|
| 386 | | - [IRQ_DA850_T12CMPINT1_3] = 7, |
|---|
| 387 | | - [IRQ_DA850_T12CMPINT2_3] = 7, |
|---|
| 388 | | - [IRQ_DA850_T12CMPINT3_3] = 7, |
|---|
| 389 | | - [IRQ_DA850_T12CMPINT4_3] = 7, |
|---|
| 390 | | - [IRQ_DA850_T12CMPINT5_3] = 7, |
|---|
| 391 | | - [IRQ_DA850_T12CMPINT6_3] = 7, |
|---|
| 392 | | - [IRQ_DA850_T12CMPINT7_3] = 7, |
|---|
| 393 | | - [IRQ_DA850_RPIINT] = 7, |
|---|
| 394 | | - [IRQ_DA850_VPIFINT] = 7, |
|---|
| 395 | | - [IRQ_DA850_CCINT1] = 7, |
|---|
| 396 | | - [IRQ_DA850_CCERRINT1] = 7, |
|---|
| 397 | | - [IRQ_DA850_TCERRINT2] = 7, |
|---|
| 398 | | - [IRQ_DA850_TINTALL_3] = 7, |
|---|
| 399 | | - [IRQ_DA850_MCBSP0RINT] = 7, |
|---|
| 400 | | - [IRQ_DA850_MCBSP0XINT] = 7, |
|---|
| 401 | | - [IRQ_DA850_MCBSP1RINT] = 7, |
|---|
| 402 | | - [IRQ_DA850_MCBSP1XINT] = 7, |
|---|
| 403 | | - [IRQ_DA8XX_ARMCLKSTOPREQ] = 7, |
|---|
| 404 | | -}; |
|---|
| 405 | | - |
|---|
| 406 | 304 | static struct map_desc da850_io_desc[] = { |
|---|
| 407 | 305 | { |
|---|
| 408 | 306 | .virtual = IO_VIRT, |
|---|
| .. | .. |
|---|
| 436 | 334 | }, |
|---|
| 437 | 335 | }; |
|---|
| 438 | 336 | |
|---|
| 439 | | -static struct davinci_timer_instance da850_timer_instance[4] = { |
|---|
| 440 | | - { |
|---|
| 441 | | - .base = DA8XX_TIMER64P0_BASE, |
|---|
| 442 | | - .bottom_irq = IRQ_DA8XX_TINT12_0, |
|---|
| 443 | | - .top_irq = IRQ_DA8XX_TINT34_0, |
|---|
| 444 | | - }, |
|---|
| 445 | | - { |
|---|
| 446 | | - .base = DA8XX_TIMER64P1_BASE, |
|---|
| 447 | | - .bottom_irq = IRQ_DA8XX_TINT12_1, |
|---|
| 448 | | - .top_irq = IRQ_DA8XX_TINT34_1, |
|---|
| 449 | | - }, |
|---|
| 450 | | - { |
|---|
| 451 | | - .base = DA850_TIMER64P2_BASE, |
|---|
| 452 | | - .bottom_irq = IRQ_DA850_TINT12_2, |
|---|
| 453 | | - .top_irq = IRQ_DA850_TINT34_2, |
|---|
| 454 | | - }, |
|---|
| 455 | | - { |
|---|
| 456 | | - .base = DA850_TIMER64P3_BASE, |
|---|
| 457 | | - .bottom_irq = IRQ_DA850_TINT12_3, |
|---|
| 458 | | - .top_irq = IRQ_DA850_TINT34_3, |
|---|
| 459 | | - }, |
|---|
| 460 | | -}; |
|---|
| 461 | | - |
|---|
| 462 | 337 | /* |
|---|
| 463 | | - * T0_BOT: Timer 0, bottom : Used for clock_event |
|---|
| 464 | | - * T0_TOP: Timer 0, top : Used for clocksource |
|---|
| 465 | | - * T1_BOT, T1_TOP: Timer 1, bottom & top: Used for watchdog timer |
|---|
| 338 | + * Bottom half of timer 0 is used for clock_event, top half for |
|---|
| 339 | + * clocksource. |
|---|
| 466 | 340 | */ |
|---|
| 467 | | -static struct davinci_timer_info da850_timer_info = { |
|---|
| 468 | | - .timers = da850_timer_instance, |
|---|
| 469 | | - .clockevent_id = T0_BOT, |
|---|
| 470 | | - .clocksource_id = T0_TOP, |
|---|
| 341 | +static const struct davinci_timer_cfg da850_timer_cfg = { |
|---|
| 342 | + .reg = DEFINE_RES_IO(DA8XX_TIMER64P0_BASE, SZ_4K), |
|---|
| 343 | + .irq = { |
|---|
| 344 | + DEFINE_RES_IRQ(DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT12_0)), |
|---|
| 345 | + DEFINE_RES_IRQ(DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT34_0)), |
|---|
| 346 | + }, |
|---|
| 471 | 347 | }; |
|---|
| 472 | 348 | |
|---|
| 473 | 349 | #ifdef CONFIG_CPU_FREQ |
|---|
| .. | .. |
|---|
| 658 | 534 | |
|---|
| 659 | 535 | static struct resource da850_vpif_display_resource[] = { |
|---|
| 660 | 536 | { |
|---|
| 661 | | - .start = IRQ_DA850_VPIFINT, |
|---|
| 662 | | - .end = IRQ_DA850_VPIFINT, |
|---|
| 537 | + .start = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT), |
|---|
| 538 | + .end = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT), |
|---|
| 663 | 539 | .flags = IORESOURCE_IRQ, |
|---|
| 664 | 540 | }, |
|---|
| 665 | 541 | }; |
|---|
| .. | .. |
|---|
| 677 | 553 | |
|---|
| 678 | 554 | static struct resource da850_vpif_capture_resource[] = { |
|---|
| 679 | 555 | { |
|---|
| 680 | | - .start = IRQ_DA850_VPIFINT, |
|---|
| 681 | | - .end = IRQ_DA850_VPIFINT, |
|---|
| 556 | + .start = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT), |
|---|
| 557 | + .end = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT), |
|---|
| 682 | 558 | .flags = IORESOURCE_IRQ, |
|---|
| 683 | 559 | }, |
|---|
| 684 | 560 | { |
|---|
| 685 | | - .start = IRQ_DA850_VPIFINT, |
|---|
| 686 | | - .end = IRQ_DA850_VPIFINT, |
|---|
| 561 | + .start = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT), |
|---|
| 562 | + .end = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT), |
|---|
| 687 | 563 | .flags = IORESOURCE_IRQ, |
|---|
| 688 | 564 | }, |
|---|
| 689 | 565 | }; |
|---|
| .. | .. |
|---|
| 719 | 595 | } |
|---|
| 720 | 596 | |
|---|
| 721 | 597 | static struct davinci_gpio_platform_data da850_gpio_platform_data = { |
|---|
| 722 | | - .ngpio = 144, |
|---|
| 598 | + .no_auto_base = true, |
|---|
| 599 | + .base = 0, |
|---|
| 600 | + .ngpio = 144, |
|---|
| 723 | 601 | }; |
|---|
| 724 | 602 | |
|---|
| 725 | 603 | int __init da850_register_gpio(void) |
|---|
| .. | .. |
|---|
| 736 | 614 | .pinmux_base = DA8XX_SYSCFG0_BASE + 0x120, |
|---|
| 737 | 615 | .pinmux_pins = da850_pins, |
|---|
| 738 | 616 | .pinmux_pins_num = ARRAY_SIZE(da850_pins), |
|---|
| 739 | | - .intc_base = DA8XX_CP_INTC_BASE, |
|---|
| 740 | | - .intc_type = DAVINCI_INTC_TYPE_CP_INTC, |
|---|
| 741 | | - .intc_irq_prios = da850_default_priorities, |
|---|
| 742 | | - .intc_irq_num = DA850_N_CP_INTC_IRQ, |
|---|
| 743 | | - .timer_info = &da850_timer_info, |
|---|
| 744 | 617 | .emac_pdata = &da8xx_emac_pdata, |
|---|
| 745 | 618 | .sram_dma = DA8XX_SHARED_RAM_BASE, |
|---|
| 746 | 619 | .sram_len = SZ_128K, |
|---|
| .. | .. |
|---|
| 758 | 631 | WARN(!da8xx_syscfg1_base, "Unable to map syscfg1 module"); |
|---|
| 759 | 632 | } |
|---|
| 760 | 633 | |
|---|
| 634 | +static const struct davinci_cp_intc_config da850_cp_intc_config = { |
|---|
| 635 | + .reg = { |
|---|
| 636 | + .start = DA8XX_CP_INTC_BASE, |
|---|
| 637 | + .end = DA8XX_CP_INTC_BASE + SZ_8K - 1, |
|---|
| 638 | + .flags = IORESOURCE_MEM, |
|---|
| 639 | + }, |
|---|
| 640 | + .num_irqs = DA850_N_CP_INTC_IRQ, |
|---|
| 641 | +}; |
|---|
| 642 | + |
|---|
| 643 | +void __init da850_init_irq(void) |
|---|
| 644 | +{ |
|---|
| 645 | + davinci_cp_intc_init(&da850_cp_intc_config); |
|---|
| 646 | +} |
|---|
| 647 | + |
|---|
| 761 | 648 | void __init da850_init_time(void) |
|---|
| 762 | 649 | { |
|---|
| 763 | 650 | void __iomem *pll0; |
|---|
| 764 | 651 | struct regmap *cfgchip; |
|---|
| 765 | 652 | struct clk *clk; |
|---|
| 653 | + int rv; |
|---|
| 766 | 654 | |
|---|
| 767 | 655 | clk_register_fixed_rate(NULL, "ref_clk", NULL, 0, DA850_REF_FREQ); |
|---|
| 768 | 656 | |
|---|
| .. | .. |
|---|
| 772 | 660 | da850_pll0_init(NULL, pll0, cfgchip); |
|---|
| 773 | 661 | |
|---|
| 774 | 662 | clk = clk_get(NULL, "timer0"); |
|---|
| 663 | + if (WARN_ON(IS_ERR(clk))) { |
|---|
| 664 | + pr_err("Unable to get the timer clock\n"); |
|---|
| 665 | + return; |
|---|
| 666 | + } |
|---|
| 775 | 667 | |
|---|
| 776 | | - davinci_timer_init(clk); |
|---|
| 668 | + rv = davinci_timer_register(clk, &da850_timer_cfg); |
|---|
| 669 | + WARN(rv, "Unable to register the timer: %d\n", rv); |
|---|
| 777 | 670 | } |
|---|
| 778 | 671 | |
|---|
| 779 | 672 | static struct resource da850_pll1_resources[] = { |
|---|