Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
[linux-2.6] / arch / sh / kernel / cpu / sh4 / setup-sh7750.c
1 /*
2  * SH7750/SH7751 Setup
3  *
4  *  Copyright (C) 2006  Paul Mundt
5  *  Copyright (C) 2006  Jamie Lenehan
6  *
7  * This file is subject to the terms and conditions of the GNU General Public
8  * License.  See the file "COPYING" in the main directory of this archive
9  * for more details.
10  */
11 #include <linux/platform_device.h>
12 #include <linux/init.h>
13 #include <linux/serial.h>
14 #include <linux/io.h>
15 #include <asm/sci.h>
16
17 static struct plat_sci_port sci_platform_data[] = {
18         {
19                 .mapbase        = 0xffe00000,
20                 .flags          = UPF_BOOT_AUTOCONF,
21                 .type           = PORT_SCI,
22                 .irqs           = { 23, 24, 25, 0 },
23         }, {
24                 .mapbase        = 0xffe80000,
25                 .flags          = UPF_BOOT_AUTOCONF,
26                 .type           = PORT_SCIF,
27                 .irqs           = { 40, 41, 43, 42 },
28         }, {
29                 .flags = 0,
30         }
31 };
32
33 static struct platform_device sci_device = {
34         .name           = "sh-sci",
35         .id             = -1,
36         .dev            = {
37                 .platform_data  = sci_platform_data,
38         },
39 };
40
41 static struct platform_device *sh7750_devices[] __initdata = {
42         &sci_device,
43 };
44
45 static int __init sh7750_devices_setup(void)
46 {
47         return platform_add_devices(sh7750_devices,
48                                     ARRAY_SIZE(sh7750_devices));
49 }
50 __initcall(sh7750_devices_setup);
51
52 static struct ipr_data sh7750_ipr_map[] = {
53         /* IRQ, IPR-idx, shift, priority */
54         { 16, 0, 12, 2 }, /* TMU0 TUNI*/
55         { 17, 0, 12, 2 }, /* TMU1 TUNI */
56         { 18, 0,  4, 2 }, /* TMU2 TUNI */
57         { 19, 0,  4, 2 }, /* TMU2 TIPCI */
58         { 27, 1, 12, 2 }, /* WDT ITI */
59         { 20, 0,  0, 2 }, /* RTC ATI (alarm) */
60         { 21, 0,  0, 2 }, /* RTC PRI (period) */
61         { 22, 0,  0, 2 }, /* RTC CUI (carry) */
62         { 23, 1,  4, 3 }, /* SCI ERI */
63         { 24, 1,  4, 3 }, /* SCI RXI */
64         { 25, 1,  4, 3 }, /* SCI TXI */
65         { 40, 2,  4, 3 }, /* SCIF ERI */
66         { 41, 2,  4, 3 }, /* SCIF RXI */
67         { 42, 2,  4, 3 }, /* SCIF BRI */
68         { 43, 2,  4, 3 }, /* SCIF TXI */
69         { 34, 2,  8, 7 }, /* DMAC DMTE0 */
70         { 35, 2,  8, 7 }, /* DMAC DMTE1 */
71         { 36, 2,  8, 7 }, /* DMAC DMTE2 */
72         { 37, 2,  8, 7 }, /* DMAC DMTE3 */
73         { 28, 2,  8, 7 }, /* DMAC DMAE */
74 };
75
76 static struct ipr_data sh7751_ipr_map[] = {
77         { 44, 2,  8, 7 }, /* DMAC DMTE4 */
78         { 45, 2,  8, 7 }, /* DMAC DMTE5 */
79         { 46, 2,  8, 7 }, /* DMAC DMTE6 */
80         { 47, 2,  8, 7 }, /* DMAC DMTE7 */
81         /* The following use INTC_INPRI00 for masking, which is a 32-bit
82            register, not a 16-bit register like the IPRx registers, so it
83            would need special support */
84         /*{ 72, INTPRI00,  8, ? },*/ /* TMU3 TUNI */
85         /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */
86 };
87
88 static unsigned long ipr_offsets[] = {
89         0xffd00004UL,   /* 0: IPRA */
90         0xffd00008UL,   /* 1: IPRB */
91         0xffd0000cUL,   /* 2: IPRC */
92         0xffd00010UL,   /* 3: IPRD */
93 };
94
95 /* given the IPR index return the address of the IPR register */
96 unsigned int map_ipridx_to_addr(int idx)
97 {
98         if (idx >= ARRAY_SIZE(ipr_offsets))
99                 return 0;
100         return ipr_offsets[idx];
101 }
102
103 #define INTC_ICR        0xffd00000UL
104 #define INTC_ICR_IRLM   (1<<7)
105
106 /* enable individual interrupt mode for external interupts */
107 void ipr_irq_enable_irlm(void)
108 {
109         ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
110 }
111
112 void __init init_IRQ_ipr()
113 {
114         make_ipr_irq(sh7750_ipr_map, ARRAY_SIZE(sh7750_ipr_map));
115 #ifdef CONFIG_CPU_SUBTYPE_SH7751
116         make_ipr_irq(sh7751_ipr_map, ARRAY_SIZE(sh7751_ipr_map));
117 #endif
118 }