aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--arch/sh/kernel/cpu/sh3/setup-sh7710.c183
-rw-r--r--arch/sh/mm/Kconfig4
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
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}
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
98config CPU_SUBTYPE_SH7710 98config 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
106config CPU_SUBTYPE_SH7712 106config 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.