[ARM] 5098/1: fix sound/soc/pxa/tosa.c to new gpio api
[deliverable/linux.git] / arch / arm / mach-pxa / tosa.c
CommitLineData
8459c159
DO
1/*
2 * Support for Sharp SL-C6000x PDAs
3 * Model: (Tosa)
4 *
5 * Copyright (c) 2005 Dirk Opfer
6 *
7 * Based on code written by Sharp/Lineo for 2.4 kernels
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
13 */
14
15#include <linux/kernel.h>
16#include <linux/init.h>
067c9048 17#include <linux/platform_device.h>
8459c159
DO
18#include <linux/major.h>
19#include <linux/fs.h>
20#include <linux/interrupt.h>
bf0116e5
DB
21#include <linux/delay.h>
22#include <linux/fb.h>
8459c159 23#include <linux/mmc/host.h>
bf0116e5 24#include <linux/mfd/tc6393xb.h>
74617fb6 25#include <linux/pm.h>
905f1467 26#include <linux/delay.h>
93e9012f
DB
27#include <linux/gpio_keys.h>
28#include <linux/input.h>
d4e7d09f 29#include <linux/gpio.h>
8459c159
DO
30
31#include <asm/setup.h>
8459c159 32#include <asm/mach-types.h>
bb548dd4 33#include <asm/arch/pxa2xx-regs.h>
2cb47342 34#include <asm/arch/mfp-pxa25x.h>
8459c159 35#include <asm/arch/irda.h>
481ea5a1 36#include <asm/arch/i2c.h>
8459c159
DO
37#include <asm/arch/mmc.h>
38#include <asm/arch/udc.h>
39
40#include <asm/mach/arch.h>
8459c159
DO
41#include <asm/arch/tosa.h>
42
43#include <asm/hardware/scoop.h>
44#include <asm/mach/sharpsl_param.h>
45
46#include "generic.h"
46c41e62 47#include "devices.h"
8459c159 48
2cb47342
DB
49static unsigned long tosa_pin_config[] = {
50 GPIO78_nCS_2, /* Scoop */
51 GPIO80_nCS_4, /* tg6393xb */
52 GPIO33_nCS_5, /* Scoop */
53
54 // GPIO76 CARD_VCC_ON1
55
56 GPIO19_GPIO, /* Reset out */
57 GPIO1_RST | WAKEUP_ON_EDGE_FALL,
58
59 GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* WAKE_UP */
60 GPIO2_GPIO | WAKEUP_ON_EDGE_BOTH, /* AC_IN */
61 GPIO3_GPIO | WAKEUP_ON_EDGE_FALL, /* RECORD */
62 GPIO4_GPIO | WAKEUP_ON_EDGE_FALL, /* SYNC */
63 GPIO20_GPIO, /* EAR_IN */
64 GPIO22_GPIO, /* On */
65
66 GPIO5_GPIO, /* USB_IN */
67 GPIO32_GPIO, /* Pen IRQ */
68
69 GPIO7_GPIO, /* Jacket Detect */
70 GPIO14_GPIO, /* BAT0_CRG */
71 GPIO12_GPIO, /* BAT1_CRG */
72 GPIO17_GPIO, /* BAT0_LOW */
73 GPIO84_GPIO, /* BAT1_LOW */
74 GPIO38_GPIO, /* BAT_LOCK */
75
76 GPIO11_3_6MHz,
77 GPIO15_GPIO, /* TC6393XB IRQ */
78 GPIO18_RDY,
79 GPIO27_GPIO, /* LCD Sync */
80
81 /* MMC */
82 GPIO6_MMC_CLK,
83 GPIO8_MMC_CS0,
84 GPIO9_GPIO, /* Detect */
c4d5f8d4 85 GPIO10_GPIO, /* nSD_INT */
2cb47342
DB
86
87 /* CF */
88 GPIO13_GPIO, /* CD_IRQ */
89 GPIO21_GPIO, /* Main Slot IRQ */
90 GPIO36_GPIO, /* Jacket Slot IRQ */
91 GPIO48_nPOE,
92 GPIO49_nPWE,
93 GPIO50_nPIOR,
94 GPIO51_nPIOW,
95 GPIO52_nPCE_1,
96 GPIO53_nPCE_2,
97 GPIO54_nPSKTSEL,
98 GPIO55_nPREG,
99 GPIO56_nPWAIT,
100 GPIO57_nIOIS16,
101
102 /* AC97 */
103 GPIO31_AC97_SYNC,
104 GPIO30_AC97_SDATA_OUT,
105 GPIO28_AC97_BITCLK,
106 GPIO29_AC97_SDATA_IN_0,
107 // GPIO79 nAUD_IRQ
108
109 /* FFUART */
110 GPIO34_FFUART_RXD,
111 GPIO35_FFUART_CTS,
112 GPIO37_FFUART_DSR,
113 GPIO39_FFUART_TXD,
114 GPIO40_FFUART_DTR,
115 GPIO41_FFUART_RTS,
116
117 /* BTUART */
118 GPIO42_BTUART_RXD,
119 GPIO43_BTUART_TXD,
120 GPIO44_BTUART_CTS,
121 GPIO45_BTUART_RTS,
122
2cb47342 123 /* Keybd */
c867155c 124 GPIO58_GPIO | MFP_LPM_DRIVE_LOW,
125 GPIO59_GPIO | MFP_LPM_DRIVE_LOW,
126 GPIO60_GPIO | MFP_LPM_DRIVE_LOW,
127 GPIO61_GPIO | MFP_LPM_DRIVE_LOW,
128 GPIO62_GPIO | MFP_LPM_DRIVE_LOW,
129 GPIO63_GPIO | MFP_LPM_DRIVE_LOW,
130 GPIO64_GPIO | MFP_LPM_DRIVE_LOW,
131 GPIO65_GPIO | MFP_LPM_DRIVE_LOW,
132 GPIO66_GPIO | MFP_LPM_DRIVE_LOW,
133 GPIO67_GPIO | MFP_LPM_DRIVE_LOW,
134 GPIO68_GPIO | MFP_LPM_DRIVE_LOW,
135 GPIO69_GPIO | MFP_LPM_DRIVE_LOW,
136 GPIO70_GPIO | MFP_LPM_DRIVE_LOW,
137 GPIO71_GPIO | MFP_LPM_DRIVE_LOW,
138 GPIO72_GPIO | MFP_LPM_DRIVE_LOW,
139 GPIO73_GPIO | MFP_LPM_DRIVE_LOW,
140 GPIO74_GPIO | MFP_LPM_DRIVE_LOW,
141 GPIO75_GPIO | MFP_LPM_DRIVE_LOW,
2cb47342
DB
142
143 /* SPI */
144 GPIO81_SSP2_CLK_OUT,
145 GPIO82_SSP2_FRM_OUT,
146 GPIO83_SSP2_TXD,
147};
148
b032fccc
DB
149static unsigned long tosa_pin_irda_off[] = {
150 GPIO46_STUART_RXD,
151 GPIO47_GPIO | MFP_LPM_DRIVE_LOW,
152};
153
154static unsigned long tosa_pin_irda_on[] = {
155 GPIO46_STUART_RXD,
156 GPIO47_STUART_TXD,
157};
158
159
8459c159
DO
160/*
161 * SCOOP Device
162 */
163static struct resource tosa_scoop_resources[] = {
164 [0] = {
165 .start = TOSA_CF_PHYS,
166 .end = TOSA_CF_PHYS + 0xfff,
167 .flags = IORESOURCE_MEM,
168 },
169};
170
171static struct scoop_config tosa_scoop_setup = {
172 .io_dir = TOSA_SCOOP_IO_DIR,
d4e7d09f 173 .gpio_base = TOSA_SCOOP_GPIO_BASE,
8459c159
DO
174};
175
ba4eb7e6 176static struct platform_device tosascoop_device = {
8459c159
DO
177 .name = "sharp-scoop",
178 .id = 0,
179 .dev = {
180 .platform_data = &tosa_scoop_setup,
181 },
182 .num_resources = ARRAY_SIZE(tosa_scoop_resources),
183 .resource = tosa_scoop_resources,
184};
185
186
187/*
188 * SCOOP Device Jacket
189 */
190static struct resource tosa_scoop_jc_resources[] = {
191 [0] = {
192 .start = TOSA_SCOOP_PHYS + 0x40,
193 .end = TOSA_SCOOP_PHYS + 0xfff,
194 .flags = IORESOURCE_MEM,
195 },
196};
197
198static struct scoop_config tosa_scoop_jc_setup = {
199 .io_dir = TOSA_SCOOP_JC_IO_DIR,
d4e7d09f 200 .gpio_base = TOSA_SCOOP_JC_GPIO_BASE,
8459c159
DO
201};
202
ba4eb7e6 203static struct platform_device tosascoop_jc_device = {
8459c159
DO
204 .name = "sharp-scoop",
205 .id = 1,
206 .dev = {
207 .platform_data = &tosa_scoop_jc_setup,
208 .parent = &tosascoop_device.dev,
209 },
210 .num_resources = ARRAY_SIZE(tosa_scoop_jc_resources),
211 .resource = tosa_scoop_jc_resources,
212};
213
4c18ad20
DO
214/*
215 * PCMCIA
216 */
8459c159
DO
217static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = {
218{
219 .dev = &tosascoop_device.dev,
220 .irq = TOSA_IRQ_GPIO_CF_IRQ,
221 .cd_irq = TOSA_IRQ_GPIO_CF_CD,
222 .cd_irq_str = "PCMCIA0 CD",
223},{
224 .dev = &tosascoop_jc_device.dev,
225 .irq = TOSA_IRQ_GPIO_JC_CF_IRQ,
226 .cd_irq = -1,
227},
228};
229
4c18ad20
DO
230static struct scoop_pcmcia_config tosa_pcmcia_config = {
231 .devs = &tosa_pcmcia_scoop[0],
232 .num_devs = 2,
4c18ad20
DO
233};
234
a93876c1
DO
235/*
236 * USB Device Controller
237 */
a93876c1 238static struct pxa2xx_udc_mach_info udc_info __initdata = {
d4e7d09f 239 .gpio_pullup = TOSA_GPIO_USB_PULLUP,
487dc922
DB
240 .gpio_vbus = TOSA_GPIO_USB_IN,
241 .gpio_vbus_inverted = 1,
a93876c1
DO
242};
243
244/*
245 * MMC/SD Device
246 */
247static struct pxamci_platform_data tosa_mci_platform_data;
248
40220c1a 249static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void *data)
a93876c1
DO
250{
251 int err;
252
a93876c1
DO
253 tosa_mci_platform_data.detect_delay = msecs_to_jiffies(250);
254
c4d5f8d4
DB
255 err = gpio_request(TOSA_GPIO_nSD_DETECT, "MMC/SD card detect");
256 if (err) {
257 printk(KERN_ERR "tosa_mci_init: can't request nSD_DETECT gpio\n");
258 goto err_gpio_detect;
259 }
260 err = gpio_direction_input(TOSA_GPIO_nSD_DETECT);
261 if (err)
262 goto err_gpio_detect_dir;
263
2687bd38
RK
264 err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int,
265 IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
a93876c1 266 "MMC/SD card detect", data);
d4e7d09f 267 if (err) {
a93876c1 268 printk(KERN_ERR "tosa_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
d4e7d09f
DB
269 goto err_irq;
270 }
271
c4d5f8d4 272 err = gpio_request(TOSA_GPIO_SD_WP, "SD Write Protect");
d4e7d09f
DB
273 if (err) {
274 printk(KERN_ERR "tosa_mci_init: can't request SD_WP gpio\n");
275 goto err_gpio_wp;
276 }
277 err = gpio_direction_input(TOSA_GPIO_SD_WP);
278 if (err)
279 goto err_gpio_wp_dir;
280
c4d5f8d4 281 err = gpio_request(TOSA_GPIO_PWR_ON, "SD Power");
d4e7d09f
DB
282 if (err) {
283 printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n");
284 goto err_gpio_pwr;
285 }
286 err = gpio_direction_output(TOSA_GPIO_PWR_ON, 0);
287 if (err)
288 goto err_gpio_pwr_dir;
a93876c1 289
c4d5f8d4
DB
290 err = gpio_request(TOSA_GPIO_nSD_INT, "SD Int");
291 if (err) {
292 printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n");
293 goto err_gpio_int;
294 }
295 err = gpio_direction_input(TOSA_GPIO_nSD_INT);
296 if (err)
297 goto err_gpio_int_dir;
298
d4e7d09f
DB
299 return 0;
300
c4d5f8d4
DB
301err_gpio_int_dir:
302 gpio_free(TOSA_GPIO_nSD_INT);
303err_gpio_int:
d4e7d09f
DB
304err_gpio_pwr_dir:
305 gpio_free(TOSA_GPIO_PWR_ON);
306err_gpio_pwr:
307err_gpio_wp_dir:
308 gpio_free(TOSA_GPIO_SD_WP);
309err_gpio_wp:
310 free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data);
311err_irq:
c4d5f8d4
DB
312err_gpio_detect_dir:
313 gpio_free(TOSA_GPIO_nSD_DETECT);
314err_gpio_detect:
2687bd38 315 return err;
a93876c1
DO
316}
317
318static void tosa_mci_setpower(struct device *dev, unsigned int vdd)
319{
320 struct pxamci_platform_data* p_d = dev->platform_data;
321
322 if (( 1 << vdd) & p_d->ocr_mask) {
d4e7d09f 323 gpio_set_value(TOSA_GPIO_PWR_ON, 1);
a93876c1 324 } else {
d4e7d09f 325 gpio_set_value(TOSA_GPIO_PWR_ON, 0);
a93876c1
DO
326 }
327}
328
329static int tosa_mci_get_ro(struct device *dev)
330{
d4e7d09f 331 return gpio_get_value(TOSA_GPIO_SD_WP);
a93876c1
DO
332}
333
334static void tosa_mci_exit(struct device *dev, void *data)
335{
c4d5f8d4 336 gpio_free(TOSA_GPIO_nSD_INT);
d4e7d09f
DB
337 gpio_free(TOSA_GPIO_PWR_ON);
338 gpio_free(TOSA_GPIO_SD_WP);
a93876c1 339 free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data);
c4d5f8d4 340 gpio_free(TOSA_GPIO_nSD_DETECT);
a93876c1
DO
341}
342
343static struct pxamci_platform_data tosa_mci_platform_data = {
344 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
345 .init = tosa_mci_init,
346 .get_ro = tosa_mci_get_ro,
347 .setpower = tosa_mci_setpower,
348 .exit = tosa_mci_exit,
349};
350
351/*
352 * Irda
353 */
b032fccc
DB
354static void tosa_irda_transceiver_mode(struct device *dev, int mode)
355{
356 if (mode & IR_OFF) {
357 gpio_set_value(TOSA_GPIO_IR_POWERDWN, 0);
358 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_irda_off));
359 gpio_direction_output(TOSA_GPIO_IRDA_TX, 0);
360 } else {
361 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_irda_on));
362 gpio_set_value(TOSA_GPIO_IR_POWERDWN, 1);
363 }
364}
365
d4e7d09f 366static int tosa_irda_startup(struct device *dev)
a93876c1 367{
d4e7d09f
DB
368 int ret;
369
b032fccc
DB
370 ret = gpio_request(TOSA_GPIO_IRDA_TX, "IrDA TX");
371 if (ret)
372 goto err_tx;
373 ret = gpio_direction_output(TOSA_GPIO_IRDA_TX, 0);
374 if (ret)
375 goto err_tx_dir;
376
d4e7d09f
DB
377 ret = gpio_request(TOSA_GPIO_IR_POWERDWN, "IrDA powerdown");
378 if (ret)
b032fccc 379 goto err_pwr;
d4e7d09f
DB
380
381 ret = gpio_direction_output(TOSA_GPIO_IR_POWERDWN, 0);
382 if (ret)
b032fccc 383 goto err_pwr_dir;
d4e7d09f 384
b032fccc 385 tosa_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF);
d4e7d09f 386
b032fccc
DB
387 return 0;
388
389err_pwr_dir:
d4e7d09f 390 gpio_free(TOSA_GPIO_IR_POWERDWN);
b032fccc
DB
391err_pwr:
392err_tx_dir:
393 gpio_free(TOSA_GPIO_IRDA_TX);
394err_tx:
395 return ret;
d4e7d09f
DB
396}
397
b032fccc 398static void tosa_irda_shutdown(struct device *dev)
d4e7d09f 399{
b032fccc
DB
400 tosa_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF);
401 gpio_free(TOSA_GPIO_IR_POWERDWN);
402 gpio_free(TOSA_GPIO_IRDA_TX);
a93876c1
DO
403}
404
405static struct pxaficp_platform_data tosa_ficp_platform_data = {
406 .transceiver_cap = IR_SIRMODE | IR_OFF,
407 .transceiver_mode = tosa_irda_transceiver_mode,
d4e7d09f
DB
408 .startup = tosa_irda_startup,
409 .shutdown = tosa_irda_shutdown,
a93876c1
DO
410};
411
412/*
413 * Tosa Keyboard
414 */
415static struct platform_device tosakbd_device = {
416 .name = "tosa-keyboard",
417 .id = -1,
418};
8459c159 419
93e9012f 420static struct gpio_keys_button tosa_gpio_keys[] = {
0aa97561
DB
421 /*
422 * Two following keys are directly tied to "ON" button of tosa. Why?
423 * The first one can be used as a wakeup source, the second can't;
424 * also the first one is OR of ac_powered and on_button.
425 */
426 {
427 .type = EV_PWR,
428 .code = KEY_RESERVED,
429 .gpio = TOSA_GPIO_POWERON,
430 .desc = "Poweron",
431 .wakeup = 1,
432 .active_low = 1,
433 },
93e9012f
DB
434 {
435 .type = EV_PWR,
436 .code = KEY_SUSPEND,
437 .gpio = TOSA_GPIO_ON_KEY,
438 .desc = "On key",
0aa97561
DB
439 /*
440 * can't be used as wakeup
441 * .wakeup = 1,
442 */
93e9012f
DB
443 .active_low = 1,
444 },
445 {
446 .type = EV_KEY,
447 .code = TOSA_KEY_RECORD,
448 .gpio = TOSA_GPIO_RECORD_BTN,
449 .desc = "Record Button",
450 .wakeup = 1,
451 .active_low = 1,
452 },
453 {
454 .type = EV_KEY,
455 .code = TOSA_KEY_SYNC,
456 .gpio = TOSA_GPIO_SYNC,
457 .desc = "Sync Button",
458 .wakeup = 1,
459 .active_low = 1,
460 },
461};
462
463static struct gpio_keys_platform_data tosa_gpio_keys_platform_data = {
464 .buttons = tosa_gpio_keys,
465 .nbuttons = ARRAY_SIZE(tosa_gpio_keys),
466};
467
468static struct platform_device tosa_gpio_keys_device = {
469 .name = "gpio-keys",
470 .id = -1,
471 .dev = {
472 .platform_data = &tosa_gpio_keys_platform_data,
473 },
474};
475
6d0cf3e0
DO
476/*
477 * Tosa LEDs
478 */
ba4eb7e6 479static struct gpio_led tosa_gpio_leds[] = {
311c736c
DB
480 {
481 .name = "tosa:amber:charge",
482 .default_trigger = "main-battery-charging",
483 .gpio = TOSA_GPIO_CHRG_ERR_LED,
484 },
485 {
486 .name = "tosa:green:mail",
487 .default_trigger = "nand-disk",
488 .gpio = TOSA_GPIO_NOTE_LED,
489 },
c546106c
DB
490 {
491 .name = "tosa:dual:wlan",
492 .default_trigger = "none",
493 .gpio = TOSA_GPIO_WLAN_LED,
494 },
495 {
496 .name = "tosa:blue:bluetooth",
497 .default_trigger = "none",
498 .gpio = TOSA_GPIO_BT_LED,
499 },
311c736c
DB
500};
501
ba4eb7e6 502static struct gpio_led_platform_data tosa_gpio_leds_platform_data = {
311c736c
DB
503 .leds = tosa_gpio_leds,
504 .num_leds = ARRAY_SIZE(tosa_gpio_leds),
505};
506
6d0cf3e0 507static struct platform_device tosaled_device = {
311c736c
DB
508 .name = "leds-gpio",
509 .id = -1,
510 .dev = {
511 .platform_data = &tosa_gpio_leds_platform_data,
512 },
6d0cf3e0
DO
513};
514
bf0116e5
DB
515/*
516 * Toshiba Mobile IO Controller
517 */
518static struct resource tc6393xb_resources[] = {
519 [0] = {
520 .start = TOSA_LCDC_PHYS,
521 .end = TOSA_LCDC_PHYS + 0x3ffffff,
522 .flags = IORESOURCE_MEM,
523 },
524
525 [1] = {
526 .start = TOSA_IRQ_GPIO_TC6393XB_INT,
527 .end = TOSA_IRQ_GPIO_TC6393XB_INT,
528 .flags = IORESOURCE_IRQ,
529 },
530};
531
532
533static int tosa_tc6393xb_enable(struct platform_device *dev)
534{
535 int rc;
536
537 rc = gpio_request(TOSA_GPIO_TC6393XB_REST_IN, "tc6393xb #pclr");
538 if (rc)
539 goto err_req_pclr;
540 rc = gpio_request(TOSA_GPIO_TC6393XB_SUSPEND, "tc6393xb #suspend");
541 if (rc)
542 goto err_req_suspend;
543 rc = gpio_request(TOSA_GPIO_TC6393XB_L3V_ON, "l3v");
544 if (rc)
545 goto err_req_l3v;
546 rc = gpio_direction_output(TOSA_GPIO_TC6393XB_L3V_ON, 0);
547 if (rc)
548 goto err_dir_l3v;
549 rc = gpio_direction_output(TOSA_GPIO_TC6393XB_SUSPEND, 0);
550 if (rc)
551 goto err_dir_suspend;
552 rc = gpio_direction_output(TOSA_GPIO_TC6393XB_REST_IN, 0);
553 if (rc)
554 goto err_dir_pclr;
555
556 mdelay(1);
557
558 gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 1);
559
560 mdelay(10);
561
562 gpio_set_value(TOSA_GPIO_TC6393XB_REST_IN, 1);
563 gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 1);
564
565 return 0;
566err_dir_pclr:
567err_dir_suspend:
568err_dir_l3v:
569 gpio_free(TOSA_GPIO_TC6393XB_L3V_ON);
570err_req_l3v:
571 gpio_free(TOSA_GPIO_TC6393XB_SUSPEND);
572err_req_suspend:
573 gpio_free(TOSA_GPIO_TC6393XB_REST_IN);
574err_req_pclr:
575 return rc;
576}
577
578static int tosa_tc6393xb_disable(struct platform_device *dev)
579{
580 gpio_free(TOSA_GPIO_TC6393XB_L3V_ON);
581 gpio_free(TOSA_GPIO_TC6393XB_SUSPEND);
582 gpio_free(TOSA_GPIO_TC6393XB_REST_IN);
583
584 return 0;
585}
586
587static int tosa_tc6393xb_resume(struct platform_device *dev)
588{
589 gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 1);
590 mdelay(10);
591 gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 1);
592 mdelay(10);
593
594 return 0;
595}
596
597static int tosa_tc6393xb_suspend(struct platform_device *dev)
598{
599 gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 0);
600 gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 0);
601 return 0;
602}
603
604static struct tc6393xb_platform_data tosa_tc6393xb_setup = {
605 .scr_pll2cr = 0x0cc1,
606 .scr_gper = 0x3300,
607 .scr_gpo_dsr =
608 TOSA_TC6393XB_GPIO_BIT(TOSA_GPIO_CARD_VCC_ON),
609 .scr_gpo_doecr =
610 TOSA_TC6393XB_GPIO_BIT(TOSA_GPIO_CARD_VCC_ON),
611
612 .irq_base = IRQ_BOARD_START,
613 .gpio_base = TOSA_TC6393XB_GPIO_BASE,
614
615 .enable = tosa_tc6393xb_enable,
616 .disable = tosa_tc6393xb_disable,
617 .suspend = tosa_tc6393xb_suspend,
618 .resume = tosa_tc6393xb_resume,
619};
620
621
622static struct platform_device tc6393xb_device = {
623 .name = "tc6393xb",
624 .id = -1,
625 .dev = {
626 .platform_data = &tosa_tc6393xb_setup,
627 },
628 .num_resources = ARRAY_SIZE(tc6393xb_resources),
629 .resource = tc6393xb_resources,
630};
631
8459c159
DO
632static struct platform_device *devices[] __initdata = {
633 &tosascoop_device,
634 &tosascoop_jc_device,
bf0116e5 635 &tc6393xb_device,
a93876c1 636 &tosakbd_device,
93e9012f 637 &tosa_gpio_keys_device,
6d0cf3e0 638 &tosaled_device,
8459c159
DO
639};
640
74617fb6
RP
641static void tosa_poweroff(void)
642{
86159a98 643 arm_machine_restart('g');
74617fb6
RP
644}
645
646static void tosa_restart(char mode)
647{
648 /* Bootloader magic for a reboot */
649 if((MSC0 & 0xffff0000) == 0x7ff00000)
650 MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
651
652 tosa_poweroff();
653}
654
8459c159
DO
655static void __init tosa_init(void)
656{
bf0116e5
DB
657 int dummy;
658
2cb47342 659 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_config));
b032fccc 660 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_irda_off));
2cb47342
DB
661 gpio_set_wake(MFP_PIN_GPIO1, 1);
662 /* We can't pass to gpio-keys since it will drop the Reset altfunc */
663
86159a98
DB
664 init_gpio_reset(TOSA_GPIO_ON_RESET);
665
74617fb6
RP
666 pm_power_off = tosa_poweroff;
667 arm_pm_restart = tosa_restart;
668
8459c159
DO
669 PCFR |= PCFR_OPDE;
670
a93876c1 671 /* enable batt_fault */
8459c159
DO
672 PMCR = 0x01;
673
bf0116e5
DB
674 dummy = gpiochip_reserve(TOSA_SCOOP_GPIO_BASE, 12);
675 dummy = gpiochip_reserve(TOSA_SCOOP_JC_GPIO_BASE, 12);
676 dummy = gpiochip_reserve(TOSA_TC6393XB_GPIO_BASE, 16);
677
a93876c1
DO
678 pxa_set_mci_info(&tosa_mci_platform_data);
679 pxa_set_udc_info(&udc_info);
680 pxa_set_ficp_info(&tosa_ficp_platform_data);
481ea5a1 681 pxa_set_i2c_info(NULL);
4c18ad20 682 platform_scoop_config = &tosa_pcmcia_config;
8459c159 683
4c18ad20 684 platform_add_devices(devices, ARRAY_SIZE(devices));
8459c159
DO
685}
686
687static void __init fixup_tosa(struct machine_desc *desc,
688 struct tag *tags, char **cmdline, struct meminfo *mi)
689{
690 sharpsl_save_param();
691 mi->nr_banks=1;
692 mi->bank[0].start = 0xa0000000;
693 mi->bank[0].node = 0;
694 mi->bank[0].size = (64*1024*1024);
695}
696
697MACHINE_START(TOSA, "SHARP Tosa")
8459c159
DO
698 .phys_io = 0x40000000,
699 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
700 .fixup = fixup_tosa,
701 .map_io = pxa_map_io,
cd49104d 702 .init_irq = pxa25x_init_irq,
8459c159
DO
703 .init_machine = tosa_init,
704 .timer = &pxa_timer,
705MACHINE_END
This page took 0.301344 seconds and 5 git commands to generate.