linux/arch/arm/mach-pxa/palmtx.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Hardware definitions for PalmTX
   4 *
   5 * Author:     Marek Vasut <marek.vasut@gmail.com>
   6 *
   7 * Based on work of:
   8 *              Alex Osborne <ato@meshy.org>
   9 *              Cristiano P. <cristianop@users.sourceforge.net>
  10 *              Jan Herman <2hp@seznam.cz>
  11 *              Michal Hrusecky
  12 *
  13 * (find more info at www.hackndev.com)
  14 */
  15
  16#include <linux/platform_device.h>
  17#include <linux/delay.h>
  18#include <linux/irq.h>
  19#include <linux/gpio_keys.h>
  20#include <linux/input.h>
  21#include <linux/pda_power.h>
  22#include <linux/pwm_backlight.h>
  23#include <linux/gpio.h>
  24#include <linux/wm97xx.h>
  25#include <linux/power_supply.h>
  26#include <linux/mtd/platnand.h>
  27#include <linux/mtd/mtd.h>
  28#include <linux/mtd/physmap.h>
  29
  30#include <asm/mach-types.h>
  31#include <asm/mach/arch.h>
  32#include <asm/mach/map.h>
  33
  34#include "pxa27x.h"
  35#include <mach/audio.h>
  36#include <mach/palmtx.h>
  37#include <linux/platform_data/mmc-pxamci.h>
  38#include <linux/platform_data/video-pxafb.h>
  39#include <linux/platform_data/irda-pxaficp.h>
  40#include <linux/platform_data/keypad-pxa27x.h>
  41#include "udc.h"
  42#include <linux/platform_data/asoc-palm27x.h>
  43#include "palm27x.h"
  44
  45#include "generic.h"
  46#include "devices.h"
  47
  48/******************************************************************************
  49 * Pin configuration
  50 ******************************************************************************/
  51static unsigned long palmtx_pin_config[] __initdata = {
  52        /* MMC */
  53        GPIO32_MMC_CLK,
  54        GPIO92_MMC_DAT_0,
  55        GPIO109_MMC_DAT_1,
  56        GPIO110_MMC_DAT_2,
  57        GPIO111_MMC_DAT_3,
  58        GPIO112_MMC_CMD,
  59        GPIO14_GPIO,    /* SD detect */
  60        GPIO114_GPIO,   /* SD power */
  61        GPIO115_GPIO,   /* SD r/o switch */
  62
  63        /* AC97 */
  64        GPIO28_AC97_BITCLK,
  65        GPIO29_AC97_SDATA_IN_0,
  66        GPIO30_AC97_SDATA_OUT,
  67        GPIO31_AC97_SYNC,
  68        GPIO89_AC97_SYSCLK,
  69        GPIO95_AC97_nRESET,
  70
  71        /* IrDA */
  72        GPIO40_GPIO,    /* ir disable */
  73        GPIO46_FICP_RXD,
  74        GPIO47_FICP_TXD,
  75
  76        /* PWM */
  77        GPIO16_PWM0_OUT,
  78
  79        /* USB */
  80        GPIO13_GPIO,    /* usb detect */
  81        GPIO93_GPIO,    /* usb power */
  82
  83        /* PCMCIA */
  84        GPIO48_nPOE,
  85        GPIO49_nPWE,
  86        GPIO50_nPIOR,
  87        GPIO51_nPIOW,
  88        GPIO85_nPCE_1,
  89        GPIO54_nPCE_2,
  90        GPIO79_PSKTSEL,
  91        GPIO55_nPREG,
  92        GPIO56_nPWAIT,
  93        GPIO57_nIOIS16,
  94        GPIO94_GPIO,    /* wifi power 1 */
  95        GPIO108_GPIO,   /* wifi power 2 */
  96        GPIO116_GPIO,   /* wifi ready */
  97
  98        /* MATRIX KEYPAD */
  99        GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 100        GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 101        GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 102        GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 103        GPIO103_KP_MKOUT_0,
 104        GPIO104_KP_MKOUT_1,
 105        GPIO105_KP_MKOUT_2,
 106
 107        /* LCD */
 108        GPIOxx_LCD_TFT_16BPP,
 109
 110        /* FFUART */
 111        GPIO34_FFUART_RXD,
 112        GPIO39_FFUART_TXD,
 113
 114        /* NAND */
 115        GPIO15_nCS_1,
 116        GPIO18_RDY,
 117
 118        /* MISC. */
 119        GPIO10_GPIO,    /* hotsync button */
 120        GPIO12_GPIO,    /* power detect */
 121        GPIO107_GPIO,   /* earphone detect */
 122};
 123
 124/******************************************************************************
 125 * NOR Flash
 126 ******************************************************************************/
 127#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 128static struct mtd_partition palmtx_partitions[] = {
 129        {
 130                .name           = "Flash",
 131                .offset         = 0x00000000,
 132                .size           = MTDPART_SIZ_FULL,
 133                .mask_flags     = 0
 134        }
 135};
 136
 137static struct physmap_flash_data palmtx_flash_data[] = {
 138        {
 139                .width          = 2,                    /* bankwidth in bytes */
 140                .parts          = palmtx_partitions,
 141                .nr_parts       = ARRAY_SIZE(palmtx_partitions)
 142        }
 143};
 144
 145static struct resource palmtx_flash_resource = {
 146        .start  = PXA_CS0_PHYS,
 147        .end    = PXA_CS0_PHYS + SZ_8M - 1,
 148        .flags  = IORESOURCE_MEM,
 149};
 150
 151static struct platform_device palmtx_flash = {
 152        .name           = "physmap-flash",
 153        .id             = 0,
 154        .resource       = &palmtx_flash_resource,
 155        .num_resources  = 1,
 156        .dev            = {
 157                .platform_data = palmtx_flash_data,
 158        },
 159};
 160
 161static void __init palmtx_nor_init(void)
 162{
 163        platform_device_register(&palmtx_flash);
 164}
 165#else
 166static inline void palmtx_nor_init(void) {}
 167#endif
 168
 169/******************************************************************************
 170 * GPIO keyboard
 171 ******************************************************************************/
 172#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
 173static const unsigned int palmtx_matrix_keys[] = {
 174        KEY(0, 0, KEY_POWER),
 175        KEY(0, 1, KEY_F1),
 176        KEY(0, 2, KEY_ENTER),
 177
 178        KEY(1, 0, KEY_F2),
 179        KEY(1, 1, KEY_F3),
 180        KEY(1, 2, KEY_F4),
 181
 182        KEY(2, 0, KEY_UP),
 183        KEY(2, 2, KEY_DOWN),
 184
 185        KEY(3, 0, KEY_RIGHT),
 186        KEY(3, 2, KEY_LEFT),
 187};
 188
 189static struct matrix_keymap_data palmtx_matrix_keymap_data = {
 190        .keymap                 = palmtx_matrix_keys,
 191        .keymap_size            = ARRAY_SIZE(palmtx_matrix_keys),
 192};
 193
 194static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
 195        .matrix_key_rows        = 4,
 196        .matrix_key_cols        = 3,
 197        .matrix_keymap_data     = &palmtx_matrix_keymap_data,
 198
 199        .debounce_interval      = 30,
 200};
 201
 202static void __init palmtx_kpc_init(void)
 203{
 204        pxa_set_keypad_info(&palmtx_keypad_platform_data);
 205}
 206#else
 207static inline void palmtx_kpc_init(void) {}
 208#endif
 209
 210/******************************************************************************
 211 * GPIO keys
 212 ******************************************************************************/
 213#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 214static struct gpio_keys_button palmtx_pxa_buttons[] = {
 215        {KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
 216};
 217
 218static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
 219        .buttons        = palmtx_pxa_buttons,
 220        .nbuttons       = ARRAY_SIZE(palmtx_pxa_buttons),
 221};
 222
 223static struct platform_device palmtx_pxa_keys = {
 224        .name   = "gpio-keys",
 225        .id     = -1,
 226        .dev    = {
 227                .platform_data = &palmtx_pxa_keys_data,
 228        },
 229};
 230
 231static void __init palmtx_keys_init(void)
 232{
 233        platform_device_register(&palmtx_pxa_keys);
 234}
 235#else
 236static inline void palmtx_keys_init(void) {}
 237#endif
 238
 239/******************************************************************************
 240 * NAND Flash
 241 ******************************************************************************/
 242#if defined(CONFIG_MTD_NAND_PLATFORM) || \
 243        defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
 244static void palmtx_nand_cmd_ctl(struct nand_chip *this, int cmd,
 245                                unsigned int ctrl)
 246{
 247        char __iomem *nandaddr = this->legacy.IO_ADDR_W;
 248
 249        if (cmd == NAND_CMD_NONE)
 250                return;
 251
 252        if (ctrl & NAND_CLE)
 253                writeb(cmd, PALMTX_NAND_CLE_VIRT);
 254        else if (ctrl & NAND_ALE)
 255                writeb(cmd, PALMTX_NAND_ALE_VIRT);
 256        else
 257                writeb(cmd, nandaddr);
 258}
 259
 260static struct mtd_partition palmtx_partition_info[] = {
 261        [0] = {
 262                .name   = "palmtx-0",
 263                .offset = 0,
 264                .size   = MTDPART_SIZ_FULL
 265        },
 266};
 267
 268struct platform_nand_data palmtx_nand_platdata = {
 269        .chip   = {
 270                .nr_chips               = 1,
 271                .chip_offset            = 0,
 272                .nr_partitions          = ARRAY_SIZE(palmtx_partition_info),
 273                .partitions             = palmtx_partition_info,
 274                .chip_delay             = 20,
 275        },
 276        .ctrl   = {
 277                .cmd_ctrl       = palmtx_nand_cmd_ctl,
 278        },
 279};
 280
 281static struct resource palmtx_nand_resource[] = {
 282        [0]     = {
 283                .start  = PXA_CS1_PHYS,
 284                .end    = PXA_CS1_PHYS + SZ_1M - 1,
 285                .flags  = IORESOURCE_MEM,
 286        },
 287};
 288
 289static struct platform_device palmtx_nand = {
 290        .name           = "gen_nand",
 291        .num_resources  = ARRAY_SIZE(palmtx_nand_resource),
 292        .resource       = palmtx_nand_resource,
 293        .id             = -1,
 294        .dev            = {
 295                .platform_data  = &palmtx_nand_platdata,
 296        }
 297};
 298
 299static void __init palmtx_nand_init(void)
 300{
 301        platform_device_register(&palmtx_nand);
 302}
 303#else
 304static inline void palmtx_nand_init(void) {}
 305#endif
 306
 307/******************************************************************************
 308 * Machine init
 309 ******************************************************************************/
 310static struct map_desc palmtx_io_desc[] __initdata = {
 311{
 312        .virtual        = (unsigned long)PALMTX_PCMCIA_VIRT,
 313        .pfn            = __phys_to_pfn(PALMTX_PCMCIA_PHYS),
 314        .length         = PALMTX_PCMCIA_SIZE,
 315        .type           = MT_DEVICE,
 316}, {
 317        .virtual        = (unsigned long)PALMTX_NAND_ALE_VIRT,
 318        .pfn            = __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
 319        .length         = SZ_1M,
 320        .type           = MT_DEVICE,
 321}, {
 322        .virtual        = (unsigned long)PALMTX_NAND_CLE_VIRT,
 323        .pfn            = __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
 324        .length         = SZ_1M,
 325        .type           = MT_DEVICE,
 326}
 327};
 328
 329static void __init palmtx_map_io(void)
 330{
 331        pxa27x_map_io();
 332        iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
 333}
 334
 335static struct gpiod_lookup_table palmtx_mci_gpio_table = {
 336        .dev_id = "pxa2xx-mci.0",
 337        .table = {
 338                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_DETECT_N,
 339                            "cd", GPIO_ACTIVE_LOW),
 340                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_READONLY,
 341                            "wp", GPIO_ACTIVE_LOW),
 342                GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_POWER,
 343                            "power", GPIO_ACTIVE_HIGH),
 344                { },
 345        },
 346};
 347
 348static void __init palmtx_init(void)
 349{
 350        pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
 351        pxa_set_ffuart_info(NULL);
 352        pxa_set_btuart_info(NULL);
 353        pxa_set_stuart_info(NULL);
 354
 355        palm27x_mmc_init(&palmtx_mci_gpio_table);
 356        palm27x_pm_init(PALMTX_STR_BASE);
 357        palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
 358        palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
 359                        GPIO_NR_PALMTX_USB_PULLUP, 1);
 360        palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
 361        palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
 362                        GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
 363        palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
 364        palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
 365        palm27x_pmic_init();
 366        palmtx_kpc_init();
 367        palmtx_keys_init();
 368        palmtx_nor_init();
 369        palmtx_nand_init();
 370}
 371
 372MACHINE_START(PALMTX, "Palm T|X")
 373        .atag_offset    = 0x100,
 374        .map_io         = palmtx_map_io,
 375        .nr_irqs        = PXA_NR_IRQS,
 376        .init_irq       = pxa27x_init_irq,
 377        .handle_irq     = pxa27x_handle_irq,
 378        .init_time      = pxa_timer_init,
 379        .init_machine   = palmtx_init,
 380        .restart        = pxa_restart,
 381MACHINE_END
 382