aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/boards/mach-r2d/setup.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2008-07-29 08:01:19 -0400
committerPaul Mundt <lethal@linux-sh.org>2008-07-29 08:01:19 -0400
commitda2014a2b080e7f3024a4eb6917d47069ad9620b (patch)
treecfde12c6d4b5baa222966b14a676f107992cf786 /arch/sh/boards/mach-r2d/setup.c
parent71b8064e7df5698520d73b4c1566a3dbc98eb9ef (diff)
sh: Shuffle the board directories in to mach groups.
This flattens out the board directories in to individual mach groups, we will use this for getting rid of unneeded directories, simplifying the build system, and becoming more coherent with the refactored arch/sh/include topology. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/boards/mach-r2d/setup.c')
-rw-r--r--arch/sh/boards/mach-r2d/setup.c258
1 files changed, 258 insertions, 0 deletions
diff --git a/arch/sh/boards/mach-r2d/setup.c b/arch/sh/boards/mach-r2d/setup.c
new file mode 100644
index 000000000000..2308e8753bcd
--- /dev/null
+++ b/arch/sh/boards/mach-r2d/setup.c
@@ -0,0 +1,258 @@
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/ata_platform.h>
14#include <linux/sm501.h>
15#include <linux/sm501-regs.h>
16#include <linux/pm.h>
17#include <linux/fb.h>
18#include <linux/spi/spi.h>
19#include <linux/spi/spi_bitbang.h>
20#include <asm/machvec.h>
21#include <asm/rts7751r2d.h>
22#include <asm/io.h>
23#include <asm/io_trapped.h>
24#include <asm/spi.h>
25
26static struct resource cf_ide_resources[] = {
27 [0] = {
28 .start = PA_AREA5_IO + 0x1000,
29 .end = PA_AREA5_IO + 0x1000 + 0x10 - 0x2,
30 .flags = IORESOURCE_MEM,
31 },
32 [1] = {
33 .start = PA_AREA5_IO + 0x80c,
34 .end = PA_AREA5_IO + 0x80c,
35 .flags = IORESOURCE_MEM,
36 },
37#ifndef CONFIG_RTS7751R2D_1 /* For R2D-1 polling is preferred */
38 [2] = {
39 .start = IRQ_CF_IDE,
40 .flags = IORESOURCE_IRQ,
41 },
42#endif
43};
44
45static struct pata_platform_info pata_info = {
46 .ioport_shift = 1,
47};
48
49static struct platform_device cf_ide_device = {
50 .name = "pata_platform",
51 .id = -1,
52 .num_resources = ARRAY_SIZE(cf_ide_resources),
53 .resource = cf_ide_resources,
54 .dev = {
55 .platform_data = &pata_info,
56 },
57};
58
59static struct spi_board_info spi_bus[] = {
60 {
61 .modalias = "rtc-r9701",
62 .max_speed_hz = 1000000,
63 .mode = SPI_MODE_3,
64 },
65};
66
67static void r2d_chip_select(struct sh_spi_info *spi, int cs, int state)
68{
69 BUG_ON(cs != 0); /* Single Epson RTC-9701JE attached on CS0 */
70 ctrl_outw(state == BITBANG_CS_ACTIVE, PA_RTCCE);
71}
72
73static struct sh_spi_info spi_info = {
74 .num_chipselect = 1,
75 .chip_select = r2d_chip_select,
76};
77
78static struct resource spi_sh_sci_resources[] = {
79 {
80 .start = 0xffe00000,
81 .end = 0xffe0001f,
82 .flags = IORESOURCE_MEM,
83 },
84};
85
86static struct platform_device spi_sh_sci_device = {
87 .name = "spi_sh_sci",
88 .id = -1,
89 .num_resources = ARRAY_SIZE(spi_sh_sci_resources),
90 .resource = spi_sh_sci_resources,
91 .dev = {
92 .platform_data = &spi_info,
93 },
94};
95
96static struct resource heartbeat_resources[] = {
97 [0] = {
98 .start = PA_OUTPORT,
99 .end = PA_OUTPORT,
100 .flags = IORESOURCE_MEM,
101 },
102};
103
104static struct platform_device heartbeat_device = {
105 .name = "heartbeat",
106 .id = -1,
107 .num_resources = ARRAY_SIZE(heartbeat_resources),
108 .resource = heartbeat_resources,
109};
110
111static struct resource sm501_resources[] = {
112 [0] = {
113 .start = 0x10000000,
114 .end = 0x13e00000 - 1,
115 .flags = IORESOURCE_MEM,
116 },
117 [1] = {
118 .start = 0x13e00000,
119 .end = 0x13ffffff,
120 .flags = IORESOURCE_MEM,
121 },
122 [2] = {
123 .start = IRQ_VOYAGER,
124 .flags = IORESOURCE_IRQ,
125 },
126};
127
128static struct fb_videomode sm501_default_mode = {
129 .pixclock = 35714,
130 .xres = 640,
131 .yres = 480,
132 .left_margin = 105,
133 .right_margin = 50,
134 .upper_margin = 35,
135 .lower_margin = 0,
136 .hsync_len = 96,
137 .vsync_len = 2,
138 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
139};
140
141static struct sm501_platdata_fbsub sm501_pdata_fbsub_pnl = {
142 .def_bpp = 16,
143 .def_mode = &sm501_default_mode,
144 .flags = SM501FB_FLAG_USE_INIT_MODE |
145 SM501FB_FLAG_USE_HWCURSOR |
146 SM501FB_FLAG_USE_HWACCEL |
147 SM501FB_FLAG_DISABLE_AT_EXIT,
148};
149
150static struct sm501_platdata_fbsub sm501_pdata_fbsub_crt = {
151 .flags = (SM501FB_FLAG_USE_INIT_MODE |
152 SM501FB_FLAG_USE_HWCURSOR |
153 SM501FB_FLAG_USE_HWACCEL |
154 SM501FB_FLAG_DISABLE_AT_EXIT),
155
156};
157
158static struct sm501_platdata_fb sm501_fb_pdata = {
159 .fb_route = SM501_FB_OWN,
160 .fb_crt = &sm501_pdata_fbsub_crt,
161 .fb_pnl = &sm501_pdata_fbsub_pnl,
162 .flags = SM501_FBPD_SWAP_FB_ENDIAN,
163};
164
165static struct sm501_initdata sm501_initdata = {
166 .devices = SM501_USE_USB_HOST | SM501_USE_UART0,
167};
168
169static struct sm501_platdata sm501_platform_data = {
170 .init = &sm501_initdata,
171 .fb = &sm501_fb_pdata,
172};
173
174static struct platform_device sm501_device = {
175 .name = "sm501",
176 .id = -1,
177 .dev = {
178 .platform_data = &sm501_platform_data,
179 },
180 .num_resources = ARRAY_SIZE(sm501_resources),
181 .resource = sm501_resources,
182};
183
184static struct platform_device *rts7751r2d_devices[] __initdata = {
185 &sm501_device,
186 &heartbeat_device,
187 &spi_sh_sci_device,
188};
189
190/*
191 * The CF is connected with a 16-bit bus where 8-bit operations are
192 * unsupported. The linux ata driver is however using 8-bit operations, so
193 * insert a trapped io filter to convert 8-bit operations into 16-bit.
194 */
195static struct trapped_io cf_trapped_io = {
196 .resource = cf_ide_resources,
197 .num_resources = 2,
198 .minimum_bus_width = 16,
199};
200
201static int __init rts7751r2d_devices_setup(void)
202{
203 if (register_trapped_io(&cf_trapped_io) == 0)
204 platform_device_register(&cf_ide_device);
205
206 spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
207
208 return platform_add_devices(rts7751r2d_devices,
209 ARRAY_SIZE(rts7751r2d_devices));
210}
211__initcall(rts7751r2d_devices_setup);
212
213static void rts7751r2d_power_off(void)
214{
215 ctrl_outw(0x0001, PA_POWOFF);
216}
217
218/*
219 * Initialize the board
220 */
221static void __init rts7751r2d_setup(char **cmdline_p)
222{
223 void __iomem *sm501_reg;
224 u16 ver = ctrl_inw(PA_VERREG);
225
226 printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
227
228 printk(KERN_INFO "FPGA version:%d (revision:%d)\n",
229 (ver >> 4) & 0xf, ver & 0xf);
230
231 ctrl_outw(0x0000, PA_OUTPORT);
232 pm_power_off = rts7751r2d_power_off;
233
234 /* sm501 dram configuration:
235 * ColSizeX = 11 - External Memory Column Size: 256 words.
236 * APX = 1 - External Memory Active to Pre-Charge Delay: 7 clocks.
237 * RstX = 1 - External Memory Reset: Normal.
238 * Rfsh = 1 - Local Memory Refresh to Command Delay: 12 clocks.
239 * BwC = 1 - Local Memory Block Write Cycle Time: 2 clocks.
240 * BwP = 1 - Local Memory Block Write to Pre-Charge Delay: 1 clock.
241 * AP = 1 - Internal Memory Active to Pre-Charge Delay: 7 clocks.
242 * Rst = 1 - Internal Memory Reset: Normal.
243 * RA = 1 - Internal Memory Remain in Active State: Do not remain.
244 */
245
246 sm501_reg = (void __iomem *)0xb3e00000 + SM501_DRAM_CONTROL;
247 writel(readl(sm501_reg) | 0x00f107c0, sm501_reg);
248}
249
250/*
251 * The Machine Vector
252 */
253static struct sh_machine_vector mv_rts7751r2d __initmv = {
254 .mv_name = "RTS7751R2D",
255 .mv_setup = rts7751r2d_setup,
256 .mv_init_irq = init_rts7751r2d_IRQ,
257 .mv_irq_demux = rts7751r2d_irq_demux,
258};