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/spi/pxa2xx_spi.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>
42 #include <mach/ohci.h>
43 #include <mach/pxafb.h>
44 #include <mach/spitz.h>
45 #include <mach/sharpsl_pm.h>
52 /******************************************************************************
54 ******************************************************************************/
55 static unsigned long spitz_pin_config[] __initdata = {
57 GPIO78_nCS_2, /* SCOOP #2 */
58 GPIO79_nCS_3, /* NAND */
59 GPIO80_nCS_4, /* SCOOP #1 */
61 /* LCD - 16bpp Active TFT */
77 GPIO28_I2S_BITCLK_OUT,
91 GPIO9_GPIO, /* SPITZ_GPIO_nSD_DETECT */
92 GPIO16_GPIO, /* SPITZ_GPIO_SYNC */
93 GPIO81_GPIO, /* SPITZ_GPIO_nSD_WP */
94 GPIO41_GPIO, /* SPITZ_GPIO_USB_CONNECT */
95 GPIO37_GPIO, /* SPITZ_GPIO_USB_HOST */
96 GPIO35_GPIO, /* SPITZ_GPIO_USB_DEVICE */
97 GPIO22_GPIO, /* SPITZ_GPIO_HSYNC */
98 GPIO94_GPIO, /* SPITZ_GPIO_CF_CD */
99 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */
100 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */
102 /* GPIO matrix keypad */
103 GPIO88_GPIO, /* column 0 */
104 GPIO23_GPIO, /* column 1 */
105 GPIO24_GPIO, /* column 2 */
106 GPIO25_GPIO, /* column 3 */
107 GPIO26_GPIO, /* column 4 */
108 GPIO27_GPIO, /* column 5 */
109 GPIO52_GPIO, /* column 6 */
110 GPIO103_GPIO, /* column 7 */
111 GPIO107_GPIO, /* column 8 */
112 GPIO108_GPIO, /* column 9 */
113 GPIO114_GPIO, /* column 10 */
114 GPIO12_GPIO, /* row 0 */
115 GPIO17_GPIO, /* row 1 */
116 GPIO91_GPIO, /* row 2 */
117 GPIO34_GPIO, /* row 3 */
118 GPIO36_GPIO, /* row 4 */
119 GPIO38_GPIO, /* row 5 */
120 GPIO39_GPIO, /* row 6 */
126 GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, /* SPITZ_GPIO_KEY_INT */
127 GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
131 /******************************************************************************
132 * Scoop GPIO expander
133 ******************************************************************************/
134 #if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
135 /* SCOOP Device #1 */
136 static struct resource spitz_scoop_1_resources[] = {
140 .flags = IORESOURCE_MEM,
144 static struct scoop_config spitz_scoop_1_setup = {
145 .io_dir = SPITZ_SCP_IO_DIR,
146 .io_out = SPITZ_SCP_IO_OUT,
147 .suspend_clr = SPITZ_SCP_SUS_CLR,
148 .suspend_set = SPITZ_SCP_SUS_SET,
149 .gpio_base = SPITZ_SCP_GPIO_BASE,
152 struct platform_device spitz_scoop_1_device = {
153 .name = "sharp-scoop",
156 .platform_data = &spitz_scoop_1_setup,
158 .num_resources = ARRAY_SIZE(spitz_scoop_1_resources),
159 .resource = spitz_scoop_1_resources,
162 /* SCOOP Device #2 */
163 static struct resource spitz_scoop_2_resources[] = {
167 .flags = IORESOURCE_MEM,
171 static struct scoop_config spitz_scoop_2_setup = {
172 .io_dir = SPITZ_SCP2_IO_DIR,
173 .io_out = SPITZ_SCP2_IO_OUT,
174 .suspend_clr = SPITZ_SCP2_SUS_CLR,
175 .suspend_set = SPITZ_SCP2_SUS_SET,
176 .gpio_base = SPITZ_SCP2_GPIO_BASE,
179 struct platform_device spitz_scoop_2_device = {
180 .name = "sharp-scoop",
183 .platform_data = &spitz_scoop_2_setup,
185 .num_resources = ARRAY_SIZE(spitz_scoop_2_resources),
186 .resource = spitz_scoop_2_resources,
189 static void __init spitz_scoop_init(void)
191 platform_device_register(&spitz_scoop_1_device);
193 /* Akita doesn't have the second SCOOP chip */
194 if (!machine_is_akita())
195 platform_device_register(&spitz_scoop_2_device);
198 /* Power control is shared with between one of the CF slots and SD */
199 static void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
205 gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
209 local_irq_save(flags);
211 cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR);
213 if (enable & new_cpr)
218 write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr);
220 local_irq_restore(flags);
224 gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
229 static inline void spitz_scoop_init(void) {}
230 static inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
233 /******************************************************************************
235 ******************************************************************************/
236 #if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
237 static void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
239 /* Only need to override behaviour for slot 0 */
242 cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
244 write_scoop_reg(scoop, SCOOP_CPR, cpr);
247 static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
249 .dev = &spitz_scoop_1_device.dev,
250 .irq = SPITZ_IRQ_GPIO_CF_IRQ,
251 .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
252 .cd_irq_str = "PCMCIA0 CD",
254 .dev = &spitz_scoop_2_device.dev,
255 .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
260 static struct scoop_pcmcia_config spitz_pcmcia_config = {
261 .devs = &spitz_pcmcia_scoop[0],
263 .power_ctrl = spitz_pcmcia_pwr,
266 static void __init spitz_pcmcia_init(void)
268 /* Akita has only one PCMCIA slot used */
269 if (machine_is_akita())
270 spitz_pcmcia_config.num_devs = 1;
272 platform_scoop_config = &spitz_pcmcia_config;
275 static inline void spitz_pcmcia_init(void) {}
278 /******************************************************************************
280 ******************************************************************************/
281 #if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
283 #define SPITZ_KEY_CALENDAR KEY_F1
284 #define SPITZ_KEY_ADDRESS KEY_F2
285 #define SPITZ_KEY_FN KEY_F3
286 #define SPITZ_KEY_CANCEL KEY_F4
287 #define SPITZ_KEY_EXOK KEY_F5
288 #define SPITZ_KEY_EXCANCEL KEY_F6
289 #define SPITZ_KEY_EXJOGDOWN KEY_F7
290 #define SPITZ_KEY_EXJOGUP KEY_F8
291 #define SPITZ_KEY_JAP1 KEY_LEFTALT
292 #define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
293 #define SPITZ_KEY_SYNC KEY_F9
294 #define SPITZ_KEY_MAIL KEY_F10
295 #define SPITZ_KEY_OK KEY_F11
296 #define SPITZ_KEY_MENU KEY_F12
298 static const uint32_t spitz_keymap[] = {
299 KEY(0, 0, KEY_LEFTCTRL),
307 KEY(0, 8, KEY_BACKSPACE),
308 KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */
309 KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */
318 KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */
319 KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */
328 KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */
336 KEY(3, 9, KEY_RIGHTSHIFT),
337 KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */
344 KEY(4, 8, KEY_ENTER),
345 KEY(4, 9, KEY_LEFTSHIFT),
346 KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */
349 KEY(5, 3, KEY_MINUS),
350 KEY(5, 4, KEY_SPACE),
351 KEY(5, 5, KEY_COMMA),
353 KEY(5, 10, SPITZ_KEY_FN), /* FN */
354 KEY(6, 0, KEY_SYSRQ),
355 KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */
356 KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */
357 KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */
358 KEY(6, 4, SPITZ_KEY_OK), /* OK */
359 KEY(6, 5, SPITZ_KEY_MENU), /* MENU */
362 KEY(6, 8, KEY_RIGHT),
365 static const struct matrix_keymap_data spitz_keymap_data = {
366 .keymap = spitz_keymap,
367 .keymap_size = ARRAY_SIZE(spitz_keymap),
370 static const uint32_t spitz_row_gpios[] =
371 { 12, 17, 91, 34, 36, 38, 39 };
372 static const uint32_t spitz_col_gpios[] =
373 { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
375 static struct matrix_keypad_platform_data spitz_mkp_pdata = {
376 .keymap_data = &spitz_keymap_data,
377 .row_gpios = spitz_row_gpios,
378 .col_gpios = spitz_col_gpios,
379 .num_row_gpios = ARRAY_SIZE(spitz_row_gpios),
380 .num_col_gpios = ARRAY_SIZE(spitz_col_gpios),
381 .col_scan_delay_us = 10,
386 static struct platform_device spitz_mkp_device = {
387 .name = "matrix-keypad",
390 .platform_data = &spitz_mkp_pdata,
394 static void __init spitz_mkp_init(void)
396 platform_device_register(&spitz_mkp_device);
399 static inline void spitz_mkp_init(void) {}
402 /******************************************************************************
404 ******************************************************************************/
405 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
406 static struct gpio_keys_button spitz_gpio_keys[] = {
410 .gpio = SPITZ_GPIO_ON_KEY,
414 /* Two buttons detecting the lid state */
418 .gpio = SPITZ_GPIO_SWA,
419 .desc = "Display Down",
424 .gpio = SPITZ_GPIO_SWB,
425 .desc = "Lid Closed",
429 static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
430 .buttons = spitz_gpio_keys,
431 .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
434 static struct platform_device spitz_gpio_keys_device = {
438 .platform_data = &spitz_gpio_keys_platform_data,
442 static void __init spitz_keys_init(void)
444 platform_device_register(&spitz_gpio_keys_device);
447 static inline void spitz_keys_init(void) {}
450 /******************************************************************************
452 ******************************************************************************/
453 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
454 static struct gpio_led spitz_gpio_leds[] = {
456 .name = "spitz:amber:charge",
457 .default_trigger = "sharpsl-charge",
458 .gpio = SPITZ_GPIO_LED_ORANGE,
461 .name = "spitz:green:hddactivity",
462 .default_trigger = "ide-disk",
463 .gpio = SPITZ_GPIO_LED_GREEN,
467 static struct gpio_led_platform_data spitz_gpio_leds_info = {
468 .leds = spitz_gpio_leds,
469 .num_leds = ARRAY_SIZE(spitz_gpio_leds),
472 static struct platform_device spitz_led_device = {
476 .platform_data = &spitz_gpio_leds_info,
480 static void __init spitz_leds_init(void)
482 platform_device_register(&spitz_led_device);
485 static inline void spitz_leds_init(void) {}
488 /******************************************************************************
490 ******************************************************************************/
491 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
492 static void spitz_ads7846_wait_for_hsync(void)
494 while (gpio_get_value(SPITZ_GPIO_HSYNC))
497 while (!gpio_get_value(SPITZ_GPIO_HSYNC))
501 static struct ads7846_platform_data spitz_ads7846_info = {
503 .vref_delay_usecs = 100,
506 .pressure_max = 1024,
507 .gpio_pendown = SPITZ_GPIO_TP_INT,
508 .wait_for_sync = spitz_ads7846_wait_for_hsync,
511 static struct pxa2xx_spi_chip spitz_ads7846_chip = {
512 .gpio_cs = SPITZ_GPIO_ADS7846_CS,
515 static void spitz_bl_kick_battery(void)
517 void (*kick_batt)(void);
519 kick_batt = symbol_get(sharpsl_battery_kick);
522 symbol_put(sharpsl_battery_kick);
526 static struct corgi_lcd_platform_data spitz_lcdcon_info = {
527 .init_mode = CORGI_LCD_MODE_VGA,
528 .max_intensity = 0x2f,
529 .default_intensity = 0x1f,
531 .gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT,
532 .gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON,
533 .kick_battery = spitz_bl_kick_battery,
536 static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
537 .gpio_cs = SPITZ_GPIO_LCDCON_CS,
540 static struct pxa2xx_spi_chip spitz_max1111_chip = {
541 .gpio_cs = SPITZ_GPIO_MAX1111_CS,
544 static struct spi_board_info spitz_spi_devices[] = {
546 .modalias = "ads7846",
547 .max_speed_hz = 1200000,
550 .platform_data = &spitz_ads7846_info,
551 .controller_data = &spitz_ads7846_chip,
552 .irq = gpio_to_irq(SPITZ_GPIO_TP_INT),
554 .modalias = "corgi-lcd",
555 .max_speed_hz = 50000,
558 .platform_data = &spitz_lcdcon_info,
559 .controller_data = &spitz_lcdcon_chip,
561 .modalias = "max1111",
562 .max_speed_hz = 450000,
565 .controller_data = &spitz_max1111_chip,
569 static struct pxa2xx_spi_master spitz_spi_info = {
573 static void __init spitz_spi_init(void)
575 struct corgi_lcd_platform_data *lcd_data = &spitz_lcdcon_info;
577 if (machine_is_akita()) {
578 lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
579 lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
582 pxa2xx_set_spi_info(2, &spitz_spi_info);
583 spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
586 static inline void spitz_spi_init(void) {}
589 /******************************************************************************
590 * SD/MMC card controller
591 ******************************************************************************/
592 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
594 * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
595 * give the card a chance to fully insert/eject.
597 static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
599 struct pxamci_platform_data* p_d = dev->platform_data;
601 if ((1 << vdd) & p_d->ocr_mask)
602 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
604 spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
607 static struct pxamci_platform_data spitz_mci_platform_data = {
608 .detect_delay_ms = 250,
609 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
610 .setpower = spitz_mci_setpower,
611 .gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
612 .gpio_card_ro = SPITZ_GPIO_nSD_WP,
616 static void __init spitz_mmc_init(void)
618 pxa_set_mci_info(&spitz_mci_platform_data);
621 static inline void spitz_mmc_init(void) {}
624 /******************************************************************************
626 ******************************************************************************/
627 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
628 static int spitz_ohci_init(struct device *dev)
632 err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST");
636 /* Only Port 2 is connected, setup USB Port 2 Output Control Register */
637 UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
639 return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
642 static void spitz_ohci_exit(struct device *dev)
644 gpio_free(SPITZ_GPIO_USB_HOST);
647 static struct pxaohci_platform_data spitz_ohci_platform_data = {
648 .port_mode = PMM_NPS_MODE,
649 .init = spitz_ohci_init,
650 .exit = spitz_ohci_exit,
651 .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION,
655 static void __init spitz_uhc_init(void)
657 pxa_set_ohci_info(&spitz_ohci_platform_data);
660 static inline void spitz_uhc_init(void) {}
663 /******************************************************************************
665 ******************************************************************************/
666 #if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
667 static struct pxaficp_platform_data spitz_ficp_platform_data = {
668 .transceiver_cap = IR_SIRMODE | IR_OFF,
671 static void __init spitz_irda_init(void)
673 if (machine_is_akita())
674 spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
676 spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
678 pxa_set_ficp_info(&spitz_ficp_platform_data);
681 static inline void spitz_irda_init(void) {}
684 /******************************************************************************
686 ******************************************************************************/
687 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
688 static struct pxafb_mode_info spitz_pxafb_modes[] = {
716 static struct pxafb_mach_info spitz_pxafb_info = {
717 .modes = spitz_pxafb_modes,
718 .num_modes = ARRAY_SIZE(spitz_pxafb_modes),
720 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
723 static void __init spitz_lcd_init(void)
725 set_pxa_fb_info(&spitz_pxafb_info);
728 static inline void spitz_lcd_init(void) {}
731 /******************************************************************************
733 ******************************************************************************/
734 #if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
735 static struct mtd_partition spitz_nand_partitions[] = {
737 .name = "System Area",
739 .size = 7 * 1024 * 1024,
741 .name = "Root Filesystem",
742 .offset = 7 * 1024 * 1024,
744 .name = "Home Filesystem",
745 .offset = MTDPART_OFS_APPEND,
746 .size = MTDPART_SIZ_FULL,
750 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
752 static struct nand_bbt_descr spitz_nand_bbt = {
756 .pattern = scan_ff_pattern
759 static struct nand_ecclayout akita_oobinfo = {
760 .oobfree = { {0x08, 0x09} },
763 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
764 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
765 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
769 static struct sharpsl_nand_platform_data spitz_nand_pdata = {
770 .badblock_pattern = &spitz_nand_bbt,
771 .partitions = spitz_nand_partitions,
772 .nr_partitions = ARRAY_SIZE(spitz_nand_partitions),
775 static struct resource spitz_nand_resources[] = {
777 .start = PXA_CS3_PHYS,
778 .end = PXA_CS3_PHYS + SZ_4K - 1,
779 .flags = IORESOURCE_MEM,
783 static struct platform_device spitz_nand_device = {
784 .name = "sharpsl-nand",
786 .resource = spitz_nand_resources,
787 .num_resources = ARRAY_SIZE(spitz_nand_resources),
789 .platform_data = &spitz_nand_pdata,
793 static void __init spitz_nand_init(void)
795 if (machine_is_spitz()) {
796 spitz_nand_partitions[1].size = 5 * 1024 * 1024;
797 } else if (machine_is_akita()) {
798 spitz_nand_partitions[1].size = 58 * 1024 * 1024;
799 spitz_nand_bbt.len = 1;
800 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
801 } else if (machine_is_borzoi()) {
802 spitz_nand_partitions[1].size = 32 * 1024 * 1024;
803 spitz_nand_bbt.len = 1;
804 spitz_nand_pdata.ecc_layout = &akita_oobinfo;
807 platform_device_register(&spitz_nand_device);
810 static inline void spitz_nand_init(void) {}
813 /******************************************************************************
815 ******************************************************************************/
816 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
817 static struct mtd_partition spitz_rom_parts[] = {
819 .name ="Boot PROM Filesystem",
820 .offset = 0x00140000,
821 .size = MTDPART_SIZ_FULL,
825 static struct physmap_flash_data spitz_rom_data = {
827 .nr_parts = ARRAY_SIZE(spitz_rom_parts),
828 .parts = spitz_rom_parts,
831 static struct resource spitz_rom_resources[] = {
833 .start = PXA_CS0_PHYS,
834 .end = PXA_CS0_PHYS + SZ_8M - 1,
835 .flags = IORESOURCE_MEM,
839 static struct platform_device spitz_rom_device = {
840 .name = "physmap-flash",
842 .resource = spitz_rom_resources,
843 .num_resources = ARRAY_SIZE(spitz_rom_resources),
845 .platform_data = &spitz_rom_data,
849 static void __init spitz_nor_init(void)
851 platform_device_register(&spitz_rom_device);
854 static inline void spitz_nor_init(void) {}
857 /******************************************************************************
859 ******************************************************************************/
860 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
861 static struct pca953x_platform_data akita_pca953x_pdata = {
862 .gpio_base = AKITA_IOEXP_GPIO_BASE,
865 static struct i2c_board_info spitz_i2c_devs[] = {
872 .platform_data = &akita_pca953x_pdata,
876 static struct regulator_consumer_supply isl6271a_consumers[] = {
878 .supply = "vcc_core",
882 static struct regulator_init_data isl6271a_info[] = {
885 .name = "vcc_core range",
889 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
891 .consumer_supplies = isl6271a_consumers,
892 .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers),
896 static struct i2c_board_info spitz_pi2c_devs[] = {
900 .platform_data = &isl6271a_info,
904 static void __init spitz_i2c_init(void)
906 int size = ARRAY_SIZE(spitz_i2c_devs);
908 /* Only Akita has the max7310 chip */
909 if (!machine_is_akita())
912 pxa_set_i2c_info(NULL);
913 pxa27x_set_i2c_power_info(NULL);
914 i2c_register_board_info(0, spitz_i2c_devs, size);
915 i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs));
918 static inline void spitz_i2c_init(void) {}
921 /******************************************************************************
923 ******************************************************************************/
924 static void spitz_poweroff(void)
926 arm_machine_restart('g', NULL);
929 static void spitz_restart(char mode, const char *cmd)
931 /* Bootloader magic for a reboot */
932 if ((MSC0 & 0xffff0000) == 0x7ff00000)
933 MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
938 static void __init spitz_init(void)
940 init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
941 pm_power_off = spitz_poweroff;
942 arm_pm_restart = spitz_restart;
946 /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
949 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
951 pxa_set_ffuart_info(NULL);
952 pxa_set_btuart_info(NULL);
953 pxa_set_stuart_info(NULL);
970 static void __init spitz_fixup(struct machine_desc *desc,
971 struct tag *tags, char **cmdline, struct meminfo *mi)
973 sharpsl_save_param();
975 mi->bank[0].start = 0xa0000000;
976 mi->bank[0].size = (64*1024*1024);
979 #ifdef CONFIG_MACH_SPITZ
980 MACHINE_START(SPITZ, "SHARP Spitz")
981 .fixup = spitz_fixup,
982 .map_io = pxa_map_io,
983 .init_irq = pxa27x_init_irq,
984 .init_machine = spitz_init,
989 #ifdef CONFIG_MACH_BORZOI
990 MACHINE_START(BORZOI, "SHARP Borzoi")
991 .fixup = spitz_fixup,
992 .map_io = pxa_map_io,
993 .init_irq = pxa27x_init_irq,
994 .init_machine = spitz_init,
999 #ifdef CONFIG_MACH_AKITA
1000 MACHINE_START(AKITA, "SHARP Akita")
1001 .fixup = spitz_fixup,
1002 .map_io = pxa_map_io,
1003 .init_irq = pxa27x_init_irq,
1004 .init_machine = spitz_init,
1005 .timer = &pxa_timer,