aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/cpu/sh3/setup-sh7710.c
diff options
context:
space:
mode:
authorMagnus Damm <damm@igel.co.jp>2007-07-25 04:47:07 -0400
committerPaul Mundt <lethal@linux-sh.org>2007-09-20 22:57:45 -0400
commit28b146c84ed571043f473d2ac2f2a27e48fda7d1 (patch)
tree529236dd44c85493b9e2de48640da66beb390ee7 /arch/sh/kernel/cpu/sh3/setup-sh7710.c
parent70e8be0a4e21f71e654bea2e5ec4789e976a796b (diff)
sh: intc - add support for SH7710
This patch converts the cpu specific interrupt setup code for sh7710 from ipr to intc. While at it new vectors are added to match the information provided by the datasheet. Version two simplifies the Kconfig part. Vectors for IRQ4 and IRQ5 are enabled by default. Use plat_irq_setup_pins() if pins IRQ0-3 should be used in IRQ mode. This patch also adds sh7710 specific platform data for the rtc driver. The base address of SCIF1 is adjusted to match the datasheet. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/cpu/sh3/setup-sh7710.c')
-rw-r--r--arch/sh/kernel/cpu/sh3/setup-sh7710.c183
1 files changed, 130 insertions, 53 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
17enum {
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
39static 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
63static 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
73static 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
85static 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
97static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, groups,
98 priorities, NULL, prio_registers, NULL);
99
100static 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
105static DECLARE_INTC_DESC(intc_desc_irq, "sh7710-irq", vectors_irq, NULL,
106 priorities, NULL, prio_registers, NULL);
107
108static 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
128static 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
16static struct plat_sci_port sci_platform_data[] = { 135static 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
41static struct platform_device *sh7710_devices[] __initdata = { 160static struct platform_device *sh7710_devices[] __initdata = {
42 &sci_device, 161 &sci_device,
162 &rtc_device,
43}; 163};
44 164
45static int __init sh7710_devices_setup(void) 165static 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
52static struct ipr_data ipr_irq_table[] = { 172void __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
80static 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
92static 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
104void __init plat_irq_setup(void) 181void __init plat_irq_setup(void)
105{ 182{
106 register_ipr_controller(&ipr_irq_desc); 183 register_intc_controller(&intc_desc);
107} 184}