GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / arch / arm / mach-pxa / spitz.c
blob1cd99cb87bb1ff19cd9bc02e72706db89e0318a8
1 /*
2 * Support for Sharp SL-Cxx00 Series of PDAs
3 * Models: SL-C3000 (Spitz), SL-C1000 (Akita) and SL-C3100 (Borzoi)
5 * Copyright (c) 2005 Richard Purdie
7 * Based on Sharp's 2.4 kernel patches/lubbock.c
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.
15 #include <linux/kernel.h>
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/gpio_keys.h>
19 #include <linux/gpio.h>
20 #include <linux/leds.h>
21 #include <linux/i2c.h>
22 #include <linux/i2c/pca953x.h>
23 #include <linux/spi/spi.h>
24 #include <linux/spi/ads7846.h>
25 #include <linux/spi/corgi_lcd.h>
26 #include <linux/mtd/physmap.h>
27 #include <linux/mtd/sharpsl.h>
28 #include <linux/input/matrix_keypad.h>
29 #include <linux/regulator/machine.h>
31 #include <asm/setup.h>
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 #include <asm/mach/sharpsl_param.h>
35 #include <asm/hardware/scoop.h>
37 #include <mach/pxa27x.h>
38 #include <mach/pxa27x-udc.h>
39 #include <mach/reset.h>
40 #include <mach/irda.h>
41 #include <mach/mmc.h>
42 #include <mach/ohci.h>
43 #include <mach/pxafb.h>
44 #include <mach/pxa2xx_spi.h>
45 #include <mach/spitz.h>
46 #include <mach/sharpsl_pm.h>
48 #include <plat/i2c.h>
50 #include "generic.h"
51 #include "devices.h"
53 /******************************************************************************
54 * Pin configuration
55 ******************************************************************************/
56 static unsigned long spitz_pin_config[] __initdata = {
57 /* Chip Selects */
58 GPIO78_nCS_2, /* SCOOP #2 */
59 GPIO79_nCS_3, /* NAND */
60 GPIO80_nCS_4, /* SCOOP #1 */
62 /* LCD - 16bpp Active TFT */
63 GPIOxx_LCD_TFT_16BPP,
65 /* PC Card */
66 GPIO48_nPOE,
67 GPIO49_nPWE,
68 GPIO50_nPIOR,
69 GPIO51_nPIOW,
70 GPIO85_nPCE_1,
71 GPIO54_nPCE_2,
72 GPIO55_nPREG,
73 GPIO56_nPWAIT,
74 GPIO57_nIOIS16,
75 GPIO104_PSKTSEL,
77 /* I2S */
78 GPIO28_I2S_BITCLK_OUT,
79 GPIO29_I2S_SDATA_IN,
80 GPIO30_I2S_SDATA_OUT,
81 GPIO31_I2S_SYNC,
83 /* MMC */
84 GPIO32_MMC_CLK,
85 GPIO112_MMC_CMD,
86 GPIO92_MMC_DAT_0,
87 GPIO109_MMC_DAT_1,
88 GPIO110_MMC_DAT_2,
89 GPIO111_MMC_DAT_3,
91 /* GPIOs */
92 GPIO9_GPIO, /* SPITZ_GPIO_nSD_DETECT */
93 GPIO16_GPIO, /* SPITZ_GPIO_SYNC */
94 GPIO81_GPIO, /* SPITZ_GPIO_nSD_WP */
95 GPIO41_GPIO, /* SPITZ_GPIO_USB_CONNECT */
96 GPIO37_GPIO, /* SPITZ_GPIO_USB_HOST */
97 GPIO35_GPIO, /* SPITZ_GPIO_USB_DEVICE */
98 GPIO22_GPIO, /* SPITZ_GPIO_HSYNC */
99 GPIO94_GPIO, /* SPITZ_GPIO_CF_CD */
100 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */
101 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */
103 /* GPIO matrix keypad */
104 GPIO88_GPIO, /* column 0 */
105 GPIO23_GPIO, /* column 1 */
106 GPIO24_GPIO, /* column 2 */
107 GPIO25_GPIO, /* column 3 */
108 GPIO26_GPIO, /* column 4 */
109 GPIO27_GPIO, /* column 5 */
110 GPIO52_GPIO, /* column 6 */
111 GPIO103_GPIO, /* column 7 */
112 GPIO107_GPIO, /* column 8 */
113 GPIO108_GPIO, /* column 9 */
114 GPIO114_GPIO, /* column 10 */
115 GPIO12_GPIO, /* row 0 */
116 GPIO17_GPIO, /* row 1 */
117 GPIO91_GPIO, /* row 2 */
118 GPIO34_GPIO, /* row 3 */
119 GPIO36_GPIO, /* row 4 */
120 GPIO38_GPIO, /* row 5 */
121 GPIO39_GPIO, /* row 6 */
123 /* I2C */
124 GPIO117_I2C_SCL,
125 GPIO118_I2C_SDA,
127 GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, /* SPITZ_GPIO_KEY_INT */
128 GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
132 /******************************************************************************
133 * Scoop GPIO expander
134 ******************************************************************************/
135 #if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
136 /* SCOOP Device #1 */
137 static struct resource spitz_scoop_1_resources[] = {
138 [0] = {
139 .start = 0x10800000,
140 .end = 0x10800fff,
141 .flags = IORESOURCE_MEM,
145 static struct scoop_config spitz_scoop_1_setup = {
146 .io_dir = SPITZ_SCP_IO_DIR,
147 .io_out = SPITZ_SCP_IO_OUT,
148 .suspend_clr = SPITZ_SCP_SUS_CLR,
149 .suspend_set = SPITZ_SCP_SUS_SET,
150 .gpio_base = SPITZ_SCP_GPIO_BASE,
153 struct platform_device spitz_scoop_1_device = {
154 .name = "sharp-scoop",
155 .id = 0,
156 .dev = {
157 .platform_data = &spitz_scoop_1_setup,
159 .num_resources = ARRAY_SIZE(spitz_scoop_1_resources),
160 .resource = spitz_scoop_1_resources,
163 /* SCOOP Device #2 */
164 static struct resource spitz_scoop_2_resources[] = {
165 [0] = {
166 .start = 0x08800040,
167 .end = 0x08800fff,
168 .flags = IORESOURCE_MEM,
172 static struct scoop_config spitz_scoop_2_setup = {
173 .io_dir = SPITZ_SCP2_IO_DIR,
174 .io_out = SPITZ_SCP2_IO_OUT,
175 .suspend_clr = SPITZ_SCP2_SUS_CLR,
176 .suspend_set = SPITZ_SCP2_SUS_SET,
177 .gpio_base = SPITZ_SCP2_GPIO_BASE,
180 struct platform_device spitz_scoop_2_device = {
181 .name = "sharp-scoop",
182 .id = 1,
183 .dev = {
184 .platform_data = &spitz_scoop_2_setup,
186 .num_resources = ARRAY_SIZE(spitz_scoop_2_resources),
187 .resource = spitz_scoop_2_resources,
190 static void __init spitz_scoop_init(void)
192 platform_device_register(&spitz_scoop_1_device);
194 /* Akita doesn't have the second SCOOP chip */
195 if (!machine_is_akita())
196 platform_device_register(&spitz_scoop_2_device);
199 /* Power control is shared with between one of the CF slots and SD */
200 static void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
202 unsigned short cpr;
203 unsigned long flags;
205 if (new_cpr & 0x7) {
206 gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
207 mdelay(5);
210 local_irq_save(flags);
212 cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR);
214 if (enable & new_cpr)
215 cpr |= new_cpr;
216 else
217 cpr &= ~enable;
219 write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr);
221 local_irq_restore(flags);
223 if (!(cpr & 0x7)) {
224 mdelay(1);
225 gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
229 #else
230 static inline void spitz_scoop_init(void) {}
231 static inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
232 #endif
234 /******************************************************************************
235 * PCMCIA
236 ******************************************************************************/
237 #if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
238 static void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
240 /* Only need to override behaviour for slot 0 */
241 if (nr == 0)
242 spitz_card_pwr_ctrl(
243 cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
244 else
245 write_scoop_reg(scoop, SCOOP_CPR, cpr);
248 static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
250 .dev = &spitz_scoop_1_device.dev,
251 .irq = SPITZ_IRQ_GPIO_CF_IRQ,
252 .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
253 .cd_irq_str = "PCMCIA0 CD",
254 }, {
255 .dev = &spitz_scoop_2_device.dev,
256 .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
257 .cd_irq = -1,
261 static struct scoop_pcmcia_config spitz_pcmcia_config = {
262 .devs = &spitz_pcmcia_scoop[0],
263 .num_devs = 2,
264 .power_ctrl = spitz_pcmcia_pwr,
267 static void __init spitz_pcmcia_init(void)
269 /* Akita has only one PCMCIA slot used */
270 if (machine_is_akita())
271 spitz_pcmcia_config.num_devs = 1;
273 platform_scoop_config = &spitz_pcmcia_config;
275 #else
276 static inline void spitz_pcmcia_init(void) {}
277 #endif
279 /******************************************************************************
280 * GPIO keyboard
281 ******************************************************************************/
282 #if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
284 #define SPITZ_KEY_CALENDAR KEY_F1
285 #define SPITZ_KEY_ADDRESS KEY_F2
286 #define SPITZ_KEY_FN KEY_F3
287 #define SPITZ_KEY_CANCEL KEY_F4
288 #define SPITZ_KEY_EXOK KEY_F5
289 #define SPITZ_KEY_EXCANCEL KEY_F6
290 #define SPITZ_KEY_EXJOGDOWN KEY_F7
291 #define SPITZ_KEY_EXJOGUP KEY_F8
292 #define SPITZ_KEY_JAP1 KEY_LEFTALT
293 #define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
294 #define SPITZ_KEY_SYNC KEY_F9
295 #define SPITZ_KEY_MAIL KEY_F10
296 #define SPITZ_KEY_OK KEY_F11
297 #define SPITZ_KEY_MENU KEY_F12
299 static const uint32_t spitz_keymap[] = {
300 KEY(0, 0, KEY_LEFTCTRL),
301 KEY(0, 1, KEY_1),
302 KEY(0, 2, KEY_3),
303 KEY(0, 3, KEY_5),
304 KEY(0, 4, KEY_6),
305 KEY(0, 5, KEY_7),
306 KEY(0, 6, KEY_9),
307 KEY(0, 7, KEY_0),
308 KEY(0, 8, KEY_BACKSPACE),
309 KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */
310 KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */
311 KEY(1, 1, KEY_2),
312 KEY(1, 2, KEY_4),
313 KEY(1, 3, KEY_R),
314 KEY(1, 4, KEY_Y),
315 KEY(1, 5, KEY_8),
316 KEY(1, 6, KEY_I),
317 KEY(1, 7, KEY_O),
318 KEY(1, 8, KEY_P),
319 KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */
320 KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */
321 KEY(2, 0, KEY_TAB),
322 KEY(2, 1, KEY_Q),
323 KEY(2, 2, KEY_E),
324 KEY(2, 3, KEY_T),
325 KEY(2, 4, KEY_G),
326 KEY(2, 5, KEY_U),
327 KEY(2, 6, KEY_J),
328 KEY(2, 7, KEY_K),
329 KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */
330 KEY(3, 1, KEY_W),
331 KEY(3, 2, KEY_S),
332 KEY(3, 3, KEY_F),
333 KEY(3, 4, KEY_V),
334 KEY(3, 5, KEY_H),
335 KEY(3, 6, KEY_M),
336 KEY(3, 7, KEY_L),
337 KEY(3, 9, KEY_RIGHTSHIFT),
338 KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */
339 KEY(4, 1, KEY_A),
340 KEY(4, 2, KEY_D),
341 KEY(4, 3, KEY_C),
342 KEY(4, 4, KEY_B),
343 KEY(4, 5, KEY_N),
344 KEY(4, 6, KEY_DOT),
345 KEY(4, 8, KEY_ENTER),
346 KEY(4, 9, KEY_LEFTSHIFT),
347 KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */
348 KEY(5, 1, KEY_Z),
349 KEY(5, 2, KEY_X),
350 KEY(5, 3, KEY_MINUS),
351 KEY(5, 4, KEY_SPACE),
352 KEY(5, 5, KEY_COMMA),
353 KEY(5, 7, KEY_UP),
354 KEY(5, 10, SPITZ_KEY_FN), /* FN */
355 KEY(6, 0, KEY_SYSRQ),
356 KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */
357 KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */
358 KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */
359 KEY(6, 4, SPITZ_KEY_OK), /* OK */
360 KEY(6, 5, SPITZ_KEY_MENU), /* MENU */
361 KEY(6, 6, KEY_LEFT),
362 KEY(6, 7, KEY_DOWN),
363 KEY(6, 8, KEY_RIGHT),
366 static const struct matrix_keymap_data spitz_keymap_data = {
367 .keymap = spitz_keymap,
368 .keymap_size = ARRAY_SIZE(spitz_keymap),
371 static const uint32_t spitz_row_gpios[] =
372 { 12, 17, 91, 34, 36, 38, 39 };
373 static const uint32_t spitz_col_gpios[] =
374 { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
376 static struct matrix_keypad_platform_data spitz_mkp_pdata = {
377 .keymap_data = &spitz_keymap_data,
378 .row_gpios = spitz_row_gpios,
379 .col_gpios = spitz_col_gpios,
380 .num_row_gpios = ARRAY_SIZE(spitz_row_gpios),
381 .num_col_gpios = ARRAY_SIZE(spitz_col_gpios),
382 .col_scan_delay_us = 10,
383 .debounce_ms = 10,
384 .wakeup = 1,
387 static struct platform_device spitz_mkp_device = {
388 .name = "matrix-keypad",
389 .id = -1,
390 .dev = {
391 .platform_data = &spitz_mkp_pdata,
395 static void __init spitz_mkp_init(void)
397 platform_device_register(&spitz_mkp_device);
399 #else
400 static inline void spitz_mkp_init(void) {}
401 #endif
403 /******************************************************************************
404 * GPIO keys
405 ******************************************************************************/
406 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
407 static struct gpio_keys_button spitz_gpio_keys[] = {
409 .type = EV_PWR,
410 .code = KEY_SUSPEND,
411 .gpio = SPITZ_GPIO_ON_KEY,
412 .desc = "On Off",
413 .wakeup = 1,
415 /* Two buttons detecting the lid state */
417 .type = EV_SW,
418 .code = 0,
419 .gpio = SPITZ_GPIO_SWA,
420 .desc = "Display Down",
423 .type = EV_SW,
424 .code = 1,
425 .gpio = SPITZ_GPIO_SWB,
426 .desc = "Lid Closed",
430 static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
431 .buttons = spitz_gpio_keys,
432 .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
435 static struct platform_device spitz_gpio_keys_device = {
436 .name = "gpio-keys",
437 .id = -1,
438 .dev = {
439 .platform_data = &spitz_gpio_keys_platform_data,
443 static void __init spitz_keys_init(void)
445 platform_device_register(&spitz_gpio_keys_device);
447 #else
448 static inline void spitz_keys_init(void) {}
449 #endif
451 /******************************************************************************
452 * LEDs
453 ******************************************************************************/
454 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
455 static struct gpio_led spitz_gpio_leds[] = {
457 .name = "spitz:amber:charge",
458 .default_trigger = "sharpsl-charge",
459 .gpio = SPITZ_GPIO_LED_ORANGE,
462 .name = "spitz:green:hddactivity",
463 .default_trigger = "ide-disk",
464 .gpio = SPITZ_GPIO_LED_GREEN,
468 static struct gpio_led_platform_data spitz_gpio_leds_info = {
469 .leds = spitz_gpio_leds,
470 .num_leds = ARRAY_SIZE(spitz_gpio_leds),
473 static struct platform_device spitz_led_device = {
474 .name = "leds-gpio",
475 .id = -1,
476 .dev = {
477 .platform_data = &spitz_gpio_leds_info,
481 static void __init spitz_leds_init(void)
483 platform_device_register(&spitz_led_device);
485 #else
486 static inline void spitz_leds_init(void) {}
487 #endif
489 /******************************************************************************
490 * SSP Devices
491 ******************************************************************************/
492 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
493 static void spitz_ads7846_wait_for_hsync(void)
495 while (gpio_get_value(SPITZ_GPIO_HSYNC))
496 cpu_relax();
498 while (!gpio_get_value(SPITZ_GPIO_HSYNC))
499 cpu_relax();
502 static struct ads7846_platform_data spitz_ads7846_info = {
503 .model = 7846,
504 .vref_delay_usecs = 100,
505 .x_plate_ohms = 419,
506 .y_plate_ohms = 486,
507 .pressure_max = 1024,
508 .gpio_pendown = SPITZ_GPIO_TP_INT,
509 .wait_for_sync = spitz_ads7846_wait_for_hsync,
512 static struct pxa2xx_spi_chip spitz_ads7846_chip = {
513 .gpio_cs = SPITZ_GPIO_ADS7846_CS,
516 static void spitz_bl_kick_battery(void)
518 void (*kick_batt)(void);
520 kick_batt = symbol_get(sharpsl_battery_kick);
521 if (kick_batt) {
522 kick_batt();
523 symbol_put(sharpsl_battery_kick);
527 static struct corgi_lcd_platform_data spitz_lcdcon_info = {
528 .init_mode = CORGI_LCD_MODE_VGA,
529 .max_intensity = 0x2f,
530 .default_intensity = 0x1f,
531 .limit_mask = 0x0b,
532 .gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT,
533 .gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON,
534 .kick_battery = spitz_bl_kick_battery,
537 static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
538 .gpio_cs = SPITZ_GPIO_LCDCON_CS,
541 static struct pxa2xx_spi_chip spitz_max1111_chip = {
542 .gpio_cs = SPITZ_GPIO_MAX1111_CS,
545 static struct spi_board_info spitz_spi_devices[] = {
547 .modalias = "ads7846",
548 .max_speed_hz = 1200000,
549 .bus_num = 2,
550 .chip_select = 0,
551 .platform_data = &spitz_ads7846_info,
552 .controller_data = &spitz_ads7846_chip,
553 .irq = gpio_to_irq(SPITZ_GPIO_TP_INT),
554 }, {
555 .modalias = "corgi-lcd",
556 .max_speed_hz = 50000,
557 .bus_num = 2,
558 .chip_select = 1,
559 .platform_data = &spitz_lcdcon_info,
560 .controller_data = &spitz_lcdcon_chip,
561 }, {
562 .modalias = "max1111",
563 .max_speed_hz = 450000,
564 .bus_num = 2,
565 .chip_select = 2,
566 .controller_data = &spitz_max1111_chip,
570 static struct pxa2xx_spi_master spitz_spi_info = {
571 .num_chipselect = 3,
574 static void __init spitz_spi_init(void)
576 struct corgi_lcd_platform_data *lcd_data = &spitz_lcdcon_info;
578 if (machine_is_akita()) {
579 lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
580 lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
583 pxa2xx_set_spi_info(2, &spitz_spi_info);
584 spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
586 #else
587 static inline void spitz_spi_init(void) {}
588 #endif
590 /******************************************************************************
591 * SD/MMC card controller
592 ******************************************************************************/
593 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
595 * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
596 * give the card a chance to fully insert/eject.
598 static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
600 struct pxamci_platform_data* p_d = dev->platform_data;
602 if ((1 << vdd) & p_d->ocr_mask)
603 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
604 else
605 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
608 static struct pxamci_platform_data spitz_mci_platform_data = {
609 .detect_delay_ms = 250,
610 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
611 .setpower = spitz_mci_setpower,
612 .gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
613 .gpio_card_ro = SPITZ_GPIO_nSD_WP,
614 .gpio_power = -1,
617 static void __init spitz_mmc_init(void)
619 pxa_set_mci_info(&spitz_mci_platform_data);
621 #else
622 static inline void spitz_mmc_init(void) {}
623 #endif
625 /******************************************************************************
626 * USB Host
627 ******************************************************************************/
628 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
629 static int spitz_ohci_init(struct device *dev)
631 int err;
633 err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST");
634 if (err)
635 return err;
637 /* Only Port 2 is connected, setup USB Port 2 Output Control Register */
638 UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
640 return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
643 static void spitz_ohci_exit(struct device *dev)
645 gpio_free(SPITZ_GPIO_USB_HOST);
648 static struct pxaohci_platform_data spitz_ohci_platform_data = {
649 .port_mode = PMM_NPS_MODE,
650 .init = spitz_ohci_init,
651 .exit = spitz_ohci_exit,
652 .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION,
653 .power_budget = 150,
656 static void __init spitz_uhc_init(void)
658 pxa_set_ohci_info(&spitz_ohci_platform_data);
660 #else
661 static inline void spitz_uhc_init(void) {}
662 #endif
664 /******************************************************************************
665 * IrDA
666 ******************************************************************************/
667 #if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
668 static struct pxaficp_platform_data spitz_ficp_platform_data = {
669 .transceiver_cap = IR_SIRMODE | IR_OFF,
672 static void __init spitz_irda_init(void)
674 if (machine_is_akita())
675 spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
676 else
677 spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
679 pxa_set_ficp_info(&spitz_ficp_platform_data);
681 #else
682 static inline void spitz_irda_init(void) {}
683 #endif
685 /******************************************************************************
686 * Framebuffer
687 ******************************************************************************/
688 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
689 static struct pxafb_mode_info spitz_pxafb_modes[] = {
691 .pixclock = 19231,
692 .xres = 480,
693 .yres = 640,
694 .bpp = 16,
695 .hsync_len = 40,
696 .left_margin = 46,
697 .right_margin = 125,
698 .vsync_len = 3,
699 .upper_margin = 1,
700 .lower_margin = 0,
701 .sync = 0,
702 }, {
703 .pixclock = 134617,
704 .xres = 240,
705 .yres = 320,
706 .bpp = 16,
707 .hsync_len = 20,
708 .left_margin = 20,
709 .right_margin = 46,
710 .vsync_len = 2,
711 .upper_margin = 1,
712 .lower_margin = 0,
713 .sync = 0,
717 static struct pxafb_mach_info spitz_pxafb_info = {
718 .modes = spitz_pxafb_modes,
719 .num_modes = ARRAY_SIZE(spitz_pxafb_modes),
720 .fixed_modes = 1,
721 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
724 static void __init spitz_lcd_init(void)
726 set_pxa_fb_info(&spitz_pxafb_info);
728 #else
729 static inline void spitz_lcd_init(void) {}
730 #endif
732 /******************************************************************************
733 * Framebuffer
734 ******************************************************************************/
735 #if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
736 static struct mtd_partition spitz_nand_partitions[] = {
738 .name = "System Area",
739 .offset = 0,
740 .size = 7 * 1024 * 1024,
741 }, {
742 .name = "Root Filesystem",
743 .offset = 7 * 1024 * 1024,
744 }, {
745 .name = "Home Filesystem",
746 .offset = MTDPART_OFS_APPEND,
747 .size = MTDPART_SIZ_FULL,
751 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
753 static struct nand_bbt_descr spitz_nand_bbt = {
754 .options = 0,
755 .offs = 4,
756 .len = 2,
757 .pattern = scan_ff_pattern
760 static struct nand_ecclayout akita_oobinfo = {
761 .oobfree = { {0x08, 0x09} },
762 .eccbytes = 24,
763 .eccpos = {
764 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
765 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
766 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
770 static struct sharpsl_nand_platform_data spitz_nand_pdata = {
771 .badblock_pattern = &spitz_nand_bbt,
772 .partitions = spitz_nand_partitions,
773 .nr_partitions = ARRAY_SIZE(spitz_nand_partitions),
776 static struct resource spitz_nand_resources[] = {
778 .start = PXA_CS3_PHYS,
779 .end = PXA_CS3_PHYS + SZ_4K - 1,
780 .flags = IORESOURCE_MEM,
784 static struct platform_device spitz_nand_device = {
785 .name = "sharpsl-nand",
786 .id = -1,
787 .resource = spitz_nand_resources,
788 .num_resources = ARRAY_SIZE(spitz_nand_resources),
789 .dev = {
790 .platform_data = &spitz_nand_pdata,
794 static void __init spitz_nand_init(void)
796 if (machine_is_spitz()) {
797 spitz_nand_partitions[1].size = 5 * 1024 * 1024;
798 } else if (machine_is_akita()) {
799 spitz_nand_partitions[1].size = 58 * 1024 * 1024;
800 spitz_nand_bbt.len = 1;
801 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
802 } else if (machine_is_borzoi()) {
803 spitz_nand_partitions[1].size = 32 * 1024 * 1024;
804 spitz_nand_bbt.len = 1;
805 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
808 platform_device_register(&spitz_nand_device);
810 #else
811 static inline void spitz_nand_init(void) {}
812 #endif
814 /******************************************************************************
815 * NOR Flash
816 ******************************************************************************/
817 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
818 static struct mtd_partition spitz_rom_parts[] = {
820 .name ="Boot PROM Filesystem",
821 .offset = 0x00140000,
822 .size = MTDPART_SIZ_FULL,
826 static struct physmap_flash_data spitz_rom_data = {
827 .width = 2,
828 .nr_parts = ARRAY_SIZE(spitz_rom_parts),
829 .parts = spitz_rom_parts,
832 static struct resource spitz_rom_resources[] = {
834 .start = PXA_CS0_PHYS,
835 .end = PXA_CS0_PHYS + SZ_8M - 1,
836 .flags = IORESOURCE_MEM,
840 static struct platform_device spitz_rom_device = {
841 .name = "physmap-flash",
842 .id = -1,
843 .resource = spitz_rom_resources,
844 .num_resources = ARRAY_SIZE(spitz_rom_resources),
845 .dev = {
846 .platform_data = &spitz_rom_data,
850 static void __init spitz_nor_init(void)
852 platform_device_register(&spitz_rom_device);
854 #else
855 static inline void spitz_nor_init(void) {}
856 #endif
858 /******************************************************************************
859 * GPIO expander
860 ******************************************************************************/
861 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
862 static struct pca953x_platform_data akita_pca953x_pdata = {
863 .gpio_base = AKITA_IOEXP_GPIO_BASE,
866 static struct i2c_board_info spitz_i2c_devs[] = {
868 .type = "wm8750",
869 .addr = 0x1b,
870 }, {
871 .type = "max7310",
872 .addr = 0x18,
873 .platform_data = &akita_pca953x_pdata,
877 static struct regulator_consumer_supply isl6271a_consumers[] = {
879 .supply = "vcc_core",
883 static struct regulator_init_data isl6271a_info[] = {
885 .constraints = {
886 .name = "vcc_core range",
887 .min_uV = 850000,
888 .max_uV = 1600000,
889 .always_on = 1,
890 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
892 .consumer_supplies = isl6271a_consumers,
893 .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers),
897 static struct i2c_board_info spitz_pi2c_devs[] = {
899 .type = "isl6271a",
900 .addr = 0x0c,
901 .platform_data = &isl6271a_info,
905 static void __init spitz_i2c_init(void)
907 int size = ARRAY_SIZE(spitz_i2c_devs);
909 /* Only Akita has the max7310 chip */
910 if (!machine_is_akita())
911 size--;
913 pxa_set_i2c_info(NULL);
914 pxa27x_set_i2c_power_info(NULL);
915 i2c_register_board_info(0, spitz_i2c_devs, size);
916 i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs));
918 #else
919 static inline void spitz_i2c_init(void) {}
920 #endif
922 /******************************************************************************
923 * Machine init
924 ******************************************************************************/
925 static void spitz_poweroff(void)
927 arm_machine_restart('g', NULL);
930 static void spitz_restart(char mode, const char *cmd)
932 /* Bootloader magic for a reboot */
933 if ((MSC0 & 0xffff0000) == 0x7ff00000)
934 MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
936 spitz_poweroff();
939 static void __init spitz_init(void)
941 init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
942 pm_power_off = spitz_poweroff;
943 arm_pm_restart = spitz_restart;
945 PMCR = 0x00;
947 /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
948 PCFR |= PCFR_OPDE;
950 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
952 pxa_set_ffuart_info(NULL);
953 pxa_set_btuart_info(NULL);
954 pxa_set_stuart_info(NULL);
956 spitz_spi_init();
957 spitz_scoop_init();
958 spitz_mkp_init();
959 spitz_keys_init();
960 spitz_leds_init();
961 spitz_mmc_init();
962 spitz_pcmcia_init();
963 spitz_irda_init();
964 spitz_uhc_init();
965 spitz_lcd_init();
966 spitz_nor_init();
967 spitz_nand_init();
968 spitz_i2c_init();
971 static void __init spitz_fixup(struct machine_desc *desc,
972 struct tag *tags, char **cmdline, struct meminfo *mi)
974 sharpsl_save_param();
975 mi->nr_banks = 1;
976 mi->bank[0].start = 0xa0000000;
977 mi->bank[0].size = (64*1024*1024);
980 #ifdef CONFIG_MACH_SPITZ
981 MACHINE_START(SPITZ, "SHARP Spitz")
982 .phys_io = 0x40000000,
983 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
984 .fixup = spitz_fixup,
985 .map_io = pxa_map_io,
986 .init_irq = pxa27x_init_irq,
987 .init_machine = spitz_init,
988 .timer = &pxa_timer,
989 MACHINE_END
990 #endif
992 #ifdef CONFIG_MACH_BORZOI
993 MACHINE_START(BORZOI, "SHARP Borzoi")
994 .phys_io = 0x40000000,
995 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
996 .fixup = spitz_fixup,
997 .map_io = pxa_map_io,
998 .init_irq = pxa27x_init_irq,
999 .init_machine = spitz_init,
1000 .timer = &pxa_timer,
1001 MACHINE_END
1002 #endif
1004 #ifdef CONFIG_MACH_AKITA
1005 MACHINE_START(AKITA, "SHARP Akita")
1006 .phys_io = 0x40000000,
1007 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
1008 .fixup = spitz_fixup,
1009 .map_io = pxa_map_io,
1010 .init_irq = pxa27x_init_irq,
1011 .init_machine = spitz_init,
1012 .timer = &pxa_timer,
1013 MACHINE_END
1014 #endif