Linux 3.11-rc3
[cris-mirror.git] / arch / arm / mach-pxa / spitz.c
blob4c29173026e8e67ff6ec0409f1862e205e5ffc4c
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/pxa-i2c.h>
23 #include <linux/i2c/pca953x.h>
24 #include <linux/spi/spi.h>
25 #include <linux/spi/ads7846.h>
26 #include <linux/spi/corgi_lcd.h>
27 #include <linux/spi/pxa2xx_spi.h>
28 #include <linux/mtd/sharpsl.h>
29 #include <linux/mtd/physmap.h>
30 #include <linux/input/matrix_keypad.h>
31 #include <linux/regulator/machine.h>
32 #include <linux/io.h>
33 #include <linux/module.h>
34 #include <linux/reboot.h>
36 #include <asm/setup.h>
37 #include <asm/mach-types.h>
38 #include <asm/mach/arch.h>
39 #include <asm/mach/sharpsl_param.h>
40 #include <asm/hardware/scoop.h>
42 #include <mach/pxa27x.h>
43 #include <mach/pxa27x-udc.h>
44 #include <mach/reset.h>
45 #include <linux/platform_data/irda-pxaficp.h>
46 #include <linux/platform_data/mmc-pxamci.h>
47 #include <linux/platform_data/usb-ohci-pxa27x.h>
48 #include <linux/platform_data/video-pxafb.h>
49 #include <mach/spitz.h>
50 #include <mach/sharpsl_pm.h>
51 #include <mach/smemc.h>
53 #include "generic.h"
54 #include "devices.h"
56 /******************************************************************************
57 * Pin configuration
58 ******************************************************************************/
59 static unsigned long spitz_pin_config[] __initdata = {
60 /* Chip Selects */
61 GPIO78_nCS_2, /* SCOOP #2 */
62 GPIO79_nCS_3, /* NAND */
63 GPIO80_nCS_4, /* SCOOP #1 */
65 /* LCD - 16bpp Active TFT */
66 GPIOxx_LCD_TFT_16BPP,
68 /* PC Card */
69 GPIO48_nPOE,
70 GPIO49_nPWE,
71 GPIO50_nPIOR,
72 GPIO51_nPIOW,
73 GPIO85_nPCE_1,
74 GPIO54_nPCE_2,
75 GPIO55_nPREG,
76 GPIO56_nPWAIT,
77 GPIO57_nIOIS16,
78 GPIO104_PSKTSEL,
80 /* I2S */
81 GPIO28_I2S_BITCLK_OUT,
82 GPIO29_I2S_SDATA_IN,
83 GPIO30_I2S_SDATA_OUT,
84 GPIO31_I2S_SYNC,
86 /* MMC */
87 GPIO32_MMC_CLK,
88 GPIO112_MMC_CMD,
89 GPIO92_MMC_DAT_0,
90 GPIO109_MMC_DAT_1,
91 GPIO110_MMC_DAT_2,
92 GPIO111_MMC_DAT_3,
94 /* GPIOs */
95 GPIO9_GPIO, /* SPITZ_GPIO_nSD_DETECT */
96 GPIO16_GPIO, /* SPITZ_GPIO_SYNC */
97 GPIO81_GPIO, /* SPITZ_GPIO_nSD_WP */
98 GPIO41_GPIO, /* SPITZ_GPIO_USB_CONNECT */
99 GPIO37_GPIO, /* SPITZ_GPIO_USB_HOST */
100 GPIO35_GPIO, /* SPITZ_GPIO_USB_DEVICE */
101 GPIO22_GPIO, /* SPITZ_GPIO_HSYNC */
102 GPIO94_GPIO, /* SPITZ_GPIO_CF_CD */
103 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */
104 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */
106 /* GPIO matrix keypad */
107 GPIO88_GPIO, /* column 0 */
108 GPIO23_GPIO, /* column 1 */
109 GPIO24_GPIO, /* column 2 */
110 GPIO25_GPIO, /* column 3 */
111 GPIO26_GPIO, /* column 4 */
112 GPIO27_GPIO, /* column 5 */
113 GPIO52_GPIO, /* column 6 */
114 GPIO103_GPIO, /* column 7 */
115 GPIO107_GPIO, /* column 8 */
116 GPIO108_GPIO, /* column 9 */
117 GPIO114_GPIO, /* column 10 */
118 GPIO12_GPIO, /* row 0 */
119 GPIO17_GPIO, /* row 1 */
120 GPIO91_GPIO, /* row 2 */
121 GPIO34_GPIO, /* row 3 */
122 GPIO36_GPIO, /* row 4 */
123 GPIO38_GPIO, /* row 5 */
124 GPIO39_GPIO, /* row 6 */
126 /* I2C */
127 GPIO117_I2C_SCL,
128 GPIO118_I2C_SDA,
130 GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, /* SPITZ_GPIO_KEY_INT */
131 GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
135 /******************************************************************************
136 * Scoop GPIO expander
137 ******************************************************************************/
138 #if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
139 /* SCOOP Device #1 */
140 static struct resource spitz_scoop_1_resources[] = {
141 [0] = {
142 .start = 0x10800000,
143 .end = 0x10800fff,
144 .flags = IORESOURCE_MEM,
148 static struct scoop_config spitz_scoop_1_setup = {
149 .io_dir = SPITZ_SCP_IO_DIR,
150 .io_out = SPITZ_SCP_IO_OUT,
151 .suspend_clr = SPITZ_SCP_SUS_CLR,
152 .suspend_set = SPITZ_SCP_SUS_SET,
153 .gpio_base = SPITZ_SCP_GPIO_BASE,
156 struct platform_device spitz_scoop_1_device = {
157 .name = "sharp-scoop",
158 .id = 0,
159 .dev = {
160 .platform_data = &spitz_scoop_1_setup,
162 .num_resources = ARRAY_SIZE(spitz_scoop_1_resources),
163 .resource = spitz_scoop_1_resources,
166 /* SCOOP Device #2 */
167 static struct resource spitz_scoop_2_resources[] = {
168 [0] = {
169 .start = 0x08800040,
170 .end = 0x08800fff,
171 .flags = IORESOURCE_MEM,
175 static struct scoop_config spitz_scoop_2_setup = {
176 .io_dir = SPITZ_SCP2_IO_DIR,
177 .io_out = SPITZ_SCP2_IO_OUT,
178 .suspend_clr = SPITZ_SCP2_SUS_CLR,
179 .suspend_set = SPITZ_SCP2_SUS_SET,
180 .gpio_base = SPITZ_SCP2_GPIO_BASE,
183 struct platform_device spitz_scoop_2_device = {
184 .name = "sharp-scoop",
185 .id = 1,
186 .dev = {
187 .platform_data = &spitz_scoop_2_setup,
189 .num_resources = ARRAY_SIZE(spitz_scoop_2_resources),
190 .resource = spitz_scoop_2_resources,
193 static void __init spitz_scoop_init(void)
195 platform_device_register(&spitz_scoop_1_device);
197 /* Akita doesn't have the second SCOOP chip */
198 if (!machine_is_akita())
199 platform_device_register(&spitz_scoop_2_device);
202 /* Power control is shared with between one of the CF slots and SD */
203 static void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
205 unsigned short cpr;
206 unsigned long flags;
208 if (new_cpr & 0x7) {
209 gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
210 mdelay(5);
213 local_irq_save(flags);
215 cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR);
217 if (enable & new_cpr)
218 cpr |= new_cpr;
219 else
220 cpr &= ~enable;
222 write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr);
224 local_irq_restore(flags);
226 if (!(cpr & 0x7)) {
227 mdelay(1);
228 gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
232 #else
233 static inline void spitz_scoop_init(void) {}
234 static inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
235 #endif
237 /******************************************************************************
238 * PCMCIA
239 ******************************************************************************/
240 #if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
241 static void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
243 /* Only need to override behaviour for slot 0 */
244 if (nr == 0)
245 spitz_card_pwr_ctrl(
246 cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
247 else
248 write_scoop_reg(scoop, SCOOP_CPR, cpr);
251 static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
253 .dev = &spitz_scoop_1_device.dev,
254 .irq = SPITZ_IRQ_GPIO_CF_IRQ,
255 .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
256 .cd_irq_str = "PCMCIA0 CD",
257 }, {
258 .dev = &spitz_scoop_2_device.dev,
259 .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
260 .cd_irq = -1,
264 static struct scoop_pcmcia_config spitz_pcmcia_config = {
265 .devs = &spitz_pcmcia_scoop[0],
266 .num_devs = 2,
267 .power_ctrl = spitz_pcmcia_pwr,
270 static void __init spitz_pcmcia_init(void)
272 /* Akita has only one PCMCIA slot used */
273 if (machine_is_akita())
274 spitz_pcmcia_config.num_devs = 1;
276 platform_scoop_config = &spitz_pcmcia_config;
278 #else
279 static inline void spitz_pcmcia_init(void) {}
280 #endif
282 /******************************************************************************
283 * GPIO keyboard
284 ******************************************************************************/
285 #if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
287 #define SPITZ_KEY_CALENDAR KEY_F1
288 #define SPITZ_KEY_ADDRESS KEY_F2
289 #define SPITZ_KEY_FN KEY_F3
290 #define SPITZ_KEY_CANCEL KEY_F4
291 #define SPITZ_KEY_EXOK KEY_F5
292 #define SPITZ_KEY_EXCANCEL KEY_F6
293 #define SPITZ_KEY_EXJOGDOWN KEY_F7
294 #define SPITZ_KEY_EXJOGUP KEY_F8
295 #define SPITZ_KEY_JAP1 KEY_LEFTALT
296 #define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
297 #define SPITZ_KEY_SYNC KEY_F9
298 #define SPITZ_KEY_MAIL KEY_F10
299 #define SPITZ_KEY_OK KEY_F11
300 #define SPITZ_KEY_MENU KEY_F12
302 static const uint32_t spitz_keymap[] = {
303 KEY(0, 0, KEY_LEFTCTRL),
304 KEY(0, 1, KEY_1),
305 KEY(0, 2, KEY_3),
306 KEY(0, 3, KEY_5),
307 KEY(0, 4, KEY_6),
308 KEY(0, 5, KEY_7),
309 KEY(0, 6, KEY_9),
310 KEY(0, 7, KEY_0),
311 KEY(0, 8, KEY_BACKSPACE),
312 KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */
313 KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */
314 KEY(1, 1, KEY_2),
315 KEY(1, 2, KEY_4),
316 KEY(1, 3, KEY_R),
317 KEY(1, 4, KEY_Y),
318 KEY(1, 5, KEY_8),
319 KEY(1, 6, KEY_I),
320 KEY(1, 7, KEY_O),
321 KEY(1, 8, KEY_P),
322 KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */
323 KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */
324 KEY(2, 0, KEY_TAB),
325 KEY(2, 1, KEY_Q),
326 KEY(2, 2, KEY_E),
327 KEY(2, 3, KEY_T),
328 KEY(2, 4, KEY_G),
329 KEY(2, 5, KEY_U),
330 KEY(2, 6, KEY_J),
331 KEY(2, 7, KEY_K),
332 KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */
333 KEY(3, 1, KEY_W),
334 KEY(3, 2, KEY_S),
335 KEY(3, 3, KEY_F),
336 KEY(3, 4, KEY_V),
337 KEY(3, 5, KEY_H),
338 KEY(3, 6, KEY_M),
339 KEY(3, 7, KEY_L),
340 KEY(3, 9, KEY_RIGHTSHIFT),
341 KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */
342 KEY(4, 1, KEY_A),
343 KEY(4, 2, KEY_D),
344 KEY(4, 3, KEY_C),
345 KEY(4, 4, KEY_B),
346 KEY(4, 5, KEY_N),
347 KEY(4, 6, KEY_DOT),
348 KEY(4, 8, KEY_ENTER),
349 KEY(4, 9, KEY_LEFTSHIFT),
350 KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */
351 KEY(5, 1, KEY_Z),
352 KEY(5, 2, KEY_X),
353 KEY(5, 3, KEY_MINUS),
354 KEY(5, 4, KEY_SPACE),
355 KEY(5, 5, KEY_COMMA),
356 KEY(5, 7, KEY_UP),
357 KEY(5, 10, SPITZ_KEY_FN), /* FN */
358 KEY(6, 0, KEY_SYSRQ),
359 KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */
360 KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */
361 KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */
362 KEY(6, 4, SPITZ_KEY_OK), /* OK */
363 KEY(6, 5, SPITZ_KEY_MENU), /* MENU */
364 KEY(6, 6, KEY_LEFT),
365 KEY(6, 7, KEY_DOWN),
366 KEY(6, 8, KEY_RIGHT),
369 static const struct matrix_keymap_data spitz_keymap_data = {
370 .keymap = spitz_keymap,
371 .keymap_size = ARRAY_SIZE(spitz_keymap),
374 static const uint32_t spitz_row_gpios[] =
375 { 12, 17, 91, 34, 36, 38, 39 };
376 static const uint32_t spitz_col_gpios[] =
377 { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
379 static struct matrix_keypad_platform_data spitz_mkp_pdata = {
380 .keymap_data = &spitz_keymap_data,
381 .row_gpios = spitz_row_gpios,
382 .col_gpios = spitz_col_gpios,
383 .num_row_gpios = ARRAY_SIZE(spitz_row_gpios),
384 .num_col_gpios = ARRAY_SIZE(spitz_col_gpios),
385 .col_scan_delay_us = 10,
386 .debounce_ms = 10,
387 .wakeup = 1,
390 static struct platform_device spitz_mkp_device = {
391 .name = "matrix-keypad",
392 .id = -1,
393 .dev = {
394 .platform_data = &spitz_mkp_pdata,
398 static void __init spitz_mkp_init(void)
400 platform_device_register(&spitz_mkp_device);
402 #else
403 static inline void spitz_mkp_init(void) {}
404 #endif
406 /******************************************************************************
407 * GPIO keys
408 ******************************************************************************/
409 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
410 static struct gpio_keys_button spitz_gpio_keys[] = {
412 .type = EV_PWR,
413 .code = KEY_SUSPEND,
414 .gpio = SPITZ_GPIO_ON_KEY,
415 .desc = "On Off",
416 .wakeup = 1,
418 /* Two buttons detecting the lid state */
420 .type = EV_SW,
421 .code = 0,
422 .gpio = SPITZ_GPIO_SWA,
423 .desc = "Display Down",
426 .type = EV_SW,
427 .code = 1,
428 .gpio = SPITZ_GPIO_SWB,
429 .desc = "Lid Closed",
433 static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
434 .buttons = spitz_gpio_keys,
435 .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
438 static struct platform_device spitz_gpio_keys_device = {
439 .name = "gpio-keys",
440 .id = -1,
441 .dev = {
442 .platform_data = &spitz_gpio_keys_platform_data,
446 static void __init spitz_keys_init(void)
448 platform_device_register(&spitz_gpio_keys_device);
450 #else
451 static inline void spitz_keys_init(void) {}
452 #endif
454 /******************************************************************************
455 * LEDs
456 ******************************************************************************/
457 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
458 static struct gpio_led spitz_gpio_leds[] = {
460 .name = "spitz:amber:charge",
461 .default_trigger = "sharpsl-charge",
462 .gpio = SPITZ_GPIO_LED_ORANGE,
465 .name = "spitz:green:hddactivity",
466 .default_trigger = "ide-disk",
467 .gpio = SPITZ_GPIO_LED_GREEN,
471 static struct gpio_led_platform_data spitz_gpio_leds_info = {
472 .leds = spitz_gpio_leds,
473 .num_leds = ARRAY_SIZE(spitz_gpio_leds),
476 static struct platform_device spitz_led_device = {
477 .name = "leds-gpio",
478 .id = -1,
479 .dev = {
480 .platform_data = &spitz_gpio_leds_info,
484 static void __init spitz_leds_init(void)
486 platform_device_register(&spitz_led_device);
488 #else
489 static inline void spitz_leds_init(void) {}
490 #endif
492 /******************************************************************************
493 * SSP Devices
494 ******************************************************************************/
495 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
496 static void spitz_ads7846_wait_for_hsync(void)
498 while (gpio_get_value(SPITZ_GPIO_HSYNC))
499 cpu_relax();
501 while (!gpio_get_value(SPITZ_GPIO_HSYNC))
502 cpu_relax();
505 static struct ads7846_platform_data spitz_ads7846_info = {
506 .model = 7846,
507 .vref_delay_usecs = 100,
508 .x_plate_ohms = 419,
509 .y_plate_ohms = 486,
510 .pressure_max = 1024,
511 .gpio_pendown = SPITZ_GPIO_TP_INT,
512 .wait_for_sync = spitz_ads7846_wait_for_hsync,
515 static struct pxa2xx_spi_chip spitz_ads7846_chip = {
516 .gpio_cs = SPITZ_GPIO_ADS7846_CS,
519 static void spitz_bl_kick_battery(void)
521 void (*kick_batt)(void);
523 kick_batt = symbol_get(sharpsl_battery_kick);
524 if (kick_batt) {
525 kick_batt();
526 symbol_put(sharpsl_battery_kick);
530 static struct corgi_lcd_platform_data spitz_lcdcon_info = {
531 .init_mode = CORGI_LCD_MODE_VGA,
532 .max_intensity = 0x2f,
533 .default_intensity = 0x1f,
534 .limit_mask = 0x0b,
535 .gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT,
536 .gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON,
537 .kick_battery = spitz_bl_kick_battery,
540 static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
541 .gpio_cs = SPITZ_GPIO_LCDCON_CS,
544 static struct pxa2xx_spi_chip spitz_max1111_chip = {
545 .gpio_cs = SPITZ_GPIO_MAX1111_CS,
548 static struct spi_board_info spitz_spi_devices[] = {
550 .modalias = "ads7846",
551 .max_speed_hz = 1200000,
552 .bus_num = 2,
553 .chip_select = 0,
554 .platform_data = &spitz_ads7846_info,
555 .controller_data = &spitz_ads7846_chip,
556 .irq = PXA_GPIO_TO_IRQ(SPITZ_GPIO_TP_INT),
557 }, {
558 .modalias = "corgi-lcd",
559 .max_speed_hz = 50000,
560 .bus_num = 2,
561 .chip_select = 1,
562 .platform_data = &spitz_lcdcon_info,
563 .controller_data = &spitz_lcdcon_chip,
564 }, {
565 .modalias = "max1111",
566 .max_speed_hz = 450000,
567 .bus_num = 2,
568 .chip_select = 2,
569 .controller_data = &spitz_max1111_chip,
573 static struct pxa2xx_spi_master spitz_spi_info = {
574 .num_chipselect = 3,
577 static void __init spitz_spi_init(void)
579 struct corgi_lcd_platform_data *lcd_data = &spitz_lcdcon_info;
581 if (machine_is_akita()) {
582 lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
583 lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
586 pxa2xx_set_spi_info(2, &spitz_spi_info);
587 spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
589 #else
590 static inline void spitz_spi_init(void) {}
591 #endif
593 /******************************************************************************
594 * SD/MMC card controller
595 ******************************************************************************/
596 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
598 * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
599 * give the card a chance to fully insert/eject.
601 static int spitz_mci_setpower(struct device *dev, unsigned int vdd)
603 struct pxamci_platform_data* p_d = dev->platform_data;
605 if ((1 << vdd) & p_d->ocr_mask)
606 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
607 else
608 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
610 return 0;
613 static struct pxamci_platform_data spitz_mci_platform_data = {
614 .detect_delay_ms = 250,
615 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
616 .setpower = spitz_mci_setpower,
617 .gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
618 .gpio_card_ro = SPITZ_GPIO_nSD_WP,
619 .gpio_power = -1,
622 static void __init spitz_mmc_init(void)
624 pxa_set_mci_info(&spitz_mci_platform_data);
626 #else
627 static inline void spitz_mmc_init(void) {}
628 #endif
630 /******************************************************************************
631 * USB Host
632 ******************************************************************************/
633 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
634 static int spitz_ohci_init(struct device *dev)
636 int err;
638 err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST");
639 if (err)
640 return err;
642 /* Only Port 2 is connected, setup USB Port 2 Output Control Register */
643 UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
645 return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
648 static void spitz_ohci_exit(struct device *dev)
650 gpio_free(SPITZ_GPIO_USB_HOST);
653 static struct pxaohci_platform_data spitz_ohci_platform_data = {
654 .port_mode = PMM_NPS_MODE,
655 .init = spitz_ohci_init,
656 .exit = spitz_ohci_exit,
657 .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION,
658 .power_budget = 150,
661 static void __init spitz_uhc_init(void)
663 pxa_set_ohci_info(&spitz_ohci_platform_data);
665 #else
666 static inline void spitz_uhc_init(void) {}
667 #endif
669 /******************************************************************************
670 * IrDA
671 ******************************************************************************/
672 #if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
673 static struct pxaficp_platform_data spitz_ficp_platform_data = {
674 .transceiver_cap = IR_SIRMODE | IR_OFF,
677 static void __init spitz_irda_init(void)
679 if (machine_is_akita())
680 spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
681 else
682 spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
684 pxa_set_ficp_info(&spitz_ficp_platform_data);
686 #else
687 static inline void spitz_irda_init(void) {}
688 #endif
690 /******************************************************************************
691 * Framebuffer
692 ******************************************************************************/
693 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
694 static struct pxafb_mode_info spitz_pxafb_modes[] = {
696 .pixclock = 19231,
697 .xres = 480,
698 .yres = 640,
699 .bpp = 16,
700 .hsync_len = 40,
701 .left_margin = 46,
702 .right_margin = 125,
703 .vsync_len = 3,
704 .upper_margin = 1,
705 .lower_margin = 0,
706 .sync = 0,
707 }, {
708 .pixclock = 134617,
709 .xres = 240,
710 .yres = 320,
711 .bpp = 16,
712 .hsync_len = 20,
713 .left_margin = 20,
714 .right_margin = 46,
715 .vsync_len = 2,
716 .upper_margin = 1,
717 .lower_margin = 0,
718 .sync = 0,
722 static struct pxafb_mach_info spitz_pxafb_info = {
723 .modes = spitz_pxafb_modes,
724 .num_modes = ARRAY_SIZE(spitz_pxafb_modes),
725 .fixed_modes = 1,
726 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
729 static void __init spitz_lcd_init(void)
731 pxa_set_fb_info(NULL, &spitz_pxafb_info);
733 #else
734 static inline void spitz_lcd_init(void) {}
735 #endif
737 /******************************************************************************
738 * NAND Flash
739 ******************************************************************************/
740 #if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
741 static struct mtd_partition spitz_nand_partitions[] = {
743 .name = "System Area",
744 .offset = 0,
745 .size = 7 * 1024 * 1024,
746 }, {
747 .name = "Root Filesystem",
748 .offset = 7 * 1024 * 1024,
749 }, {
750 .name = "Home Filesystem",
751 .offset = MTDPART_OFS_APPEND,
752 .size = MTDPART_SIZ_FULL,
756 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
758 static struct nand_bbt_descr spitz_nand_bbt = {
759 .options = 0,
760 .offs = 4,
761 .len = 2,
762 .pattern = scan_ff_pattern
765 static struct nand_ecclayout akita_oobinfo = {
766 .oobfree = { {0x08, 0x09} },
767 .eccbytes = 24,
768 .eccpos = {
769 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
770 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
771 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
775 static struct sharpsl_nand_platform_data spitz_nand_pdata = {
776 .badblock_pattern = &spitz_nand_bbt,
777 .partitions = spitz_nand_partitions,
778 .nr_partitions = ARRAY_SIZE(spitz_nand_partitions),
781 static struct resource spitz_nand_resources[] = {
783 .start = PXA_CS3_PHYS,
784 .end = PXA_CS3_PHYS + SZ_4K - 1,
785 .flags = IORESOURCE_MEM,
789 static struct platform_device spitz_nand_device = {
790 .name = "sharpsl-nand",
791 .id = -1,
792 .resource = spitz_nand_resources,
793 .num_resources = ARRAY_SIZE(spitz_nand_resources),
794 .dev = {
795 .platform_data = &spitz_nand_pdata,
799 static void __init spitz_nand_init(void)
801 if (machine_is_spitz()) {
802 spitz_nand_partitions[1].size = 5 * 1024 * 1024;
803 } else if (machine_is_akita()) {
804 spitz_nand_partitions[1].size = 58 * 1024 * 1024;
805 spitz_nand_bbt.len = 1;
806 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
807 } else if (machine_is_borzoi()) {
808 spitz_nand_partitions[1].size = 32 * 1024 * 1024;
809 spitz_nand_bbt.len = 1;
810 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
813 platform_device_register(&spitz_nand_device);
815 #else
816 static inline void spitz_nand_init(void) {}
817 #endif
819 /******************************************************************************
820 * NOR Flash
821 ******************************************************************************/
822 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
823 static struct mtd_partition spitz_rom_parts[] = {
825 .name ="Boot PROM Filesystem",
826 .offset = 0x00140000,
827 .size = MTDPART_SIZ_FULL,
831 static struct physmap_flash_data spitz_rom_data = {
832 .width = 2,
833 .nr_parts = ARRAY_SIZE(spitz_rom_parts),
834 .parts = spitz_rom_parts,
837 static struct resource spitz_rom_resources[] = {
839 .start = PXA_CS0_PHYS,
840 .end = PXA_CS0_PHYS + SZ_8M - 1,
841 .flags = IORESOURCE_MEM,
845 static struct platform_device spitz_rom_device = {
846 .name = "physmap-flash",
847 .id = -1,
848 .resource = spitz_rom_resources,
849 .num_resources = ARRAY_SIZE(spitz_rom_resources),
850 .dev = {
851 .platform_data = &spitz_rom_data,
855 static void __init spitz_nor_init(void)
857 platform_device_register(&spitz_rom_device);
859 #else
860 static inline void spitz_nor_init(void) {}
861 #endif
863 /******************************************************************************
864 * I2C devices
865 ******************************************************************************/
866 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
867 static struct pca953x_platform_data akita_pca953x_pdata = {
868 .gpio_base = AKITA_IOEXP_GPIO_BASE,
871 static struct i2c_board_info spitz_i2c_devs[] = {
873 .type = "wm8750",
874 .addr = 0x1b,
875 }, {
876 .type = "max7310",
877 .addr = 0x18,
878 .platform_data = &akita_pca953x_pdata,
882 static struct regulator_consumer_supply isl6271a_consumers[] = {
883 REGULATOR_SUPPLY("vcc_core", NULL),
886 static struct regulator_init_data isl6271a_info[] = {
888 .constraints = {
889 .name = "vcc_core range",
890 .min_uV = 850000,
891 .max_uV = 1600000,
892 .always_on = 1,
893 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
895 .consumer_supplies = isl6271a_consumers,
896 .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers),
900 static struct i2c_board_info spitz_pi2c_devs[] = {
902 .type = "isl6271a",
903 .addr = 0x0c,
904 .platform_data = &isl6271a_info,
908 static void __init spitz_i2c_init(void)
910 int size = ARRAY_SIZE(spitz_i2c_devs);
912 /* Only Akita has the max7310 chip */
913 if (!machine_is_akita())
914 size--;
916 pxa_set_i2c_info(NULL);
917 pxa27x_set_i2c_power_info(NULL);
918 i2c_register_board_info(0, spitz_i2c_devs, size);
919 i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs));
921 #else
922 static inline void spitz_i2c_init(void) {}
923 #endif
925 /******************************************************************************
926 * Machine init
927 ******************************************************************************/
928 static void spitz_poweroff(void)
930 pxa_restart(REBOOT_GPIO, NULL);
933 static void spitz_restart(enum reboot_mode mode, const char *cmd)
935 uint32_t msc0 = __raw_readl(MSC0);
936 /* Bootloader magic for a reboot */
937 if ((msc0 & 0xffff0000) == 0x7ff00000)
938 __raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0);
940 spitz_poweroff();
943 static void __init spitz_init(void)
945 init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
946 pm_power_off = spitz_poweroff;
948 PMCR = 0x00;
950 /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
951 PCFR |= PCFR_OPDE;
953 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
955 pxa_set_ffuart_info(NULL);
956 pxa_set_btuart_info(NULL);
957 pxa_set_stuart_info(NULL);
959 spitz_spi_init();
960 spitz_scoop_init();
961 spitz_mkp_init();
962 spitz_keys_init();
963 spitz_leds_init();
964 spitz_mmc_init();
965 spitz_pcmcia_init();
966 spitz_irda_init();
967 spitz_uhc_init();
968 spitz_lcd_init();
969 spitz_nor_init();
970 spitz_nand_init();
971 spitz_i2c_init();
974 static void __init spitz_fixup(struct tag *tags, char **cmdline,
975 struct meminfo *mi)
977 sharpsl_save_param();
978 mi->nr_banks = 1;
979 mi->bank[0].start = 0xa0000000;
980 mi->bank[0].size = (64*1024*1024);
983 #ifdef CONFIG_MACH_SPITZ
984 MACHINE_START(SPITZ, "SHARP Spitz")
985 .fixup = spitz_fixup,
986 .map_io = pxa27x_map_io,
987 .nr_irqs = PXA_NR_IRQS,
988 .init_irq = pxa27x_init_irq,
989 .handle_irq = pxa27x_handle_irq,
990 .init_machine = spitz_init,
991 .init_time = pxa_timer_init,
992 .restart = spitz_restart,
993 MACHINE_END
994 #endif
996 #ifdef CONFIG_MACH_BORZOI
997 MACHINE_START(BORZOI, "SHARP Borzoi")
998 .fixup = spitz_fixup,
999 .map_io = pxa27x_map_io,
1000 .nr_irqs = PXA_NR_IRQS,
1001 .init_irq = pxa27x_init_irq,
1002 .handle_irq = pxa27x_handle_irq,
1003 .init_machine = spitz_init,
1004 .init_time = pxa_timer_init,
1005 .restart = spitz_restart,
1006 MACHINE_END
1007 #endif
1009 #ifdef CONFIG_MACH_AKITA
1010 MACHINE_START(AKITA, "SHARP Akita")
1011 .fixup = spitz_fixup,
1012 .map_io = pxa27x_map_io,
1013 .nr_irqs = PXA_NR_IRQS,
1014 .init_irq = pxa27x_init_irq,
1015 .handle_irq = pxa27x_handle_irq,
1016 .init_machine = spitz_init,
1017 .init_time = pxa_timer_init,
1018 .restart = spitz_restart,
1019 MACHINE_END
1020 #endif