aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/boards/mach-microdev/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sh/boards/mach-microdev/setup.c')
-rw-r--r--arch/sh/boards/mach-microdev/setup.c186
1 files changed, 6 insertions, 180 deletions
diff --git a/arch/sh/boards/mach-microdev/setup.c b/arch/sh/boards/mach-microdev/setup.c
index 9f5a97812e75..d1df2a4fb9b8 100644
--- a/arch/sh/boards/mach-microdev/setup.c
+++ b/arch/sh/boards/mach-microdev/setup.c
@@ -17,64 +17,12 @@
17#include <mach/microdev.h> 17#include <mach/microdev.h>
18#include <asm/io.h> 18#include <asm/io.h>
19#include <asm/machvec.h> 19#include <asm/machvec.h>
20 20#include <asm/sizes.h>
21 /*
22 * Setup for the SMSC FDC37C93xAPM
23 */
24#define SMSC_CONFIG_PORT_ADDR (0x3F0)
25#define SMSC_INDEX_PORT_ADDR SMSC_CONFIG_PORT_ADDR
26#define SMSC_DATA_PORT_ADDR (SMSC_INDEX_PORT_ADDR + 1)
27
28#define SMSC_ENTER_CONFIG_KEY 0x55
29#define SMSC_EXIT_CONFIG_KEY 0xaa
30
31#define SMCS_LOGICAL_DEV_INDEX 0x07 /* Logical Device Number */
32#define SMSC_DEVICE_ID_INDEX 0x20 /* Device ID */
33#define SMSC_DEVICE_REV_INDEX 0x21 /* Device Revision */
34#define SMSC_ACTIVATE_INDEX 0x30 /* Activate */
35#define SMSC_PRIMARY_BASE_INDEX 0x60 /* Primary Base Address */
36#define SMSC_SECONDARY_BASE_INDEX 0x62 /* Secondary Base Address */
37#define SMSC_PRIMARY_INT_INDEX 0x70 /* Primary Interrupt Select */
38#define SMSC_SECONDARY_INT_INDEX 0x72 /* Secondary Interrupt Select */
39#define SMSC_HDCS0_INDEX 0xf0 /* HDCS0 Address Decoder */
40#define SMSC_HDCS1_INDEX 0xf1 /* HDCS1 Address Decoder */
41
42#define SMSC_IDE1_DEVICE 1 /* IDE #1 logical device */
43#define SMSC_IDE2_DEVICE 2 /* IDE #2 logical device */
44#define SMSC_PARALLEL_DEVICE 3 /* Parallel Port logical device */
45#define SMSC_SERIAL1_DEVICE 4 /* Serial #1 logical device */
46#define SMSC_SERIAL2_DEVICE 5 /* Serial #2 logical device */
47#define SMSC_KEYBOARD_DEVICE 7 /* Keyboard logical device */
48#define SMSC_CONFIG_REGISTERS 8 /* Configuration Registers (Aux I/O) */
49
50#define SMSC_READ_INDEXED(index) ({ \
51 outb((index), SMSC_INDEX_PORT_ADDR); \
52 inb(SMSC_DATA_PORT_ADDR); })
53#define SMSC_WRITE_INDEXED(val, index) ({ \
54 outb((index), SMSC_INDEX_PORT_ADDR); \
55 outb((val), SMSC_DATA_PORT_ADDR); })
56
57#define IDE1_PRIMARY_BASE 0x01f0 /* Task File Registe base for IDE #1 */
58#define IDE1_SECONDARY_BASE 0x03f6 /* Miscellaneous AT registers for IDE #1 */
59#define IDE2_PRIMARY_BASE 0x0170 /* Task File Registe base for IDE #2 */
60#define IDE2_SECONDARY_BASE 0x0376 /* Miscellaneous AT registers for IDE #2 */
61
62#define SERIAL1_PRIMARY_BASE 0x03f8
63#define SERIAL2_PRIMARY_BASE 0x02f8
64
65#define MSB(x) ( (x) >> 8 )
66#define LSB(x) ( (x) & 0xff )
67
68 /* General-Purpose base address on CPU-board FPGA */
69#define MICRODEV_FPGA_GP_BASE 0xa6100000ul
70
71 /* assume a Keyboard Controller is present */
72int microdev_kbd_controller_present = 1;
73 21
74static struct resource smc91x_resources[] = { 22static struct resource smc91x_resources[] = {
75 [0] = { 23 [0] = {
76 .start = 0x300, 24 .start = 0x300,
77 .end = 0x300 + 0x0001000 - 1, 25 .end = 0x300 + SZ_4K - 1,
78 .flags = IORESOURCE_MEM, 26 .flags = IORESOURCE_MEM,
79 }, 27 },
80 [1] = { 28 [1] = {
@@ -91,7 +39,6 @@ static struct platform_device smc91x_device = {
91 .resource = smc91x_resources, 39 .resource = smc91x_resources,
92}; 40};
93 41
94#ifdef CONFIG_FB_S1D13XXX
95static struct s1d13xxxfb_regval s1d13806_initregs[] = { 42static struct s1d13xxxfb_regval s1d13806_initregs[] = {
96 { S1DREG_MISC, 0x00 }, 43 { S1DREG_MISC, 0x00 },
97 { S1DREG_COM_DISP_MODE, 0x00 }, 44 { S1DREG_COM_DISP_MODE, 0x00 },
@@ -210,12 +157,12 @@ static struct s1d13xxxfb_pdata s1d13806_platform_data = {
210static struct resource s1d13806_resources[] = { 157static struct resource s1d13806_resources[] = {
211 [0] = { 158 [0] = {
212 .start = 0x07200000, 159 .start = 0x07200000,
213 .end = 0x07200000 + 0x00200000 - 1, 160 .end = 0x07200000 + SZ_2M - 1,
214 .flags = IORESOURCE_MEM, 161 .flags = IORESOURCE_MEM,
215 }, 162 },
216 [1] = { 163 [1] = {
217 .start = 0x07000000, 164 .start = 0x07000000,
218 .end = 0x07000000 + 0x00200000 - 1, 165 .end = 0x07000000 + SZ_2M - 1,
219 .flags = IORESOURCE_MEM, 166 .flags = IORESOURCE_MEM,
220 }, 167 },
221}; 168};
@@ -230,145 +177,24 @@ static struct platform_device s1d13806_device = {
230 .platform_data = &s1d13806_platform_data, 177 .platform_data = &s1d13806_platform_data,
231 }, 178 },
232}; 179};
233#endif
234 180
235static struct platform_device *microdev_devices[] __initdata = { 181static struct platform_device *microdev_devices[] __initdata = {
236 &smc91x_device, 182 &smc91x_device,
237#ifdef CONFIG_FB_S1D13XXX
238 &s1d13806_device, 183 &s1d13806_device,
239#endif
240}; 184};
241 185
242static int __init microdev_devices_setup(void) 186static int __init microdev_devices_setup(void)
243{ 187{
244 return platform_add_devices(microdev_devices, ARRAY_SIZE(microdev_devices)); 188 return platform_add_devices(microdev_devices, ARRAY_SIZE(microdev_devices));
245} 189}
246 190device_initcall(microdev_devices_setup);
247/*
248 * Setup for the SMSC FDC37C93xAPM
249 */
250static int __init smsc_superio_setup(void)
251{
252
253 unsigned char devid, devrev;
254
255 /* Initially the chip is in run state */
256 /* Put it into configuration state */
257 outb(SMSC_ENTER_CONFIG_KEY, SMSC_CONFIG_PORT_ADDR);
258
259 /* Read device ID info */
260 devid = SMSC_READ_INDEXED(SMSC_DEVICE_ID_INDEX);
261 devrev = SMSC_READ_INDEXED(SMSC_DEVICE_REV_INDEX);
262 if ( (devid==0x30) && (devrev==0x01) )
263 {
264 printk("SMSC FDC37C93xAPM SuperIO device detected\n");
265 }
266 else
267 { /* not the device identity we expected */
268 printk("Not detected a SMSC FDC37C93xAPM SuperIO device (devid=0x%02x, rev=0x%02x)\n",
269 devid, devrev);
270 /* inform the keyboard driver that we have no keyboard controller */
271 microdev_kbd_controller_present = 0;
272 /* little point in doing anything else in this functon */
273 return 0;
274 }
275
276 /* Select the keyboard device */
277 SMSC_WRITE_INDEXED(SMSC_KEYBOARD_DEVICE, SMCS_LOGICAL_DEV_INDEX);
278 /* enable it */
279 SMSC_WRITE_INDEXED(1, SMSC_ACTIVATE_INDEX);
280 /* enable the interrupts */
281 SMSC_WRITE_INDEXED(MICRODEV_FPGA_IRQ_KEYBOARD, SMSC_PRIMARY_INT_INDEX);
282 SMSC_WRITE_INDEXED(MICRODEV_FPGA_IRQ_MOUSE, SMSC_SECONDARY_INT_INDEX);
283
284 /* Select the Serial #1 device */
285 SMSC_WRITE_INDEXED(SMSC_SERIAL1_DEVICE, SMCS_LOGICAL_DEV_INDEX);
286 /* enable it */
287 SMSC_WRITE_INDEXED(1, SMSC_ACTIVATE_INDEX);
288 /* program with port addresses */
289 SMSC_WRITE_INDEXED(MSB(SERIAL1_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+0);
290 SMSC_WRITE_INDEXED(LSB(SERIAL1_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+1);
291 SMSC_WRITE_INDEXED(0x00, SMSC_HDCS0_INDEX);
292 /* enable the interrupts */
293 SMSC_WRITE_INDEXED(MICRODEV_FPGA_IRQ_SERIAL1, SMSC_PRIMARY_INT_INDEX);
294
295 /* Select the Serial #2 device */
296 SMSC_WRITE_INDEXED(SMSC_SERIAL2_DEVICE, SMCS_LOGICAL_DEV_INDEX);
297 /* enable it */
298 SMSC_WRITE_INDEXED(1, SMSC_ACTIVATE_INDEX);
299 /* program with port addresses */
300 SMSC_WRITE_INDEXED(MSB(SERIAL2_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+0);
301 SMSC_WRITE_INDEXED(LSB(SERIAL2_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+1);
302 SMSC_WRITE_INDEXED(0x00, SMSC_HDCS0_INDEX);
303 /* enable the interrupts */
304 SMSC_WRITE_INDEXED(MICRODEV_FPGA_IRQ_SERIAL2, SMSC_PRIMARY_INT_INDEX);
305
306 /* Select the IDE#1 device */
307 SMSC_WRITE_INDEXED(SMSC_IDE1_DEVICE, SMCS_LOGICAL_DEV_INDEX);
308 /* enable it */
309 SMSC_WRITE_INDEXED(1, SMSC_ACTIVATE_INDEX);
310 /* program with port addresses */
311 SMSC_WRITE_INDEXED(MSB(IDE1_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+0);
312 SMSC_WRITE_INDEXED(LSB(IDE1_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+1);
313 SMSC_WRITE_INDEXED(MSB(IDE1_SECONDARY_BASE), SMSC_SECONDARY_BASE_INDEX+0);
314 SMSC_WRITE_INDEXED(LSB(IDE1_SECONDARY_BASE), SMSC_SECONDARY_BASE_INDEX+1);
315 SMSC_WRITE_INDEXED(0x0c, SMSC_HDCS0_INDEX);
316 SMSC_WRITE_INDEXED(0x00, SMSC_HDCS1_INDEX);
317 /* select the interrupt */
318 SMSC_WRITE_INDEXED(MICRODEV_FPGA_IRQ_IDE1, SMSC_PRIMARY_INT_INDEX);
319
320 /* Select the IDE#2 device */
321 SMSC_WRITE_INDEXED(SMSC_IDE2_DEVICE, SMCS_LOGICAL_DEV_INDEX);
322 /* enable it */
323 SMSC_WRITE_INDEXED(1, SMSC_ACTIVATE_INDEX);
324 /* program with port addresses */
325 SMSC_WRITE_INDEXED(MSB(IDE2_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+0);
326 SMSC_WRITE_INDEXED(LSB(IDE2_PRIMARY_BASE), SMSC_PRIMARY_BASE_INDEX+1);
327 SMSC_WRITE_INDEXED(MSB(IDE2_SECONDARY_BASE), SMSC_SECONDARY_BASE_INDEX+0);
328 SMSC_WRITE_INDEXED(LSB(IDE2_SECONDARY_BASE), SMSC_SECONDARY_BASE_INDEX+1);
329 /* select the interrupt */
330 SMSC_WRITE_INDEXED(MICRODEV_FPGA_IRQ_IDE2, SMSC_PRIMARY_INT_INDEX);
331
332 /* Select the configuration registers */
333 SMSC_WRITE_INDEXED(SMSC_CONFIG_REGISTERS, SMCS_LOGICAL_DEV_INDEX);
334 /* enable the appropriate GPIO pins for IDE functionality:
335 * bit[0] In/Out 1==input; 0==output
336 * bit[1] Polarity 1==invert; 0==no invert
337 * bit[2] Int Enb #1 1==Enable Combined IRQ #1; 0==disable
338 * bit[3:4] Function Select 00==original; 01==Alternate Function #1
339 */
340 SMSC_WRITE_INDEXED(0x00, 0xc2); /* GP42 = nIDE1_OE */
341 SMSC_WRITE_INDEXED(0x01, 0xc5); /* GP45 = IDE1_IRQ */
342 SMSC_WRITE_INDEXED(0x00, 0xc6); /* GP46 = nIOROP */
343 SMSC_WRITE_INDEXED(0x00, 0xc7); /* GP47 = nIOWOP */
344 SMSC_WRITE_INDEXED(0x08, 0xe8); /* GP20 = nIDE2_OE */
345
346 /* Exit the configuration state */
347 outb(SMSC_EXIT_CONFIG_KEY, SMSC_CONFIG_PORT_ADDR);
348
349 return 0;
350}
351
352static void __init microdev_setup(char **cmdline_p)
353{
354 int * const fpgaRevisionRegister = (int*)(MICRODEV_FPGA_GP_BASE + 0x8ul);
355 const int fpgaRevision = *fpgaRevisionRegister;
356 int * const CacheControlRegister = (int*)CCR;
357
358 device_initcall(microdev_devices_setup);
359 device_initcall(smsc_superio_setup);
360
361 printk("SuperH %s board (FPGA rev: 0x%0x, CCR: 0x%0x)\n",
362 get_system_type(), fpgaRevision, *CacheControlRegister);
363}
364 191
365/* 192/*
366 * The Machine Vector 193 * The Machine Vector
367 */ 194 */
368static struct sh_machine_vector mv_sh4202_microdev __initmv = { 195static struct sh_machine_vector mv_sh4202_microdev __initmv = {
369 .mv_name = "SH4-202 MicroDev", 196 .mv_name = "SH4-202 MicroDev",
370 .mv_setup = microdev_setup, 197 .mv_nr_irqs = 72,
371 .mv_nr_irqs = 72, /* QQQ need to check this - use the MACRO */
372 198
373 .mv_inb = microdev_inb, 199 .mv_inb = microdev_inb,
374 .mv_inw = microdev_inw, 200 .mv_inw = microdev_inw,