162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Support for Sharp SL-Cxx00 Series of PDAs 462306a36Sopenharmony_ci * Models: SL-C3000 (Spitz), SL-C1000 (Akita) and SL-C3100 (Borzoi) 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (c) 2005 Richard Purdie 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Based on Sharp's 2.4 kernel patches/lubbock.c 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/platform_device.h> 1362306a36Sopenharmony_ci#include <linux/delay.h> 1462306a36Sopenharmony_ci#include <linux/gpio_keys.h> 1562306a36Sopenharmony_ci#include <linux/gpio.h> 1662306a36Sopenharmony_ci#include <linux/gpio/machine.h> 1762306a36Sopenharmony_ci#include <linux/leds.h> 1862306a36Sopenharmony_ci#include <linux/i2c.h> 1962306a36Sopenharmony_ci#include <linux/platform_data/i2c-pxa.h> 2062306a36Sopenharmony_ci#include <linux/platform_data/pca953x.h> 2162306a36Sopenharmony_ci#include <linux/spi/spi.h> 2262306a36Sopenharmony_ci#include <linux/spi/ads7846.h> 2362306a36Sopenharmony_ci#include <linux/spi/corgi_lcd.h> 2462306a36Sopenharmony_ci#include <linux/spi/pxa2xx_spi.h> 2562306a36Sopenharmony_ci#include <linux/mtd/sharpsl.h> 2662306a36Sopenharmony_ci#include <linux/mtd/physmap.h> 2762306a36Sopenharmony_ci#include <linux/input-event-codes.h> 2862306a36Sopenharmony_ci#include <linux/input/matrix_keypad.h> 2962306a36Sopenharmony_ci#include <linux/regulator/machine.h> 3062306a36Sopenharmony_ci#include <linux/io.h> 3162306a36Sopenharmony_ci#include <linux/reboot.h> 3262306a36Sopenharmony_ci#include <linux/memblock.h> 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#include <asm/setup.h> 3562306a36Sopenharmony_ci#include <asm/mach-types.h> 3662306a36Sopenharmony_ci#include <asm/mach/arch.h> 3762306a36Sopenharmony_ci#include <asm/mach/sharpsl_param.h> 3862306a36Sopenharmony_ci#include <asm/hardware/scoop.h> 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#include "pxa27x.h" 4162306a36Sopenharmony_ci#include "pxa27x-udc.h" 4262306a36Sopenharmony_ci#include "reset.h" 4362306a36Sopenharmony_ci#include <linux/platform_data/mmc-pxamci.h> 4462306a36Sopenharmony_ci#include <linux/platform_data/usb-ohci-pxa27x.h> 4562306a36Sopenharmony_ci#include <linux/platform_data/video-pxafb.h> 4662306a36Sopenharmony_ci#include "spitz.h" 4762306a36Sopenharmony_ci#include "sharpsl_pm.h" 4862306a36Sopenharmony_ci#include "smemc.h" 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#include "generic.h" 5162306a36Sopenharmony_ci#include "devices.h" 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/****************************************************************************** 5462306a36Sopenharmony_ci * Pin configuration 5562306a36Sopenharmony_ci ******************************************************************************/ 5662306a36Sopenharmony_cistatic unsigned long spitz_pin_config[] __initdata = { 5762306a36Sopenharmony_ci /* Chip Selects */ 5862306a36Sopenharmony_ci GPIO78_nCS_2, /* SCOOP #2 */ 5962306a36Sopenharmony_ci GPIO79_nCS_3, /* NAND */ 6062306a36Sopenharmony_ci GPIO80_nCS_4, /* SCOOP #1 */ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci /* LCD - 16bpp Active TFT */ 6362306a36Sopenharmony_ci GPIOxx_LCD_TFT_16BPP, 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci /* PC Card */ 6662306a36Sopenharmony_ci GPIO48_nPOE, 6762306a36Sopenharmony_ci GPIO49_nPWE, 6862306a36Sopenharmony_ci GPIO50_nPIOR, 6962306a36Sopenharmony_ci GPIO51_nPIOW, 7062306a36Sopenharmony_ci GPIO85_nPCE_1, 7162306a36Sopenharmony_ci GPIO54_nPCE_2, 7262306a36Sopenharmony_ci GPIO55_nPREG, 7362306a36Sopenharmony_ci GPIO56_nPWAIT, 7462306a36Sopenharmony_ci GPIO57_nIOIS16, 7562306a36Sopenharmony_ci GPIO104_PSKTSEL, 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci /* I2S */ 7862306a36Sopenharmony_ci GPIO28_I2S_BITCLK_OUT, 7962306a36Sopenharmony_ci GPIO29_I2S_SDATA_IN, 8062306a36Sopenharmony_ci GPIO30_I2S_SDATA_OUT, 8162306a36Sopenharmony_ci GPIO31_I2S_SYNC, 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci /* MMC */ 8462306a36Sopenharmony_ci GPIO32_MMC_CLK, 8562306a36Sopenharmony_ci GPIO112_MMC_CMD, 8662306a36Sopenharmony_ci GPIO92_MMC_DAT_0, 8762306a36Sopenharmony_ci GPIO109_MMC_DAT_1, 8862306a36Sopenharmony_ci GPIO110_MMC_DAT_2, 8962306a36Sopenharmony_ci GPIO111_MMC_DAT_3, 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* GPIOs */ 9262306a36Sopenharmony_ci GPIO9_GPIO, /* SPITZ_GPIO_nSD_DETECT */ 9362306a36Sopenharmony_ci GPIO16_GPIO, /* SPITZ_GPIO_SYNC */ 9462306a36Sopenharmony_ci GPIO81_GPIO, /* SPITZ_GPIO_nSD_WP */ 9562306a36Sopenharmony_ci GPIO41_GPIO, /* SPITZ_GPIO_USB_CONNECT */ 9662306a36Sopenharmony_ci GPIO37_GPIO, /* SPITZ_GPIO_USB_HOST */ 9762306a36Sopenharmony_ci GPIO35_GPIO, /* SPITZ_GPIO_USB_DEVICE */ 9862306a36Sopenharmony_ci GPIO22_GPIO, /* SPITZ_GPIO_HSYNC */ 9962306a36Sopenharmony_ci GPIO94_GPIO, /* SPITZ_GPIO_CF_CD */ 10062306a36Sopenharmony_ci GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */ 10162306a36Sopenharmony_ci GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */ 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci /* GPIO matrix keypad */ 10462306a36Sopenharmony_ci GPIO88_GPIO, /* column 0 */ 10562306a36Sopenharmony_ci GPIO23_GPIO, /* column 1 */ 10662306a36Sopenharmony_ci GPIO24_GPIO, /* column 2 */ 10762306a36Sopenharmony_ci GPIO25_GPIO, /* column 3 */ 10862306a36Sopenharmony_ci GPIO26_GPIO, /* column 4 */ 10962306a36Sopenharmony_ci GPIO27_GPIO, /* column 5 */ 11062306a36Sopenharmony_ci GPIO52_GPIO, /* column 6 */ 11162306a36Sopenharmony_ci GPIO103_GPIO, /* column 7 */ 11262306a36Sopenharmony_ci GPIO107_GPIO, /* column 8 */ 11362306a36Sopenharmony_ci GPIO108_GPIO, /* column 9 */ 11462306a36Sopenharmony_ci GPIO114_GPIO, /* column 10 */ 11562306a36Sopenharmony_ci GPIO12_GPIO, /* row 0 */ 11662306a36Sopenharmony_ci GPIO17_GPIO, /* row 1 */ 11762306a36Sopenharmony_ci GPIO91_GPIO, /* row 2 */ 11862306a36Sopenharmony_ci GPIO34_GPIO, /* row 3 */ 11962306a36Sopenharmony_ci GPIO36_GPIO, /* row 4 */ 12062306a36Sopenharmony_ci GPIO38_GPIO, /* row 5 */ 12162306a36Sopenharmony_ci GPIO39_GPIO, /* row 6 */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci /* I2C */ 12462306a36Sopenharmony_ci GPIO117_I2C_SCL, 12562306a36Sopenharmony_ci GPIO118_I2C_SDA, 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, /* SPITZ_GPIO_KEY_INT */ 12862306a36Sopenharmony_ci GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */ 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci/****************************************************************************** 13362306a36Sopenharmony_ci * Scoop GPIO expander 13462306a36Sopenharmony_ci ******************************************************************************/ 13562306a36Sopenharmony_ci#if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE) 13662306a36Sopenharmony_ci/* SCOOP Device #1 */ 13762306a36Sopenharmony_cistatic struct resource spitz_scoop_1_resources[] = { 13862306a36Sopenharmony_ci [0] = { 13962306a36Sopenharmony_ci .start = 0x10800000, 14062306a36Sopenharmony_ci .end = 0x10800fff, 14162306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 14262306a36Sopenharmony_ci }, 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic struct scoop_config spitz_scoop_1_setup = { 14662306a36Sopenharmony_ci .io_dir = SPITZ_SCP_IO_DIR, 14762306a36Sopenharmony_ci .io_out = SPITZ_SCP_IO_OUT, 14862306a36Sopenharmony_ci .suspend_clr = SPITZ_SCP_SUS_CLR, 14962306a36Sopenharmony_ci .suspend_set = SPITZ_SCP_SUS_SET, 15062306a36Sopenharmony_ci .gpio_base = SPITZ_SCP_GPIO_BASE, 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistruct platform_device spitz_scoop_1_device = { 15462306a36Sopenharmony_ci .name = "sharp-scoop", 15562306a36Sopenharmony_ci .id = 0, 15662306a36Sopenharmony_ci .dev = { 15762306a36Sopenharmony_ci .platform_data = &spitz_scoop_1_setup, 15862306a36Sopenharmony_ci }, 15962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(spitz_scoop_1_resources), 16062306a36Sopenharmony_ci .resource = spitz_scoop_1_resources, 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci/* SCOOP Device #2 */ 16462306a36Sopenharmony_cistatic struct resource spitz_scoop_2_resources[] = { 16562306a36Sopenharmony_ci [0] = { 16662306a36Sopenharmony_ci .start = 0x08800040, 16762306a36Sopenharmony_ci .end = 0x08800fff, 16862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 16962306a36Sopenharmony_ci }, 17062306a36Sopenharmony_ci}; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_cistatic struct scoop_config spitz_scoop_2_setup = { 17362306a36Sopenharmony_ci .io_dir = SPITZ_SCP2_IO_DIR, 17462306a36Sopenharmony_ci .io_out = SPITZ_SCP2_IO_OUT, 17562306a36Sopenharmony_ci .suspend_clr = SPITZ_SCP2_SUS_CLR, 17662306a36Sopenharmony_ci .suspend_set = SPITZ_SCP2_SUS_SET, 17762306a36Sopenharmony_ci .gpio_base = SPITZ_SCP2_GPIO_BASE, 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistruct platform_device spitz_scoop_2_device = { 18162306a36Sopenharmony_ci .name = "sharp-scoop", 18262306a36Sopenharmony_ci .id = 1, 18362306a36Sopenharmony_ci .dev = { 18462306a36Sopenharmony_ci .platform_data = &spitz_scoop_2_setup, 18562306a36Sopenharmony_ci }, 18662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(spitz_scoop_2_resources), 18762306a36Sopenharmony_ci .resource = spitz_scoop_2_resources, 18862306a36Sopenharmony_ci}; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic void __init spitz_scoop_init(void) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci platform_device_register(&spitz_scoop_1_device); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci /* Akita doesn't have the second SCOOP chip */ 19562306a36Sopenharmony_ci if (!machine_is_akita()) 19662306a36Sopenharmony_ci platform_device_register(&spitz_scoop_2_device); 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/* Power control is shared with between one of the CF slots and SD */ 20062306a36Sopenharmony_cistatic void __maybe_unused spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci unsigned short cpr; 20362306a36Sopenharmony_ci unsigned long flags; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci if (new_cpr & 0x7) { 20662306a36Sopenharmony_ci gpio_set_value(SPITZ_GPIO_CF_POWER, 1); 20762306a36Sopenharmony_ci mdelay(5); 20862306a36Sopenharmony_ci } 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci local_irq_save(flags); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci if (enable & new_cpr) 21562306a36Sopenharmony_ci cpr |= new_cpr; 21662306a36Sopenharmony_ci else 21762306a36Sopenharmony_ci cpr &= ~enable; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr); 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci local_irq_restore(flags); 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci if (!(cpr & 0x7)) { 22462306a36Sopenharmony_ci mdelay(1); 22562306a36Sopenharmony_ci gpio_set_value(SPITZ_GPIO_CF_POWER, 0); 22662306a36Sopenharmony_ci } 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci#else 23062306a36Sopenharmony_cistatic inline void spitz_scoop_init(void) {} 23162306a36Sopenharmony_cistatic inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {} 23262306a36Sopenharmony_ci#endif 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/****************************************************************************** 23562306a36Sopenharmony_ci * PCMCIA 23662306a36Sopenharmony_ci ******************************************************************************/ 23762306a36Sopenharmony_ci#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) 23862306a36Sopenharmony_cistatic void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci /* Only need to override behaviour for slot 0 */ 24162306a36Sopenharmony_ci if (nr == 0) 24262306a36Sopenharmony_ci spitz_card_pwr_ctrl( 24362306a36Sopenharmony_ci cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr); 24462306a36Sopenharmony_ci else 24562306a36Sopenharmony_ci write_scoop_reg(scoop, SCOOP_CPR, cpr); 24662306a36Sopenharmony_ci} 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = { 24962306a36Sopenharmony_ci { 25062306a36Sopenharmony_ci .dev = &spitz_scoop_1_device.dev, 25162306a36Sopenharmony_ci .irq = SPITZ_IRQ_GPIO_CF_IRQ, 25262306a36Sopenharmony_ci .cd_irq = SPITZ_IRQ_GPIO_CF_CD, 25362306a36Sopenharmony_ci .cd_irq_str = "PCMCIA0 CD", 25462306a36Sopenharmony_ci }, { 25562306a36Sopenharmony_ci .dev = &spitz_scoop_2_device.dev, 25662306a36Sopenharmony_ci .irq = SPITZ_IRQ_GPIO_CF2_IRQ, 25762306a36Sopenharmony_ci .cd_irq = -1, 25862306a36Sopenharmony_ci }, 25962306a36Sopenharmony_ci}; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic struct scoop_pcmcia_config spitz_pcmcia_config = { 26262306a36Sopenharmony_ci .devs = &spitz_pcmcia_scoop[0], 26362306a36Sopenharmony_ci .num_devs = 2, 26462306a36Sopenharmony_ci .power_ctrl = spitz_pcmcia_pwr, 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic void __init spitz_pcmcia_init(void) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci /* Akita has only one PCMCIA slot used */ 27062306a36Sopenharmony_ci if (machine_is_akita()) 27162306a36Sopenharmony_ci spitz_pcmcia_config.num_devs = 1; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci platform_scoop_config = &spitz_pcmcia_config; 27462306a36Sopenharmony_ci} 27562306a36Sopenharmony_ci#else 27662306a36Sopenharmony_cistatic inline void spitz_pcmcia_init(void) {} 27762306a36Sopenharmony_ci#endif 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/****************************************************************************** 28062306a36Sopenharmony_ci * GPIO keyboard 28162306a36Sopenharmony_ci ******************************************************************************/ 28262306a36Sopenharmony_ci#if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE) 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci#define SPITZ_KEY_CALENDAR KEY_F1 28562306a36Sopenharmony_ci#define SPITZ_KEY_ADDRESS KEY_F2 28662306a36Sopenharmony_ci#define SPITZ_KEY_FN KEY_F3 28762306a36Sopenharmony_ci#define SPITZ_KEY_CANCEL KEY_F4 28862306a36Sopenharmony_ci#define SPITZ_KEY_EXOK KEY_F5 28962306a36Sopenharmony_ci#define SPITZ_KEY_EXCANCEL KEY_F6 29062306a36Sopenharmony_ci#define SPITZ_KEY_EXJOGDOWN KEY_F7 29162306a36Sopenharmony_ci#define SPITZ_KEY_EXJOGUP KEY_F8 29262306a36Sopenharmony_ci#define SPITZ_KEY_JAP1 KEY_LEFTALT 29362306a36Sopenharmony_ci#define SPITZ_KEY_JAP2 KEY_RIGHTCTRL 29462306a36Sopenharmony_ci#define SPITZ_KEY_SYNC KEY_F9 29562306a36Sopenharmony_ci#define SPITZ_KEY_MAIL KEY_F10 29662306a36Sopenharmony_ci#define SPITZ_KEY_OK KEY_F11 29762306a36Sopenharmony_ci#define SPITZ_KEY_MENU KEY_F12 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cistatic const uint32_t spitz_keymap[] = { 30062306a36Sopenharmony_ci KEY(0, 0, KEY_LEFTCTRL), 30162306a36Sopenharmony_ci KEY(0, 1, KEY_1), 30262306a36Sopenharmony_ci KEY(0, 2, KEY_3), 30362306a36Sopenharmony_ci KEY(0, 3, KEY_5), 30462306a36Sopenharmony_ci KEY(0, 4, KEY_6), 30562306a36Sopenharmony_ci KEY(0, 5, KEY_7), 30662306a36Sopenharmony_ci KEY(0, 6, KEY_9), 30762306a36Sopenharmony_ci KEY(0, 7, KEY_0), 30862306a36Sopenharmony_ci KEY(0, 8, KEY_BACKSPACE), 30962306a36Sopenharmony_ci KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */ 31062306a36Sopenharmony_ci KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */ 31162306a36Sopenharmony_ci KEY(1, 1, KEY_2), 31262306a36Sopenharmony_ci KEY(1, 2, KEY_4), 31362306a36Sopenharmony_ci KEY(1, 3, KEY_R), 31462306a36Sopenharmony_ci KEY(1, 4, KEY_Y), 31562306a36Sopenharmony_ci KEY(1, 5, KEY_8), 31662306a36Sopenharmony_ci KEY(1, 6, KEY_I), 31762306a36Sopenharmony_ci KEY(1, 7, KEY_O), 31862306a36Sopenharmony_ci KEY(1, 8, KEY_P), 31962306a36Sopenharmony_ci KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */ 32062306a36Sopenharmony_ci KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */ 32162306a36Sopenharmony_ci KEY(2, 0, KEY_TAB), 32262306a36Sopenharmony_ci KEY(2, 1, KEY_Q), 32362306a36Sopenharmony_ci KEY(2, 2, KEY_E), 32462306a36Sopenharmony_ci KEY(2, 3, KEY_T), 32562306a36Sopenharmony_ci KEY(2, 4, KEY_G), 32662306a36Sopenharmony_ci KEY(2, 5, KEY_U), 32762306a36Sopenharmony_ci KEY(2, 6, KEY_J), 32862306a36Sopenharmony_ci KEY(2, 7, KEY_K), 32962306a36Sopenharmony_ci KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */ 33062306a36Sopenharmony_ci KEY(3, 1, KEY_W), 33162306a36Sopenharmony_ci KEY(3, 2, KEY_S), 33262306a36Sopenharmony_ci KEY(3, 3, KEY_F), 33362306a36Sopenharmony_ci KEY(3, 4, KEY_V), 33462306a36Sopenharmony_ci KEY(3, 5, KEY_H), 33562306a36Sopenharmony_ci KEY(3, 6, KEY_M), 33662306a36Sopenharmony_ci KEY(3, 7, KEY_L), 33762306a36Sopenharmony_ci KEY(3, 9, KEY_RIGHTSHIFT), 33862306a36Sopenharmony_ci KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */ 33962306a36Sopenharmony_ci KEY(4, 1, KEY_A), 34062306a36Sopenharmony_ci KEY(4, 2, KEY_D), 34162306a36Sopenharmony_ci KEY(4, 3, KEY_C), 34262306a36Sopenharmony_ci KEY(4, 4, KEY_B), 34362306a36Sopenharmony_ci KEY(4, 5, KEY_N), 34462306a36Sopenharmony_ci KEY(4, 6, KEY_DOT), 34562306a36Sopenharmony_ci KEY(4, 8, KEY_ENTER), 34662306a36Sopenharmony_ci KEY(4, 9, KEY_LEFTSHIFT), 34762306a36Sopenharmony_ci KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */ 34862306a36Sopenharmony_ci KEY(5, 1, KEY_Z), 34962306a36Sopenharmony_ci KEY(5, 2, KEY_X), 35062306a36Sopenharmony_ci KEY(5, 3, KEY_MINUS), 35162306a36Sopenharmony_ci KEY(5, 4, KEY_SPACE), 35262306a36Sopenharmony_ci KEY(5, 5, KEY_COMMA), 35362306a36Sopenharmony_ci KEY(5, 7, KEY_UP), 35462306a36Sopenharmony_ci KEY(5, 10, SPITZ_KEY_FN), /* FN */ 35562306a36Sopenharmony_ci KEY(6, 0, KEY_SYSRQ), 35662306a36Sopenharmony_ci KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */ 35762306a36Sopenharmony_ci KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */ 35862306a36Sopenharmony_ci KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */ 35962306a36Sopenharmony_ci KEY(6, 4, SPITZ_KEY_OK), /* OK */ 36062306a36Sopenharmony_ci KEY(6, 5, SPITZ_KEY_MENU), /* MENU */ 36162306a36Sopenharmony_ci KEY(6, 6, KEY_LEFT), 36262306a36Sopenharmony_ci KEY(6, 7, KEY_DOWN), 36362306a36Sopenharmony_ci KEY(6, 8, KEY_RIGHT), 36462306a36Sopenharmony_ci}; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic const struct matrix_keymap_data spitz_keymap_data = { 36762306a36Sopenharmony_ci .keymap = spitz_keymap, 36862306a36Sopenharmony_ci .keymap_size = ARRAY_SIZE(spitz_keymap), 36962306a36Sopenharmony_ci}; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic const uint32_t spitz_row_gpios[] = 37262306a36Sopenharmony_ci { 12, 17, 91, 34, 36, 38, 39 }; 37362306a36Sopenharmony_cistatic const uint32_t spitz_col_gpios[] = 37462306a36Sopenharmony_ci { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 }; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic struct matrix_keypad_platform_data spitz_mkp_pdata = { 37762306a36Sopenharmony_ci .keymap_data = &spitz_keymap_data, 37862306a36Sopenharmony_ci .row_gpios = spitz_row_gpios, 37962306a36Sopenharmony_ci .col_gpios = spitz_col_gpios, 38062306a36Sopenharmony_ci .num_row_gpios = ARRAY_SIZE(spitz_row_gpios), 38162306a36Sopenharmony_ci .num_col_gpios = ARRAY_SIZE(spitz_col_gpios), 38262306a36Sopenharmony_ci .col_scan_delay_us = 10, 38362306a36Sopenharmony_ci .debounce_ms = 10, 38462306a36Sopenharmony_ci .wakeup = 1, 38562306a36Sopenharmony_ci}; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_cistatic struct platform_device spitz_mkp_device = { 38862306a36Sopenharmony_ci .name = "matrix-keypad", 38962306a36Sopenharmony_ci .id = -1, 39062306a36Sopenharmony_ci .dev = { 39162306a36Sopenharmony_ci .platform_data = &spitz_mkp_pdata, 39262306a36Sopenharmony_ci }, 39362306a36Sopenharmony_ci}; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic void __init spitz_mkp_init(void) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci platform_device_register(&spitz_mkp_device); 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci#else 40062306a36Sopenharmony_cistatic inline void spitz_mkp_init(void) {} 40162306a36Sopenharmony_ci#endif 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci/****************************************************************************** 40462306a36Sopenharmony_ci * GPIO keys 40562306a36Sopenharmony_ci ******************************************************************************/ 40662306a36Sopenharmony_ci#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 40762306a36Sopenharmony_cistatic struct gpio_keys_button spitz_gpio_keys[] = { 40862306a36Sopenharmony_ci { 40962306a36Sopenharmony_ci .type = EV_PWR, 41062306a36Sopenharmony_ci .code = KEY_SUSPEND, 41162306a36Sopenharmony_ci .gpio = SPITZ_GPIO_ON_KEY, 41262306a36Sopenharmony_ci .desc = "On Off", 41362306a36Sopenharmony_ci .wakeup = 1, 41462306a36Sopenharmony_ci }, 41562306a36Sopenharmony_ci /* Two buttons detecting the lid state */ 41662306a36Sopenharmony_ci { 41762306a36Sopenharmony_ci .type = EV_SW, 41862306a36Sopenharmony_ci .code = 0, 41962306a36Sopenharmony_ci .gpio = SPITZ_GPIO_SWA, 42062306a36Sopenharmony_ci .desc = "Display Down", 42162306a36Sopenharmony_ci }, 42262306a36Sopenharmony_ci { 42362306a36Sopenharmony_ci .type = EV_SW, 42462306a36Sopenharmony_ci .code = 1, 42562306a36Sopenharmony_ci .gpio = SPITZ_GPIO_SWB, 42662306a36Sopenharmony_ci .desc = "Lid Closed", 42762306a36Sopenharmony_ci }, 42862306a36Sopenharmony_ci}; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_cistatic struct gpio_keys_platform_data spitz_gpio_keys_platform_data = { 43162306a36Sopenharmony_ci .buttons = spitz_gpio_keys, 43262306a36Sopenharmony_ci .nbuttons = ARRAY_SIZE(spitz_gpio_keys), 43362306a36Sopenharmony_ci}; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistatic struct platform_device spitz_gpio_keys_device = { 43662306a36Sopenharmony_ci .name = "gpio-keys", 43762306a36Sopenharmony_ci .id = -1, 43862306a36Sopenharmony_ci .dev = { 43962306a36Sopenharmony_ci .platform_data = &spitz_gpio_keys_platform_data, 44062306a36Sopenharmony_ci }, 44162306a36Sopenharmony_ci}; 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistatic void __init spitz_keys_init(void) 44462306a36Sopenharmony_ci{ 44562306a36Sopenharmony_ci platform_device_register(&spitz_gpio_keys_device); 44662306a36Sopenharmony_ci} 44762306a36Sopenharmony_ci#else 44862306a36Sopenharmony_cistatic inline void spitz_keys_init(void) {} 44962306a36Sopenharmony_ci#endif 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci/****************************************************************************** 45262306a36Sopenharmony_ci * LEDs 45362306a36Sopenharmony_ci ******************************************************************************/ 45462306a36Sopenharmony_ci#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 45562306a36Sopenharmony_cistatic struct gpio_led spitz_gpio_leds[] = { 45662306a36Sopenharmony_ci { 45762306a36Sopenharmony_ci .name = "spitz:amber:charge", 45862306a36Sopenharmony_ci .default_trigger = "sharpsl-charge", 45962306a36Sopenharmony_ci .gpio = SPITZ_GPIO_LED_ORANGE, 46062306a36Sopenharmony_ci }, 46162306a36Sopenharmony_ci { 46262306a36Sopenharmony_ci .name = "spitz:green:hddactivity", 46362306a36Sopenharmony_ci .default_trigger = "disk-activity", 46462306a36Sopenharmony_ci .gpio = SPITZ_GPIO_LED_GREEN, 46562306a36Sopenharmony_ci }, 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistatic struct gpio_led_platform_data spitz_gpio_leds_info = { 46962306a36Sopenharmony_ci .leds = spitz_gpio_leds, 47062306a36Sopenharmony_ci .num_leds = ARRAY_SIZE(spitz_gpio_leds), 47162306a36Sopenharmony_ci}; 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_cistatic struct platform_device spitz_led_device = { 47462306a36Sopenharmony_ci .name = "leds-gpio", 47562306a36Sopenharmony_ci .id = -1, 47662306a36Sopenharmony_ci .dev = { 47762306a36Sopenharmony_ci .platform_data = &spitz_gpio_leds_info, 47862306a36Sopenharmony_ci }, 47962306a36Sopenharmony_ci}; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_cistatic void __init spitz_leds_init(void) 48262306a36Sopenharmony_ci{ 48362306a36Sopenharmony_ci platform_device_register(&spitz_led_device); 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci#else 48662306a36Sopenharmony_cistatic inline void spitz_leds_init(void) {} 48762306a36Sopenharmony_ci#endif 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci/****************************************************************************** 49062306a36Sopenharmony_ci * SSP Devices 49162306a36Sopenharmony_ci ******************************************************************************/ 49262306a36Sopenharmony_ci#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE) 49362306a36Sopenharmony_cistatic void spitz_ads7846_wait_for_hsync(void) 49462306a36Sopenharmony_ci{ 49562306a36Sopenharmony_ci while (gpio_get_value(SPITZ_GPIO_HSYNC)) 49662306a36Sopenharmony_ci cpu_relax(); 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci while (!gpio_get_value(SPITZ_GPIO_HSYNC)) 49962306a36Sopenharmony_ci cpu_relax(); 50062306a36Sopenharmony_ci} 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_cistatic struct ads7846_platform_data spitz_ads7846_info = { 50362306a36Sopenharmony_ci .model = 7846, 50462306a36Sopenharmony_ci .vref_delay_usecs = 100, 50562306a36Sopenharmony_ci .x_plate_ohms = 419, 50662306a36Sopenharmony_ci .y_plate_ohms = 486, 50762306a36Sopenharmony_ci .pressure_max = 1024, 50862306a36Sopenharmony_ci .wait_for_sync = spitz_ads7846_wait_for_hsync, 50962306a36Sopenharmony_ci}; 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_cistatic struct gpiod_lookup_table spitz_ads7846_gpio_table = { 51262306a36Sopenharmony_ci .dev_id = "spi2.0", 51362306a36Sopenharmony_ci .table = { 51462306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_TP_INT, 51562306a36Sopenharmony_ci "pendown", GPIO_ACTIVE_LOW), 51662306a36Sopenharmony_ci { } 51762306a36Sopenharmony_ci }, 51862306a36Sopenharmony_ci}; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_cistatic struct gpiod_lookup_table spitz_lcdcon_gpio_table = { 52162306a36Sopenharmony_ci .dev_id = "spi2.1", 52262306a36Sopenharmony_ci .table = { 52362306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_CONT, 52462306a36Sopenharmony_ci "BL_CONT", GPIO_ACTIVE_LOW), 52562306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_ON, 52662306a36Sopenharmony_ci "BL_ON", GPIO_ACTIVE_HIGH), 52762306a36Sopenharmony_ci { }, 52862306a36Sopenharmony_ci }, 52962306a36Sopenharmony_ci}; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic struct gpiod_lookup_table akita_lcdcon_gpio_table = { 53262306a36Sopenharmony_ci .dev_id = "spi2.1", 53362306a36Sopenharmony_ci .table = { 53462306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_CONT, 53562306a36Sopenharmony_ci "BL_CONT", GPIO_ACTIVE_LOW), 53662306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_ON, 53762306a36Sopenharmony_ci "BL_ON", GPIO_ACTIVE_HIGH), 53862306a36Sopenharmony_ci { }, 53962306a36Sopenharmony_ci }, 54062306a36Sopenharmony_ci}; 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_cistatic struct corgi_lcd_platform_data spitz_lcdcon_info = { 54362306a36Sopenharmony_ci .init_mode = CORGI_LCD_MODE_VGA, 54462306a36Sopenharmony_ci .max_intensity = 0x2f, 54562306a36Sopenharmony_ci .default_intensity = 0x1f, 54662306a36Sopenharmony_ci .limit_mask = 0x0b, 54762306a36Sopenharmony_ci .kick_battery = sharpsl_battery_kick, 54862306a36Sopenharmony_ci}; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_cistatic struct spi_board_info spitz_spi_devices[] = { 55162306a36Sopenharmony_ci { 55262306a36Sopenharmony_ci .modalias = "ads7846", 55362306a36Sopenharmony_ci .max_speed_hz = 1200000, 55462306a36Sopenharmony_ci .bus_num = 2, 55562306a36Sopenharmony_ci .chip_select = 0, 55662306a36Sopenharmony_ci .platform_data = &spitz_ads7846_info, 55762306a36Sopenharmony_ci .irq = PXA_GPIO_TO_IRQ(SPITZ_GPIO_TP_INT), 55862306a36Sopenharmony_ci }, { 55962306a36Sopenharmony_ci .modalias = "corgi-lcd", 56062306a36Sopenharmony_ci .max_speed_hz = 50000, 56162306a36Sopenharmony_ci .bus_num = 2, 56262306a36Sopenharmony_ci .chip_select = 1, 56362306a36Sopenharmony_ci .platform_data = &spitz_lcdcon_info, 56462306a36Sopenharmony_ci }, { 56562306a36Sopenharmony_ci .modalias = "max1111", 56662306a36Sopenharmony_ci .max_speed_hz = 450000, 56762306a36Sopenharmony_ci .bus_num = 2, 56862306a36Sopenharmony_ci .chip_select = 2, 56962306a36Sopenharmony_ci }, 57062306a36Sopenharmony_ci}; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_cistatic struct pxa2xx_spi_controller spitz_spi_info = { 57362306a36Sopenharmony_ci .num_chipselect = 3, 57462306a36Sopenharmony_ci}; 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_cistatic struct gpiod_lookup_table spitz_spi_gpio_table = { 57762306a36Sopenharmony_ci .dev_id = "spi2", 57862306a36Sopenharmony_ci .table = { 57962306a36Sopenharmony_ci GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_ADS7846_CS, "cs", 0, GPIO_ACTIVE_LOW), 58062306a36Sopenharmony_ci GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_LCDCON_CS, "cs", 1, GPIO_ACTIVE_LOW), 58162306a36Sopenharmony_ci GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_MAX1111_CS, "cs", 2, GPIO_ACTIVE_LOW), 58262306a36Sopenharmony_ci { }, 58362306a36Sopenharmony_ci }, 58462306a36Sopenharmony_ci}; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic void __init spitz_spi_init(void) 58762306a36Sopenharmony_ci{ 58862306a36Sopenharmony_ci if (machine_is_akita()) 58962306a36Sopenharmony_ci gpiod_add_lookup_table(&akita_lcdcon_gpio_table); 59062306a36Sopenharmony_ci else 59162306a36Sopenharmony_ci gpiod_add_lookup_table(&spitz_lcdcon_gpio_table); 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_ci gpiod_add_lookup_table(&spitz_ads7846_gpio_table); 59462306a36Sopenharmony_ci gpiod_add_lookup_table(&spitz_spi_gpio_table); 59562306a36Sopenharmony_ci pxa2xx_set_spi_info(2, &spitz_spi_info); 59662306a36Sopenharmony_ci spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices)); 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci#else 59962306a36Sopenharmony_cistatic inline void spitz_spi_init(void) {} 60062306a36Sopenharmony_ci#endif 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci/****************************************************************************** 60362306a36Sopenharmony_ci * SD/MMC card controller 60462306a36Sopenharmony_ci ******************************************************************************/ 60562306a36Sopenharmony_ci#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) 60662306a36Sopenharmony_ci/* 60762306a36Sopenharmony_ci * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to 60862306a36Sopenharmony_ci * give the card a chance to fully insert/eject. 60962306a36Sopenharmony_ci */ 61062306a36Sopenharmony_cistatic int spitz_mci_setpower(struct device *dev, unsigned int vdd) 61162306a36Sopenharmony_ci{ 61262306a36Sopenharmony_ci struct pxamci_platform_data* p_d = dev->platform_data; 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci if ((1 << vdd) & p_d->ocr_mask) 61562306a36Sopenharmony_ci spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V); 61662306a36Sopenharmony_ci else 61762306a36Sopenharmony_ci spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0); 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci return 0; 62062306a36Sopenharmony_ci} 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_cistatic struct pxamci_platform_data spitz_mci_platform_data = { 62362306a36Sopenharmony_ci .detect_delay_ms = 250, 62462306a36Sopenharmony_ci .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 62562306a36Sopenharmony_ci .setpower = spitz_mci_setpower, 62662306a36Sopenharmony_ci}; 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_cistatic struct gpiod_lookup_table spitz_mci_gpio_table = { 62962306a36Sopenharmony_ci .dev_id = "pxa2xx-mci.0", 63062306a36Sopenharmony_ci .table = { 63162306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_nSD_DETECT, 63262306a36Sopenharmony_ci "cd", GPIO_ACTIVE_LOW), 63362306a36Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_nSD_WP, 63462306a36Sopenharmony_ci "wp", GPIO_ACTIVE_LOW), 63562306a36Sopenharmony_ci { }, 63662306a36Sopenharmony_ci }, 63762306a36Sopenharmony_ci}; 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_cistatic void __init spitz_mmc_init(void) 64062306a36Sopenharmony_ci{ 64162306a36Sopenharmony_ci gpiod_add_lookup_table(&spitz_mci_gpio_table); 64262306a36Sopenharmony_ci pxa_set_mci_info(&spitz_mci_platform_data); 64362306a36Sopenharmony_ci} 64462306a36Sopenharmony_ci#else 64562306a36Sopenharmony_cistatic inline void spitz_mmc_init(void) {} 64662306a36Sopenharmony_ci#endif 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci/****************************************************************************** 64962306a36Sopenharmony_ci * USB Host 65062306a36Sopenharmony_ci ******************************************************************************/ 65162306a36Sopenharmony_ci#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) 65262306a36Sopenharmony_cistatic int spitz_ohci_init(struct device *dev) 65362306a36Sopenharmony_ci{ 65462306a36Sopenharmony_ci int err; 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST"); 65762306a36Sopenharmony_ci if (err) 65862306a36Sopenharmony_ci return err; 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci /* Only Port 2 is connected, setup USB Port 2 Output Control Register */ 66162306a36Sopenharmony_ci UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1); 66462306a36Sopenharmony_ci} 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_cistatic void spitz_ohci_exit(struct device *dev) 66762306a36Sopenharmony_ci{ 66862306a36Sopenharmony_ci gpio_free(SPITZ_GPIO_USB_HOST); 66962306a36Sopenharmony_ci} 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_cistatic struct pxaohci_platform_data spitz_ohci_platform_data = { 67262306a36Sopenharmony_ci .port_mode = PMM_NPS_MODE, 67362306a36Sopenharmony_ci .init = spitz_ohci_init, 67462306a36Sopenharmony_ci .exit = spitz_ohci_exit, 67562306a36Sopenharmony_ci .flags = ENABLE_PORT_ALL | NO_OC_PROTECTION, 67662306a36Sopenharmony_ci .power_budget = 150, 67762306a36Sopenharmony_ci}; 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_cistatic void __init spitz_uhc_init(void) 68062306a36Sopenharmony_ci{ 68162306a36Sopenharmony_ci pxa_set_ohci_info(&spitz_ohci_platform_data); 68262306a36Sopenharmony_ci} 68362306a36Sopenharmony_ci#else 68462306a36Sopenharmony_cistatic inline void spitz_uhc_init(void) {} 68562306a36Sopenharmony_ci#endif 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci/****************************************************************************** 68862306a36Sopenharmony_ci * Framebuffer 68962306a36Sopenharmony_ci ******************************************************************************/ 69062306a36Sopenharmony_ci#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) 69162306a36Sopenharmony_cistatic struct pxafb_mode_info spitz_pxafb_modes[] = { 69262306a36Sopenharmony_ci { 69362306a36Sopenharmony_ci .pixclock = 19231, 69462306a36Sopenharmony_ci .xres = 480, 69562306a36Sopenharmony_ci .yres = 640, 69662306a36Sopenharmony_ci .bpp = 16, 69762306a36Sopenharmony_ci .hsync_len = 40, 69862306a36Sopenharmony_ci .left_margin = 46, 69962306a36Sopenharmony_ci .right_margin = 125, 70062306a36Sopenharmony_ci .vsync_len = 3, 70162306a36Sopenharmony_ci .upper_margin = 1, 70262306a36Sopenharmony_ci .lower_margin = 0, 70362306a36Sopenharmony_ci .sync = 0, 70462306a36Sopenharmony_ci }, { 70562306a36Sopenharmony_ci .pixclock = 134617, 70662306a36Sopenharmony_ci .xres = 240, 70762306a36Sopenharmony_ci .yres = 320, 70862306a36Sopenharmony_ci .bpp = 16, 70962306a36Sopenharmony_ci .hsync_len = 20, 71062306a36Sopenharmony_ci .left_margin = 20, 71162306a36Sopenharmony_ci .right_margin = 46, 71262306a36Sopenharmony_ci .vsync_len = 2, 71362306a36Sopenharmony_ci .upper_margin = 1, 71462306a36Sopenharmony_ci .lower_margin = 0, 71562306a36Sopenharmony_ci .sync = 0, 71662306a36Sopenharmony_ci }, 71762306a36Sopenharmony_ci}; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cistatic struct pxafb_mach_info spitz_pxafb_info = { 72062306a36Sopenharmony_ci .modes = spitz_pxafb_modes, 72162306a36Sopenharmony_ci .num_modes = ARRAY_SIZE(spitz_pxafb_modes), 72262306a36Sopenharmony_ci .fixed_modes = 1, 72362306a36Sopenharmony_ci .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING, 72462306a36Sopenharmony_ci}; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_cistatic void __init spitz_lcd_init(void) 72762306a36Sopenharmony_ci{ 72862306a36Sopenharmony_ci pxa_set_fb_info(NULL, &spitz_pxafb_info); 72962306a36Sopenharmony_ci} 73062306a36Sopenharmony_ci#else 73162306a36Sopenharmony_cistatic inline void spitz_lcd_init(void) {} 73262306a36Sopenharmony_ci#endif 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci/****************************************************************************** 73562306a36Sopenharmony_ci * NAND Flash 73662306a36Sopenharmony_ci ******************************************************************************/ 73762306a36Sopenharmony_ci#if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE) 73862306a36Sopenharmony_cistatic uint8_t scan_ff_pattern[] = { 0xff, 0xff }; 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_cistatic struct nand_bbt_descr spitz_nand_bbt = { 74162306a36Sopenharmony_ci .options = 0, 74262306a36Sopenharmony_ci .offs = 4, 74362306a36Sopenharmony_ci .len = 2, 74462306a36Sopenharmony_ci .pattern = scan_ff_pattern 74562306a36Sopenharmony_ci}; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_cistatic int akita_ooblayout_ecc(struct mtd_info *mtd, int section, 74862306a36Sopenharmony_ci struct mtd_oob_region *oobregion) 74962306a36Sopenharmony_ci{ 75062306a36Sopenharmony_ci if (section > 12) 75162306a36Sopenharmony_ci return -ERANGE; 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci switch (section % 3) { 75462306a36Sopenharmony_ci case 0: 75562306a36Sopenharmony_ci oobregion->offset = 5; 75662306a36Sopenharmony_ci oobregion->length = 1; 75762306a36Sopenharmony_ci break; 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci case 1: 76062306a36Sopenharmony_ci oobregion->offset = 1; 76162306a36Sopenharmony_ci oobregion->length = 3; 76262306a36Sopenharmony_ci break; 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci case 2: 76562306a36Sopenharmony_ci oobregion->offset = 6; 76662306a36Sopenharmony_ci oobregion->length = 2; 76762306a36Sopenharmony_ci break; 76862306a36Sopenharmony_ci } 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci oobregion->offset += (section / 3) * 0x10; 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci return 0; 77362306a36Sopenharmony_ci} 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_cistatic int akita_ooblayout_free(struct mtd_info *mtd, int section, 77662306a36Sopenharmony_ci struct mtd_oob_region *oobregion) 77762306a36Sopenharmony_ci{ 77862306a36Sopenharmony_ci if (section) 77962306a36Sopenharmony_ci return -ERANGE; 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_ci oobregion->offset = 8; 78262306a36Sopenharmony_ci oobregion->length = 9; 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci return 0; 78562306a36Sopenharmony_ci} 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_cistatic const struct mtd_ooblayout_ops akita_ooblayout_ops = { 78862306a36Sopenharmony_ci .ecc = akita_ooblayout_ecc, 78962306a36Sopenharmony_ci .free = akita_ooblayout_free, 79062306a36Sopenharmony_ci}; 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_cistatic const char * const probes[] = { 79362306a36Sopenharmony_ci "cmdlinepart", 79462306a36Sopenharmony_ci "ofpart", 79562306a36Sopenharmony_ci "sharpslpart", 79662306a36Sopenharmony_ci NULL, 79762306a36Sopenharmony_ci}; 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_cistatic struct sharpsl_nand_platform_data spitz_nand_pdata = { 80062306a36Sopenharmony_ci .badblock_pattern = &spitz_nand_bbt, 80162306a36Sopenharmony_ci .part_parsers = probes, 80262306a36Sopenharmony_ci}; 80362306a36Sopenharmony_ci 80462306a36Sopenharmony_cistatic struct resource spitz_nand_resources[] = { 80562306a36Sopenharmony_ci { 80662306a36Sopenharmony_ci .start = PXA_CS3_PHYS, 80762306a36Sopenharmony_ci .end = PXA_CS3_PHYS + SZ_4K - 1, 80862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 80962306a36Sopenharmony_ci }, 81062306a36Sopenharmony_ci}; 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_cistatic struct platform_device spitz_nand_device = { 81362306a36Sopenharmony_ci .name = "sharpsl-nand", 81462306a36Sopenharmony_ci .id = -1, 81562306a36Sopenharmony_ci .resource = spitz_nand_resources, 81662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(spitz_nand_resources), 81762306a36Sopenharmony_ci .dev = { 81862306a36Sopenharmony_ci .platform_data = &spitz_nand_pdata, 81962306a36Sopenharmony_ci } 82062306a36Sopenharmony_ci}; 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_cistatic void __init spitz_nand_init(void) 82362306a36Sopenharmony_ci{ 82462306a36Sopenharmony_ci if (machine_is_akita() || machine_is_borzoi()) { 82562306a36Sopenharmony_ci spitz_nand_bbt.len = 1; 82662306a36Sopenharmony_ci spitz_nand_pdata.ecc_layout = &akita_ooblayout_ops; 82762306a36Sopenharmony_ci } 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci platform_device_register(&spitz_nand_device); 83062306a36Sopenharmony_ci} 83162306a36Sopenharmony_ci#else 83262306a36Sopenharmony_cistatic inline void spitz_nand_init(void) {} 83362306a36Sopenharmony_ci#endif 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ci/****************************************************************************** 83662306a36Sopenharmony_ci * NOR Flash 83762306a36Sopenharmony_ci ******************************************************************************/ 83862306a36Sopenharmony_ci#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 83962306a36Sopenharmony_cistatic struct mtd_partition spitz_rom_parts[] = { 84062306a36Sopenharmony_ci { 84162306a36Sopenharmony_ci .name ="Boot PROM Filesystem", 84262306a36Sopenharmony_ci .offset = 0x00140000, 84362306a36Sopenharmony_ci .size = MTDPART_SIZ_FULL, 84462306a36Sopenharmony_ci }, 84562306a36Sopenharmony_ci}; 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_cistatic struct physmap_flash_data spitz_rom_data = { 84862306a36Sopenharmony_ci .width = 2, 84962306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(spitz_rom_parts), 85062306a36Sopenharmony_ci .parts = spitz_rom_parts, 85162306a36Sopenharmony_ci}; 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_cistatic struct resource spitz_rom_resources[] = { 85462306a36Sopenharmony_ci { 85562306a36Sopenharmony_ci .start = PXA_CS0_PHYS, 85662306a36Sopenharmony_ci .end = PXA_CS0_PHYS + SZ_8M - 1, 85762306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 85862306a36Sopenharmony_ci }, 85962306a36Sopenharmony_ci}; 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_cistatic struct platform_device spitz_rom_device = { 86262306a36Sopenharmony_ci .name = "physmap-flash", 86362306a36Sopenharmony_ci .id = -1, 86462306a36Sopenharmony_ci .resource = spitz_rom_resources, 86562306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(spitz_rom_resources), 86662306a36Sopenharmony_ci .dev = { 86762306a36Sopenharmony_ci .platform_data = &spitz_rom_data, 86862306a36Sopenharmony_ci }, 86962306a36Sopenharmony_ci}; 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_cistatic void __init spitz_nor_init(void) 87262306a36Sopenharmony_ci{ 87362306a36Sopenharmony_ci platform_device_register(&spitz_rom_device); 87462306a36Sopenharmony_ci} 87562306a36Sopenharmony_ci#else 87662306a36Sopenharmony_cistatic inline void spitz_nor_init(void) {} 87762306a36Sopenharmony_ci#endif 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci/****************************************************************************** 88062306a36Sopenharmony_ci * I2C devices 88162306a36Sopenharmony_ci ******************************************************************************/ 88262306a36Sopenharmony_ci#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE) 88362306a36Sopenharmony_cistatic struct pca953x_platform_data akita_pca953x_pdata = { 88462306a36Sopenharmony_ci .gpio_base = AKITA_IOEXP_GPIO_BASE, 88562306a36Sopenharmony_ci}; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_cistatic struct i2c_board_info spitz_i2c_devs[] = { 88862306a36Sopenharmony_ci { 88962306a36Sopenharmony_ci .type = "wm8750", 89062306a36Sopenharmony_ci .addr = 0x1b, 89162306a36Sopenharmony_ci }, { 89262306a36Sopenharmony_ci .type = "max7310", 89362306a36Sopenharmony_ci .addr = 0x18, 89462306a36Sopenharmony_ci .platform_data = &akita_pca953x_pdata, 89562306a36Sopenharmony_ci }, 89662306a36Sopenharmony_ci}; 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_cistatic struct regulator_consumer_supply isl6271a_consumers[] = { 89962306a36Sopenharmony_ci REGULATOR_SUPPLY("vcc_core", NULL), 90062306a36Sopenharmony_ci}; 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_cistatic struct regulator_init_data isl6271a_info[] = { 90362306a36Sopenharmony_ci { 90462306a36Sopenharmony_ci .constraints = { 90562306a36Sopenharmony_ci .name = "vcc_core range", 90662306a36Sopenharmony_ci .min_uV = 850000, 90762306a36Sopenharmony_ci .max_uV = 1600000, 90862306a36Sopenharmony_ci .always_on = 1, 90962306a36Sopenharmony_ci .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, 91062306a36Sopenharmony_ci }, 91162306a36Sopenharmony_ci .consumer_supplies = isl6271a_consumers, 91262306a36Sopenharmony_ci .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers), 91362306a36Sopenharmony_ci } 91462306a36Sopenharmony_ci}; 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_cistatic struct i2c_board_info spitz_pi2c_devs[] = { 91762306a36Sopenharmony_ci { 91862306a36Sopenharmony_ci .type = "isl6271a", 91962306a36Sopenharmony_ci .addr = 0x0c, 92062306a36Sopenharmony_ci .platform_data = &isl6271a_info, 92162306a36Sopenharmony_ci }, 92262306a36Sopenharmony_ci}; 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_cistatic void __init spitz_i2c_init(void) 92562306a36Sopenharmony_ci{ 92662306a36Sopenharmony_ci int size = ARRAY_SIZE(spitz_i2c_devs); 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci /* Only Akita has the max7310 chip */ 92962306a36Sopenharmony_ci if (!machine_is_akita()) 93062306a36Sopenharmony_ci size--; 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci pxa_set_i2c_info(NULL); 93362306a36Sopenharmony_ci pxa27x_set_i2c_power_info(NULL); 93462306a36Sopenharmony_ci i2c_register_board_info(0, spitz_i2c_devs, size); 93562306a36Sopenharmony_ci i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs)); 93662306a36Sopenharmony_ci} 93762306a36Sopenharmony_ci#else 93862306a36Sopenharmony_cistatic inline void spitz_i2c_init(void) {} 93962306a36Sopenharmony_ci#endif 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_cistatic struct gpiod_lookup_table spitz_audio_gpio_table = { 94262306a36Sopenharmony_ci .dev_id = "spitz-audio", 94362306a36Sopenharmony_ci .table = { 94462306a36Sopenharmony_ci GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE, 94562306a36Sopenharmony_ci "mute-l", GPIO_ACTIVE_HIGH), 94662306a36Sopenharmony_ci GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE, 94762306a36Sopenharmony_ci "mute-r", GPIO_ACTIVE_HIGH), 94862306a36Sopenharmony_ci GPIO_LOOKUP("sharp-scoop.1", SPITZ_GPIO_MIC_BIAS - SPITZ_SCP2_GPIO_BASE, 94962306a36Sopenharmony_ci "mic", GPIO_ACTIVE_HIGH), 95062306a36Sopenharmony_ci { }, 95162306a36Sopenharmony_ci }, 95262306a36Sopenharmony_ci}; 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_cistatic struct gpiod_lookup_table akita_audio_gpio_table = { 95562306a36Sopenharmony_ci .dev_id = "spitz-audio", 95662306a36Sopenharmony_ci .table = { 95762306a36Sopenharmony_ci GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE, 95862306a36Sopenharmony_ci "mute-l", GPIO_ACTIVE_HIGH), 95962306a36Sopenharmony_ci GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE, 96062306a36Sopenharmony_ci "mute-r", GPIO_ACTIVE_HIGH), 96162306a36Sopenharmony_ci GPIO_LOOKUP("i2c-max7310", AKITA_GPIO_MIC_BIAS - AKITA_IOEXP_GPIO_BASE, 96262306a36Sopenharmony_ci "mic", GPIO_ACTIVE_HIGH), 96362306a36Sopenharmony_ci { }, 96462306a36Sopenharmony_ci }, 96562306a36Sopenharmony_ci}; 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci/****************************************************************************** 96862306a36Sopenharmony_ci * Audio devices 96962306a36Sopenharmony_ci ******************************************************************************/ 97062306a36Sopenharmony_cistatic inline void spitz_audio_init(void) 97162306a36Sopenharmony_ci{ 97262306a36Sopenharmony_ci if (machine_is_akita()) 97362306a36Sopenharmony_ci gpiod_add_lookup_table(&akita_audio_gpio_table); 97462306a36Sopenharmony_ci else 97562306a36Sopenharmony_ci gpiod_add_lookup_table(&spitz_audio_gpio_table); 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci platform_device_register_simple("spitz-audio", -1, NULL, 0); 97862306a36Sopenharmony_ci} 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_ci/****************************************************************************** 98162306a36Sopenharmony_ci * Machine init 98262306a36Sopenharmony_ci ******************************************************************************/ 98362306a36Sopenharmony_cistatic void spitz_poweroff(void) 98462306a36Sopenharmony_ci{ 98562306a36Sopenharmony_ci pxa_restart(REBOOT_GPIO, NULL); 98662306a36Sopenharmony_ci} 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_cistatic void spitz_restart(enum reboot_mode mode, const char *cmd) 98962306a36Sopenharmony_ci{ 99062306a36Sopenharmony_ci uint32_t msc0 = __raw_readl(MSC0); 99162306a36Sopenharmony_ci /* Bootloader magic for a reboot */ 99262306a36Sopenharmony_ci if ((msc0 & 0xffff0000) == 0x7ff00000) 99362306a36Sopenharmony_ci __raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0); 99462306a36Sopenharmony_ci 99562306a36Sopenharmony_ci spitz_poweroff(); 99662306a36Sopenharmony_ci} 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_cistatic void __init spitz_init(void) 99962306a36Sopenharmony_ci{ 100062306a36Sopenharmony_ci init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0); 100162306a36Sopenharmony_ci pm_power_off = spitz_poweroff; 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci PMCR = 0x00; 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ 100662306a36Sopenharmony_ci PCFR |= PCFR_OPDE; 100762306a36Sopenharmony_ci 100862306a36Sopenharmony_ci pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config)); 100962306a36Sopenharmony_ci 101062306a36Sopenharmony_ci pxa_set_ffuart_info(NULL); 101162306a36Sopenharmony_ci pxa_set_btuart_info(NULL); 101262306a36Sopenharmony_ci pxa_set_stuart_info(NULL); 101362306a36Sopenharmony_ci 101462306a36Sopenharmony_ci spitz_spi_init(); 101562306a36Sopenharmony_ci spitz_scoop_init(); 101662306a36Sopenharmony_ci spitz_mkp_init(); 101762306a36Sopenharmony_ci spitz_keys_init(); 101862306a36Sopenharmony_ci spitz_leds_init(); 101962306a36Sopenharmony_ci spitz_mmc_init(); 102062306a36Sopenharmony_ci spitz_pcmcia_init(); 102162306a36Sopenharmony_ci spitz_uhc_init(); 102262306a36Sopenharmony_ci spitz_lcd_init(); 102362306a36Sopenharmony_ci spitz_nor_init(); 102462306a36Sopenharmony_ci spitz_nand_init(); 102562306a36Sopenharmony_ci spitz_i2c_init(); 102662306a36Sopenharmony_ci spitz_audio_init(); 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci regulator_has_full_constraints(); 102962306a36Sopenharmony_ci} 103062306a36Sopenharmony_ci 103162306a36Sopenharmony_cistatic void __init spitz_fixup(struct tag *tags, char **cmdline) 103262306a36Sopenharmony_ci{ 103362306a36Sopenharmony_ci sharpsl_save_param(); 103462306a36Sopenharmony_ci memblock_add(0xa0000000, SZ_64M); 103562306a36Sopenharmony_ci} 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci#ifdef CONFIG_MACH_SPITZ 103862306a36Sopenharmony_ciMACHINE_START(SPITZ, "SHARP Spitz") 103962306a36Sopenharmony_ci .fixup = spitz_fixup, 104062306a36Sopenharmony_ci .map_io = pxa27x_map_io, 104162306a36Sopenharmony_ci .nr_irqs = PXA_NR_IRQS, 104262306a36Sopenharmony_ci .init_irq = pxa27x_init_irq, 104362306a36Sopenharmony_ci .init_machine = spitz_init, 104462306a36Sopenharmony_ci .init_time = pxa_timer_init, 104562306a36Sopenharmony_ci .restart = spitz_restart, 104662306a36Sopenharmony_ciMACHINE_END 104762306a36Sopenharmony_ci#endif 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_ci#ifdef CONFIG_MACH_BORZOI 105062306a36Sopenharmony_ciMACHINE_START(BORZOI, "SHARP Borzoi") 105162306a36Sopenharmony_ci .fixup = spitz_fixup, 105262306a36Sopenharmony_ci .map_io = pxa27x_map_io, 105362306a36Sopenharmony_ci .nr_irqs = PXA_NR_IRQS, 105462306a36Sopenharmony_ci .init_irq = pxa27x_init_irq, 105562306a36Sopenharmony_ci .init_machine = spitz_init, 105662306a36Sopenharmony_ci .init_time = pxa_timer_init, 105762306a36Sopenharmony_ci .restart = spitz_restart, 105862306a36Sopenharmony_ciMACHINE_END 105962306a36Sopenharmony_ci#endif 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci#ifdef CONFIG_MACH_AKITA 106262306a36Sopenharmony_ciMACHINE_START(AKITA, "SHARP Akita") 106362306a36Sopenharmony_ci .fixup = spitz_fixup, 106462306a36Sopenharmony_ci .map_io = pxa27x_map_io, 106562306a36Sopenharmony_ci .nr_irqs = PXA_NR_IRQS, 106662306a36Sopenharmony_ci .init_irq = pxa27x_init_irq, 106762306a36Sopenharmony_ci .init_machine = spitz_init, 106862306a36Sopenharmony_ci .init_time = pxa_timer_init, 106962306a36Sopenharmony_ci .restart = spitz_restart, 107062306a36Sopenharmony_ciMACHINE_END 107162306a36Sopenharmony_ci#endif 1072