palmte2.c (10466B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Hardware definitions for Palm Tungsten|E2 4 * 5 * Author: 6 * Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com> 7 * 8 * Rewrite for mainline: 9 * Marek Vasut <marek.vasut@gmail.com> 10 * 11 * (find more info at www.hackndev.com) 12 */ 13 14#include <linux/platform_device.h> 15#include <linux/delay.h> 16#include <linux/irq.h> 17#include <linux/gpio_keys.h> 18#include <linux/gpio/machine.h> 19#include <linux/input.h> 20#include <linux/pda_power.h> 21#include <linux/pwm.h> 22#include <linux/pwm_backlight.h> 23#include <linux/gpio.h> 24#include <linux/wm97xx.h> 25#include <linux/power_supply.h> 26 27#include <asm/mach-types.h> 28#include <asm/mach/arch.h> 29#include <asm/mach/map.h> 30 31#include "pxa25x.h" 32#include <linux/platform_data/asoc-pxa.h> 33#include "palmte2.h" 34#include <linux/platform_data/mmc-pxamci.h> 35#include <linux/platform_data/video-pxafb.h> 36#include <linux/platform_data/irda-pxaficp.h> 37#include "udc.h" 38#include <linux/platform_data/asoc-palm27x.h> 39 40#include "generic.h" 41#include "devices.h" 42 43/****************************************************************************** 44 * Pin configuration 45 ******************************************************************************/ 46static unsigned long palmte2_pin_config[] __initdata = { 47 /* MMC */ 48 GPIO6_MMC_CLK, 49 GPIO8_MMC_CS0, 50 GPIO10_GPIO, /* SD detect */ 51 GPIO55_GPIO, /* SD power */ 52 GPIO51_GPIO, /* SD r/o switch */ 53 54 /* AC97 */ 55 GPIO28_AC97_BITCLK, 56 GPIO29_AC97_SDATA_IN_0, 57 GPIO30_AC97_SDATA_OUT, 58 GPIO31_AC97_SYNC, 59 60 /* PWM */ 61 GPIO16_PWM0_OUT, 62 63 /* USB */ 64 GPIO15_GPIO, /* usb detect */ 65 GPIO53_GPIO, /* usb power */ 66 67 /* IrDA */ 68 GPIO48_GPIO, /* ir disable */ 69 GPIO46_FICP_RXD, 70 GPIO47_FICP_TXD, 71 72 /* LCD */ 73 GPIOxx_LCD_TFT_16BPP, 74 75 /* GPIO KEYS */ 76 GPIO5_GPIO, /* notes */ 77 GPIO7_GPIO, /* tasks */ 78 GPIO11_GPIO, /* calendar */ 79 GPIO13_GPIO, /* contacts */ 80 GPIO14_GPIO, /* center */ 81 GPIO19_GPIO, /* left */ 82 GPIO20_GPIO, /* right */ 83 GPIO21_GPIO, /* down */ 84 GPIO22_GPIO, /* up */ 85 86 /* MISC */ 87 GPIO1_RST, /* reset */ 88 GPIO4_GPIO, /* Hotsync button */ 89 GPIO9_GPIO, /* power detect */ 90 GPIO15_GPIO, /* earphone detect */ 91 GPIO37_GPIO, /* LCD power */ 92 GPIO56_GPIO, /* Backlight power */ 93}; 94 95/****************************************************************************** 96 * SD/MMC card controller 97 ******************************************************************************/ 98static struct pxamci_platform_data palmte2_mci_platform_data = { 99 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 100}; 101 102static struct gpiod_lookup_table palmte2_mci_gpio_table = { 103 .dev_id = "pxa2xx-mci.0", 104 .table = { 105 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_DETECT_N, 106 "cd", GPIO_ACTIVE_LOW), 107 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_READONLY, 108 "wp", GPIO_ACTIVE_LOW), 109 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_POWER, 110 "power", GPIO_ACTIVE_HIGH), 111 { }, 112 }, 113}; 114 115#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 116/****************************************************************************** 117 * GPIO keys 118 ******************************************************************************/ 119static struct gpio_keys_button palmte2_pxa_buttons[] = { 120 {KEY_F1, GPIO_NR_PALMTE2_KEY_CONTACTS, 1, "Contacts" }, 121 {KEY_F2, GPIO_NR_PALMTE2_KEY_CALENDAR, 1, "Calendar" }, 122 {KEY_F3, GPIO_NR_PALMTE2_KEY_TASKS, 1, "Tasks" }, 123 {KEY_F4, GPIO_NR_PALMTE2_KEY_NOTES, 1, "Notes" }, 124 {KEY_ENTER, GPIO_NR_PALMTE2_KEY_CENTER, 1, "Center" }, 125 {KEY_LEFT, GPIO_NR_PALMTE2_KEY_LEFT, 1, "Left" }, 126 {KEY_RIGHT, GPIO_NR_PALMTE2_KEY_RIGHT, 1, "Right" }, 127 {KEY_DOWN, GPIO_NR_PALMTE2_KEY_DOWN, 1, "Down" }, 128 {KEY_UP, GPIO_NR_PALMTE2_KEY_UP, 1, "Up" }, 129}; 130 131static struct gpio_keys_platform_data palmte2_pxa_keys_data = { 132 .buttons = palmte2_pxa_buttons, 133 .nbuttons = ARRAY_SIZE(palmte2_pxa_buttons), 134}; 135 136static struct platform_device palmte2_pxa_keys = { 137 .name = "gpio-keys", 138 .id = -1, 139 .dev = { 140 .platform_data = &palmte2_pxa_keys_data, 141 }, 142}; 143#endif 144 145/****************************************************************************** 146 * Backlight 147 ******************************************************************************/ 148static struct pwm_lookup palmte2_pwm_lookup[] = { 149 PWM_LOOKUP("pxa25x-pwm.0", 0, "pwm-backlight.0", NULL, 150 PALMTE2_PERIOD_NS, PWM_POLARITY_NORMAL), 151}; 152 153static struct gpio palmte_bl_gpios[] = { 154 { GPIO_NR_PALMTE2_BL_POWER, GPIOF_INIT_LOW, "Backlight power" }, 155 { GPIO_NR_PALMTE2_LCD_POWER, GPIOF_INIT_LOW, "LCD power" }, 156}; 157 158static int palmte2_backlight_init(struct device *dev) 159{ 160 return gpio_request_array(ARRAY_AND_SIZE(palmte_bl_gpios)); 161} 162 163static int palmte2_backlight_notify(struct device *dev, int brightness) 164{ 165 gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness); 166 gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness); 167 return brightness; 168} 169 170static void palmte2_backlight_exit(struct device *dev) 171{ 172 gpio_free_array(ARRAY_AND_SIZE(palmte_bl_gpios)); 173} 174 175static struct platform_pwm_backlight_data palmte2_backlight_data = { 176 .max_brightness = PALMTE2_MAX_INTENSITY, 177 .dft_brightness = PALMTE2_MAX_INTENSITY, 178 .init = palmte2_backlight_init, 179 .notify = palmte2_backlight_notify, 180 .exit = palmte2_backlight_exit, 181}; 182 183static struct platform_device palmte2_backlight = { 184 .name = "pwm-backlight", 185 .dev = { 186 .parent = &pxa25x_device_pwm0.dev, 187 .platform_data = &palmte2_backlight_data, 188 }, 189}; 190 191/****************************************************************************** 192 * IrDA 193 ******************************************************************************/ 194static struct pxaficp_platform_data palmte2_ficp_platform_data = { 195 .gpio_pwdown = GPIO_NR_PALMTE2_IR_DISABLE, 196 .transceiver_cap = IR_SIRMODE | IR_OFF, 197}; 198 199/****************************************************************************** 200 * UDC 201 ******************************************************************************/ 202static struct gpiod_lookup_table palmte2_udc_gpiod_table = { 203 .dev_id = "gpio-vbus", 204 .table = { 205 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_USB_DETECT_N, 206 "vbus", GPIO_ACTIVE_LOW), 207 GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_USB_PULLUP, 208 "pullup", GPIO_ACTIVE_HIGH), 209 { }, 210 }, 211}; 212 213static struct platform_device palmte2_gpio_vbus = { 214 .name = "gpio-vbus", 215 .id = -1, 216}; 217 218/****************************************************************************** 219 * Power supply 220 ******************************************************************************/ 221static int power_supply_init(struct device *dev) 222{ 223 int ret; 224 225 ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC"); 226 if (ret) 227 goto err1; 228 ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT); 229 if (ret) 230 goto err2; 231 232 return 0; 233 234err2: 235 gpio_free(GPIO_NR_PALMTE2_POWER_DETECT); 236err1: 237 return ret; 238} 239 240static int palmte2_is_ac_online(void) 241{ 242 return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT); 243} 244 245static void power_supply_exit(struct device *dev) 246{ 247 gpio_free(GPIO_NR_PALMTE2_POWER_DETECT); 248} 249 250static char *palmte2_supplicants[] = { 251 "main-battery", 252}; 253 254static struct pda_power_pdata power_supply_info = { 255 .init = power_supply_init, 256 .is_ac_online = palmte2_is_ac_online, 257 .exit = power_supply_exit, 258 .supplied_to = palmte2_supplicants, 259 .num_supplicants = ARRAY_SIZE(palmte2_supplicants), 260}; 261 262static struct platform_device power_supply = { 263 .name = "pda-power", 264 .id = -1, 265 .dev = { 266 .platform_data = &power_supply_info, 267 }, 268}; 269 270/****************************************************************************** 271 * WM97xx audio, battery 272 ******************************************************************************/ 273static struct wm97xx_batt_pdata palmte2_batt_pdata = { 274 .batt_aux = WM97XX_AUX_ID3, 275 .temp_aux = WM97XX_AUX_ID2, 276 .max_voltage = PALMTE2_BAT_MAX_VOLTAGE, 277 .min_voltage = PALMTE2_BAT_MIN_VOLTAGE, 278 .batt_mult = 1000, 279 .batt_div = 414, 280 .temp_mult = 1, 281 .temp_div = 1, 282 .batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO, 283 .batt_name = "main-batt", 284}; 285 286static struct wm97xx_pdata palmte2_wm97xx_pdata = { 287 .batt_pdata = &palmte2_batt_pdata, 288}; 289 290static pxa2xx_audio_ops_t palmte2_ac97_pdata = { 291 .codec_pdata = { &palmte2_wm97xx_pdata, }, 292}; 293 294static struct palm27x_asoc_info palmte2_asoc_pdata = { 295 .jack_gpio = GPIO_NR_PALMTE2_EARPHONE_DETECT, 296}; 297 298static struct platform_device palmte2_asoc = { 299 .name = "palm27x-asoc", 300 .id = -1, 301 .dev = { 302 .platform_data = &palmte2_asoc_pdata, 303 }, 304}; 305 306/****************************************************************************** 307 * Framebuffer 308 ******************************************************************************/ 309static struct pxafb_mode_info palmte2_lcd_modes[] = { 310{ 311 .pixclock = 77757, 312 .xres = 320, 313 .yres = 320, 314 .bpp = 16, 315 316 .left_margin = 28, 317 .right_margin = 7, 318 .upper_margin = 7, 319 .lower_margin = 5, 320 321 .hsync_len = 4, 322 .vsync_len = 1, 323}, 324}; 325 326static struct pxafb_mach_info palmte2_lcd_screen = { 327 .modes = palmte2_lcd_modes, 328 .num_modes = ARRAY_SIZE(palmte2_lcd_modes), 329 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, 330}; 331 332/****************************************************************************** 333 * Machine init 334 ******************************************************************************/ 335static struct platform_device *devices[] __initdata = { 336#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 337 &palmte2_pxa_keys, 338#endif 339 &palmte2_backlight, 340 &power_supply, 341 &palmte2_asoc, 342 &palmte2_gpio_vbus, 343}; 344 345/* setup udc GPIOs initial state */ 346static void __init palmte2_udc_init(void) 347{ 348 if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) { 349 gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1); 350 gpio_free(GPIO_NR_PALMTE2_USB_PULLUP); 351 } 352} 353 354static void __init palmte2_init(void) 355{ 356 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config)); 357 358 pxa_set_ffuart_info(NULL); 359 pxa_set_btuart_info(NULL); 360 pxa_set_stuart_info(NULL); 361 362 pxa_set_fb_info(NULL, &palmte2_lcd_screen); 363 gpiod_add_lookup_table(&palmte2_mci_gpio_table); 364 pxa_set_mci_info(&palmte2_mci_platform_data); 365 palmte2_udc_init(); 366 pxa_set_ac97_info(&palmte2_ac97_pdata); 367 pxa_set_ficp_info(&palmte2_ficp_platform_data); 368 369 pwm_add_table(palmte2_pwm_lookup, ARRAY_SIZE(palmte2_pwm_lookup)); 370 gpiod_add_lookup_table(&palmte2_udc_gpiod_table); 371 platform_add_devices(devices, ARRAY_SIZE(devices)); 372} 373 374MACHINE_START(PALMTE2, "Palm Tungsten|E2") 375 .atag_offset = 0x100, 376 .map_io = pxa25x_map_io, 377 .nr_irqs = PXA_NR_IRQS, 378 .init_irq = pxa25x_init_irq, 379 .handle_irq = pxa25x_handle_irq, 380 .init_time = pxa_timer_init, 381 .init_machine = palmte2_init, 382 .restart = pxa_restart, 383MACHINE_END