Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sh/boards/mach-x3proto/setup.c
15126 views
1
/*
2
* arch/sh/boards/mach-x3proto/setup.c
3
*
4
* Renesas SH-X3 Prototype Board Support.
5
*
6
* Copyright (C) 2007 - 2010 Paul Mundt
7
*
8
* This file is subject to the terms and conditions of the GNU General Public
9
* License. See the file "COPYING" in the main directory of this archive
10
* for more details.
11
*/
12
#include <linux/init.h>
13
#include <linux/platform_device.h>
14
#include <linux/kernel.h>
15
#include <linux/io.h>
16
#include <linux/smc91x.h>
17
#include <linux/irq.h>
18
#include <linux/interrupt.h>
19
#include <linux/input.h>
20
#include <linux/usb/r8a66597.h>
21
#include <linux/usb/m66592.h>
22
#include <linux/gpio.h>
23
#include <linux/gpio_keys.h>
24
#include <mach/ilsel.h>
25
#include <mach/hardware.h>
26
#include <asm/smp-ops.h>
27
28
static struct resource heartbeat_resources[] = {
29
[0] = {
30
.start = 0xb8140020,
31
.end = 0xb8140020,
32
.flags = IORESOURCE_MEM,
33
},
34
};
35
36
static struct platform_device heartbeat_device = {
37
.name = "heartbeat",
38
.id = -1,
39
.num_resources = ARRAY_SIZE(heartbeat_resources),
40
.resource = heartbeat_resources,
41
};
42
43
static struct smc91x_platdata smc91x_info = {
44
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
45
};
46
47
static struct resource smc91x_resources[] = {
48
[0] = {
49
.start = 0x18000300,
50
.end = 0x18000300 + 0x10 - 1,
51
.flags = IORESOURCE_MEM,
52
},
53
[1] = {
54
/* Filled in by ilsel */
55
.flags = IORESOURCE_IRQ,
56
},
57
};
58
59
static struct platform_device smc91x_device = {
60
.name = "smc91x",
61
.id = -1,
62
.resource = smc91x_resources,
63
.num_resources = ARRAY_SIZE(smc91x_resources),
64
.dev = {
65
.platform_data = &smc91x_info,
66
},
67
};
68
69
static struct r8a66597_platdata r8a66597_data = {
70
.xtal = R8A66597_PLATDATA_XTAL_12MHZ,
71
.vif = 1,
72
};
73
74
static struct resource r8a66597_usb_host_resources[] = {
75
[0] = {
76
.start = 0x18040000,
77
.end = 0x18080000 - 1,
78
.flags = IORESOURCE_MEM,
79
},
80
[1] = {
81
/* Filled in by ilsel */
82
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
83
},
84
};
85
86
static struct platform_device r8a66597_usb_host_device = {
87
.name = "r8a66597_hcd",
88
.id = -1,
89
.dev = {
90
.dma_mask = NULL, /* don't use dma */
91
.coherent_dma_mask = 0xffffffff,
92
.platform_data = &r8a66597_data,
93
},
94
.num_resources = ARRAY_SIZE(r8a66597_usb_host_resources),
95
.resource = r8a66597_usb_host_resources,
96
};
97
98
static struct m66592_platdata usbf_platdata = {
99
.xtal = M66592_PLATDATA_XTAL_24MHZ,
100
.vif = 1,
101
};
102
103
static struct resource m66592_usb_peripheral_resources[] = {
104
[0] = {
105
.name = "m66592_udc",
106
.start = 0x18080000,
107
.end = 0x180c0000 - 1,
108
.flags = IORESOURCE_MEM,
109
},
110
[1] = {
111
.name = "m66592_udc",
112
/* Filled in by ilsel */
113
.flags = IORESOURCE_IRQ,
114
},
115
};
116
117
static struct platform_device m66592_usb_peripheral_device = {
118
.name = "m66592_udc",
119
.id = -1,
120
.dev = {
121
.dma_mask = NULL, /* don't use dma */
122
.coherent_dma_mask = 0xffffffff,
123
.platform_data = &usbf_platdata,
124
},
125
.num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources),
126
.resource = m66592_usb_peripheral_resources,
127
};
128
129
static struct gpio_keys_button baseboard_buttons[NR_BASEBOARD_GPIOS] = {
130
{
131
.desc = "key44",
132
.code = KEY_POWER,
133
.active_low = 1,
134
.wakeup = 1,
135
}, {
136
.desc = "key43",
137
.code = KEY_SUSPEND,
138
.active_low = 1,
139
.wakeup = 1,
140
}, {
141
.desc = "key42",
142
.code = KEY_KATAKANAHIRAGANA,
143
.active_low = 1,
144
}, {
145
.desc = "key41",
146
.code = KEY_SWITCHVIDEOMODE,
147
.active_low = 1,
148
}, {
149
.desc = "key34",
150
.code = KEY_F12,
151
.active_low = 1,
152
}, {
153
.desc = "key33",
154
.code = KEY_F11,
155
.active_low = 1,
156
}, {
157
.desc = "key32",
158
.code = KEY_F10,
159
.active_low = 1,
160
}, {
161
.desc = "key31",
162
.code = KEY_F9,
163
.active_low = 1,
164
}, {
165
.desc = "key24",
166
.code = KEY_F8,
167
.active_low = 1,
168
}, {
169
.desc = "key23",
170
.code = KEY_F7,
171
.active_low = 1,
172
}, {
173
.desc = "key22",
174
.code = KEY_F6,
175
.active_low = 1,
176
}, {
177
.desc = "key21",
178
.code = KEY_F5,
179
.active_low = 1,
180
}, {
181
.desc = "key14",
182
.code = KEY_F4,
183
.active_low = 1,
184
}, {
185
.desc = "key13",
186
.code = KEY_F3,
187
.active_low = 1,
188
}, {
189
.desc = "key12",
190
.code = KEY_F2,
191
.active_low = 1,
192
}, {
193
.desc = "key11",
194
.code = KEY_F1,
195
.active_low = 1,
196
},
197
};
198
199
static struct gpio_keys_platform_data baseboard_buttons_data = {
200
.buttons = baseboard_buttons,
201
.nbuttons = ARRAY_SIZE(baseboard_buttons),
202
};
203
204
static struct platform_device baseboard_buttons_device = {
205
.name = "gpio-keys",
206
.id = -1,
207
.dev = {
208
.platform_data = &baseboard_buttons_data,
209
},
210
};
211
212
static struct platform_device *x3proto_devices[] __initdata = {
213
&heartbeat_device,
214
&smc91x_device,
215
&r8a66597_usb_host_device,
216
&m66592_usb_peripheral_device,
217
&baseboard_buttons_device,
218
};
219
220
static void __init x3proto_init_irq(void)
221
{
222
plat_irq_setup_pins(IRQ_MODE_IRL3210);
223
224
/* Set ICR0.LVLMODE */
225
__raw_writel(__raw_readl(0xfe410000) | (1 << 21), 0xfe410000);
226
}
227
228
static int __init x3proto_devices_setup(void)
229
{
230
int ret, i;
231
232
/*
233
* IRLs are only needed for ILSEL mappings, so flip over the INTC
234
* pins at a later point to enable the GPIOs to settle.
235
*/
236
x3proto_init_irq();
237
238
/*
239
* Now that ILSELs are available, set up the baseboard GPIOs.
240
*/
241
ret = x3proto_gpio_setup();
242
if (unlikely(ret))
243
return ret;
244
245
/*
246
* Propagate dynamic GPIOs for the baseboard button device.
247
*/
248
for (i = 0; i < ARRAY_SIZE(baseboard_buttons); i++)
249
baseboard_buttons[i].gpio = x3proto_gpio_chip.base + i;
250
251
r8a66597_usb_host_resources[1].start =
252
r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I);
253
254
m66592_usb_peripheral_resources[1].start =
255
m66592_usb_peripheral_resources[1].end = ilsel_enable(ILSEL_USBP_I);
256
257
smc91x_resources[1].start =
258
smc91x_resources[1].end = ilsel_enable(ILSEL_LAN);
259
260
return platform_add_devices(x3proto_devices,
261
ARRAY_SIZE(x3proto_devices));
262
}
263
device_initcall(x3proto_devices_setup);
264
265
static void __init x3proto_setup(char **cmdline_p)
266
{
267
register_smp_ops(&shx3_smp_ops);
268
}
269
270
static struct sh_machine_vector mv_x3proto __initmv = {
271
.mv_name = "x3proto",
272
.mv_setup = x3proto_setup,
273
};
274
275