diff options
-rw-r--r-- | arch/sh/kernel/cpu/sh3/setup-sh7710.c | 183 | ||||
-rw-r--r-- | arch/sh/mm/Kconfig | 4 |
2 files changed, 132 insertions, 55 deletions
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7710.c b/arch/sh/kernel/cpu/sh3/setup-sh7710.c index 132284893373..93b6d7b42694 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7710.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7710.c | |||
@@ -10,9 +10,128 @@ | |||
10 | */ | 10 | */ |
11 | #include <linux/platform_device.h> | 11 | #include <linux/platform_device.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | ||
13 | #include <linux/serial.h> | 14 | #include <linux/serial.h> |
14 | #include <asm/sci.h> | 15 | #include <asm/sci.h> |
15 | 16 | ||
17 | enum { | ||
18 | UNUSED = 0, | ||
19 | |||
20 | /* interrupt sources */ | ||
21 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, | ||
22 | DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3, | ||
23 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | ||
24 | SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, | ||
25 | DMAC_DEI4, DMAC_DEI5, | ||
26 | IPSEC, | ||
27 | EDMAC0, EDMAC1, EDMAC2, | ||
28 | SIOF0_ERI, SIOF0_TXI, SIOF0_RXI, SIOF0_CCI, | ||
29 | SIOF1_ERI, SIOF1_TXI, SIOF1_RXI, SIOF1_CCI, | ||
30 | TMU0, TMU1, TMU2, | ||
31 | RTC_ATI, RTC_PRI, RTC_CUI, | ||
32 | WDT, | ||
33 | REF, | ||
34 | |||
35 | /* interrupt groups */ | ||
36 | RTC, DMAC1, SCIF0, SCIF1, DMAC2, SIOF0, SIOF1, | ||
37 | }; | ||
38 | |||
39 | static struct intc_vect vectors[] = { | ||
40 | INTC_VECT(IRQ4, 0x680), INTC_VECT(IRQ5, 0x6a0), | ||
41 | INTC_VECT(DMAC_DEI0, 0x800), INTC_VECT(DMAC_DEI1, 0x820), | ||
42 | INTC_VECT(DMAC_DEI2, 0x840), INTC_VECT(DMAC_DEI3, 0x860), | ||
43 | INTC_VECT(SCIF0_ERI, 0x880), INTC_VECT(SCIF0_RXI, 0x8a0), | ||
44 | INTC_VECT(SCIF0_BRI, 0x8c0), INTC_VECT(SCIF0_TXI, 0x8e0), | ||
45 | INTC_VECT(SCIF1_ERI, 0x900), INTC_VECT(SCIF1_RXI, 0x920), | ||
46 | INTC_VECT(SCIF1_BRI, 0x940), INTC_VECT(SCIF1_TXI, 0x960), | ||
47 | INTC_VECT(DMAC_DEI4, 0xb80), INTC_VECT(DMAC_DEI5, 0xba0), | ||
48 | INTC_VECT(IPSEC, 0xbe0), | ||
49 | INTC_VECT(EDMAC0, 0xc00), INTC_VECT(EDMAC1, 0xc20), | ||
50 | INTC_VECT(EDMAC2, 0xc40), | ||
51 | INTC_VECT(SIOF0_ERI, 0xe00), INTC_VECT(SIOF0_TXI, 0xe20), | ||
52 | INTC_VECT(SIOF0_RXI, 0xe40), INTC_VECT(SIOF0_CCI, 0xe60), | ||
53 | INTC_VECT(SIOF1_ERI, 0xe80), INTC_VECT(SIOF1_TXI, 0xea0), | ||
54 | INTC_VECT(SIOF1_RXI, 0xec0), INTC_VECT(SIOF1_CCI, 0xee0), | ||
55 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | ||
56 | INTC_VECT(TMU2, 0x440), | ||
57 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | ||
58 | INTC_VECT(RTC_CUI, 0x4c0), | ||
59 | INTC_VECT(WDT, 0x560), | ||
60 | INTC_VECT(REF, 0x580), | ||
61 | }; | ||
62 | |||
63 | static struct intc_group groups[] = { | ||
64 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
65 | INTC_GROUP(DMAC1, DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3), | ||
66 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
67 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | ||
68 | INTC_GROUP(DMAC2, DMAC_DEI4, DMAC_DEI5), | ||
69 | INTC_GROUP(SIOF0, SIOF0_ERI, SIOF0_TXI, SIOF0_RXI, SIOF0_CCI), | ||
70 | INTC_GROUP(SIOF1, SIOF1_ERI, SIOF1_TXI, SIOF1_RXI, SIOF1_CCI), | ||
71 | }; | ||
72 | |||
73 | static struct intc_prio priorities[] = { | ||
74 | INTC_PRIO(DMAC1, 7), | ||
75 | INTC_PRIO(DMAC2, 7), | ||
76 | INTC_PRIO(SCIF0, 3), | ||
77 | INTC_PRIO(SCIF1, 3), | ||
78 | INTC_PRIO(SIOF0, 3), | ||
79 | INTC_PRIO(SIOF1, 3), | ||
80 | INTC_PRIO(EDMAC0, 5), | ||
81 | INTC_PRIO(EDMAC1, 5), | ||
82 | INTC_PRIO(EDMAC2, 5), | ||
83 | }; | ||
84 | |||
85 | static struct intc_prio_reg prio_registers[] = { | ||
86 | { 0xfffffee2, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, | ||
87 | { 0xfffffee4, 16, 4, /* IPRB */ { WDT, REF, 0, 0 } }, | ||
88 | { 0xa4000016, 16, 4, /* IPRC */ { IRQ3, IRQ2, IRQ1, IRQ0 } }, | ||
89 | { 0xa4000018, 16, 4, /* IPRD */ { 0, 0, IRQ4, IRQ5 } }, | ||
90 | { 0xa400001a, 16, 4, /* IPRE */ { DMAC1, SCIF0, SCIF1 } }, | ||
91 | { 0xa4080000, 16, 4, /* IPRF */ { IPSEC, DMAC2 } }, | ||
92 | { 0xa4080002, 16, 4, /* IPRG */ { EDMAC0, EDMAC1, EDMAC2 } }, | ||
93 | { 0xa4080004, 16, 4, /* IPRH */ { 0, 0, 0, SIOF0 } }, | ||
94 | { 0xa4080006, 16, 4, /* IPRI */ { 0, 0, SIOF1 } }, | ||
95 | }; | ||
96 | |||
97 | static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, groups, | ||
98 | priorities, NULL, prio_registers, NULL); | ||
99 | |||
100 | static struct intc_vect vectors_irq[] = { | ||
101 | INTC_VECT(IRQ0, 0x600), INTC_VECT(IRQ1, 0x620), | ||
102 | INTC_VECT(IRQ2, 0x640), INTC_VECT(IRQ3, 0x660), | ||
103 | }; | ||
104 | |||
105 | static DECLARE_INTC_DESC(intc_desc_irq, "sh7710-irq", vectors_irq, NULL, | ||
106 | priorities, NULL, prio_registers, NULL); | ||
107 | |||
108 | static struct resource rtc_resources[] = { | ||
109 | [0] = { | ||
110 | .start = 0xa413fec0, | ||
111 | .end = 0xa413fec0 + 0x1e, | ||
112 | .flags = IORESOURCE_IO, | ||
113 | }, | ||
114 | [1] = { | ||
115 | .start = 20, | ||
116 | .flags = IORESOURCE_IRQ, | ||
117 | }, | ||
118 | [2] = { | ||
119 | .start = 21, | ||
120 | .flags = IORESOURCE_IRQ, | ||
121 | }, | ||
122 | [3] = { | ||
123 | .start = 22, | ||
124 | .flags = IORESOURCE_IRQ, | ||
125 | }, | ||
126 | }; | ||
127 | |||
128 | static struct platform_device rtc_device = { | ||
129 | .name = "sh-rtc", | ||
130 | .id = -1, | ||
131 | .num_resources = ARRAY_SIZE(rtc_resources), | ||
132 | .resource = rtc_resources, | ||
133 | }; | ||
134 | |||
16 | static struct plat_sci_port sci_platform_data[] = { | 135 | static struct plat_sci_port sci_platform_data[] = { |
17 | { | 136 | { |
18 | .mapbase = 0xa4400000, | 137 | .mapbase = 0xa4400000, |
@@ -20,7 +139,7 @@ static struct plat_sci_port sci_platform_data[] = { | |||
20 | .type = PORT_SCIF, | 139 | .type = PORT_SCIF, |
21 | .irqs = { 52, 53, 55, 54 }, | 140 | .irqs = { 52, 53, 55, 54 }, |
22 | }, { | 141 | }, { |
23 | .mapbase = 0xa4420000, | 142 | .mapbase = 0xa4410000, |
24 | .flags = UPF_BOOT_AUTOCONF, | 143 | .flags = UPF_BOOT_AUTOCONF, |
25 | .type = PORT_SCIF, | 144 | .type = PORT_SCIF, |
26 | .irqs = { 56, 57, 59, 58 }, | 145 | .irqs = { 56, 57, 59, 58 }, |
@@ -40,6 +159,7 @@ static struct platform_device sci_device = { | |||
40 | 159 | ||
41 | static struct platform_device *sh7710_devices[] __initdata = { | 160 | static struct platform_device *sh7710_devices[] __initdata = { |
42 | &sci_device, | 161 | &sci_device, |
162 | &rtc_device, | ||
43 | }; | 163 | }; |
44 | 164 | ||
45 | static int __init sh7710_devices_setup(void) | 165 | static int __init sh7710_devices_setup(void) |
@@ -49,59 +169,16 @@ static int __init sh7710_devices_setup(void) | |||
49 | } | 169 | } |
50 | __initcall(sh7710_devices_setup); | 170 | __initcall(sh7710_devices_setup); |
51 | 171 | ||
52 | static struct ipr_data ipr_irq_table[] = { | 172 | void __init plat_irq_setup_pins(int mode) |
53 | /* IRQ, IPR-idx, shift, priority */ | 173 | { |
54 | { 16, 0, 12, 2 }, /* TMU0 TUNI*/ | 174 | if (mode == IRQ_MODE_IRQ) { |
55 | { 17, 0, 8, 2 }, /* TMU1 TUNI */ | 175 | register_intc_controller(&intc_desc_irq); |
56 | { 18, 0, 4, 2 }, /* TMU2 TUNI */ | 176 | return; |
57 | { 27, 1, 12, 2 }, /* WDT ITI */ | 177 | } |
58 | { 20, 0, 0, 2 }, /* RTC ATI (alarm) */ | 178 | BUG(); |
59 | { 21, 0, 0, 2 }, /* RTC PRI (period) */ | 179 | } |
60 | { 22, 0, 0, 2 }, /* RTC CUI (carry) */ | ||
61 | { 48, 4, 12, 7 }, /* DMAC DMTE0 */ | ||
62 | { 49, 4, 12, 7 }, /* DMAC DMTE1 */ | ||
63 | { 50, 4, 12, 7 }, /* DMAC DMTE2 */ | ||
64 | { 51, 4, 12, 7 }, /* DMAC DMTE3 */ | ||
65 | { 52, 4, 8, 3 }, /* SCIF0 ERI */ | ||
66 | { 53, 4, 8, 3 }, /* SCIF0 RXI */ | ||
67 | { 54, 4, 8, 3 }, /* SCIF0 BRI */ | ||
68 | { 55, 4, 8, 3 }, /* SCIF0 TXI */ | ||
69 | { 56, 4, 4, 3 }, /* SCIF1 ERI */ | ||
70 | { 57, 4, 4, 3 }, /* SCIF1 RXI */ | ||
71 | { 58, 4, 4, 3 }, /* SCIF1 BRI */ | ||
72 | { 59, 4, 4, 3 }, /* SCIF1 TXI */ | ||
73 | { 76, 5, 8, 7 }, /* DMAC DMTE4 */ | ||
74 | { 77, 5, 8, 7 }, /* DMAC DMTE5 */ | ||
75 | { 80, 6, 12, 5 }, /* EDMAC EINT0 */ | ||
76 | { 81, 6, 8, 5 }, /* EDMAC EINT1 */ | ||
77 | { 82, 6, 4, 5 }, /* EDMAC EINT2 */ | ||
78 | }; | ||
79 | |||
80 | static unsigned long ipr_offsets[] = { | ||
81 | 0xA414FEE2, /* 0: IPRA */ | ||
82 | 0xA414FEE4, /* 1: IPRB */ | ||
83 | 0xA4140016, /* 2: IPRC */ | ||
84 | 0xA4140018, /* 3: IPRD */ | ||
85 | 0xA414001A, /* 4: IPRE */ | ||
86 | 0xA4080000, /* 5: IPRF */ | ||
87 | 0xA4080002, /* 6: IPRG */ | ||
88 | 0xA4080004, /* 7: IPRH */ | ||
89 | 0xA4080006, /* 8: IPRI */ | ||
90 | }; | ||
91 | |||
92 | static struct ipr_desc ipr_irq_desc = { | ||
93 | .ipr_offsets = ipr_offsets, | ||
94 | .nr_offsets = ARRAY_SIZE(ipr_offsets), | ||
95 | |||
96 | .ipr_data = ipr_irq_table, | ||
97 | .nr_irqs = ARRAY_SIZE(ipr_irq_table), | ||
98 | |||
99 | .chip = { | ||
100 | .name = "IPR-sh7710", | ||
101 | }, | ||
102 | }; | ||
103 | 180 | ||
104 | void __init plat_irq_setup(void) | 181 | void __init plat_irq_setup(void) |
105 | { | 182 | { |
106 | register_ipr_controller(&ipr_irq_desc); | 183 | register_intc_controller(&intc_desc); |
107 | } | 184 | } |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index a4202606de4f..a50636eb4ea8 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -98,7 +98,7 @@ config CPU_SUBTYPE_SH7709 | |||
98 | config CPU_SUBTYPE_SH7710 | 98 | config CPU_SUBTYPE_SH7710 |
99 | bool "Support SH7710 processor" | 99 | bool "Support SH7710 processor" |
100 | select CPU_SH3 | 100 | select CPU_SH3 |
101 | select CPU_HAS_IPR_IRQ | 101 | select CPU_HAS_INTC_IRQ |
102 | select CPU_HAS_DSP | 102 | select CPU_HAS_DSP |
103 | help | 103 | help |
104 | Select SH7710 if you have a SH3-DSP SH7710 CPU. | 104 | Select SH7710 if you have a SH3-DSP SH7710 CPU. |
@@ -106,7 +106,7 @@ config CPU_SUBTYPE_SH7710 | |||
106 | config CPU_SUBTYPE_SH7712 | 106 | config CPU_SUBTYPE_SH7712 |
107 | bool "Support SH7712 processor" | 107 | bool "Support SH7712 processor" |
108 | select CPU_SH3 | 108 | select CPU_SH3 |
109 | select CPU_HAS_IPR_IRQ | 109 | select CPU_HAS_INTC_IRQ |
110 | select CPU_HAS_DSP | 110 | select CPU_HAS_DSP |
111 | help | 111 | help |
112 | Select SH7712 if you have a SH3-DSP SH7712 CPU. | 112 | Select SH7712 if you have a SH3-DSP SH7712 CPU. |