Merge tag 'locks-v3.16-2' of git://git.samba.org/jlayton/linux
[linux/fpc-iii.git] / arch / arm / mach-pxa / spitz.c
blob840c3a48e7200106c0050e8ff7c2f5cd35840c3d
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/platform_data/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>
35 #include <linux/memblock.h>
37 #include <asm/setup.h>
38 #include <asm/mach-types.h>
39 #include <asm/mach/arch.h>
40 #include <asm/mach/sharpsl_param.h>
41 #include <asm/hardware/scoop.h>
43 #include <mach/pxa27x.h>
44 #include <mach/pxa27x-udc.h>
45 #include <mach/reset.h>
46 #include <linux/platform_data/irda-pxaficp.h>
47 #include <linux/platform_data/mmc-pxamci.h>
48 #include <linux/platform_data/usb-ohci-pxa27x.h>
49 #include <linux/platform_data/video-pxafb.h>
50 #include <mach/spitz.h>
51 #include <mach/sharpsl_pm.h>
52 #include <mach/smemc.h>
54 #include "generic.h"
55 #include "devices.h"
57 /******************************************************************************
58 * Pin configuration
59 ******************************************************************************/
60 static unsigned long spitz_pin_config[] __initdata = {
61 /* Chip Selects */
62 GPIO78_nCS_2, /* SCOOP #2 */
63 GPIO79_nCS_3, /* NAND */
64 GPIO80_nCS_4, /* SCOOP #1 */
66 /* LCD - 16bpp Active TFT */
67 GPIOxx_LCD_TFT_16BPP,
69 /* PC Card */
70 GPIO48_nPOE,
71 GPIO49_nPWE,
72 GPIO50_nPIOR,
73 GPIO51_nPIOW,
74 GPIO85_nPCE_1,
75 GPIO54_nPCE_2,
76 GPIO55_nPREG,
77 GPIO56_nPWAIT,
78 GPIO57_nIOIS16,
79 GPIO104_PSKTSEL,
81 /* I2S */
82 GPIO28_I2S_BITCLK_OUT,
83 GPIO29_I2S_SDATA_IN,
84 GPIO30_I2S_SDATA_OUT,
85 GPIO31_I2S_SYNC,
87 /* MMC */
88 GPIO32_MMC_CLK,
89 GPIO112_MMC_CMD,
90 GPIO92_MMC_DAT_0,
91 GPIO109_MMC_DAT_1,
92 GPIO110_MMC_DAT_2,
93 GPIO111_MMC_DAT_3,
95 /* GPIOs */
96 GPIO9_GPIO, /* SPITZ_GPIO_nSD_DETECT */
97 GPIO16_GPIO, /* SPITZ_GPIO_SYNC */
98 GPIO81_GPIO, /* SPITZ_GPIO_nSD_WP */
99 GPIO41_GPIO, /* SPITZ_GPIO_USB_CONNECT */
100 GPIO37_GPIO, /* SPITZ_GPIO_USB_HOST */
101 GPIO35_GPIO, /* SPITZ_GPIO_USB_DEVICE */
102 GPIO22_GPIO, /* SPITZ_GPIO_HSYNC */
103 GPIO94_GPIO, /* SPITZ_GPIO_CF_CD */
104 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */
105 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */
107 /* GPIO matrix keypad */
108 GPIO88_GPIO, /* column 0 */
109 GPIO23_GPIO, /* column 1 */
110 GPIO24_GPIO, /* column 2 */
111 GPIO25_GPIO, /* column 3 */
112 GPIO26_GPIO, /* column 4 */
113 GPIO27_GPIO, /* column 5 */
114 GPIO52_GPIO, /* column 6 */
115 GPIO103_GPIO, /* column 7 */
116 GPIO107_GPIO, /* column 8 */
117 GPIO108_GPIO, /* column 9 */
118 GPIO114_GPIO, /* column 10 */
119 GPIO12_GPIO, /* row 0 */
120 GPIO17_GPIO, /* row 1 */
121 GPIO91_GPIO, /* row 2 */
122 GPIO34_GPIO, /* row 3 */
123 GPIO36_GPIO, /* row 4 */
124 GPIO38_GPIO, /* row 5 */
125 GPIO39_GPIO, /* row 6 */
127 /* I2C */
128 GPIO117_I2C_SCL,
129 GPIO118_I2C_SDA,
131 GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, /* SPITZ_GPIO_KEY_INT */
132 GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
136 /******************************************************************************
137 * Scoop GPIO expander
138 ******************************************************************************/
139 #if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
140 /* SCOOP Device #1 */
141 static struct resource spitz_scoop_1_resources[] = {
142 [0] = {
143 .start = 0x10800000,
144 .end = 0x10800fff,
145 .flags = IORESOURCE_MEM,
149 static struct scoop_config spitz_scoop_1_setup = {
150 .io_dir = SPITZ_SCP_IO_DIR,
151 .io_out = SPITZ_SCP_IO_OUT,
152 .suspend_clr = SPITZ_SCP_SUS_CLR,
153 .suspend_set = SPITZ_SCP_SUS_SET,
154 .gpio_base = SPITZ_SCP_GPIO_BASE,
157 struct platform_device spitz_scoop_1_device = {
158 .name = "sharp-scoop",
159 .id = 0,
160 .dev = {
161 .platform_data = &spitz_scoop_1_setup,
163 .num_resources = ARRAY_SIZE(spitz_scoop_1_resources),
164 .resource = spitz_scoop_1_resources,
167 /* SCOOP Device #2 */
168 static struct resource spitz_scoop_2_resources[] = {
169 [0] = {
170 .start = 0x08800040,
171 .end = 0x08800fff,
172 .flags = IORESOURCE_MEM,
176 static struct scoop_config spitz_scoop_2_setup = {
177 .io_dir = SPITZ_SCP2_IO_DIR,
178 .io_out = SPITZ_SCP2_IO_OUT,
179 .suspend_clr = SPITZ_SCP2_SUS_CLR,
180 .suspend_set = SPITZ_SCP2_SUS_SET,
181 .gpio_base = SPITZ_SCP2_GPIO_BASE,
184 struct platform_device spitz_scoop_2_device = {
185 .name = "sharp-scoop",
186 .id = 1,
187 .dev = {
188 .platform_data = &spitz_scoop_2_setup,
190 .num_resources = ARRAY_SIZE(spitz_scoop_2_resources),
191 .resource = spitz_scoop_2_resources,
194 static void __init spitz_scoop_init(void)
196 platform_device_register(&spitz_scoop_1_device);
198 /* Akita doesn't have the second SCOOP chip */
199 if (!machine_is_akita())
200 platform_device_register(&spitz_scoop_2_device);
203 /* Power control is shared with between one of the CF slots and SD */
204 static void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
206 unsigned short cpr;
207 unsigned long flags;
209 if (new_cpr & 0x7) {
210 gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
211 mdelay(5);
214 local_irq_save(flags);
216 cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR);
218 if (enable & new_cpr)
219 cpr |= new_cpr;
220 else
221 cpr &= ~enable;
223 write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr);
225 local_irq_restore(flags);
227 if (!(cpr & 0x7)) {
228 mdelay(1);
229 gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
233 #else
234 static inline void spitz_scoop_init(void) {}
235 static inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
236 #endif
238 /******************************************************************************
239 * PCMCIA
240 ******************************************************************************/
241 #if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
242 static void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
244 /* Only need to override behaviour for slot 0 */
245 if (nr == 0)
246 spitz_card_pwr_ctrl(
247 cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
248 else
249 write_scoop_reg(scoop, SCOOP_CPR, cpr);
252 static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
254 .dev = &spitz_scoop_1_device.dev,
255 .irq = SPITZ_IRQ_GPIO_CF_IRQ,
256 .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
257 .cd_irq_str = "PCMCIA0 CD",
258 }, {
259 .dev = &spitz_scoop_2_device.dev,
260 .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
261 .cd_irq = -1,
265 static struct scoop_pcmcia_config spitz_pcmcia_config = {
266 .devs = &spitz_pcmcia_scoop[0],
267 .num_devs = 2,
268 .power_ctrl = spitz_pcmcia_pwr,
271 static void __init spitz_pcmcia_init(void)
273 /* Akita has only one PCMCIA slot used */
274 if (machine_is_akita())
275 spitz_pcmcia_config.num_devs = 1;
277 platform_scoop_config = &spitz_pcmcia_config;
279 #else
280 static inline void spitz_pcmcia_init(void) {}
281 #endif
283 /******************************************************************************
284 * GPIO keyboard
285 ******************************************************************************/
286 #if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
288 #define SPITZ_KEY_CALENDAR KEY_F1
289 #define SPITZ_KEY_ADDRESS KEY_F2
290 #define SPITZ_KEY_FN KEY_F3
291 #define SPITZ_KEY_CANCEL KEY_F4
292 #define SPITZ_KEY_EXOK KEY_F5
293 #define SPITZ_KEY_EXCANCEL KEY_F6
294 #define SPITZ_KEY_EXJOGDOWN KEY_F7
295 #define SPITZ_KEY_EXJOGUP KEY_F8
296 #define SPITZ_KEY_JAP1 KEY_LEFTALT
297 #define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
298 #define SPITZ_KEY_SYNC KEY_F9
299 #define SPITZ_KEY_MAIL KEY_F10
300 #define SPITZ_KEY_OK KEY_F11
301 #define SPITZ_KEY_MENU KEY_F12
303 static const uint32_t spitz_keymap[] = {
304 KEY(0, 0, KEY_LEFTCTRL),
305 KEY(0, 1, KEY_1),
306 KEY(0, 2, KEY_3),
307 KEY(0, 3, KEY_5),
308 KEY(0, 4, KEY_6),
309 KEY(0, 5, KEY_7),
310 KEY(0, 6, KEY_9),
311 KEY(0, 7, KEY_0),
312 KEY(0, 8, KEY_BACKSPACE),
313 KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */
314 KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */
315 KEY(1, 1, KEY_2),
316 KEY(1, 2, KEY_4),
317 KEY(1, 3, KEY_R),
318 KEY(1, 4, KEY_Y),
319 KEY(1, 5, KEY_8),
320 KEY(1, 6, KEY_I),
321 KEY(1, 7, KEY_O),
322 KEY(1, 8, KEY_P),
323 KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */
324 KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */
325 KEY(2, 0, KEY_TAB),
326 KEY(2, 1, KEY_Q),
327 KEY(2, 2, KEY_E),
328 KEY(2, 3, KEY_T),
329 KEY(2, 4, KEY_G),
330 KEY(2, 5, KEY_U),
331 KEY(2, 6, KEY_J),
332 KEY(2, 7, KEY_K),
333 KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */
334 KEY(3, 1, KEY_W),
335 KEY(3, 2, KEY_S),
336 KEY(3, 3, KEY_F),
337 KEY(3, 4, KEY_V),
338 KEY(3, 5, KEY_H),
339 KEY(3, 6, KEY_M),
340 KEY(3, 7, KEY_L),
341 KEY(3, 9, KEY_RIGHTSHIFT),
342 KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */
343 KEY(4, 1, KEY_A),
344 KEY(4, 2, KEY_D),
345 KEY(4, 3, KEY_C),
346 KEY(4, 4, KEY_B),
347 KEY(4, 5, KEY_N),
348 KEY(4, 6, KEY_DOT),
349 KEY(4, 8, KEY_ENTER),
350 KEY(4, 9, KEY_LEFTSHIFT),
351 KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */
352 KEY(5, 1, KEY_Z),
353 KEY(5, 2, KEY_X),
354 KEY(5, 3, KEY_MINUS),
355 KEY(5, 4, KEY_SPACE),
356 KEY(5, 5, KEY_COMMA),
357 KEY(5, 7, KEY_UP),
358 KEY(5, 10, SPITZ_KEY_FN), /* FN */
359 KEY(6, 0, KEY_SYSRQ),
360 KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */
361 KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */
362 KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */
363 KEY(6, 4, SPITZ_KEY_OK), /* OK */
364 KEY(6, 5, SPITZ_KEY_MENU), /* MENU */
365 KEY(6, 6, KEY_LEFT),
366 KEY(6, 7, KEY_DOWN),
367 KEY(6, 8, KEY_RIGHT),
370 static const struct matrix_keymap_data spitz_keymap_data = {
371 .keymap = spitz_keymap,
372 .keymap_size = ARRAY_SIZE(spitz_keymap),
375 static const uint32_t spitz_row_gpios[] =
376 { 12, 17, 91, 34, 36, 38, 39 };
377 static const uint32_t spitz_col_gpios[] =
378 { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
380 static struct matrix_keypad_platform_data spitz_mkp_pdata = {
381 .keymap_data = &spitz_keymap_data,
382 .row_gpios = spitz_row_gpios,
383 .col_gpios = spitz_col_gpios,
384 .num_row_gpios = ARRAY_SIZE(spitz_row_gpios),
385 .num_col_gpios = ARRAY_SIZE(spitz_col_gpios),
386 .col_scan_delay_us = 10,
387 .debounce_ms = 10,
388 .wakeup = 1,
391 static struct platform_device spitz_mkp_device = {
392 .name = "matrix-keypad",
393 .id = -1,
394 .dev = {
395 .platform_data = &spitz_mkp_pdata,
399 static void __init spitz_mkp_init(void)
401 platform_device_register(&spitz_mkp_device);
403 #else
404 static inline void spitz_mkp_init(void) {}
405 #endif
407 /******************************************************************************
408 * GPIO keys
409 ******************************************************************************/
410 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
411 static struct gpio_keys_button spitz_gpio_keys[] = {
413 .type = EV_PWR,
414 .code = KEY_SUSPEND,
415 .gpio = SPITZ_GPIO_ON_KEY,
416 .desc = "On Off",
417 .wakeup = 1,
419 /* Two buttons detecting the lid state */
421 .type = EV_SW,
422 .code = 0,
423 .gpio = SPITZ_GPIO_SWA,
424 .desc = "Display Down",
427 .type = EV_SW,
428 .code = 1,
429 .gpio = SPITZ_GPIO_SWB,
430 .desc = "Lid Closed",
434 static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
435 .buttons = spitz_gpio_keys,
436 .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
439 static struct platform_device spitz_gpio_keys_device = {
440 .name = "gpio-keys",
441 .id = -1,
442 .dev = {
443 .platform_data = &spitz_gpio_keys_platform_data,
447 static void __init spitz_keys_init(void)
449 platform_device_register(&spitz_gpio_keys_device);
451 #else
452 static inline void spitz_keys_init(void) {}
453 #endif
455 /******************************************************************************
456 * LEDs
457 ******************************************************************************/
458 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
459 static struct gpio_led spitz_gpio_leds[] = {
461 .name = "spitz:amber:charge",
462 .default_trigger = "sharpsl-charge",
463 .gpio = SPITZ_GPIO_LED_ORANGE,
466 .name = "spitz:green:hddactivity",
467 .default_trigger = "ide-disk",
468 .gpio = SPITZ_GPIO_LED_GREEN,
472 static struct gpio_led_platform_data spitz_gpio_leds_info = {
473 .leds = spitz_gpio_leds,
474 .num_leds = ARRAY_SIZE(spitz_gpio_leds),
477 static struct platform_device spitz_led_device = {
478 .name = "leds-gpio",
479 .id = -1,
480 .dev = {
481 .platform_data = &spitz_gpio_leds_info,
485 static void __init spitz_leds_init(void)
487 platform_device_register(&spitz_led_device);
489 #else
490 static inline void spitz_leds_init(void) {}
491 #endif
493 /******************************************************************************
494 * SSP Devices
495 ******************************************************************************/
496 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
497 static void spitz_ads7846_wait_for_hsync(void)
499 while (gpio_get_value(SPITZ_GPIO_HSYNC))
500 cpu_relax();
502 while (!gpio_get_value(SPITZ_GPIO_HSYNC))
503 cpu_relax();
506 static struct ads7846_platform_data spitz_ads7846_info = {
507 .model = 7846,
508 .vref_delay_usecs = 100,
509 .x_plate_ohms = 419,
510 .y_plate_ohms = 486,
511 .pressure_max = 1024,
512 .gpio_pendown = SPITZ_GPIO_TP_INT,
513 .wait_for_sync = spitz_ads7846_wait_for_hsync,
516 static struct pxa2xx_spi_chip spitz_ads7846_chip = {
517 .gpio_cs = SPITZ_GPIO_ADS7846_CS,
520 static void spitz_bl_kick_battery(void)
522 void (*kick_batt)(void);
524 kick_batt = symbol_get(sharpsl_battery_kick);
525 if (kick_batt) {
526 kick_batt();
527 symbol_put(sharpsl_battery_kick);
531 static struct corgi_lcd_platform_data spitz_lcdcon_info = {
532 .init_mode = CORGI_LCD_MODE_VGA,
533 .max_intensity = 0x2f,
534 .default_intensity = 0x1f,
535 .limit_mask = 0x0b,
536 .gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT,
537 .gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON,
538 .kick_battery = spitz_bl_kick_battery,
541 static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
542 .gpio_cs = SPITZ_GPIO_LCDCON_CS,
545 static struct pxa2xx_spi_chip spitz_max1111_chip = {
546 .gpio_cs = SPITZ_GPIO_MAX1111_CS,
549 static struct spi_board_info spitz_spi_devices[] = {
551 .modalias = "ads7846",
552 .max_speed_hz = 1200000,
553 .bus_num = 2,
554 .chip_select = 0,
555 .platform_data = &spitz_ads7846_info,
556 .controller_data = &spitz_ads7846_chip,
557 .irq = PXA_GPIO_TO_IRQ(SPITZ_GPIO_TP_INT),
558 }, {
559 .modalias = "corgi-lcd",
560 .max_speed_hz = 50000,
561 .bus_num = 2,
562 .chip_select = 1,
563 .platform_data = &spitz_lcdcon_info,
564 .controller_data = &spitz_lcdcon_chip,
565 }, {
566 .modalias = "max1111",
567 .max_speed_hz = 450000,
568 .bus_num = 2,
569 .chip_select = 2,
570 .controller_data = &spitz_max1111_chip,
574 static struct pxa2xx_spi_master spitz_spi_info = {
575 .num_chipselect = 3,
578 static void __init spitz_spi_init(void)
580 struct corgi_lcd_platform_data *lcd_data = &spitz_lcdcon_info;
582 if (machine_is_akita()) {
583 lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
584 lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
587 pxa2xx_set_spi_info(2, &spitz_spi_info);
588 spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
590 #else
591 static inline void spitz_spi_init(void) {}
592 #endif
594 /******************************************************************************
595 * SD/MMC card controller
596 ******************************************************************************/
597 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
599 * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
600 * give the card a chance to fully insert/eject.
602 static int spitz_mci_setpower(struct device *dev, unsigned int vdd)
604 struct pxamci_platform_data* p_d = dev->platform_data;
606 if ((1 << vdd) & p_d->ocr_mask)
607 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
608 else
609 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
611 return 0;
614 static struct pxamci_platform_data spitz_mci_platform_data = {
615 .detect_delay_ms = 250,
616 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
617 .setpower = spitz_mci_setpower,
618 .gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
619 .gpio_card_ro = SPITZ_GPIO_nSD_WP,
620 .gpio_power = -1,
623 static void __init spitz_mmc_init(void)
625 pxa_set_mci_info(&spitz_mci_platform_data);
627 #else
628 static inline void spitz_mmc_init(void) {}
629 #endif
631 /******************************************************************************
632 * USB Host
633 ******************************************************************************/
634 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
635 static int spitz_ohci_init(struct device *dev)
637 int err;
639 err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST");
640 if (err)
641 return err;
643 /* Only Port 2 is connected, setup USB Port 2 Output Control Register */
644 UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
646 return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
649 static void spitz_ohci_exit(struct device *dev)
651 gpio_free(SPITZ_GPIO_USB_HOST);
654 static struct pxaohci_platform_data spitz_ohci_platform_data = {
655 .port_mode = PMM_NPS_MODE,
656 .init = spitz_ohci_init,
657 .exit = spitz_ohci_exit,
658 .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION,
659 .power_budget = 150,
662 static void __init spitz_uhc_init(void)
664 pxa_set_ohci_info(&spitz_ohci_platform_data);
666 #else
667 static inline void spitz_uhc_init(void) {}
668 #endif
670 /******************************************************************************
671 * IrDA
672 ******************************************************************************/
673 #if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
674 static struct pxaficp_platform_data spitz_ficp_platform_data = {
675 .transceiver_cap = IR_SIRMODE | IR_OFF,
678 static void __init spitz_irda_init(void)
680 if (machine_is_akita())
681 spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
682 else
683 spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
685 pxa_set_ficp_info(&spitz_ficp_platform_data);
687 #else
688 static inline void spitz_irda_init(void) {}
689 #endif
691 /******************************************************************************
692 * Framebuffer
693 ******************************************************************************/
694 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
695 static struct pxafb_mode_info spitz_pxafb_modes[] = {
697 .pixclock = 19231,
698 .xres = 480,
699 .yres = 640,
700 .bpp = 16,
701 .hsync_len = 40,
702 .left_margin = 46,
703 .right_margin = 125,
704 .vsync_len = 3,
705 .upper_margin = 1,
706 .lower_margin = 0,
707 .sync = 0,
708 }, {
709 .pixclock = 134617,
710 .xres = 240,
711 .yres = 320,
712 .bpp = 16,
713 .hsync_len = 20,
714 .left_margin = 20,
715 .right_margin = 46,
716 .vsync_len = 2,
717 .upper_margin = 1,
718 .lower_margin = 0,
719 .sync = 0,
723 static struct pxafb_mach_info spitz_pxafb_info = {
724 .modes = spitz_pxafb_modes,
725 .num_modes = ARRAY_SIZE(spitz_pxafb_modes),
726 .fixed_modes = 1,
727 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
730 static void __init spitz_lcd_init(void)
732 pxa_set_fb_info(NULL, &spitz_pxafb_info);
734 #else
735 static inline void spitz_lcd_init(void) {}
736 #endif
738 /******************************************************************************
739 * NAND Flash
740 ******************************************************************************/
741 #if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
742 static struct mtd_partition spitz_nand_partitions[] = {
744 .name = "System Area",
745 .offset = 0,
746 .size = 7 * 1024 * 1024,
747 }, {
748 .name = "Root Filesystem",
749 .offset = 7 * 1024 * 1024,
750 }, {
751 .name = "Home Filesystem",
752 .offset = MTDPART_OFS_APPEND,
753 .size = MTDPART_SIZ_FULL,
757 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
759 static struct nand_bbt_descr spitz_nand_bbt = {
760 .options = 0,
761 .offs = 4,
762 .len = 2,
763 .pattern = scan_ff_pattern
766 static struct nand_ecclayout akita_oobinfo = {
767 .oobfree = { {0x08, 0x09} },
768 .eccbytes = 24,
769 .eccpos = {
770 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
771 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
772 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
776 static struct sharpsl_nand_platform_data spitz_nand_pdata = {
777 .badblock_pattern = &spitz_nand_bbt,
778 .partitions = spitz_nand_partitions,
779 .nr_partitions = ARRAY_SIZE(spitz_nand_partitions),
782 static struct resource spitz_nand_resources[] = {
784 .start = PXA_CS3_PHYS,
785 .end = PXA_CS3_PHYS + SZ_4K - 1,
786 .flags = IORESOURCE_MEM,
790 static struct platform_device spitz_nand_device = {
791 .name = "sharpsl-nand",
792 .id = -1,
793 .resource = spitz_nand_resources,
794 .num_resources = ARRAY_SIZE(spitz_nand_resources),
795 .dev = {
796 .platform_data = &spitz_nand_pdata,
800 static void __init spitz_nand_init(void)
802 if (machine_is_spitz()) {
803 spitz_nand_partitions[1].size = 5 * 1024 * 1024;
804 } else if (machine_is_akita()) {
805 spitz_nand_partitions[1].size = 58 * 1024 * 1024;
806 spitz_nand_bbt.len = 1;
807 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
808 } else if (machine_is_borzoi()) {
809 spitz_nand_partitions[1].size = 32 * 1024 * 1024;
810 spitz_nand_bbt.len = 1;
811 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
814 platform_device_register(&spitz_nand_device);
816 #else
817 static inline void spitz_nand_init(void) {}
818 #endif
820 /******************************************************************************
821 * NOR Flash
822 ******************************************************************************/
823 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
824 static struct mtd_partition spitz_rom_parts[] = {
826 .name ="Boot PROM Filesystem",
827 .offset = 0x00140000,
828 .size = MTDPART_SIZ_FULL,
832 static struct physmap_flash_data spitz_rom_data = {
833 .width = 2,
834 .nr_parts = ARRAY_SIZE(spitz_rom_parts),
835 .parts = spitz_rom_parts,
838 static struct resource spitz_rom_resources[] = {
840 .start = PXA_CS0_PHYS,
841 .end = PXA_CS0_PHYS + SZ_8M - 1,
842 .flags = IORESOURCE_MEM,
846 static struct platform_device spitz_rom_device = {
847 .name = "physmap-flash",
848 .id = -1,
849 .resource = spitz_rom_resources,
850 .num_resources = ARRAY_SIZE(spitz_rom_resources),
851 .dev = {
852 .platform_data = &spitz_rom_data,
856 static void __init spitz_nor_init(void)
858 platform_device_register(&spitz_rom_device);
860 #else
861 static inline void spitz_nor_init(void) {}
862 #endif
864 /******************************************************************************
865 * I2C devices
866 ******************************************************************************/
867 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
868 static struct pca953x_platform_data akita_pca953x_pdata = {
869 .gpio_base = AKITA_IOEXP_GPIO_BASE,
872 static struct i2c_board_info spitz_i2c_devs[] = {
874 .type = "wm8750",
875 .addr = 0x1b,
876 }, {
877 .type = "max7310",
878 .addr = 0x18,
879 .platform_data = &akita_pca953x_pdata,
883 static struct regulator_consumer_supply isl6271a_consumers[] = {
884 REGULATOR_SUPPLY("vcc_core", NULL),
887 static struct regulator_init_data isl6271a_info[] = {
889 .constraints = {
890 .name = "vcc_core range",
891 .min_uV = 850000,
892 .max_uV = 1600000,
893 .always_on = 1,
894 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
896 .consumer_supplies = isl6271a_consumers,
897 .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers),
901 static struct i2c_board_info spitz_pi2c_devs[] = {
903 .type = "isl6271a",
904 .addr = 0x0c,
905 .platform_data = &isl6271a_info,
909 static void __init spitz_i2c_init(void)
911 int size = ARRAY_SIZE(spitz_i2c_devs);
913 /* Only Akita has the max7310 chip */
914 if (!machine_is_akita())
915 size--;
917 pxa_set_i2c_info(NULL);
918 pxa27x_set_i2c_power_info(NULL);
919 i2c_register_board_info(0, spitz_i2c_devs, size);
920 i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs));
922 #else
923 static inline void spitz_i2c_init(void) {}
924 #endif
926 /******************************************************************************
927 * Machine init
928 ******************************************************************************/
929 static void spitz_poweroff(void)
931 pxa_restart(REBOOT_GPIO, NULL);
934 static void spitz_restart(enum reboot_mode mode, const char *cmd)
936 uint32_t msc0 = __raw_readl(MSC0);
937 /* Bootloader magic for a reboot */
938 if ((msc0 & 0xffff0000) == 0x7ff00000)
939 __raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0);
941 spitz_poweroff();
944 static void __init spitz_init(void)
946 init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
947 pm_power_off = spitz_poweroff;
949 PMCR = 0x00;
951 /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
952 PCFR |= PCFR_OPDE;
954 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
956 pxa_set_ffuart_info(NULL);
957 pxa_set_btuart_info(NULL);
958 pxa_set_stuart_info(NULL);
960 spitz_spi_init();
961 spitz_scoop_init();
962 spitz_mkp_init();
963 spitz_keys_init();
964 spitz_leds_init();
965 spitz_mmc_init();
966 spitz_pcmcia_init();
967 spitz_irda_init();
968 spitz_uhc_init();
969 spitz_lcd_init();
970 spitz_nor_init();
971 spitz_nand_init();
972 spitz_i2c_init();
975 static void __init spitz_fixup(struct tag *tags, char **cmdline)
977 sharpsl_save_param();
978 memblock_add(0xa0000000, SZ_64M);
981 #ifdef CONFIG_MACH_SPITZ
982 MACHINE_START(SPITZ, "SHARP Spitz")
983 .fixup = spitz_fixup,
984 .map_io = pxa27x_map_io,
985 .nr_irqs = PXA_NR_IRQS,
986 .init_irq = pxa27x_init_irq,
987 .handle_irq = pxa27x_handle_irq,
988 .init_machine = spitz_init,
989 .init_time = pxa_timer_init,
990 .restart = spitz_restart,
991 MACHINE_END
992 #endif
994 #ifdef CONFIG_MACH_BORZOI
995 MACHINE_START(BORZOI, "SHARP Borzoi")
996 .fixup = spitz_fixup,
997 .map_io = pxa27x_map_io,
998 .nr_irqs = PXA_NR_IRQS,
999 .init_irq = pxa27x_init_irq,
1000 .handle_irq = pxa27x_handle_irq,
1001 .init_machine = spitz_init,
1002 .init_time = pxa_timer_init,
1003 .restart = spitz_restart,
1004 MACHINE_END
1005 #endif
1007 #ifdef CONFIG_MACH_AKITA
1008 MACHINE_START(AKITA, "SHARP Akita")
1009 .fixup = spitz_fixup,
1010 .map_io = pxa27x_map_io,
1011 .nr_irqs = PXA_NR_IRQS,
1012 .init_irq = pxa27x_init_irq,
1013 .handle_irq = pxa27x_handle_irq,
1014 .init_machine = spitz_init,
1015 .init_time = pxa_timer_init,
1016 .restart = spitz_restart,
1017 MACHINE_END
1018 #endif