.. | .. |
---|
12 | 12 | #include <linux/clk/davinci.h> |
---|
13 | 13 | #include <linux/gpio.h> |
---|
14 | 14 | #include <linux/init.h> |
---|
| 15 | +#include <linux/io.h> |
---|
| 16 | +#include <linux/irqchip/irq-davinci-cp-intc.h> |
---|
15 | 17 | #include <linux/platform_data/gpio-davinci.h> |
---|
16 | 18 | |
---|
17 | 19 | #include <asm/mach/map.h> |
---|
.. | .. |
---|
19 | 21 | #include <mach/common.h> |
---|
20 | 22 | #include <mach/cputype.h> |
---|
21 | 23 | #include <mach/da8xx.h> |
---|
22 | | -#include <mach/irqs.h> |
---|
23 | | -#include <mach/time.h> |
---|
24 | 24 | |
---|
| 25 | +#include <clocksource/timer-davinci.h> |
---|
| 26 | + |
---|
| 27 | +#include "irqs.h" |
---|
25 | 28 | #include "mux.h" |
---|
26 | 29 | |
---|
27 | 30 | /* Offsets of the 8 compare registers on the da830 */ |
---|
.. | .. |
---|
623 | 626 | -1 |
---|
624 | 627 | }; |
---|
625 | 628 | |
---|
626 | | -/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */ |
---|
627 | | -static u8 da830_default_priorities[DA830_N_CP_INTC_IRQ] = { |
---|
628 | | - [IRQ_DA8XX_COMMTX] = 7, |
---|
629 | | - [IRQ_DA8XX_COMMRX] = 7, |
---|
630 | | - [IRQ_DA8XX_NINT] = 7, |
---|
631 | | - [IRQ_DA8XX_EVTOUT0] = 7, |
---|
632 | | - [IRQ_DA8XX_EVTOUT1] = 7, |
---|
633 | | - [IRQ_DA8XX_EVTOUT2] = 7, |
---|
634 | | - [IRQ_DA8XX_EVTOUT3] = 7, |
---|
635 | | - [IRQ_DA8XX_EVTOUT4] = 7, |
---|
636 | | - [IRQ_DA8XX_EVTOUT5] = 7, |
---|
637 | | - [IRQ_DA8XX_EVTOUT6] = 7, |
---|
638 | | - [IRQ_DA8XX_EVTOUT7] = 7, |
---|
639 | | - [IRQ_DA8XX_CCINT0] = 7, |
---|
640 | | - [IRQ_DA8XX_CCERRINT] = 7, |
---|
641 | | - [IRQ_DA8XX_TCERRINT0] = 7, |
---|
642 | | - [IRQ_DA8XX_AEMIFINT] = 7, |
---|
643 | | - [IRQ_DA8XX_I2CINT0] = 7, |
---|
644 | | - [IRQ_DA8XX_MMCSDINT0] = 7, |
---|
645 | | - [IRQ_DA8XX_MMCSDINT1] = 7, |
---|
646 | | - [IRQ_DA8XX_ALLINT0] = 7, |
---|
647 | | - [IRQ_DA8XX_RTC] = 7, |
---|
648 | | - [IRQ_DA8XX_SPINT0] = 7, |
---|
649 | | - [IRQ_DA8XX_TINT12_0] = 7, |
---|
650 | | - [IRQ_DA8XX_TINT34_0] = 7, |
---|
651 | | - [IRQ_DA8XX_TINT12_1] = 7, |
---|
652 | | - [IRQ_DA8XX_TINT34_1] = 7, |
---|
653 | | - [IRQ_DA8XX_UARTINT0] = 7, |
---|
654 | | - [IRQ_DA8XX_KEYMGRINT] = 7, |
---|
655 | | - [IRQ_DA830_MPUERR] = 7, |
---|
656 | | - [IRQ_DA8XX_CHIPINT0] = 7, |
---|
657 | | - [IRQ_DA8XX_CHIPINT1] = 7, |
---|
658 | | - [IRQ_DA8XX_CHIPINT2] = 7, |
---|
659 | | - [IRQ_DA8XX_CHIPINT3] = 7, |
---|
660 | | - [IRQ_DA8XX_TCERRINT1] = 7, |
---|
661 | | - [IRQ_DA8XX_C0_RX_THRESH_PULSE] = 7, |
---|
662 | | - [IRQ_DA8XX_C0_RX_PULSE] = 7, |
---|
663 | | - [IRQ_DA8XX_C0_TX_PULSE] = 7, |
---|
664 | | - [IRQ_DA8XX_C0_MISC_PULSE] = 7, |
---|
665 | | - [IRQ_DA8XX_C1_RX_THRESH_PULSE] = 7, |
---|
666 | | - [IRQ_DA8XX_C1_RX_PULSE] = 7, |
---|
667 | | - [IRQ_DA8XX_C1_TX_PULSE] = 7, |
---|
668 | | - [IRQ_DA8XX_C1_MISC_PULSE] = 7, |
---|
669 | | - [IRQ_DA8XX_MEMERR] = 7, |
---|
670 | | - [IRQ_DA8XX_GPIO0] = 7, |
---|
671 | | - [IRQ_DA8XX_GPIO1] = 7, |
---|
672 | | - [IRQ_DA8XX_GPIO2] = 7, |
---|
673 | | - [IRQ_DA8XX_GPIO3] = 7, |
---|
674 | | - [IRQ_DA8XX_GPIO4] = 7, |
---|
675 | | - [IRQ_DA8XX_GPIO5] = 7, |
---|
676 | | - [IRQ_DA8XX_GPIO6] = 7, |
---|
677 | | - [IRQ_DA8XX_GPIO7] = 7, |
---|
678 | | - [IRQ_DA8XX_GPIO8] = 7, |
---|
679 | | - [IRQ_DA8XX_I2CINT1] = 7, |
---|
680 | | - [IRQ_DA8XX_LCDINT] = 7, |
---|
681 | | - [IRQ_DA8XX_UARTINT1] = 7, |
---|
682 | | - [IRQ_DA8XX_MCASPINT] = 7, |
---|
683 | | - [IRQ_DA8XX_ALLINT1] = 7, |
---|
684 | | - [IRQ_DA8XX_SPINT1] = 7, |
---|
685 | | - [IRQ_DA8XX_UHPI_INT1] = 7, |
---|
686 | | - [IRQ_DA8XX_USB_INT] = 7, |
---|
687 | | - [IRQ_DA8XX_IRQN] = 7, |
---|
688 | | - [IRQ_DA8XX_RWAKEUP] = 7, |
---|
689 | | - [IRQ_DA8XX_UARTINT2] = 7, |
---|
690 | | - [IRQ_DA8XX_DFTSSINT] = 7, |
---|
691 | | - [IRQ_DA8XX_EHRPWM0] = 7, |
---|
692 | | - [IRQ_DA8XX_EHRPWM0TZ] = 7, |
---|
693 | | - [IRQ_DA8XX_EHRPWM1] = 7, |
---|
694 | | - [IRQ_DA8XX_EHRPWM1TZ] = 7, |
---|
695 | | - [IRQ_DA830_EHRPWM2] = 7, |
---|
696 | | - [IRQ_DA830_EHRPWM2TZ] = 7, |
---|
697 | | - [IRQ_DA8XX_ECAP0] = 7, |
---|
698 | | - [IRQ_DA8XX_ECAP1] = 7, |
---|
699 | | - [IRQ_DA8XX_ECAP2] = 7, |
---|
700 | | - [IRQ_DA830_EQEP0] = 7, |
---|
701 | | - [IRQ_DA830_EQEP1] = 7, |
---|
702 | | - [IRQ_DA830_T12CMPINT0_0] = 7, |
---|
703 | | - [IRQ_DA830_T12CMPINT1_0] = 7, |
---|
704 | | - [IRQ_DA830_T12CMPINT2_0] = 7, |
---|
705 | | - [IRQ_DA830_T12CMPINT3_0] = 7, |
---|
706 | | - [IRQ_DA830_T12CMPINT4_0] = 7, |
---|
707 | | - [IRQ_DA830_T12CMPINT5_0] = 7, |
---|
708 | | - [IRQ_DA830_T12CMPINT6_0] = 7, |
---|
709 | | - [IRQ_DA830_T12CMPINT7_0] = 7, |
---|
710 | | - [IRQ_DA830_T12CMPINT0_1] = 7, |
---|
711 | | - [IRQ_DA830_T12CMPINT1_1] = 7, |
---|
712 | | - [IRQ_DA830_T12CMPINT2_1] = 7, |
---|
713 | | - [IRQ_DA830_T12CMPINT3_1] = 7, |
---|
714 | | - [IRQ_DA830_T12CMPINT4_1] = 7, |
---|
715 | | - [IRQ_DA830_T12CMPINT5_1] = 7, |
---|
716 | | - [IRQ_DA830_T12CMPINT6_1] = 7, |
---|
717 | | - [IRQ_DA830_T12CMPINT7_1] = 7, |
---|
718 | | - [IRQ_DA8XX_ARMCLKSTOPREQ] = 7, |
---|
719 | | -}; |
---|
720 | | - |
---|
721 | 629 | static struct map_desc da830_io_desc[] = { |
---|
722 | 630 | { |
---|
723 | 631 | .virtual = IO_VIRT, |
---|
.. | .. |
---|
759 | 667 | }; |
---|
760 | 668 | |
---|
761 | 669 | static struct davinci_gpio_platform_data da830_gpio_platform_data = { |
---|
762 | | - .ngpio = 128, |
---|
| 670 | + .no_auto_base = true, |
---|
| 671 | + .base = 0, |
---|
| 672 | + .ngpio = 128, |
---|
763 | 673 | }; |
---|
764 | 674 | |
---|
765 | 675 | int __init da830_register_gpio(void) |
---|
.. | .. |
---|
767 | 677 | return da8xx_register_gpio(&da830_gpio_platform_data); |
---|
768 | 678 | } |
---|
769 | 679 | |
---|
770 | | -static struct davinci_timer_instance da830_timer_instance[2] = { |
---|
771 | | - { |
---|
772 | | - .base = DA8XX_TIMER64P0_BASE, |
---|
773 | | - .bottom_irq = IRQ_DA8XX_TINT12_0, |
---|
774 | | - .top_irq = IRQ_DA8XX_TINT34_0, |
---|
775 | | - .cmp_off = DA830_CMP12_0, |
---|
776 | | - .cmp_irq = IRQ_DA830_T12CMPINT0_0, |
---|
777 | | - }, |
---|
778 | | - { |
---|
779 | | - .base = DA8XX_TIMER64P1_BASE, |
---|
780 | | - .bottom_irq = IRQ_DA8XX_TINT12_1, |
---|
781 | | - .top_irq = IRQ_DA8XX_TINT34_1, |
---|
782 | | - .cmp_off = DA830_CMP12_0, |
---|
783 | | - .cmp_irq = IRQ_DA830_T12CMPINT0_1, |
---|
784 | | - }, |
---|
785 | | -}; |
---|
786 | | - |
---|
787 | 680 | /* |
---|
788 | | - * T0_BOT: Timer 0, bottom : Used for clock_event & clocksource |
---|
789 | | - * T0_TOP: Timer 0, top : Used by DSP |
---|
790 | | - * T1_BOT, T1_TOP: Timer 1, bottom & top: Used for watchdog timer |
---|
| 681 | + * Bottom half of timer0 is used both for clock even and clocksource. |
---|
| 682 | + * Top half is used by DSP. |
---|
791 | 683 | */ |
---|
792 | | -static struct davinci_timer_info da830_timer_info = { |
---|
793 | | - .timers = da830_timer_instance, |
---|
794 | | - .clockevent_id = T0_BOT, |
---|
795 | | - .clocksource_id = T0_BOT, |
---|
| 684 | +static const struct davinci_timer_cfg da830_timer_cfg = { |
---|
| 685 | + .reg = DEFINE_RES_IO(DA8XX_TIMER64P0_BASE, SZ_4K), |
---|
| 686 | + .irq = { |
---|
| 687 | + DEFINE_RES_IRQ(DAVINCI_INTC_IRQ(IRQ_DA830_T12CMPINT0_0)), |
---|
| 688 | + DEFINE_RES_IRQ(DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT12_0)), |
---|
| 689 | + }, |
---|
| 690 | + .cmp_off = DA830_CMP12_0, |
---|
796 | 691 | }; |
---|
797 | 692 | |
---|
798 | 693 | static const struct davinci_soc_info davinci_soc_info_da830 = { |
---|
.. | .. |
---|
804 | 699 | .pinmux_base = DA8XX_SYSCFG0_BASE + 0x120, |
---|
805 | 700 | .pinmux_pins = da830_pins, |
---|
806 | 701 | .pinmux_pins_num = ARRAY_SIZE(da830_pins), |
---|
807 | | - .intc_base = DA8XX_CP_INTC_BASE, |
---|
808 | | - .intc_type = DAVINCI_INTC_TYPE_CP_INTC, |
---|
809 | | - .intc_irq_prios = da830_default_priorities, |
---|
810 | | - .intc_irq_num = DA830_N_CP_INTC_IRQ, |
---|
811 | | - .timer_info = &da830_timer_info, |
---|
812 | 702 | .emac_pdata = &da8xx_emac_pdata, |
---|
813 | 703 | }; |
---|
814 | 704 | |
---|
.. | .. |
---|
820 | 710 | WARN(!da8xx_syscfg0_base, "Unable to map syscfg0 module"); |
---|
821 | 711 | } |
---|
822 | 712 | |
---|
| 713 | +static const struct davinci_cp_intc_config da830_cp_intc_config = { |
---|
| 714 | + .reg = { |
---|
| 715 | + .start = DA8XX_CP_INTC_BASE, |
---|
| 716 | + .end = DA8XX_CP_INTC_BASE + SZ_8K - 1, |
---|
| 717 | + .flags = IORESOURCE_MEM, |
---|
| 718 | + }, |
---|
| 719 | + .num_irqs = DA830_N_CP_INTC_IRQ, |
---|
| 720 | +}; |
---|
| 721 | + |
---|
| 722 | +void __init da830_init_irq(void) |
---|
| 723 | +{ |
---|
| 724 | + davinci_cp_intc_init(&da830_cp_intc_config); |
---|
| 725 | +} |
---|
| 726 | + |
---|
823 | 727 | void __init da830_init_time(void) |
---|
824 | 728 | { |
---|
825 | 729 | void __iomem *pll; |
---|
826 | 730 | struct clk *clk; |
---|
| 731 | + int rv; |
---|
827 | 732 | |
---|
828 | 733 | clk_register_fixed_rate(NULL, "ref_clk", NULL, 0, DA830_REF_FREQ); |
---|
829 | 734 | |
---|
.. | .. |
---|
832 | 737 | da830_pll_init(NULL, pll, NULL); |
---|
833 | 738 | |
---|
834 | 739 | clk = clk_get(NULL, "timer0"); |
---|
| 740 | + if (WARN_ON(IS_ERR(clk))) { |
---|
| 741 | + pr_err("Unable to get the timer clock\n"); |
---|
| 742 | + return; |
---|
| 743 | + } |
---|
835 | 744 | |
---|
836 | | - davinci_timer_init(clk); |
---|
| 745 | + rv = davinci_timer_register(clk, &da830_timer_cfg); |
---|
| 746 | + WARN(rv, "Unable to register the timer: %d\n", rv); |
---|
837 | 747 | } |
---|
838 | 748 | |
---|
839 | 749 | static struct resource da830_psc0_resources[] = { |
---|