Merge branch 'fixes-jgarzik' of git://git.kernel.org/pub/scm/linux/kernel/git/linvill...
[sfrench/cifs-2.6.git] / arch / sh / boards / renesas / rts7751r2d / setup.c
1 /*
2  * Renesas Technology Sales RTS7751R2D Support.
3  *
4  * Copyright (C) 2002 - 2006 Atom Create Engineering Co., Ltd.
5  * Copyright (C) 2004 - 2007 Paul Mundt
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/init.h>
12 #include <linux/platform_device.h>
13 #include <linux/pata_platform.h>
14 #include <linux/serial_8250.h>
15 #include <linux/sm501.h>
16 #include <linux/pm.h>
17 #include <asm/machvec.h>
18 #include <asm/rts7751r2d.h>
19 #include <asm/voyagergx.h>
20 #include <asm/io.h>
21
22 static void __init voyagergx_serial_init(void)
23 {
24         unsigned long val;
25
26         /*
27          * GPIO Control
28          */
29         val = readl((void __iomem *)GPIO_MUX_HIGH);
30         val |= 0x00001fe0;
31         writel(val, (void __iomem *)GPIO_MUX_HIGH);
32
33         /*
34          * Power Mode Gate
35          */
36         val = readl((void __iomem *)POWER_MODE0_GATE);
37         val |= (POWER_MODE0_GATE_U0 | POWER_MODE0_GATE_U1);
38         writel(val, (void __iomem *)POWER_MODE0_GATE);
39
40         val = readl((void __iomem *)POWER_MODE1_GATE);
41         val |= (POWER_MODE1_GATE_U0 | POWER_MODE1_GATE_U1);
42         writel(val, (void __iomem *)POWER_MODE1_GATE);
43 }
44
45 static struct resource cf_ide_resources[] = {
46         [0] = {
47                 .start  = PA_AREA5_IO + 0x1000,
48                 .end    = PA_AREA5_IO + 0x1000 + 0x10 - 0x2,
49                 .flags  = IORESOURCE_MEM,
50         },
51         [1] = {
52                 .start  = PA_AREA5_IO + 0x80c,
53                 .end    = PA_AREA5_IO + 0x80c,
54                 .flags  = IORESOURCE_MEM,
55         },
56 #ifndef CONFIG_RTS7751R2D_1 /* For R2D-1 polling is preferred */
57         [2] = {
58                 .start  = IRQ_CF_IDE,
59                 .flags  = IORESOURCE_IRQ,
60         },
61 #endif
62 };
63
64 static struct pata_platform_info pata_info = {
65         .ioport_shift   = 1,
66 };
67
68 static struct platform_device cf_ide_device  = {
69         .name           = "pata_platform",
70         .id             = -1,
71         .num_resources  = ARRAY_SIZE(cf_ide_resources),
72         .resource       = cf_ide_resources,
73         .dev    = {
74                 .platform_data  = &pata_info,
75         },
76 };
77
78 static struct resource heartbeat_resources[] = {
79         [0] = {
80                 .start  = PA_OUTPORT,
81                 .end    = PA_OUTPORT,
82                 .flags  = IORESOURCE_MEM,
83         },
84 };
85
86 static struct platform_device heartbeat_device = {
87         .name           = "heartbeat",
88         .id             = -1,
89         .num_resources  = ARRAY_SIZE(heartbeat_resources),
90         .resource       = heartbeat_resources,
91 };
92
93 #ifdef CONFIG_MFD_SM501
94 static struct plat_serial8250_port uart_platform_data[] = {
95         {
96                 .membase        = (void __iomem *)VOYAGER_UART_BASE,
97                 .mapbase        = VOYAGER_UART_BASE,
98                 .iotype         = UPIO_MEM,
99                 .irq            = IRQ_SM501_U0,
100                 .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
101                 .regshift       = 2,
102                 .uartclk        = (9600 * 16),
103         },
104         { 0 },
105 };
106
107 static struct platform_device uart_device = {
108         .name           = "serial8250",
109         .id             = PLAT8250_DEV_PLATFORM,
110         .dev            = {
111                 .platform_data  = uart_platform_data,
112         },
113 };
114
115 static struct resource sm501_resources[] = {
116         [0]     = {
117                 .start  = 0x10000000,
118                 .end    = 0x13e00000 - 1,
119                 .flags  = IORESOURCE_MEM,
120         },
121         [1]     = {
122                 .start  = 0x13e00000,
123                 .end    = 0x13ffffff,
124                 .flags  = IORESOURCE_MEM,
125         },
126         [2]     = {
127                 .start  = IRQ_SM501_CV,
128                 .flags  = IORESOURCE_IRQ,
129         },
130 };
131
132 static struct platform_device sm501_device = {
133         .name           = "sm501",
134         .id             = -1,
135         .num_resources  = ARRAY_SIZE(sm501_resources),
136         .resource       = sm501_resources,
137 };
138
139 #endif /* CONFIG_MFD_SM501 */
140
141 static struct platform_device *rts7751r2d_devices[] __initdata = {
142 #ifdef CONFIG_MFD_SM501
143         &uart_device,
144         &sm501_device,
145 #endif
146         &cf_ide_device,
147         &heartbeat_device,
148 };
149
150 static int __init rts7751r2d_devices_setup(void)
151 {
152         return platform_add_devices(rts7751r2d_devices,
153                                     ARRAY_SIZE(rts7751r2d_devices));
154 }
155 __initcall(rts7751r2d_devices_setup);
156
157 static void rts7751r2d_power_off(void)
158 {
159         ctrl_outw(0x0001, PA_POWOFF);
160 }
161
162 static inline unsigned char is_ide_ioaddr(unsigned long addr)
163 {
164         return ((cf_ide_resources[0].start <= addr &&
165                  addr <= cf_ide_resources[0].end) ||
166                 (cf_ide_resources[1].start <= addr &&
167                  addr <= cf_ide_resources[1].end));
168 }
169
170 void rts7751r2d_writeb(u8 b, void __iomem *addr)
171 {
172         unsigned long tmp = (unsigned long __force)addr;
173
174         if (is_ide_ioaddr(tmp))
175                 ctrl_outw((u16)b, tmp);
176         else
177                 ctrl_outb(b, tmp);
178 }
179
180 u8 rts7751r2d_readb(void __iomem *addr)
181 {
182         unsigned long tmp = (unsigned long __force)addr;
183
184         if (is_ide_ioaddr(tmp))
185                 return ctrl_inw(tmp) & 0xff;
186         else
187                 return ctrl_inb(tmp);
188 }
189
190 /*
191  * Initialize the board
192  */
193 static void __init rts7751r2d_setup(char **cmdline_p)
194 {
195         u16 ver = ctrl_inw(PA_VERREG);
196
197         printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
198
199         printk(KERN_INFO "FPGA version:%d (revision:%d)\n",
200                                         (ver >> 4) & 0xf, ver & 0xf);
201
202         ctrl_outw(0x0000, PA_OUTPORT);
203         pm_power_off = rts7751r2d_power_off;
204
205         voyagergx_serial_init();
206 }
207
208 /*
209  * The Machine Vector
210  */
211 static struct sh_machine_vector mv_rts7751r2d __initmv = {
212         .mv_name                = "RTS7751R2D",
213         .mv_setup               = rts7751r2d_setup,
214         .mv_init_irq            = init_rts7751r2d_IRQ,
215         .mv_irq_demux           = rts7751r2d_irq_demux,
216         .mv_writeb              = rts7751r2d_writeb,
217         .mv_readb               = rts7751r2d_readb,
218 #if defined(CONFIG_MFD_SM501) && defined(CONFIG_USB_OHCI_HCD)
219         .mv_consistent_alloc    = voyagergx_consistent_alloc,
220         .mv_consistent_free     = voyagergx_consistent_free,
221 #endif
222 };