1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/tty.h>
22#include <linux/serial.h>
23#include <linux/serial_core.h>
24#include <linux/console.h>
25
26#include <asm/io.h>
27#include <asm/prom.h>
28
29
30
31static int txx9_serial_bitmap __initdata;
32
33static struct {
34 uint32_t offset;
35 uint32_t index;
36} txx9_scc_tab[3] __initdata = {
37 { 0x300, 0 },
38 { 0x400, 0 },
39 { 0x800, 1 }
40};
41
42static int __init txx9_serial_init(void)
43{
44 extern int early_serial_txx9_setup(struct uart_port *port);
45 struct device_node *node = NULL;
46 int i;
47 struct uart_port req;
48 struct of_irq irq;
49 struct resource res;
50
51 while ((node = of_find_compatible_node(node,
52 "serial", "toshiba,sio-scc")) != NULL) {
53 for (i = 0; i < ARRAY_SIZE(txx9_scc_tab); i++) {
54 if (!(txx9_serial_bitmap & (1<<i)))
55 continue;
56
57 if (of_irq_map_one(node, i, &irq))
58 continue;
59 if (of_address_to_resource(node,
60 txx9_scc_tab[i].index, &res))
61 continue;
62
63 memset(&req, 0, sizeof(req));
64 req.line = i;
65 req.iotype = UPIO_MEM;
66 req.mapbase = res.start + txx9_scc_tab[i].offset;
67#ifdef CONFIG_SERIAL_TXX9_CONSOLE
68 req.membase = ioremap(req.mapbase, 0x24);
69#endif
70 req.irq = irq_create_of_mapping(irq.controller,
71 irq.specifier, irq.size);
72 req.flags |= UPF_IOREMAP | UPF_BUGGY_UART
73 ;
74 req.uartclk = 83300000;
75 early_serial_txx9_setup(&req);
76 }
77 }
78
79 return 0;
80}
81
82static int __init txx9_serial_config(char *ptr)
83{
84 int i;
85
86 for (;;) {
87 switch (get_option(&ptr, &i)) {
88 default:
89 return 0;
90 case 2:
91 txx9_serial_bitmap |= 1 << i;
92 break;
93 case 1:
94 txx9_serial_bitmap |= 1 << i;
95 return 0;
96 }
97 }
98}
99__setup("txx9_serial=", txx9_serial_config);
100
101console_initcall(txx9_serial_init);
102