diff options
author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2008-07-11 10:27:54 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2008-07-15 13:44:35 -0400 |
commit | edcaf1a6a77315562e9781245cc8e028c9a921dc (patch) | |
tree | a20a0a85071fa283c36db87a41d1a7e091a35781 /arch/mips/txx9/rbtx4927 | |
parent | 766891565bdaf605ea4aebe3e75de77e848254d0 (diff) |
[MIPS] TXx9: Make single kernel can support multiple boards
Make single kernel can be used on RBTX4927/37/38. Also make
some SoC-specific code independent from board-specific code.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/txx9/rbtx4927')
-rw-r--r-- | arch/mips/txx9/rbtx4927/irq.c | 57 | ||||
-rw-r--r-- | arch/mips/txx9/rbtx4927/prom.c | 52 | ||||
-rw-r--r-- | arch/mips/txx9/rbtx4927/setup.c | 78 |
3 files changed, 69 insertions, 118 deletions
diff --git a/arch/mips/txx9/rbtx4927/irq.c b/arch/mips/txx9/rbtx4927/irq.c index bef1447aeed2..70f13211bc2a 100644 --- a/arch/mips/txx9/rbtx4927/irq.c +++ b/arch/mips/txx9/rbtx4927/irq.c | |||
@@ -111,17 +111,10 @@ JP7 is not bus master -- do NOT use -- only 4 pci bus master's allowed -- SouthB | |||
111 | #include <linux/types.h> | 111 | #include <linux/types.h> |
112 | #include <linux/interrupt.h> | 112 | #include <linux/interrupt.h> |
113 | #include <asm/io.h> | 113 | #include <asm/io.h> |
114 | #include <asm/mipsregs.h> | ||
115 | #include <asm/txx9/generic.h> | ||
114 | #include <asm/txx9/rbtx4927.h> | 116 | #include <asm/txx9/rbtx4927.h> |
115 | 117 | ||
116 | #define TOSHIBA_RBTX4927_IRQ_IOC_RAW_BEG 0 | ||
117 | #define TOSHIBA_RBTX4927_IRQ_IOC_RAW_END 7 | ||
118 | |||
119 | #define TOSHIBA_RBTX4927_IRQ_IOC_BEG ((TX4927_IRQ_PIC_END+1)+TOSHIBA_RBTX4927_IRQ_IOC_RAW_BEG) /* 56 */ | ||
120 | #define TOSHIBA_RBTX4927_IRQ_IOC_END ((TX4927_IRQ_PIC_END+1)+TOSHIBA_RBTX4927_IRQ_IOC_RAW_END) /* 63 */ | ||
121 | |||
122 | #define TOSHIBA_RBTX4927_IRQ_NEST_IOC_ON_PIC TX4927_IRQ_NEST_EXT_ON_PIC | ||
123 | #define TOSHIBA_RBTX4927_IRQ_NEST_ISA_ON_IOC (TOSHIBA_RBTX4927_IRQ_IOC_BEG+2) | ||
124 | |||
125 | static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq); | 118 | static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq); |
126 | static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq); | 119 | static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq); |
127 | 120 | ||
@@ -136,34 +129,25 @@ static struct irq_chip toshiba_rbtx4927_irq_ioc_type = { | |||
136 | #define TOSHIBA_RBTX4927_IOC_INTR_ENAB (void __iomem *)0xbc002000UL | 129 | #define TOSHIBA_RBTX4927_IOC_INTR_ENAB (void __iomem *)0xbc002000UL |
137 | #define TOSHIBA_RBTX4927_IOC_INTR_STAT (void __iomem *)0xbc002006UL | 130 | #define TOSHIBA_RBTX4927_IOC_INTR_STAT (void __iomem *)0xbc002006UL |
138 | 131 | ||
139 | int toshiba_rbtx4927_irq_nested(int sw_irq) | 132 | static int toshiba_rbtx4927_irq_nested(int sw_irq) |
140 | { | 133 | { |
141 | u8 level3; | 134 | u8 level3; |
142 | 135 | ||
143 | level3 = readb(TOSHIBA_RBTX4927_IOC_INTR_STAT) & 0x1f; | 136 | level3 = readb(TOSHIBA_RBTX4927_IOC_INTR_STAT) & 0x1f; |
144 | if (level3) | 137 | if (level3) |
145 | sw_irq = TOSHIBA_RBTX4927_IRQ_IOC_BEG + fls(level3) - 1; | 138 | sw_irq = RBTX4927_IRQ_IOC + fls(level3) - 1; |
146 | return (sw_irq); | 139 | return (sw_irq); |
147 | } | 140 | } |
148 | 141 | ||
149 | static struct irqaction toshiba_rbtx4927_irq_ioc_action = { | ||
150 | .handler = no_action, | ||
151 | .flags = IRQF_SHARED, | ||
152 | .mask = CPU_MASK_NONE, | ||
153 | .name = TOSHIBA_RBTX4927_IOC_NAME | ||
154 | }; | ||
155 | |||
156 | static void __init toshiba_rbtx4927_irq_ioc_init(void) | 142 | static void __init toshiba_rbtx4927_irq_ioc_init(void) |
157 | { | 143 | { |
158 | int i; | 144 | int i; |
159 | 145 | ||
160 | for (i = TOSHIBA_RBTX4927_IRQ_IOC_BEG; | 146 | for (i = RBTX4927_IRQ_IOC; |
161 | i <= TOSHIBA_RBTX4927_IRQ_IOC_END; i++) | 147 | i < RBTX4927_IRQ_IOC + RBTX4927_NR_IRQ_IOC; i++) |
162 | set_irq_chip_and_handler(i, &toshiba_rbtx4927_irq_ioc_type, | 148 | set_irq_chip_and_handler(i, &toshiba_rbtx4927_irq_ioc_type, |
163 | handle_level_irq); | 149 | handle_level_irq); |
164 | 150 | set_irq_chained_handler(RBTX4927_IRQ_IOCINT, handle_simple_irq); | |
165 | setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_IOC_ON_PIC, | ||
166 | &toshiba_rbtx4927_irq_ioc_action); | ||
167 | } | 151 | } |
168 | 152 | ||
169 | static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq) | 153 | static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq) |
@@ -171,7 +155,7 @@ static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq) | |||
171 | unsigned char v; | 155 | unsigned char v; |
172 | 156 | ||
173 | v = readb(TOSHIBA_RBTX4927_IOC_INTR_ENAB); | 157 | v = readb(TOSHIBA_RBTX4927_IOC_INTR_ENAB); |
174 | v |= (1 << (irq - TOSHIBA_RBTX4927_IRQ_IOC_BEG)); | 158 | v |= (1 << (irq - RBTX4927_IRQ_IOC)); |
175 | writeb(v, TOSHIBA_RBTX4927_IOC_INTR_ENAB); | 159 | writeb(v, TOSHIBA_RBTX4927_IOC_INTR_ENAB); |
176 | } | 160 | } |
177 | 161 | ||
@@ -180,15 +164,34 @@ static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq) | |||
180 | unsigned char v; | 164 | unsigned char v; |
181 | 165 | ||
182 | v = readb(TOSHIBA_RBTX4927_IOC_INTR_ENAB); | 166 | v = readb(TOSHIBA_RBTX4927_IOC_INTR_ENAB); |
183 | v &= ~(1 << (irq - TOSHIBA_RBTX4927_IRQ_IOC_BEG)); | 167 | v &= ~(1 << (irq - RBTX4927_IRQ_IOC)); |
184 | writeb(v, TOSHIBA_RBTX4927_IOC_INTR_ENAB); | 168 | writeb(v, TOSHIBA_RBTX4927_IOC_INTR_ENAB); |
185 | mmiowb(); | 169 | mmiowb(); |
186 | } | 170 | } |
187 | 171 | ||
188 | void __init arch_init_irq(void) | 172 | |
173 | static int rbtx4927_irq_dispatch(int pending) | ||
189 | { | 174 | { |
190 | extern void tx4927_irq_init(void); | 175 | int irq; |
176 | |||
177 | if (pending & STATUSF_IP7) /* cpu timer */ | ||
178 | irq = MIPS_CPU_IRQ_BASE + 7; | ||
179 | else if (pending & STATUSF_IP2) { /* tx4927 pic */ | ||
180 | irq = txx9_irq(); | ||
181 | if (irq == RBTX4927_IRQ_IOCINT) | ||
182 | irq = toshiba_rbtx4927_irq_nested(irq); | ||
183 | } else if (pending & STATUSF_IP0) /* user line 0 */ | ||
184 | irq = MIPS_CPU_IRQ_BASE + 0; | ||
185 | else if (pending & STATUSF_IP1) /* user line 1 */ | ||
186 | irq = MIPS_CPU_IRQ_BASE + 1; | ||
187 | else | ||
188 | irq = -1; | ||
189 | return irq; | ||
190 | } | ||
191 | 191 | ||
192 | void __init rbtx4927_irq_setup(void) | ||
193 | { | ||
194 | txx9_irq_dispatch = rbtx4927_irq_dispatch; | ||
192 | tx4927_irq_init(); | 195 | tx4927_irq_init(); |
193 | toshiba_rbtx4927_irq_ioc_init(); | 196 | toshiba_rbtx4927_irq_ioc_init(); |
194 | /* Onboard 10M Ether: High Active */ | 197 | /* Onboard 10M Ether: High Active */ |
diff --git a/arch/mips/txx9/rbtx4927/prom.c b/arch/mips/txx9/rbtx4927/prom.c index 0020bbee838b..942e627d2dc1 100644 --- a/arch/mips/txx9/rbtx4927/prom.c +++ b/arch/mips/txx9/rbtx4927/prom.c | |||
@@ -30,62 +30,16 @@ | |||
30 | * 675 Mass Ave, Cambridge, MA 02139, USA. | 30 | * 675 Mass Ave, Cambridge, MA 02139, USA. |
31 | */ | 31 | */ |
32 | #include <linux/init.h> | 32 | #include <linux/init.h> |
33 | #include <linux/string.h> | ||
34 | #include <asm/bootinfo.h> | 33 | #include <asm/bootinfo.h> |
35 | #include <asm/cpu.h> | 34 | #include <asm/txx9/generic.h> |
36 | #include <asm/mipsregs.h> | 35 | #include <asm/txx9/rbtx4927.h> |
37 | #include <asm/txx9/tx4927.h> | ||
38 | 36 | ||
39 | void __init prom_init_cmdline(void) | 37 | void __init rbtx4927_prom_init(void) |
40 | { | ||
41 | int argc = (int) fw_arg0; | ||
42 | char **argv = (char **) fw_arg1; | ||
43 | int i; /* Always ignore the "-c" at argv[0] */ | ||
44 | |||
45 | /* ignore all built-in args if any f/w args given */ | ||
46 | if (argc > 1) { | ||
47 | *arcs_cmdline = '\0'; | ||
48 | } | ||
49 | |||
50 | for (i = 1; i < argc; i++) { | ||
51 | if (i != 1) { | ||
52 | strcat(arcs_cmdline, " "); | ||
53 | } | ||
54 | strcat(arcs_cmdline, argv[i]); | ||
55 | } | ||
56 | } | ||
57 | |||
58 | void __init prom_init(void) | ||
59 | { | 38 | { |
60 | extern int tx4927_get_mem_size(void); | 39 | extern int tx4927_get_mem_size(void); |
61 | extern char* toshiba_name; | ||
62 | int msize; | 40 | int msize; |
63 | 41 | ||
64 | prom_init_cmdline(); | 42 | prom_init_cmdline(); |
65 | |||
66 | if ((read_c0_prid() & 0xff) == PRID_REV_TX4927) { | ||
67 | mips_machtype = MACH_TOSHIBA_RBTX4927; | ||
68 | toshiba_name = "TX4927"; | ||
69 | } else { | ||
70 | mips_machtype = MACH_TOSHIBA_RBTX4937; | ||
71 | toshiba_name = "TX4937"; | ||
72 | } | ||
73 | |||
74 | msize = tx4927_get_mem_size(); | 43 | msize = tx4927_get_mem_size(); |
75 | add_memory_region(0, msize << 20, BOOT_MEM_RAM); | 44 | add_memory_region(0, msize << 20, BOOT_MEM_RAM); |
76 | } | 45 | } |
77 | |||
78 | void __init prom_free_prom_memory(void) | ||
79 | { | ||
80 | } | ||
81 | |||
82 | const char *get_system_type(void) | ||
83 | { | ||
84 | return "Toshiba RBTX4927/RBTX4937"; | ||
85 | } | ||
86 | |||
87 | char * __init prom_getcmdline(void) | ||
88 | { | ||
89 | return &(arcs_cmdline[0]); | ||
90 | } | ||
91 | |||
diff --git a/arch/mips/txx9/rbtx4927/setup.c b/arch/mips/txx9/rbtx4927/setup.c index 86b870abc319..c3566c39c26c 100644 --- a/arch/mips/txx9/rbtx4927/setup.c +++ b/arch/mips/txx9/rbtx4927/setup.c | |||
@@ -49,7 +49,6 @@ | |||
49 | #include <linux/interrupt.h> | 49 | #include <linux/interrupt.h> |
50 | #include <linux/pm.h> | 50 | #include <linux/pm.h> |
51 | #include <linux/platform_device.h> | 51 | #include <linux/platform_device.h> |
52 | #include <linux/clk.h> | ||
53 | #include <linux/delay.h> | 52 | #include <linux/delay.h> |
54 | 53 | ||
55 | #include <asm/bootinfo.h> | 54 | #include <asm/bootinfo.h> |
@@ -76,8 +75,6 @@ char *prom_getcmdline(void); | |||
76 | 75 | ||
77 | static int tx4927_ccfg_toeon = 1; | 76 | static int tx4927_ccfg_toeon = 1; |
78 | 77 | ||
79 | char *toshiba_name = ""; | ||
80 | |||
81 | #ifdef CONFIG_PCI | 78 | #ifdef CONFIG_PCI |
82 | static void __init tx4927_pci_setup(void) | 79 | static void __init tx4927_pci_setup(void) |
83 | { | 80 | { |
@@ -171,15 +168,15 @@ static void __init tx4937_pci_setup(void) | |||
171 | } | 168 | } |
172 | } | 169 | } |
173 | 170 | ||
174 | static int __init rbtx4927_arch_init(void) | 171 | static void __init rbtx4927_arch_init(void) |
175 | { | 172 | { |
176 | if (mips_machtype == MACH_TOSHIBA_RBTX4937) | 173 | if (mips_machtype == MACH_TOSHIBA_RBTX4937) |
177 | tx4937_pci_setup(); | 174 | tx4937_pci_setup(); |
178 | else | 175 | else |
179 | tx4927_pci_setup(); | 176 | tx4927_pci_setup(); |
180 | return 0; | ||
181 | } | 177 | } |
182 | arch_initcall(rbtx4927_arch_init); | 178 | #else |
179 | #define rbtx4927_arch_init NULL | ||
183 | #endif /* CONFIG_PCI */ | 180 | #endif /* CONFIG_PCI */ |
184 | 181 | ||
185 | static void __noreturn wait_forever(void) | 182 | static void __noreturn wait_forever(void) |
@@ -223,14 +220,12 @@ void toshiba_rbtx4927_power_off(void) | |||
223 | /* no return */ | 220 | /* no return */ |
224 | } | 221 | } |
225 | 222 | ||
226 | void __init plat_mem_setup(void) | 223 | static void __init rbtx4927_mem_setup(void) |
227 | { | 224 | { |
228 | int i; | 225 | int i; |
229 | u32 cp0_config; | 226 | u32 cp0_config; |
230 | char *argptr; | 227 | char *argptr; |
231 | 228 | ||
232 | printk("CPU is %s\n", toshiba_name); | ||
233 | |||
234 | /* f/w leaves this on at startup */ | 229 | /* f/w leaves this on at startup */ |
235 | clear_c0_status(ST0_ERL); | 230 | clear_c0_status(ST0_ERL); |
236 | 231 | ||
@@ -323,7 +318,7 @@ void __init plat_mem_setup(void) | |||
323 | req.iotype = UPIO_MEM; | 318 | req.iotype = UPIO_MEM; |
324 | req.membase = (char *)(0xff1ff300 + i * 0x100); | 319 | req.membase = (char *)(0xff1ff300 + i * 0x100); |
325 | req.mapbase = 0xff1ff300 + i * 0x100; | 320 | req.mapbase = 0xff1ff300 + i * 0x100; |
326 | req.irq = TX4927_IRQ_PIC_BEG + 8 + i; | 321 | req.irq = TXX9_IRQ_BASE + TX4927_IR_SIO(i); |
327 | req.flags |= UPF_BUGGY_UART /*HAVE_CTS_LINE*/; | 322 | req.flags |= UPF_BUGGY_UART /*HAVE_CTS_LINE*/; |
328 | req.uartclk = 50000000; | 323 | req.uartclk = 50000000; |
329 | early_serial_txx9_setup(&req); | 324 | early_serial_txx9_setup(&req); |
@@ -352,7 +347,7 @@ void __init plat_mem_setup(void) | |||
352 | #endif | 347 | #endif |
353 | } | 348 | } |
354 | 349 | ||
355 | void __init plat_time_init(void) | 350 | static void __init rbtx4927_time_init(void) |
356 | { | 351 | { |
357 | mips_hpt_frequency = txx9_cpu_clock / 2; | 352 | mips_hpt_frequency = txx9_cpu_clock / 2; |
358 | if (____raw_readq(&tx4927_ccfgptr->ccfg) & TX4927_CCFG_TINTDIS) | 353 | if (____raw_readq(&tx4927_ccfgptr->ccfg) & TX4927_CCFG_TINTDIS) |
@@ -372,7 +367,6 @@ static int __init toshiba_rbtx4927_rtc_init(void) | |||
372 | platform_device_register_simple("rtc-ds1742", -1, &res, 1); | 367 | platform_device_register_simple("rtc-ds1742", -1, &res, 1); |
373 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | 368 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; |
374 | } | 369 | } |
375 | device_initcall(toshiba_rbtx4927_rtc_init); | ||
376 | 370 | ||
377 | static int __init rbtx4927_ne_init(void) | 371 | static int __init rbtx4927_ne_init(void) |
378 | { | 372 | { |
@@ -391,7 +385,6 @@ static int __init rbtx4927_ne_init(void) | |||
391 | res, ARRAY_SIZE(res)); | 385 | res, ARRAY_SIZE(res)); |
392 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | 386 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; |
393 | } | 387 | } |
394 | device_initcall(rbtx4927_ne_init); | ||
395 | 388 | ||
396 | /* Watchdog support */ | 389 | /* Watchdog support */ |
397 | 390 | ||
@@ -411,36 +404,37 @@ static int __init rbtx4927_wdt_init(void) | |||
411 | { | 404 | { |
412 | return txx9_wdt_init(TX4927_TMR_REG(2) & 0xfffffffffULL); | 405 | return txx9_wdt_init(TX4927_TMR_REG(2) & 0xfffffffffULL); |
413 | } | 406 | } |
414 | device_initcall(rbtx4927_wdt_init); | ||
415 | |||
416 | /* Minimum CLK support */ | ||
417 | |||
418 | struct clk *clk_get(struct device *dev, const char *id) | ||
419 | { | ||
420 | if (!strcmp(id, "imbus_clk")) | ||
421 | return (struct clk *)50000000; | ||
422 | return ERR_PTR(-ENOENT); | ||
423 | } | ||
424 | EXPORT_SYMBOL(clk_get); | ||
425 | |||
426 | int clk_enable(struct clk *clk) | ||
427 | { | ||
428 | return 0; | ||
429 | } | ||
430 | EXPORT_SYMBOL(clk_enable); | ||
431 | 407 | ||
432 | void clk_disable(struct clk *clk) | 408 | static void __init rbtx4927_device_init(void) |
433 | { | 409 | { |
410 | toshiba_rbtx4927_rtc_init(); | ||
411 | rbtx4927_ne_init(); | ||
412 | rbtx4927_wdt_init(); | ||
434 | } | 413 | } |
435 | EXPORT_SYMBOL(clk_disable); | ||
436 | 414 | ||
437 | unsigned long clk_get_rate(struct clk *clk) | 415 | struct txx9_board_vec rbtx4927_vec __initdata = { |
438 | { | 416 | .type = MACH_TOSHIBA_RBTX4927, |
439 | return (unsigned long)clk; | 417 | .system = "Toshiba RBTX4927", |
440 | } | 418 | .prom_init = rbtx4927_prom_init, |
441 | EXPORT_SYMBOL(clk_get_rate); | 419 | .mem_setup = rbtx4927_mem_setup, |
442 | 420 | .irq_setup = rbtx4927_irq_setup, | |
443 | void clk_put(struct clk *clk) | 421 | .time_init = rbtx4927_time_init, |
444 | { | 422 | .device_init = rbtx4927_device_init, |
445 | } | 423 | .arch_init = rbtx4927_arch_init, |
446 | EXPORT_SYMBOL(clk_put); | 424 | #ifdef CONFIG_PCI |
425 | .pci_map_irq = rbtx4927_pci_map_irq, | ||
426 | #endif | ||
427 | }; | ||
428 | struct txx9_board_vec rbtx4937_vec __initdata = { | ||
429 | .type = MACH_TOSHIBA_RBTX4937, | ||
430 | .system = "Toshiba RBTX4937", | ||
431 | .prom_init = rbtx4927_prom_init, | ||
432 | .mem_setup = rbtx4927_mem_setup, | ||
433 | .irq_setup = rbtx4927_irq_setup, | ||
434 | .time_init = rbtx4927_time_init, | ||
435 | .device_init = rbtx4927_device_init, | ||
436 | .arch_init = rbtx4927_arch_init, | ||
437 | #ifdef CONFIG_PCI | ||
438 | .pci_map_irq = rbtx4927_pci_map_irq, | ||
439 | #endif | ||
440 | }; | ||