tools, slub: Fix off-by-one buffer corruption after readlink() call
[linux-2.6/linux-mips.git] / arch / arm / mach-pxa / spitz.c
blob438c7b5e451f0a58db257abd339067da99ba1d65
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>
34 #include <asm/setup.h>
35 #include <asm/mach-types.h>
36 #include <asm/mach/arch.h>
37 #include <asm/mach/sharpsl_param.h>
38 #include <asm/hardware/scoop.h>
40 #include <mach/pxa27x.h>
41 #include <mach/pxa27x-udc.h>
42 #include <mach/reset.h>
43 #include <mach/irda.h>
44 #include <mach/mmc.h>
45 #include <mach/ohci.h>
46 #include <mach/pxafb.h>
47 #include <mach/spitz.h>
48 #include <mach/sharpsl_pm.h>
49 #include <mach/smemc.h>
51 #include "generic.h"
52 #include "devices.h"
54 /******************************************************************************
55 * Pin configuration
56 ******************************************************************************/
57 static unsigned long spitz_pin_config[] __initdata = {
58 /* Chip Selects */
59 GPIO78_nCS_2, /* SCOOP #2 */
60 GPIO79_nCS_3, /* NAND */
61 GPIO80_nCS_4, /* SCOOP #1 */
63 /* LCD - 16bpp Active TFT */
64 GPIOxx_LCD_TFT_16BPP,
66 /* PC Card */
67 GPIO48_nPOE,
68 GPIO49_nPWE,
69 GPIO50_nPIOR,
70 GPIO51_nPIOW,
71 GPIO85_nPCE_1,
72 GPIO54_nPCE_2,
73 GPIO55_nPREG,
74 GPIO56_nPWAIT,
75 GPIO57_nIOIS16,
76 GPIO104_PSKTSEL,
78 /* I2S */
79 GPIO28_I2S_BITCLK_OUT,
80 GPIO29_I2S_SDATA_IN,
81 GPIO30_I2S_SDATA_OUT,
82 GPIO31_I2S_SYNC,
84 /* MMC */
85 GPIO32_MMC_CLK,
86 GPIO112_MMC_CMD,
87 GPIO92_MMC_DAT_0,
88 GPIO109_MMC_DAT_1,
89 GPIO110_MMC_DAT_2,
90 GPIO111_MMC_DAT_3,
92 /* GPIOs */
93 GPIO9_GPIO, /* SPITZ_GPIO_nSD_DETECT */
94 GPIO16_GPIO, /* SPITZ_GPIO_SYNC */
95 GPIO81_GPIO, /* SPITZ_GPIO_nSD_WP */
96 GPIO41_GPIO, /* SPITZ_GPIO_USB_CONNECT */
97 GPIO37_GPIO, /* SPITZ_GPIO_USB_HOST */
98 GPIO35_GPIO, /* SPITZ_GPIO_USB_DEVICE */
99 GPIO22_GPIO, /* SPITZ_GPIO_HSYNC */
100 GPIO94_GPIO, /* SPITZ_GPIO_CF_CD */
101 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */
102 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */
104 /* GPIO matrix keypad */
105 GPIO88_GPIO, /* column 0 */
106 GPIO23_GPIO, /* column 1 */
107 GPIO24_GPIO, /* column 2 */
108 GPIO25_GPIO, /* column 3 */
109 GPIO26_GPIO, /* column 4 */
110 GPIO27_GPIO, /* column 5 */
111 GPIO52_GPIO, /* column 6 */
112 GPIO103_GPIO, /* column 7 */
113 GPIO107_GPIO, /* column 8 */
114 GPIO108_GPIO, /* column 9 */
115 GPIO114_GPIO, /* column 10 */
116 GPIO12_GPIO, /* row 0 */
117 GPIO17_GPIO, /* row 1 */
118 GPIO91_GPIO, /* row 2 */
119 GPIO34_GPIO, /* row 3 */
120 GPIO36_GPIO, /* row 4 */
121 GPIO38_GPIO, /* row 5 */
122 GPIO39_GPIO, /* row 6 */
124 /* I2C */
125 GPIO117_I2C_SCL,
126 GPIO118_I2C_SDA,
128 GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, /* SPITZ_GPIO_KEY_INT */
129 GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
133 /******************************************************************************
134 * Scoop GPIO expander
135 ******************************************************************************/
136 #if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
137 /* SCOOP Device #1 */
138 static struct resource spitz_scoop_1_resources[] = {
139 [0] = {
140 .start = 0x10800000,
141 .end = 0x10800fff,
142 .flags = IORESOURCE_MEM,
146 static struct scoop_config spitz_scoop_1_setup = {
147 .io_dir = SPITZ_SCP_IO_DIR,
148 .io_out = SPITZ_SCP_IO_OUT,
149 .suspend_clr = SPITZ_SCP_SUS_CLR,
150 .suspend_set = SPITZ_SCP_SUS_SET,
151 .gpio_base = SPITZ_SCP_GPIO_BASE,
154 struct platform_device spitz_scoop_1_device = {
155 .name = "sharp-scoop",
156 .id = 0,
157 .dev = {
158 .platform_data = &spitz_scoop_1_setup,
160 .num_resources = ARRAY_SIZE(spitz_scoop_1_resources),
161 .resource = spitz_scoop_1_resources,
164 /* SCOOP Device #2 */
165 static struct resource spitz_scoop_2_resources[] = {
166 [0] = {
167 .start = 0x08800040,
168 .end = 0x08800fff,
169 .flags = IORESOURCE_MEM,
173 static struct scoop_config spitz_scoop_2_setup = {
174 .io_dir = SPITZ_SCP2_IO_DIR,
175 .io_out = SPITZ_SCP2_IO_OUT,
176 .suspend_clr = SPITZ_SCP2_SUS_CLR,
177 .suspend_set = SPITZ_SCP2_SUS_SET,
178 .gpio_base = SPITZ_SCP2_GPIO_BASE,
181 struct platform_device spitz_scoop_2_device = {
182 .name = "sharp-scoop",
183 .id = 1,
184 .dev = {
185 .platform_data = &spitz_scoop_2_setup,
187 .num_resources = ARRAY_SIZE(spitz_scoop_2_resources),
188 .resource = spitz_scoop_2_resources,
191 static void __init spitz_scoop_init(void)
193 platform_device_register(&spitz_scoop_1_device);
195 /* Akita doesn't have the second SCOOP chip */
196 if (!machine_is_akita())
197 platform_device_register(&spitz_scoop_2_device);
200 /* Power control is shared with between one of the CF slots and SD */
201 static void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
203 unsigned short cpr;
204 unsigned long flags;
206 if (new_cpr & 0x7) {
207 gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
208 mdelay(5);
211 local_irq_save(flags);
213 cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR);
215 if (enable & new_cpr)
216 cpr |= new_cpr;
217 else
218 cpr &= ~enable;
220 write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr);
222 local_irq_restore(flags);
224 if (!(cpr & 0x7)) {
225 mdelay(1);
226 gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
230 #else
231 static inline void spitz_scoop_init(void) {}
232 static inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
233 #endif
235 /******************************************************************************
236 * PCMCIA
237 ******************************************************************************/
238 #if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
239 static void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
241 /* Only need to override behaviour for slot 0 */
242 if (nr == 0)
243 spitz_card_pwr_ctrl(
244 cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
245 else
246 write_scoop_reg(scoop, SCOOP_CPR, cpr);
249 static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
251 .dev = &spitz_scoop_1_device.dev,
252 .irq = SPITZ_IRQ_GPIO_CF_IRQ,
253 .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
254 .cd_irq_str = "PCMCIA0 CD",
255 }, {
256 .dev = &spitz_scoop_2_device.dev,
257 .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
258 .cd_irq = -1,
262 static struct scoop_pcmcia_config spitz_pcmcia_config = {
263 .devs = &spitz_pcmcia_scoop[0],
264 .num_devs = 2,
265 .power_ctrl = spitz_pcmcia_pwr,
268 static void __init spitz_pcmcia_init(void)
270 /* Akita has only one PCMCIA slot used */
271 if (machine_is_akita())
272 spitz_pcmcia_config.num_devs = 1;
274 platform_scoop_config = &spitz_pcmcia_config;
276 #else
277 static inline void spitz_pcmcia_init(void) {}
278 #endif
280 /******************************************************************************
281 * GPIO keyboard
282 ******************************************************************************/
283 #if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
285 #define SPITZ_KEY_CALENDAR KEY_F1
286 #define SPITZ_KEY_ADDRESS KEY_F2
287 #define SPITZ_KEY_FN KEY_F3
288 #define SPITZ_KEY_CANCEL KEY_F4
289 #define SPITZ_KEY_EXOK KEY_F5
290 #define SPITZ_KEY_EXCANCEL KEY_F6
291 #define SPITZ_KEY_EXJOGDOWN KEY_F7
292 #define SPITZ_KEY_EXJOGUP KEY_F8
293 #define SPITZ_KEY_JAP1 KEY_LEFTALT
294 #define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
295 #define SPITZ_KEY_SYNC KEY_F9
296 #define SPITZ_KEY_MAIL KEY_F10
297 #define SPITZ_KEY_OK KEY_F11
298 #define SPITZ_KEY_MENU KEY_F12
300 static const uint32_t spitz_keymap[] = {
301 KEY(0, 0, KEY_LEFTCTRL),
302 KEY(0, 1, KEY_1),
303 KEY(0, 2, KEY_3),
304 KEY(0, 3, KEY_5),
305 KEY(0, 4, KEY_6),
306 KEY(0, 5, KEY_7),
307 KEY(0, 6, KEY_9),
308 KEY(0, 7, KEY_0),
309 KEY(0, 8, KEY_BACKSPACE),
310 KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */
311 KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */
312 KEY(1, 1, KEY_2),
313 KEY(1, 2, KEY_4),
314 KEY(1, 3, KEY_R),
315 KEY(1, 4, KEY_Y),
316 KEY(1, 5, KEY_8),
317 KEY(1, 6, KEY_I),
318 KEY(1, 7, KEY_O),
319 KEY(1, 8, KEY_P),
320 KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */
321 KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */
322 KEY(2, 0, KEY_TAB),
323 KEY(2, 1, KEY_Q),
324 KEY(2, 2, KEY_E),
325 KEY(2, 3, KEY_T),
326 KEY(2, 4, KEY_G),
327 KEY(2, 5, KEY_U),
328 KEY(2, 6, KEY_J),
329 KEY(2, 7, KEY_K),
330 KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */
331 KEY(3, 1, KEY_W),
332 KEY(3, 2, KEY_S),
333 KEY(3, 3, KEY_F),
334 KEY(3, 4, KEY_V),
335 KEY(3, 5, KEY_H),
336 KEY(3, 6, KEY_M),
337 KEY(3, 7, KEY_L),
338 KEY(3, 9, KEY_RIGHTSHIFT),
339 KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */
340 KEY(4, 1, KEY_A),
341 KEY(4, 2, KEY_D),
342 KEY(4, 3, KEY_C),
343 KEY(4, 4, KEY_B),
344 KEY(4, 5, KEY_N),
345 KEY(4, 6, KEY_DOT),
346 KEY(4, 8, KEY_ENTER),
347 KEY(4, 9, KEY_LEFTSHIFT),
348 KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */
349 KEY(5, 1, KEY_Z),
350 KEY(5, 2, KEY_X),
351 KEY(5, 3, KEY_MINUS),
352 KEY(5, 4, KEY_SPACE),
353 KEY(5, 5, KEY_COMMA),
354 KEY(5, 7, KEY_UP),
355 KEY(5, 10, SPITZ_KEY_FN), /* FN */
356 KEY(6, 0, KEY_SYSRQ),
357 KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */
358 KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */
359 KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */
360 KEY(6, 4, SPITZ_KEY_OK), /* OK */
361 KEY(6, 5, SPITZ_KEY_MENU), /* MENU */
362 KEY(6, 6, KEY_LEFT),
363 KEY(6, 7, KEY_DOWN),
364 KEY(6, 8, KEY_RIGHT),
367 static const struct matrix_keymap_data spitz_keymap_data = {
368 .keymap = spitz_keymap,
369 .keymap_size = ARRAY_SIZE(spitz_keymap),
372 static const uint32_t spitz_row_gpios[] =
373 { 12, 17, 91, 34, 36, 38, 39 };
374 static const uint32_t spitz_col_gpios[] =
375 { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
377 static struct matrix_keypad_platform_data spitz_mkp_pdata = {
378 .keymap_data = &spitz_keymap_data,
379 .row_gpios = spitz_row_gpios,
380 .col_gpios = spitz_col_gpios,
381 .num_row_gpios = ARRAY_SIZE(spitz_row_gpios),
382 .num_col_gpios = ARRAY_SIZE(spitz_col_gpios),
383 .col_scan_delay_us = 10,
384 .debounce_ms = 10,
385 .wakeup = 1,
388 static struct platform_device spitz_mkp_device = {
389 .name = "matrix-keypad",
390 .id = -1,
391 .dev = {
392 .platform_data = &spitz_mkp_pdata,
396 static void __init spitz_mkp_init(void)
398 platform_device_register(&spitz_mkp_device);
400 #else
401 static inline void spitz_mkp_init(void) {}
402 #endif
404 /******************************************************************************
405 * GPIO keys
406 ******************************************************************************/
407 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
408 static struct gpio_keys_button spitz_gpio_keys[] = {
410 .type = EV_PWR,
411 .code = KEY_SUSPEND,
412 .gpio = SPITZ_GPIO_ON_KEY,
413 .desc = "On Off",
414 .wakeup = 1,
416 /* Two buttons detecting the lid state */
418 .type = EV_SW,
419 .code = 0,
420 .gpio = SPITZ_GPIO_SWA,
421 .desc = "Display Down",
424 .type = EV_SW,
425 .code = 1,
426 .gpio = SPITZ_GPIO_SWB,
427 .desc = "Lid Closed",
431 static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
432 .buttons = spitz_gpio_keys,
433 .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
436 static struct platform_device spitz_gpio_keys_device = {
437 .name = "gpio-keys",
438 .id = -1,
439 .dev = {
440 .platform_data = &spitz_gpio_keys_platform_data,
444 static void __init spitz_keys_init(void)
446 platform_device_register(&spitz_gpio_keys_device);
448 #else
449 static inline void spitz_keys_init(void) {}
450 #endif
452 /******************************************************************************
453 * LEDs
454 ******************************************************************************/
455 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
456 static struct gpio_led spitz_gpio_leds[] = {
458 .name = "spitz:amber:charge",
459 .default_trigger = "sharpsl-charge",
460 .gpio = SPITZ_GPIO_LED_ORANGE,
463 .name = "spitz:green:hddactivity",
464 .default_trigger = "ide-disk",
465 .gpio = SPITZ_GPIO_LED_GREEN,
469 static struct gpio_led_platform_data spitz_gpio_leds_info = {
470 .leds = spitz_gpio_leds,
471 .num_leds = ARRAY_SIZE(spitz_gpio_leds),
474 static struct platform_device spitz_led_device = {
475 .name = "leds-gpio",
476 .id = -1,
477 .dev = {
478 .platform_data = &spitz_gpio_leds_info,
482 static void __init spitz_leds_init(void)
484 platform_device_register(&spitz_led_device);
486 #else
487 static inline void spitz_leds_init(void) {}
488 #endif
490 /******************************************************************************
491 * SSP Devices
492 ******************************************************************************/
493 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
494 static void spitz_ads7846_wait_for_hsync(void)
496 while (gpio_get_value(SPITZ_GPIO_HSYNC))
497 cpu_relax();
499 while (!gpio_get_value(SPITZ_GPIO_HSYNC))
500 cpu_relax();
503 static struct ads7846_platform_data spitz_ads7846_info = {
504 .model = 7846,
505 .vref_delay_usecs = 100,
506 .x_plate_ohms = 419,
507 .y_plate_ohms = 486,
508 .pressure_max = 1024,
509 .gpio_pendown = SPITZ_GPIO_TP_INT,
510 .wait_for_sync = spitz_ads7846_wait_for_hsync,
513 static struct pxa2xx_spi_chip spitz_ads7846_chip = {
514 .gpio_cs = SPITZ_GPIO_ADS7846_CS,
517 static void spitz_bl_kick_battery(void)
519 void (*kick_batt)(void);
521 kick_batt = symbol_get(sharpsl_battery_kick);
522 if (kick_batt) {
523 kick_batt();
524 symbol_put(sharpsl_battery_kick);
528 static struct corgi_lcd_platform_data spitz_lcdcon_info = {
529 .init_mode = CORGI_LCD_MODE_VGA,
530 .max_intensity = 0x2f,
531 .default_intensity = 0x1f,
532 .limit_mask = 0x0b,
533 .gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT,
534 .gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON,
535 .kick_battery = spitz_bl_kick_battery,
538 static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
539 .gpio_cs = SPITZ_GPIO_LCDCON_CS,
542 static struct pxa2xx_spi_chip spitz_max1111_chip = {
543 .gpio_cs = SPITZ_GPIO_MAX1111_CS,
546 static struct spi_board_info spitz_spi_devices[] = {
548 .modalias = "ads7846",
549 .max_speed_hz = 1200000,
550 .bus_num = 2,
551 .chip_select = 0,
552 .platform_data = &spitz_ads7846_info,
553 .controller_data = &spitz_ads7846_chip,
554 .irq = gpio_to_irq(SPITZ_GPIO_TP_INT),
555 }, {
556 .modalias = "corgi-lcd",
557 .max_speed_hz = 50000,
558 .bus_num = 2,
559 .chip_select = 1,
560 .platform_data = &spitz_lcdcon_info,
561 .controller_data = &spitz_lcdcon_chip,
562 }, {
563 .modalias = "max1111",
564 .max_speed_hz = 450000,
565 .bus_num = 2,
566 .chip_select = 2,
567 .controller_data = &spitz_max1111_chip,
571 static struct pxa2xx_spi_master spitz_spi_info = {
572 .num_chipselect = 3,
575 static void __init spitz_spi_init(void)
577 struct corgi_lcd_platform_data *lcd_data = &spitz_lcdcon_info;
579 if (machine_is_akita()) {
580 lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
581 lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
584 pxa2xx_set_spi_info(2, &spitz_spi_info);
585 spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
587 #else
588 static inline void spitz_spi_init(void) {}
589 #endif
591 /******************************************************************************
592 * SD/MMC card controller
593 ******************************************************************************/
594 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
596 * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
597 * give the card a chance to fully insert/eject.
599 static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
601 struct pxamci_platform_data* p_d = dev->platform_data;
603 if ((1 << vdd) & p_d->ocr_mask)
604 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
605 else
606 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
609 static struct pxamci_platform_data spitz_mci_platform_data = {
610 .detect_delay_ms = 250,
611 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
612 .setpower = spitz_mci_setpower,
613 .gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
614 .gpio_card_ro = SPITZ_GPIO_nSD_WP,
615 .gpio_power = -1,
618 static void __init spitz_mmc_init(void)
620 pxa_set_mci_info(&spitz_mci_platform_data);
622 #else
623 static inline void spitz_mmc_init(void) {}
624 #endif
626 /******************************************************************************
627 * USB Host
628 ******************************************************************************/
629 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
630 static int spitz_ohci_init(struct device *dev)
632 int err;
634 err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST");
635 if (err)
636 return err;
638 /* Only Port 2 is connected, setup USB Port 2 Output Control Register */
639 UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
641 return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
644 static void spitz_ohci_exit(struct device *dev)
646 gpio_free(SPITZ_GPIO_USB_HOST);
649 static struct pxaohci_platform_data spitz_ohci_platform_data = {
650 .port_mode = PMM_NPS_MODE,
651 .init = spitz_ohci_init,
652 .exit = spitz_ohci_exit,
653 .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION,
654 .power_budget = 150,
657 static void __init spitz_uhc_init(void)
659 pxa_set_ohci_info(&spitz_ohci_platform_data);
661 #else
662 static inline void spitz_uhc_init(void) {}
663 #endif
665 /******************************************************************************
666 * IrDA
667 ******************************************************************************/
668 #if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
669 static struct pxaficp_platform_data spitz_ficp_platform_data = {
670 .transceiver_cap = IR_SIRMODE | IR_OFF,
673 static void __init spitz_irda_init(void)
675 if (machine_is_akita())
676 spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
677 else
678 spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
680 pxa_set_ficp_info(&spitz_ficp_platform_data);
682 #else
683 static inline void spitz_irda_init(void) {}
684 #endif
686 /******************************************************************************
687 * Framebuffer
688 ******************************************************************************/
689 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
690 static struct pxafb_mode_info spitz_pxafb_modes[] = {
692 .pixclock = 19231,
693 .xres = 480,
694 .yres = 640,
695 .bpp = 16,
696 .hsync_len = 40,
697 .left_margin = 46,
698 .right_margin = 125,
699 .vsync_len = 3,
700 .upper_margin = 1,
701 .lower_margin = 0,
702 .sync = 0,
703 }, {
704 .pixclock = 134617,
705 .xres = 240,
706 .yres = 320,
707 .bpp = 16,
708 .hsync_len = 20,
709 .left_margin = 20,
710 .right_margin = 46,
711 .vsync_len = 2,
712 .upper_margin = 1,
713 .lower_margin = 0,
714 .sync = 0,
718 static struct pxafb_mach_info spitz_pxafb_info = {
719 .modes = spitz_pxafb_modes,
720 .num_modes = ARRAY_SIZE(spitz_pxafb_modes),
721 .fixed_modes = 1,
722 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
725 static void __init spitz_lcd_init(void)
727 pxa_set_fb_info(NULL, &spitz_pxafb_info);
729 #else
730 static inline void spitz_lcd_init(void) {}
731 #endif
733 /******************************************************************************
734 * Framebuffer
735 ******************************************************************************/
736 #if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
737 static struct mtd_partition spitz_nand_partitions[] = {
739 .name = "System Area",
740 .offset = 0,
741 .size = 7 * 1024 * 1024,
742 }, {
743 .name = "Root Filesystem",
744 .offset = 7 * 1024 * 1024,
745 }, {
746 .name = "Home Filesystem",
747 .offset = MTDPART_OFS_APPEND,
748 .size = MTDPART_SIZ_FULL,
752 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
754 static struct nand_bbt_descr spitz_nand_bbt = {
755 .options = 0,
756 .offs = 4,
757 .len = 2,
758 .pattern = scan_ff_pattern
761 static struct nand_ecclayout akita_oobinfo = {
762 .oobfree = { {0x08, 0x09} },
763 .eccbytes = 24,
764 .eccpos = {
765 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
766 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
767 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
771 static struct sharpsl_nand_platform_data spitz_nand_pdata = {
772 .badblock_pattern = &spitz_nand_bbt,
773 .partitions = spitz_nand_partitions,
774 .nr_partitions = ARRAY_SIZE(spitz_nand_partitions),
777 static struct resource spitz_nand_resources[] = {
779 .start = PXA_CS3_PHYS,
780 .end = PXA_CS3_PHYS + SZ_4K - 1,
781 .flags = IORESOURCE_MEM,
785 static struct platform_device spitz_nand_device = {
786 .name = "sharpsl-nand",
787 .id = -1,
788 .resource = spitz_nand_resources,
789 .num_resources = ARRAY_SIZE(spitz_nand_resources),
790 .dev = {
791 .platform_data = &spitz_nand_pdata,
795 static void __init spitz_nand_init(void)
797 if (machine_is_spitz()) {
798 spitz_nand_partitions[1].size = 5 * 1024 * 1024;
799 } else if (machine_is_akita()) {
800 spitz_nand_partitions[1].size = 58 * 1024 * 1024;
801 spitz_nand_bbt.len = 1;
802 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
803 } else if (machine_is_borzoi()) {
804 spitz_nand_partitions[1].size = 32 * 1024 * 1024;
805 spitz_nand_bbt.len = 1;
806 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
809 platform_device_register(&spitz_nand_device);
811 #else
812 static inline void spitz_nand_init(void) {}
813 #endif
815 /******************************************************************************
816 * NOR Flash
817 ******************************************************************************/
818 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
819 static struct mtd_partition spitz_rom_parts[] = {
821 .name ="Boot PROM Filesystem",
822 .offset = 0x00140000,
823 .size = MTDPART_SIZ_FULL,
827 static struct physmap_flash_data spitz_rom_data = {
828 .width = 2,
829 .nr_parts = ARRAY_SIZE(spitz_rom_parts),
830 .parts = spitz_rom_parts,
833 static struct resource spitz_rom_resources[] = {
835 .start = PXA_CS0_PHYS,
836 .end = PXA_CS0_PHYS + SZ_8M - 1,
837 .flags = IORESOURCE_MEM,
841 static struct platform_device spitz_rom_device = {
842 .name = "physmap-flash",
843 .id = -1,
844 .resource = spitz_rom_resources,
845 .num_resources = ARRAY_SIZE(spitz_rom_resources),
846 .dev = {
847 .platform_data = &spitz_rom_data,
851 static void __init spitz_nor_init(void)
853 platform_device_register(&spitz_rom_device);
855 #else
856 static inline void spitz_nor_init(void) {}
857 #endif
859 /******************************************************************************
860 * GPIO expander
861 ******************************************************************************/
862 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
863 static struct pca953x_platform_data akita_pca953x_pdata = {
864 .gpio_base = AKITA_IOEXP_GPIO_BASE,
867 static struct i2c_board_info spitz_i2c_devs[] = {
869 .type = "wm8750",
870 .addr = 0x1b,
871 }, {
872 .type = "max7310",
873 .addr = 0x18,
874 .platform_data = &akita_pca953x_pdata,
878 static struct regulator_consumer_supply isl6271a_consumers[] = {
880 .supply = "vcc_core",
884 static struct regulator_init_data isl6271a_info[] = {
886 .constraints = {
887 .name = "vcc_core range",
888 .min_uV = 850000,
889 .max_uV = 1600000,
890 .always_on = 1,
891 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
893 .consumer_supplies = isl6271a_consumers,
894 .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers),
898 static struct i2c_board_info spitz_pi2c_devs[] = {
900 .type = "isl6271a",
901 .addr = 0x0c,
902 .platform_data = &isl6271a_info,
906 static void __init spitz_i2c_init(void)
908 int size = ARRAY_SIZE(spitz_i2c_devs);
910 /* Only Akita has the max7310 chip */
911 if (!machine_is_akita())
912 size--;
914 pxa_set_i2c_info(NULL);
915 pxa27x_set_i2c_power_info(NULL);
916 i2c_register_board_info(0, spitz_i2c_devs, size);
917 i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs));
919 #else
920 static inline void spitz_i2c_init(void) {}
921 #endif
923 /******************************************************************************
924 * Machine init
925 ******************************************************************************/
926 static void spitz_poweroff(void)
928 arm_machine_restart('g', NULL);
931 static void spitz_restart(char mode, const char *cmd)
933 uint32_t msc0 = __raw_readl(MSC0);
934 /* Bootloader magic for a reboot */
935 if ((msc0 & 0xffff0000) == 0x7ff00000)
936 __raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0);
938 spitz_poweroff();
941 static void __init spitz_init(void)
943 init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
944 pm_power_off = spitz_poweroff;
945 arm_pm_restart = spitz_restart;
947 PMCR = 0x00;
949 /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
950 PCFR |= PCFR_OPDE;
952 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
954 pxa_set_ffuart_info(NULL);
955 pxa_set_btuart_info(NULL);
956 pxa_set_stuart_info(NULL);
958 spitz_spi_init();
959 spitz_scoop_init();
960 spitz_mkp_init();
961 spitz_keys_init();
962 spitz_leds_init();
963 spitz_mmc_init();
964 spitz_pcmcia_init();
965 spitz_irda_init();
966 spitz_uhc_init();
967 spitz_lcd_init();
968 spitz_nor_init();
969 spitz_nand_init();
970 spitz_i2c_init();
973 static void __init spitz_fixup(struct machine_desc *desc,
974 struct tag *tags, char **cmdline, struct meminfo *mi)
976 sharpsl_save_param();
977 mi->nr_banks = 1;
978 mi->bank[0].start = 0xa0000000;
979 mi->bank[0].size = (64*1024*1024);
982 #ifdef CONFIG_MACH_SPITZ
983 MACHINE_START(SPITZ, "SHARP Spitz")
984 .fixup = spitz_fixup,
985 .map_io = pxa27x_map_io,
986 .init_irq = pxa27x_init_irq,
987 .handle_irq = pxa27x_handle_irq,
988 .init_machine = spitz_init,
989 .timer = &pxa_timer,
990 MACHINE_END
991 #endif
993 #ifdef CONFIG_MACH_BORZOI
994 MACHINE_START(BORZOI, "SHARP Borzoi")
995 .fixup = spitz_fixup,
996 .map_io = pxa27x_map_io,
997 .init_irq = pxa27x_init_irq,
998 .handle_irq = pxa27x_handle_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 .fixup = spitz_fixup,
1007 .map_io = pxa27x_map_io,
1008 .init_irq = pxa27x_init_irq,
1009 .handle_irq = pxa27x_handle_irq,
1010 .init_machine = spitz_init,
1011 .timer = &pxa_timer,
1012 MACHINE_END
1013 #endif