linux/arch/arm/mach-pxa/palmte2.c
<<
>>
Prefs
   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 <mach/audio.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
 384