18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-pxa/z2.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Support for the Zipit Z2 Handheld device. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2009-2010 Marek Vasut <marek.vasut@gmail.com> 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Based on research and code by: Ken McGuire 108c2ecf20Sopenharmony_ci * Based on mainstone.c as modified for the Zipit Z2. 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 148c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 158c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h> 168c2ecf20Sopenharmony_ci#include <linux/pwm.h> 178c2ecf20Sopenharmony_ci#include <linux/pwm_backlight.h> 188c2ecf20Sopenharmony_ci#include <linux/z2_battery.h> 198c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 208c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 218c2ecf20Sopenharmony_ci#include <linux/spi/pxa2xx_spi.h> 228c2ecf20Sopenharmony_ci#include <linux/spi/libertas_spi.h> 238c2ecf20Sopenharmony_ci#include <linux/spi/lms283gf05.h> 248c2ecf20Sopenharmony_ci#include <linux/power_supply.h> 258c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 268c2ecf20Sopenharmony_ci#include <linux/gpio.h> 278c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h> 288c2ecf20Sopenharmony_ci#include <linux/gpio_keys.h> 298c2ecf20Sopenharmony_ci#include <linux/delay.h> 308c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h> 318c2ecf20Sopenharmony_ci#include <linux/platform_data/i2c-pxa.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 348c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include "pxa27x.h" 378c2ecf20Sopenharmony_ci#include "mfp-pxa27x.h" 388c2ecf20Sopenharmony_ci#include <mach/z2.h> 398c2ecf20Sopenharmony_ci#include <linux/platform_data/video-pxafb.h> 408c2ecf20Sopenharmony_ci#include <linux/platform_data/mmc-pxamci.h> 418c2ecf20Sopenharmony_ci#include <linux/platform_data/keypad-pxa27x.h> 428c2ecf20Sopenharmony_ci#include "pm.h" 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#include "generic.h" 458c2ecf20Sopenharmony_ci#include "devices.h" 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/****************************************************************************** 488c2ecf20Sopenharmony_ci * Pin configuration 498c2ecf20Sopenharmony_ci ******************************************************************************/ 508c2ecf20Sopenharmony_cistatic unsigned long z2_pin_config[] = { 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci /* LCD - 16bpp Active TFT */ 538c2ecf20Sopenharmony_ci GPIO58_LCD_LDD_0, 548c2ecf20Sopenharmony_ci GPIO59_LCD_LDD_1, 558c2ecf20Sopenharmony_ci GPIO60_LCD_LDD_2, 568c2ecf20Sopenharmony_ci GPIO61_LCD_LDD_3, 578c2ecf20Sopenharmony_ci GPIO62_LCD_LDD_4, 588c2ecf20Sopenharmony_ci GPIO63_LCD_LDD_5, 598c2ecf20Sopenharmony_ci GPIO64_LCD_LDD_6, 608c2ecf20Sopenharmony_ci GPIO65_LCD_LDD_7, 618c2ecf20Sopenharmony_ci GPIO66_LCD_LDD_8, 628c2ecf20Sopenharmony_ci GPIO67_LCD_LDD_9, 638c2ecf20Sopenharmony_ci GPIO68_LCD_LDD_10, 648c2ecf20Sopenharmony_ci GPIO69_LCD_LDD_11, 658c2ecf20Sopenharmony_ci GPIO70_LCD_LDD_12, 668c2ecf20Sopenharmony_ci GPIO71_LCD_LDD_13, 678c2ecf20Sopenharmony_ci GPIO72_LCD_LDD_14, 688c2ecf20Sopenharmony_ci GPIO73_LCD_LDD_15, 698c2ecf20Sopenharmony_ci GPIO74_LCD_FCLK, 708c2ecf20Sopenharmony_ci GPIO75_LCD_LCLK, 718c2ecf20Sopenharmony_ci GPIO76_LCD_PCLK, 728c2ecf20Sopenharmony_ci GPIO77_LCD_BIAS, 738c2ecf20Sopenharmony_ci GPIO19_GPIO, /* LCD reset */ 748c2ecf20Sopenharmony_ci GPIO88_GPIO, /* LCD chipselect */ 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci /* PWM */ 778c2ecf20Sopenharmony_ci GPIO115_PWM1_OUT, /* Keypad Backlight */ 788c2ecf20Sopenharmony_ci GPIO11_PWM2_OUT, /* LCD Backlight */ 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci /* MMC */ 818c2ecf20Sopenharmony_ci GPIO32_MMC_CLK, 828c2ecf20Sopenharmony_ci GPIO112_MMC_CMD, 838c2ecf20Sopenharmony_ci GPIO92_MMC_DAT_0, 848c2ecf20Sopenharmony_ci GPIO109_MMC_DAT_1, 858c2ecf20Sopenharmony_ci GPIO110_MMC_DAT_2, 868c2ecf20Sopenharmony_ci GPIO111_MMC_DAT_3, 878c2ecf20Sopenharmony_ci GPIO96_GPIO, /* SD detect */ 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci /* STUART */ 908c2ecf20Sopenharmony_ci GPIO46_STUART_RXD, 918c2ecf20Sopenharmony_ci GPIO47_STUART_TXD, 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci /* Keypad */ 948c2ecf20Sopenharmony_ci GPIO100_KP_MKIN_0, 958c2ecf20Sopenharmony_ci GPIO101_KP_MKIN_1, 968c2ecf20Sopenharmony_ci GPIO102_KP_MKIN_2, 978c2ecf20Sopenharmony_ci GPIO34_KP_MKIN_3, 988c2ecf20Sopenharmony_ci GPIO38_KP_MKIN_4, 998c2ecf20Sopenharmony_ci GPIO16_KP_MKIN_5, 1008c2ecf20Sopenharmony_ci GPIO17_KP_MKIN_6, 1018c2ecf20Sopenharmony_ci GPIO103_KP_MKOUT_0, 1028c2ecf20Sopenharmony_ci GPIO104_KP_MKOUT_1, 1038c2ecf20Sopenharmony_ci GPIO105_KP_MKOUT_2, 1048c2ecf20Sopenharmony_ci GPIO106_KP_MKOUT_3, 1058c2ecf20Sopenharmony_ci GPIO107_KP_MKOUT_4, 1068c2ecf20Sopenharmony_ci GPIO108_KP_MKOUT_5, 1078c2ecf20Sopenharmony_ci GPIO35_KP_MKOUT_6, 1088c2ecf20Sopenharmony_ci GPIO41_KP_MKOUT_7, 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci /* I2C */ 1118c2ecf20Sopenharmony_ci GPIO117_I2C_SCL, 1128c2ecf20Sopenharmony_ci GPIO118_I2C_SDA, 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci /* SSP1 */ 1158c2ecf20Sopenharmony_ci GPIO23_SSP1_SCLK, /* SSP1_SCK */ 1168c2ecf20Sopenharmony_ci GPIO25_SSP1_TXD, /* SSP1_TXD */ 1178c2ecf20Sopenharmony_ci GPIO26_SSP1_RXD, /* SSP1_RXD */ 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci /* SSP2 */ 1208c2ecf20Sopenharmony_ci GPIO22_SSP2_SCLK, /* SSP2_SCK */ 1218c2ecf20Sopenharmony_ci GPIO13_SSP2_TXD, /* SSP2_TXD */ 1228c2ecf20Sopenharmony_ci GPIO40_SSP2_RXD, /* SSP2_RXD */ 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci /* LEDs */ 1258c2ecf20Sopenharmony_ci GPIO10_GPIO, /* WiFi LED */ 1268c2ecf20Sopenharmony_ci GPIO83_GPIO, /* Charging LED */ 1278c2ecf20Sopenharmony_ci GPIO85_GPIO, /* Charged LED */ 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci /* I2S */ 1308c2ecf20Sopenharmony_ci GPIO28_I2S_BITCLK_OUT, 1318c2ecf20Sopenharmony_ci GPIO29_I2S_SDATA_IN, 1328c2ecf20Sopenharmony_ci GPIO30_I2S_SDATA_OUT, 1338c2ecf20Sopenharmony_ci GPIO31_I2S_SYNC, 1348c2ecf20Sopenharmony_ci GPIO113_I2S_SYSCLK, 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci /* MISC */ 1378c2ecf20Sopenharmony_ci GPIO0_GPIO, /* AC power detect */ 1388c2ecf20Sopenharmony_ci GPIO1_GPIO, /* Power button */ 1398c2ecf20Sopenharmony_ci GPIO37_GPIO, /* Headphone detect */ 1408c2ecf20Sopenharmony_ci GPIO98_GPIO, /* Lid switch */ 1418c2ecf20Sopenharmony_ci GPIO14_GPIO, /* WiFi Power */ 1428c2ecf20Sopenharmony_ci GPIO24_GPIO, /* WiFi CS */ 1438c2ecf20Sopenharmony_ci GPIO36_GPIO, /* WiFi IRQ */ 1448c2ecf20Sopenharmony_ci GPIO88_GPIO, /* LCD CS */ 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci/****************************************************************************** 1488c2ecf20Sopenharmony_ci * NOR Flash 1498c2ecf20Sopenharmony_ci ******************************************************************************/ 1508c2ecf20Sopenharmony_ci#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 1518c2ecf20Sopenharmony_cistatic struct resource z2_flash_resource = { 1528c2ecf20Sopenharmony_ci .start = PXA_CS0_PHYS, 1538c2ecf20Sopenharmony_ci .end = PXA_CS0_PHYS + SZ_8M - 1, 1548c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1558c2ecf20Sopenharmony_ci}; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_cistatic struct mtd_partition z2_flash_parts[] = { 1588c2ecf20Sopenharmony_ci { 1598c2ecf20Sopenharmony_ci .name = "U-Boot Bootloader", 1608c2ecf20Sopenharmony_ci .offset = 0x0, 1618c2ecf20Sopenharmony_ci .size = 0x40000, 1628c2ecf20Sopenharmony_ci }, { 1638c2ecf20Sopenharmony_ci .name = "U-Boot Environment", 1648c2ecf20Sopenharmony_ci .offset = 0x40000, 1658c2ecf20Sopenharmony_ci .size = 0x20000, 1668c2ecf20Sopenharmony_ci }, { 1678c2ecf20Sopenharmony_ci .name = "Flash", 1688c2ecf20Sopenharmony_ci .offset = 0x60000, 1698c2ecf20Sopenharmony_ci .size = MTDPART_SIZ_FULL, 1708c2ecf20Sopenharmony_ci }, 1718c2ecf20Sopenharmony_ci}; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic struct physmap_flash_data z2_flash_data = { 1748c2ecf20Sopenharmony_ci .width = 2, 1758c2ecf20Sopenharmony_ci .parts = z2_flash_parts, 1768c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(z2_flash_parts), 1778c2ecf20Sopenharmony_ci}; 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_cistatic struct platform_device z2_flash = { 1808c2ecf20Sopenharmony_ci .name = "physmap-flash", 1818c2ecf20Sopenharmony_ci .id = -1, 1828c2ecf20Sopenharmony_ci .resource = &z2_flash_resource, 1838c2ecf20Sopenharmony_ci .num_resources = 1, 1848c2ecf20Sopenharmony_ci .dev = { 1858c2ecf20Sopenharmony_ci .platform_data = &z2_flash_data, 1868c2ecf20Sopenharmony_ci }, 1878c2ecf20Sopenharmony_ci}; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_cistatic void __init z2_nor_init(void) 1908c2ecf20Sopenharmony_ci{ 1918c2ecf20Sopenharmony_ci platform_device_register(&z2_flash); 1928c2ecf20Sopenharmony_ci} 1938c2ecf20Sopenharmony_ci#else 1948c2ecf20Sopenharmony_cistatic inline void z2_nor_init(void) {} 1958c2ecf20Sopenharmony_ci#endif 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci/****************************************************************************** 1988c2ecf20Sopenharmony_ci * Backlight 1998c2ecf20Sopenharmony_ci ******************************************************************************/ 2008c2ecf20Sopenharmony_ci#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE) 2018c2ecf20Sopenharmony_cistatic struct pwm_lookup z2_pwm_lookup[] = { 2028c2ecf20Sopenharmony_ci PWM_LOOKUP("pxa27x-pwm.1", 0, "pwm-backlight.0", NULL, 1260320, 2038c2ecf20Sopenharmony_ci PWM_POLARITY_NORMAL), 2048c2ecf20Sopenharmony_ci PWM_LOOKUP("pxa27x-pwm.0", 1, "pwm-backlight.1", NULL, 1260320, 2058c2ecf20Sopenharmony_ci PWM_POLARITY_NORMAL), 2068c2ecf20Sopenharmony_ci}; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_cistatic struct platform_pwm_backlight_data z2_backlight_data[] = { 2098c2ecf20Sopenharmony_ci [0] = { 2108c2ecf20Sopenharmony_ci /* Keypad Backlight */ 2118c2ecf20Sopenharmony_ci .max_brightness = 1023, 2128c2ecf20Sopenharmony_ci .dft_brightness = 0, 2138c2ecf20Sopenharmony_ci }, 2148c2ecf20Sopenharmony_ci [1] = { 2158c2ecf20Sopenharmony_ci /* LCD Backlight */ 2168c2ecf20Sopenharmony_ci .max_brightness = 1023, 2178c2ecf20Sopenharmony_ci .dft_brightness = 512, 2188c2ecf20Sopenharmony_ci }, 2198c2ecf20Sopenharmony_ci}; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cistatic struct platform_device z2_backlight_devices[2] = { 2228c2ecf20Sopenharmony_ci { 2238c2ecf20Sopenharmony_ci .name = "pwm-backlight", 2248c2ecf20Sopenharmony_ci .id = 0, 2258c2ecf20Sopenharmony_ci .dev = { 2268c2ecf20Sopenharmony_ci .platform_data = &z2_backlight_data[1], 2278c2ecf20Sopenharmony_ci }, 2288c2ecf20Sopenharmony_ci }, 2298c2ecf20Sopenharmony_ci { 2308c2ecf20Sopenharmony_ci .name = "pwm-backlight", 2318c2ecf20Sopenharmony_ci .id = 1, 2328c2ecf20Sopenharmony_ci .dev = { 2338c2ecf20Sopenharmony_ci .platform_data = &z2_backlight_data[0], 2348c2ecf20Sopenharmony_ci }, 2358c2ecf20Sopenharmony_ci }, 2368c2ecf20Sopenharmony_ci}; 2378c2ecf20Sopenharmony_cistatic void __init z2_pwm_init(void) 2388c2ecf20Sopenharmony_ci{ 2398c2ecf20Sopenharmony_ci pwm_add_table(z2_pwm_lookup, ARRAY_SIZE(z2_pwm_lookup)); 2408c2ecf20Sopenharmony_ci platform_device_register(&z2_backlight_devices[0]); 2418c2ecf20Sopenharmony_ci platform_device_register(&z2_backlight_devices[1]); 2428c2ecf20Sopenharmony_ci} 2438c2ecf20Sopenharmony_ci#else 2448c2ecf20Sopenharmony_cistatic inline void z2_pwm_init(void) {} 2458c2ecf20Sopenharmony_ci#endif 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci/****************************************************************************** 2488c2ecf20Sopenharmony_ci * Framebuffer 2498c2ecf20Sopenharmony_ci ******************************************************************************/ 2508c2ecf20Sopenharmony_ci#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) 2518c2ecf20Sopenharmony_cistatic struct pxafb_mode_info z2_lcd_modes[] = { 2528c2ecf20Sopenharmony_ci{ 2538c2ecf20Sopenharmony_ci .pixclock = 192000, 2548c2ecf20Sopenharmony_ci .xres = 240, 2558c2ecf20Sopenharmony_ci .yres = 320, 2568c2ecf20Sopenharmony_ci .bpp = 16, 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci .left_margin = 4, 2598c2ecf20Sopenharmony_ci .right_margin = 8, 2608c2ecf20Sopenharmony_ci .upper_margin = 4, 2618c2ecf20Sopenharmony_ci .lower_margin = 8, 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci .hsync_len = 4, 2648c2ecf20Sopenharmony_ci .vsync_len = 4, 2658c2ecf20Sopenharmony_ci}, 2668c2ecf20Sopenharmony_ci}; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_cistatic struct pxafb_mach_info z2_lcd_screen = { 2698c2ecf20Sopenharmony_ci .modes = z2_lcd_modes, 2708c2ecf20Sopenharmony_ci .num_modes = ARRAY_SIZE(z2_lcd_modes), 2718c2ecf20Sopenharmony_ci .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_BIAS_ACTIVE_LOW | 2728c2ecf20Sopenharmony_ci LCD_ALTERNATE_MAPPING, 2738c2ecf20Sopenharmony_ci}; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_cistatic void __init z2_lcd_init(void) 2768c2ecf20Sopenharmony_ci{ 2778c2ecf20Sopenharmony_ci pxa_set_fb_info(NULL, &z2_lcd_screen); 2788c2ecf20Sopenharmony_ci} 2798c2ecf20Sopenharmony_ci#else 2808c2ecf20Sopenharmony_cistatic inline void z2_lcd_init(void) {} 2818c2ecf20Sopenharmony_ci#endif 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci/****************************************************************************** 2848c2ecf20Sopenharmony_ci * SD/MMC card controller 2858c2ecf20Sopenharmony_ci ******************************************************************************/ 2868c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) 2878c2ecf20Sopenharmony_cistatic struct pxamci_platform_data z2_mci_platform_data = { 2888c2ecf20Sopenharmony_ci .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 2898c2ecf20Sopenharmony_ci .detect_delay_ms = 200, 2908c2ecf20Sopenharmony_ci}; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table z2_mci_gpio_table = { 2938c2ecf20Sopenharmony_ci .dev_id = "pxa2xx-mci.0", 2948c2ecf20Sopenharmony_ci .table = { 2958c2ecf20Sopenharmony_ci GPIO_LOOKUP("gpio-pxa", GPIO96_ZIPITZ2_SD_DETECT, 2968c2ecf20Sopenharmony_ci "cd", GPIO_ACTIVE_LOW), 2978c2ecf20Sopenharmony_ci { }, 2988c2ecf20Sopenharmony_ci }, 2998c2ecf20Sopenharmony_ci}; 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_cistatic void __init z2_mmc_init(void) 3028c2ecf20Sopenharmony_ci{ 3038c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&z2_mci_gpio_table); 3048c2ecf20Sopenharmony_ci pxa_set_mci_info(&z2_mci_platform_data); 3058c2ecf20Sopenharmony_ci} 3068c2ecf20Sopenharmony_ci#else 3078c2ecf20Sopenharmony_cistatic inline void z2_mmc_init(void) {} 3088c2ecf20Sopenharmony_ci#endif 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci/****************************************************************************** 3118c2ecf20Sopenharmony_ci * LEDs 3128c2ecf20Sopenharmony_ci ******************************************************************************/ 3138c2ecf20Sopenharmony_ci#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 3148c2ecf20Sopenharmony_cistruct gpio_led z2_gpio_leds[] = { 3158c2ecf20Sopenharmony_ci{ 3168c2ecf20Sopenharmony_ci .name = "z2:green:wifi", 3178c2ecf20Sopenharmony_ci .default_trigger = "none", 3188c2ecf20Sopenharmony_ci .gpio = GPIO10_ZIPITZ2_LED_WIFI, 3198c2ecf20Sopenharmony_ci .active_low = 1, 3208c2ecf20Sopenharmony_ci}, { 3218c2ecf20Sopenharmony_ci .name = "z2:green:charged", 3228c2ecf20Sopenharmony_ci .default_trigger = "mmc0", 3238c2ecf20Sopenharmony_ci .gpio = GPIO85_ZIPITZ2_LED_CHARGED, 3248c2ecf20Sopenharmony_ci .active_low = 1, 3258c2ecf20Sopenharmony_ci}, { 3268c2ecf20Sopenharmony_ci .name = "z2:amber:charging", 3278c2ecf20Sopenharmony_ci .default_trigger = "Z2-charging-or-full", 3288c2ecf20Sopenharmony_ci .gpio = GPIO83_ZIPITZ2_LED_CHARGING, 3298c2ecf20Sopenharmony_ci .active_low = 1, 3308c2ecf20Sopenharmony_ci}, 3318c2ecf20Sopenharmony_ci}; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_cistatic struct gpio_led_platform_data z2_gpio_led_info = { 3348c2ecf20Sopenharmony_ci .leds = z2_gpio_leds, 3358c2ecf20Sopenharmony_ci .num_leds = ARRAY_SIZE(z2_gpio_leds), 3368c2ecf20Sopenharmony_ci}; 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_cistatic struct platform_device z2_leds = { 3398c2ecf20Sopenharmony_ci .name = "leds-gpio", 3408c2ecf20Sopenharmony_ci .id = -1, 3418c2ecf20Sopenharmony_ci .dev = { 3428c2ecf20Sopenharmony_ci .platform_data = &z2_gpio_led_info, 3438c2ecf20Sopenharmony_ci } 3448c2ecf20Sopenharmony_ci}; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cistatic void __init z2_leds_init(void) 3478c2ecf20Sopenharmony_ci{ 3488c2ecf20Sopenharmony_ci platform_device_register(&z2_leds); 3498c2ecf20Sopenharmony_ci} 3508c2ecf20Sopenharmony_ci#else 3518c2ecf20Sopenharmony_cistatic inline void z2_leds_init(void) {} 3528c2ecf20Sopenharmony_ci#endif 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci/****************************************************************************** 3558c2ecf20Sopenharmony_ci * GPIO keyboard 3568c2ecf20Sopenharmony_ci ******************************************************************************/ 3578c2ecf20Sopenharmony_ci#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE) 3588c2ecf20Sopenharmony_cistatic const unsigned int z2_matrix_keys[] = { 3598c2ecf20Sopenharmony_ci KEY(0, 0, KEY_OPTION), 3608c2ecf20Sopenharmony_ci KEY(1, 0, KEY_UP), 3618c2ecf20Sopenharmony_ci KEY(2, 0, KEY_DOWN), 3628c2ecf20Sopenharmony_ci KEY(3, 0, KEY_LEFT), 3638c2ecf20Sopenharmony_ci KEY(4, 0, KEY_RIGHT), 3648c2ecf20Sopenharmony_ci KEY(5, 0, KEY_END), 3658c2ecf20Sopenharmony_ci KEY(6, 0, KEY_KPPLUS), 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci KEY(0, 1, KEY_HOME), 3688c2ecf20Sopenharmony_ci KEY(1, 1, KEY_Q), 3698c2ecf20Sopenharmony_ci KEY(2, 1, KEY_I), 3708c2ecf20Sopenharmony_ci KEY(3, 1, KEY_G), 3718c2ecf20Sopenharmony_ci KEY(4, 1, KEY_X), 3728c2ecf20Sopenharmony_ci KEY(5, 1, KEY_ENTER), 3738c2ecf20Sopenharmony_ci KEY(6, 1, KEY_KPMINUS), 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci KEY(0, 2, KEY_PAGEUP), 3768c2ecf20Sopenharmony_ci KEY(1, 2, KEY_W), 3778c2ecf20Sopenharmony_ci KEY(2, 2, KEY_O), 3788c2ecf20Sopenharmony_ci KEY(3, 2, KEY_H), 3798c2ecf20Sopenharmony_ci KEY(4, 2, KEY_C), 3808c2ecf20Sopenharmony_ci KEY(5, 2, KEY_LEFTALT), 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci KEY(0, 3, KEY_PAGEDOWN), 3838c2ecf20Sopenharmony_ci KEY(1, 3, KEY_E), 3848c2ecf20Sopenharmony_ci KEY(2, 3, KEY_P), 3858c2ecf20Sopenharmony_ci KEY(3, 3, KEY_J), 3868c2ecf20Sopenharmony_ci KEY(4, 3, KEY_V), 3878c2ecf20Sopenharmony_ci KEY(5, 3, KEY_LEFTSHIFT), 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci KEY(0, 4, KEY_ESC), 3908c2ecf20Sopenharmony_ci KEY(1, 4, KEY_R), 3918c2ecf20Sopenharmony_ci KEY(2, 4, KEY_A), 3928c2ecf20Sopenharmony_ci KEY(3, 4, KEY_K), 3938c2ecf20Sopenharmony_ci KEY(4, 4, KEY_B), 3948c2ecf20Sopenharmony_ci KEY(5, 4, KEY_LEFTCTRL), 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ci KEY(0, 5, KEY_TAB), 3978c2ecf20Sopenharmony_ci KEY(1, 5, KEY_T), 3988c2ecf20Sopenharmony_ci KEY(2, 5, KEY_S), 3998c2ecf20Sopenharmony_ci KEY(3, 5, KEY_L), 4008c2ecf20Sopenharmony_ci KEY(4, 5, KEY_N), 4018c2ecf20Sopenharmony_ci KEY(5, 5, KEY_SPACE), 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ci KEY(0, 6, KEY_STOPCD), 4048c2ecf20Sopenharmony_ci KEY(1, 6, KEY_Y), 4058c2ecf20Sopenharmony_ci KEY(2, 6, KEY_D), 4068c2ecf20Sopenharmony_ci KEY(3, 6, KEY_BACKSPACE), 4078c2ecf20Sopenharmony_ci KEY(4, 6, KEY_M), 4088c2ecf20Sopenharmony_ci KEY(5, 6, KEY_COMMA), 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ci KEY(0, 7, KEY_PLAYCD), 4118c2ecf20Sopenharmony_ci KEY(1, 7, KEY_U), 4128c2ecf20Sopenharmony_ci KEY(2, 7, KEY_F), 4138c2ecf20Sopenharmony_ci KEY(3, 7, KEY_Z), 4148c2ecf20Sopenharmony_ci KEY(4, 7, KEY_SEMICOLON), 4158c2ecf20Sopenharmony_ci KEY(5, 7, KEY_DOT), 4168c2ecf20Sopenharmony_ci}; 4178c2ecf20Sopenharmony_ci 4188c2ecf20Sopenharmony_cistatic struct matrix_keymap_data z2_matrix_keymap_data = { 4198c2ecf20Sopenharmony_ci .keymap = z2_matrix_keys, 4208c2ecf20Sopenharmony_ci .keymap_size = ARRAY_SIZE(z2_matrix_keys), 4218c2ecf20Sopenharmony_ci}; 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_cistatic struct pxa27x_keypad_platform_data z2_keypad_platform_data = { 4248c2ecf20Sopenharmony_ci .matrix_key_rows = 7, 4258c2ecf20Sopenharmony_ci .matrix_key_cols = 8, 4268c2ecf20Sopenharmony_ci .matrix_keymap_data = &z2_matrix_keymap_data, 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci .debounce_interval = 30, 4298c2ecf20Sopenharmony_ci}; 4308c2ecf20Sopenharmony_ci 4318c2ecf20Sopenharmony_cistatic void __init z2_mkp_init(void) 4328c2ecf20Sopenharmony_ci{ 4338c2ecf20Sopenharmony_ci pxa_set_keypad_info(&z2_keypad_platform_data); 4348c2ecf20Sopenharmony_ci} 4358c2ecf20Sopenharmony_ci#else 4368c2ecf20Sopenharmony_cistatic inline void z2_mkp_init(void) {} 4378c2ecf20Sopenharmony_ci#endif 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_ci/****************************************************************************** 4408c2ecf20Sopenharmony_ci * GPIO keys 4418c2ecf20Sopenharmony_ci ******************************************************************************/ 4428c2ecf20Sopenharmony_ci#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 4438c2ecf20Sopenharmony_cistatic struct gpio_keys_button z2_pxa_buttons[] = { 4448c2ecf20Sopenharmony_ci { 4458c2ecf20Sopenharmony_ci .code = KEY_POWER, 4468c2ecf20Sopenharmony_ci .gpio = GPIO1_ZIPITZ2_POWER_BUTTON, 4478c2ecf20Sopenharmony_ci .active_low = 0, 4488c2ecf20Sopenharmony_ci .desc = "Power Button", 4498c2ecf20Sopenharmony_ci .wakeup = 1, 4508c2ecf20Sopenharmony_ci .type = EV_KEY, 4518c2ecf20Sopenharmony_ci }, 4528c2ecf20Sopenharmony_ci { 4538c2ecf20Sopenharmony_ci .code = SW_LID, 4548c2ecf20Sopenharmony_ci .gpio = GPIO98_ZIPITZ2_LID_BUTTON, 4558c2ecf20Sopenharmony_ci .active_low = 1, 4568c2ecf20Sopenharmony_ci .desc = "Lid Switch", 4578c2ecf20Sopenharmony_ci .wakeup = 0, 4588c2ecf20Sopenharmony_ci .type = EV_SW, 4598c2ecf20Sopenharmony_ci }, 4608c2ecf20Sopenharmony_ci}; 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_cistatic struct gpio_keys_platform_data z2_pxa_keys_data = { 4638c2ecf20Sopenharmony_ci .buttons = z2_pxa_buttons, 4648c2ecf20Sopenharmony_ci .nbuttons = ARRAY_SIZE(z2_pxa_buttons), 4658c2ecf20Sopenharmony_ci}; 4668c2ecf20Sopenharmony_ci 4678c2ecf20Sopenharmony_cistatic struct platform_device z2_pxa_keys = { 4688c2ecf20Sopenharmony_ci .name = "gpio-keys", 4698c2ecf20Sopenharmony_ci .id = -1, 4708c2ecf20Sopenharmony_ci .dev = { 4718c2ecf20Sopenharmony_ci .platform_data = &z2_pxa_keys_data, 4728c2ecf20Sopenharmony_ci }, 4738c2ecf20Sopenharmony_ci}; 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_cistatic void __init z2_keys_init(void) 4768c2ecf20Sopenharmony_ci{ 4778c2ecf20Sopenharmony_ci platform_device_register(&z2_pxa_keys); 4788c2ecf20Sopenharmony_ci} 4798c2ecf20Sopenharmony_ci#else 4808c2ecf20Sopenharmony_cistatic inline void z2_keys_init(void) {} 4818c2ecf20Sopenharmony_ci#endif 4828c2ecf20Sopenharmony_ci 4838c2ecf20Sopenharmony_ci/****************************************************************************** 4848c2ecf20Sopenharmony_ci * Battery 4858c2ecf20Sopenharmony_ci ******************************************************************************/ 4868c2ecf20Sopenharmony_ci#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE) 4878c2ecf20Sopenharmony_cistatic struct z2_battery_info batt_chip_info = { 4888c2ecf20Sopenharmony_ci .batt_I2C_bus = 0, 4898c2ecf20Sopenharmony_ci .batt_I2C_addr = 0x55, 4908c2ecf20Sopenharmony_ci .batt_I2C_reg = 2, 4918c2ecf20Sopenharmony_ci .charge_gpio = GPIO0_ZIPITZ2_AC_DETECT, 4928c2ecf20Sopenharmony_ci .min_voltage = 3475000, 4938c2ecf20Sopenharmony_ci .max_voltage = 4190000, 4948c2ecf20Sopenharmony_ci .batt_div = 59, 4958c2ecf20Sopenharmony_ci .batt_mult = 1000000, 4968c2ecf20Sopenharmony_ci .batt_tech = POWER_SUPPLY_TECHNOLOGY_LION, 4978c2ecf20Sopenharmony_ci .batt_name = "Z2", 4988c2ecf20Sopenharmony_ci}; 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata z2_i2c_board_info[] = { 5018c2ecf20Sopenharmony_ci { 5028c2ecf20Sopenharmony_ci I2C_BOARD_INFO("aer915", 0x55), 5038c2ecf20Sopenharmony_ci .platform_data = &batt_chip_info, 5048c2ecf20Sopenharmony_ci }, { 5058c2ecf20Sopenharmony_ci I2C_BOARD_INFO("wm8750", 0x1b), 5068c2ecf20Sopenharmony_ci }, 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci}; 5098c2ecf20Sopenharmony_ci 5108c2ecf20Sopenharmony_cistatic void __init z2_i2c_init(void) 5118c2ecf20Sopenharmony_ci{ 5128c2ecf20Sopenharmony_ci pxa_set_i2c_info(NULL); 5138c2ecf20Sopenharmony_ci i2c_register_board_info(0, ARRAY_AND_SIZE(z2_i2c_board_info)); 5148c2ecf20Sopenharmony_ci} 5158c2ecf20Sopenharmony_ci#else 5168c2ecf20Sopenharmony_cistatic inline void z2_i2c_init(void) {} 5178c2ecf20Sopenharmony_ci#endif 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_ci/****************************************************************************** 5208c2ecf20Sopenharmony_ci * SSP Devices - WiFi and LCD control 5218c2ecf20Sopenharmony_ci ******************************************************************************/ 5228c2ecf20Sopenharmony_ci#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE) 5238c2ecf20Sopenharmony_ci/* WiFi */ 5248c2ecf20Sopenharmony_cistatic int z2_lbs_spi_setup(struct spi_device *spi) 5258c2ecf20Sopenharmony_ci{ 5268c2ecf20Sopenharmony_ci int ret = 0; 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_ci ret = gpio_request(GPIO14_ZIPITZ2_WIFI_POWER, "WiFi Power"); 5298c2ecf20Sopenharmony_ci if (ret) 5308c2ecf20Sopenharmony_ci goto err; 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci ret = gpio_direction_output(GPIO14_ZIPITZ2_WIFI_POWER, 1); 5338c2ecf20Sopenharmony_ci if (ret) 5348c2ecf20Sopenharmony_ci goto err2; 5358c2ecf20Sopenharmony_ci 5368c2ecf20Sopenharmony_ci /* Wait until card is powered on */ 5378c2ecf20Sopenharmony_ci mdelay(180); 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci spi->bits_per_word = 16; 5408c2ecf20Sopenharmony_ci spi->mode = SPI_MODE_2, 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_ci spi_setup(spi); 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci return 0; 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_cierr2: 5478c2ecf20Sopenharmony_ci gpio_free(GPIO14_ZIPITZ2_WIFI_POWER); 5488c2ecf20Sopenharmony_cierr: 5498c2ecf20Sopenharmony_ci return ret; 5508c2ecf20Sopenharmony_ci}; 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_cistatic int z2_lbs_spi_teardown(struct spi_device *spi) 5538c2ecf20Sopenharmony_ci{ 5548c2ecf20Sopenharmony_ci gpio_set_value(GPIO14_ZIPITZ2_WIFI_POWER, 0); 5558c2ecf20Sopenharmony_ci gpio_free(GPIO14_ZIPITZ2_WIFI_POWER); 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_ci return 0; 5588c2ecf20Sopenharmony_ci}; 5598c2ecf20Sopenharmony_ci 5608c2ecf20Sopenharmony_cistatic struct pxa2xx_spi_chip z2_lbs_chip_info = { 5618c2ecf20Sopenharmony_ci .rx_threshold = 8, 5628c2ecf20Sopenharmony_ci .tx_threshold = 8, 5638c2ecf20Sopenharmony_ci .timeout = 1000, 5648c2ecf20Sopenharmony_ci .gpio_cs = GPIO24_ZIPITZ2_WIFI_CS, 5658c2ecf20Sopenharmony_ci}; 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_cistatic struct libertas_spi_platform_data z2_lbs_pdata = { 5688c2ecf20Sopenharmony_ci .use_dummy_writes = 1, 5698c2ecf20Sopenharmony_ci .setup = z2_lbs_spi_setup, 5708c2ecf20Sopenharmony_ci .teardown = z2_lbs_spi_teardown, 5718c2ecf20Sopenharmony_ci}; 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci/* LCD */ 5748c2ecf20Sopenharmony_cistatic struct pxa2xx_spi_chip lms283_chip_info = { 5758c2ecf20Sopenharmony_ci .rx_threshold = 1, 5768c2ecf20Sopenharmony_ci .tx_threshold = 1, 5778c2ecf20Sopenharmony_ci .timeout = 64, 5788c2ecf20Sopenharmony_ci .gpio_cs = GPIO88_ZIPITZ2_LCD_CS, 5798c2ecf20Sopenharmony_ci}; 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_cistatic const struct lms283gf05_pdata lms283_pdata = { 5828c2ecf20Sopenharmony_ci .reset_gpio = GPIO19_ZIPITZ2_LCD_RESET, 5838c2ecf20Sopenharmony_ci}; 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_cistatic struct spi_board_info spi_board_info[] __initdata = { 5868c2ecf20Sopenharmony_ci{ 5878c2ecf20Sopenharmony_ci .modalias = "libertas_spi", 5888c2ecf20Sopenharmony_ci .platform_data = &z2_lbs_pdata, 5898c2ecf20Sopenharmony_ci .controller_data = &z2_lbs_chip_info, 5908c2ecf20Sopenharmony_ci .irq = PXA_GPIO_TO_IRQ(GPIO36_ZIPITZ2_WIFI_IRQ), 5918c2ecf20Sopenharmony_ci .max_speed_hz = 13000000, 5928c2ecf20Sopenharmony_ci .bus_num = 1, 5938c2ecf20Sopenharmony_ci .chip_select = 0, 5948c2ecf20Sopenharmony_ci}, 5958c2ecf20Sopenharmony_ci{ 5968c2ecf20Sopenharmony_ci .modalias = "lms283gf05", 5978c2ecf20Sopenharmony_ci .controller_data = &lms283_chip_info, 5988c2ecf20Sopenharmony_ci .platform_data = &lms283_pdata, 5998c2ecf20Sopenharmony_ci .max_speed_hz = 400000, 6008c2ecf20Sopenharmony_ci .bus_num = 2, 6018c2ecf20Sopenharmony_ci .chip_select = 0, 6028c2ecf20Sopenharmony_ci}, 6038c2ecf20Sopenharmony_ci}; 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_cistatic struct pxa2xx_spi_controller pxa_ssp1_master_info = { 6068c2ecf20Sopenharmony_ci .num_chipselect = 1, 6078c2ecf20Sopenharmony_ci .enable_dma = 1, 6088c2ecf20Sopenharmony_ci}; 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_cistatic struct pxa2xx_spi_controller pxa_ssp2_master_info = { 6118c2ecf20Sopenharmony_ci .num_chipselect = 1, 6128c2ecf20Sopenharmony_ci}; 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_cistatic void __init z2_spi_init(void) 6158c2ecf20Sopenharmony_ci{ 6168c2ecf20Sopenharmony_ci pxa2xx_set_spi_info(1, &pxa_ssp1_master_info); 6178c2ecf20Sopenharmony_ci pxa2xx_set_spi_info(2, &pxa_ssp2_master_info); 6188c2ecf20Sopenharmony_ci spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); 6198c2ecf20Sopenharmony_ci} 6208c2ecf20Sopenharmony_ci#else 6218c2ecf20Sopenharmony_cistatic inline void z2_spi_init(void) {} 6228c2ecf20Sopenharmony_ci#endif 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_ci/****************************************************************************** 6258c2ecf20Sopenharmony_ci * Core power regulator 6268c2ecf20Sopenharmony_ci ******************************************************************************/ 6278c2ecf20Sopenharmony_ci#if defined(CONFIG_REGULATOR_TPS65023) || \ 6288c2ecf20Sopenharmony_ci defined(CONFIG_REGULATOR_TPS65023_MODULE) 6298c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply z2_tps65021_consumers[] = { 6308c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vcc_core", NULL), 6318c2ecf20Sopenharmony_ci}; 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_cistatic struct regulator_init_data z2_tps65021_info[] = { 6348c2ecf20Sopenharmony_ci { 6358c2ecf20Sopenharmony_ci .constraints = { 6368c2ecf20Sopenharmony_ci .name = "vcc_core range", 6378c2ecf20Sopenharmony_ci .min_uV = 800000, 6388c2ecf20Sopenharmony_ci .max_uV = 1600000, 6398c2ecf20Sopenharmony_ci .always_on = 1, 6408c2ecf20Sopenharmony_ci .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, 6418c2ecf20Sopenharmony_ci }, 6428c2ecf20Sopenharmony_ci .consumer_supplies = z2_tps65021_consumers, 6438c2ecf20Sopenharmony_ci .num_consumer_supplies = ARRAY_SIZE(z2_tps65021_consumers), 6448c2ecf20Sopenharmony_ci }, { 6458c2ecf20Sopenharmony_ci .constraints = { 6468c2ecf20Sopenharmony_ci .name = "DCDC2", 6478c2ecf20Sopenharmony_ci .min_uV = 3300000, 6488c2ecf20Sopenharmony_ci .max_uV = 3300000, 6498c2ecf20Sopenharmony_ci .always_on = 1, 6508c2ecf20Sopenharmony_ci }, 6518c2ecf20Sopenharmony_ci }, { 6528c2ecf20Sopenharmony_ci .constraints = { 6538c2ecf20Sopenharmony_ci .name = "DCDC3", 6548c2ecf20Sopenharmony_ci .min_uV = 1800000, 6558c2ecf20Sopenharmony_ci .max_uV = 1800000, 6568c2ecf20Sopenharmony_ci .always_on = 1, 6578c2ecf20Sopenharmony_ci }, 6588c2ecf20Sopenharmony_ci }, { 6598c2ecf20Sopenharmony_ci .constraints = { 6608c2ecf20Sopenharmony_ci .name = "LDO1", 6618c2ecf20Sopenharmony_ci .min_uV = 1000000, 6628c2ecf20Sopenharmony_ci .max_uV = 3150000, 6638c2ecf20Sopenharmony_ci .always_on = 1, 6648c2ecf20Sopenharmony_ci }, 6658c2ecf20Sopenharmony_ci }, { 6668c2ecf20Sopenharmony_ci .constraints = { 6678c2ecf20Sopenharmony_ci .name = "LDO2", 6688c2ecf20Sopenharmony_ci .min_uV = 1050000, 6698c2ecf20Sopenharmony_ci .max_uV = 3300000, 6708c2ecf20Sopenharmony_ci .always_on = 1, 6718c2ecf20Sopenharmony_ci }, 6728c2ecf20Sopenharmony_ci } 6738c2ecf20Sopenharmony_ci}; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata z2_pi2c_board_info[] = { 6768c2ecf20Sopenharmony_ci { 6778c2ecf20Sopenharmony_ci I2C_BOARD_INFO("tps65021", 0x48), 6788c2ecf20Sopenharmony_ci .platform_data = &z2_tps65021_info, 6798c2ecf20Sopenharmony_ci }, 6808c2ecf20Sopenharmony_ci}; 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_cistatic void __init z2_pmic_init(void) 6838c2ecf20Sopenharmony_ci{ 6848c2ecf20Sopenharmony_ci pxa27x_set_i2c_power_info(NULL); 6858c2ecf20Sopenharmony_ci i2c_register_board_info(1, ARRAY_AND_SIZE(z2_pi2c_board_info)); 6868c2ecf20Sopenharmony_ci} 6878c2ecf20Sopenharmony_ci#else 6888c2ecf20Sopenharmony_cistatic inline void z2_pmic_init(void) {} 6898c2ecf20Sopenharmony_ci#endif 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 6928c2ecf20Sopenharmony_cistatic void z2_power_off(void) 6938c2ecf20Sopenharmony_ci{ 6948c2ecf20Sopenharmony_ci /* We're using deep sleep as poweroff, so clear PSPR to ensure that 6958c2ecf20Sopenharmony_ci * bootloader will jump to its entry point in resume handler 6968c2ecf20Sopenharmony_ci */ 6978c2ecf20Sopenharmony_ci PSPR = 0x0; 6988c2ecf20Sopenharmony_ci local_irq_disable(); 6998c2ecf20Sopenharmony_ci pxa27x_set_pwrmode(PWRMODE_DEEPSLEEP); 7008c2ecf20Sopenharmony_ci pxa27x_cpu_pm_enter(PM_SUSPEND_MEM); 7018c2ecf20Sopenharmony_ci} 7028c2ecf20Sopenharmony_ci#else 7038c2ecf20Sopenharmony_ci#define z2_power_off NULL 7048c2ecf20Sopenharmony_ci#endif 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci/****************************************************************************** 7078c2ecf20Sopenharmony_ci * Machine init 7088c2ecf20Sopenharmony_ci ******************************************************************************/ 7098c2ecf20Sopenharmony_cistatic void __init z2_init(void) 7108c2ecf20Sopenharmony_ci{ 7118c2ecf20Sopenharmony_ci pxa2xx_mfp_config(ARRAY_AND_SIZE(z2_pin_config)); 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_ci pxa_set_ffuart_info(NULL); 7148c2ecf20Sopenharmony_ci pxa_set_btuart_info(NULL); 7158c2ecf20Sopenharmony_ci pxa_set_stuart_info(NULL); 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci z2_lcd_init(); 7188c2ecf20Sopenharmony_ci z2_mmc_init(); 7198c2ecf20Sopenharmony_ci z2_mkp_init(); 7208c2ecf20Sopenharmony_ci z2_i2c_init(); 7218c2ecf20Sopenharmony_ci z2_spi_init(); 7228c2ecf20Sopenharmony_ci z2_nor_init(); 7238c2ecf20Sopenharmony_ci z2_pwm_init(); 7248c2ecf20Sopenharmony_ci z2_leds_init(); 7258c2ecf20Sopenharmony_ci z2_keys_init(); 7268c2ecf20Sopenharmony_ci z2_pmic_init(); 7278c2ecf20Sopenharmony_ci 7288c2ecf20Sopenharmony_ci pm_power_off = z2_power_off; 7298c2ecf20Sopenharmony_ci} 7308c2ecf20Sopenharmony_ci 7318c2ecf20Sopenharmony_ciMACHINE_START(ZIPIT2, "Zipit Z2") 7328c2ecf20Sopenharmony_ci .atag_offset = 0x100, 7338c2ecf20Sopenharmony_ci .map_io = pxa27x_map_io, 7348c2ecf20Sopenharmony_ci .nr_irqs = PXA_NR_IRQS, 7358c2ecf20Sopenharmony_ci .init_irq = pxa27x_init_irq, 7368c2ecf20Sopenharmony_ci .handle_irq = pxa27x_handle_irq, 7378c2ecf20Sopenharmony_ci .init_time = pxa_timer_init, 7388c2ecf20Sopenharmony_ci .init_machine = z2_init, 7398c2ecf20Sopenharmony_ci .restart = pxa_restart, 7408c2ecf20Sopenharmony_ciMACHINE_END 741