linux/arch/arm/mach-pxa/colibri-pxa270.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/mach-pxa/colibri-pxa270.c
   3 *
   4 *  Support for Toradex PXA270 based Colibri module
   5 *  Daniel Mack <daniel@caiaq.de>
   6 *  Marek Vasut <marek.vasut@gmail.com>
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License version 2 as
  10 *  published by the Free Software Foundation.
  11 */
  12
  13#include <linux/init.h>
  14#include <linux/interrupt.h>
  15#include <linux/moduleparam.h>
  16#include <linux/kernel.h>
  17#include <linux/mtd/mtd.h>
  18#include <linux/mtd/partitions.h>
  19#include <linux/mtd/physmap.h>
  20#include <linux/platform_device.h>
  21#include <linux/regulator/machine.h>
  22#include <linux/ucb1400.h>
  23
  24#include <asm/mach/arch.h>
  25#include <asm/mach/flash.h>
  26#include <asm/mach-types.h>
  27#include <asm/sizes.h>
  28
  29#include <mach/audio.h>
  30#include "colibri.h"
  31#include "pxa27x.h"
  32
  33#include "devices.h"
  34#include "generic.h"
  35
  36/******************************************************************************
  37 * Evaluation board MFP
  38 ******************************************************************************/
  39#ifdef   CONFIG_MACH_COLIBRI_EVALBOARD
  40static mfp_cfg_t colibri_pxa270_evalboard_pin_config[] __initdata = {
  41        /* MMC */
  42        GPIO32_MMC_CLK,
  43        GPIO92_MMC_DAT_0,
  44        GPIO109_MMC_DAT_1,
  45        GPIO110_MMC_DAT_2,
  46        GPIO111_MMC_DAT_3,
  47        GPIO112_MMC_CMD,
  48        GPIO0_GPIO,     /* SD detect */
  49
  50        /* FFUART */
  51        GPIO39_FFUART_TXD,
  52        GPIO34_FFUART_RXD,
  53
  54        /* UHC */
  55        GPIO88_USBH1_PWR,
  56        GPIO89_USBH1_PEN,
  57        GPIO119_USBH2_PWR,
  58        GPIO120_USBH2_PEN,
  59
  60        /* PCMCIA */
  61        GPIO85_nPCE_1,
  62        GPIO54_nPCE_2,
  63        GPIO55_nPREG,
  64        GPIO50_nPIOR,
  65        GPIO51_nPIOW,
  66        GPIO49_nPWE,
  67        GPIO48_nPOE,
  68        GPIO57_nIOIS16,
  69        GPIO56_nPWAIT,
  70        GPIO104_PSKTSEL,
  71        GPIO53_GPIO,    /* RESET */
  72        GPIO83_GPIO,    /* BVD1 */
  73        GPIO82_GPIO,    /* BVD2 */
  74        GPIO1_GPIO,     /* READY */
  75        GPIO84_GPIO,    /* DETECT */
  76        GPIO107_GPIO,   /* PPEN */
  77
  78        /* I2C */
  79        GPIO117_I2C_SCL,
  80        GPIO118_I2C_SDA,
  81};
  82#else
  83static mfp_cfg_t colibri_pxa270_evalboard_pin_config[] __initdata = {};
  84#endif
  85
  86#ifdef  CONFIG_MACH_COLIBRI_PXA270_INCOME
  87static mfp_cfg_t income_pin_config[] __initdata = {
  88        /* MMC */
  89        GPIO32_MMC_CLK,
  90        GPIO92_MMC_DAT_0,
  91        GPIO109_MMC_DAT_1,
  92        GPIO110_MMC_DAT_2,
  93        GPIO111_MMC_DAT_3,
  94        GPIO112_MMC_CMD,
  95        GPIO0_GPIO,     /* SD detect */
  96        GPIO1_GPIO,     /* SD read-only */
  97
  98        /* FFUART */
  99        GPIO39_FFUART_TXD,
 100        GPIO34_FFUART_RXD,
 101
 102        /* BFUART */
 103        GPIO42_BTUART_RXD,
 104        GPIO43_BTUART_TXD,
 105        GPIO45_BTUART_RTS,
 106
 107        /* STUART */
 108        GPIO46_STUART_RXD,
 109        GPIO47_STUART_TXD,
 110
 111        /* UHC */
 112        GPIO88_USBH1_PWR,
 113        GPIO89_USBH1_PEN,
 114
 115        /* LCD */
 116        GPIOxx_LCD_TFT_16BPP,
 117
 118        /* PWM */
 119        GPIO16_PWM0_OUT,
 120
 121        /* I2C */
 122        GPIO117_I2C_SCL,
 123        GPIO118_I2C_SDA,
 124
 125        /* LED */
 126        GPIO54_GPIO,    /* LED A */
 127        GPIO55_GPIO,    /* LED B */
 128};
 129#else
 130static mfp_cfg_t income_pin_config[] __initdata = {};
 131#endif
 132
 133/******************************************************************************
 134 * Pin configuration
 135 ******************************************************************************/
 136static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
 137        /* Ethernet */
 138        GPIO78_nCS_2,   /* Ethernet CS */
 139        GPIO114_GPIO,   /* Ethernet IRQ */
 140
 141        /* AC97 */
 142        GPIO28_AC97_BITCLK,
 143        GPIO29_AC97_SDATA_IN_0,
 144        GPIO30_AC97_SDATA_OUT,
 145        GPIO31_AC97_SYNC,
 146        GPIO95_AC97_nRESET,
 147        GPIO98_AC97_SYSCLK,
 148        GPIO113_GPIO,   /* Touchscreen IRQ */
 149};
 150
 151/******************************************************************************
 152 * NOR Flash
 153 ******************************************************************************/
 154#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 155static struct mtd_partition colibri_partitions[] = {
 156        {
 157                .name =         "Bootloader",
 158                .offset =       0x00000000,
 159                .size =         0x00040000,
 160                .mask_flags =   MTD_WRITEABLE   /* force read-only */
 161        }, {
 162                .name =         "Kernel",
 163                .offset =       0x00040000,
 164                .size =         0x00400000,
 165                .mask_flags =   0
 166        }, {
 167                .name =         "Rootfs",
 168                .offset =       0x00440000,
 169                .size =         MTDPART_SIZ_FULL,
 170                .mask_flags =   0
 171        }
 172};
 173
 174static struct physmap_flash_data colibri_flash_data[] = {
 175        {
 176                .width          = 4,                    /* bankwidth in bytes */
 177                .parts          = colibri_partitions,
 178                .nr_parts       = ARRAY_SIZE(colibri_partitions)
 179        }
 180};
 181
 182static struct resource colibri_pxa270_flash_resource = {
 183        .start  = PXA_CS0_PHYS,
 184        .end    = PXA_CS0_PHYS + SZ_32M - 1,
 185        .flags  = IORESOURCE_MEM,
 186};
 187
 188static struct platform_device colibri_pxa270_flash_device = {
 189        .name   = "physmap-flash",
 190        .id     = 0,
 191        .dev    = {
 192                .platform_data = colibri_flash_data,
 193        },
 194        .resource = &colibri_pxa270_flash_resource,
 195        .num_resources = 1,
 196};
 197
 198static void __init colibri_pxa270_nor_init(void)
 199{
 200        platform_device_register(&colibri_pxa270_flash_device);
 201}
 202#else
 203static inline void colibri_pxa270_nor_init(void) {}
 204#endif
 205
 206/******************************************************************************
 207 * Ethernet
 208 ******************************************************************************/
 209#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
 210static struct resource colibri_pxa270_dm9000_resources[] = {
 211        {
 212                .start  = PXA_CS2_PHYS,
 213                .end    = PXA_CS2_PHYS + 3,
 214                .flags  = IORESOURCE_MEM,
 215        },
 216        {
 217                .start  = PXA_CS2_PHYS + 4,
 218                .end    = PXA_CS2_PHYS + 4 + 500,
 219                .flags  = IORESOURCE_MEM,
 220        },
 221        {
 222                .start  = PXA_GPIO_TO_IRQ(GPIO114_COLIBRI_PXA270_ETH_IRQ),
 223                .end    = PXA_GPIO_TO_IRQ(GPIO114_COLIBRI_PXA270_ETH_IRQ),
 224                .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
 225        },
 226};
 227
 228static struct platform_device colibri_pxa270_dm9000_device = {
 229        .name           = "dm9000",
 230        .id             = -1,
 231        .num_resources  = ARRAY_SIZE(colibri_pxa270_dm9000_resources),
 232        .resource       = colibri_pxa270_dm9000_resources,
 233};
 234
 235static void __init colibri_pxa270_eth_init(void)
 236{
 237        platform_device_register(&colibri_pxa270_dm9000_device);
 238}
 239#else
 240static inline void colibri_pxa270_eth_init(void) {}
 241#endif
 242
 243/******************************************************************************
 244 * Audio and Touchscreen
 245 ******************************************************************************/
 246#if     defined(CONFIG_TOUCHSCREEN_UCB1400) || \
 247        defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
 248static pxa2xx_audio_ops_t colibri_pxa270_ac97_pdata = {
 249        .reset_gpio     = 95,
 250};
 251
 252static struct ucb1400_pdata colibri_pxa270_ucb1400_pdata = {
 253        .irq            = PXA_GPIO_TO_IRQ(GPIO113_COLIBRI_PXA270_TS_IRQ),
 254};
 255
 256static struct platform_device colibri_pxa270_ucb1400_device = {
 257        .name           = "ucb1400_core",
 258        .id             = -1,
 259        .dev            = {
 260                .platform_data = &colibri_pxa270_ucb1400_pdata,
 261        },
 262};
 263
 264static void __init colibri_pxa270_tsc_init(void)
 265{
 266        pxa_set_ac97_info(&colibri_pxa270_ac97_pdata);
 267        platform_device_register(&colibri_pxa270_ucb1400_device);
 268}
 269#else
 270static inline void colibri_pxa270_tsc_init(void) {}
 271#endif
 272
 273static int colibri_pxa270_baseboard;
 274core_param(colibri_pxa270_baseboard, colibri_pxa270_baseboard, int, 0444);
 275
 276static void __init colibri_pxa270_init(void)
 277{
 278        pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
 279
 280        colibri_pxa270_nor_init();
 281        colibri_pxa270_eth_init();
 282        colibri_pxa270_tsc_init();
 283
 284        switch (colibri_pxa270_baseboard) {
 285        case COLIBRI_EVALBOARD:
 286                pxa2xx_mfp_config(ARRAY_AND_SIZE(
 287                        colibri_pxa270_evalboard_pin_config));
 288                colibri_evalboard_init();
 289                break;
 290        case COLIBRI_PXA270_INCOME:
 291                pxa2xx_mfp_config(ARRAY_AND_SIZE(income_pin_config));
 292                colibri_pxa270_income_boardinit();
 293                break;
 294        default:
 295                printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n",
 296                                colibri_pxa270_baseboard);
 297        }
 298
 299        regulator_has_full_constraints();
 300}
 301
 302/* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
 303 * with the INCOME mach type or with COLIBRI and the kernel parameter
 304 * "colibri_pxa270_baseboard=1"
 305 */
 306static void __init colibri_pxa270_income_init(void)
 307{
 308        colibri_pxa270_baseboard = COLIBRI_PXA270_INCOME;
 309        colibri_pxa270_init();
 310}
 311
 312MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
 313        .atag_offset    = 0x100,
 314        .init_machine   = colibri_pxa270_init,
 315        .map_io         = pxa27x_map_io,
 316        .nr_irqs        = PXA_NR_IRQS,
 317        .init_irq       = pxa27x_init_irq,
 318        .handle_irq     = pxa27x_handle_irq,
 319        .init_time      = pxa_timer_init,
 320        .restart        = pxa_restart,
 321MACHINE_END
 322
 323MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC")
 324        .atag_offset    = 0x100,
 325        .init_machine   = colibri_pxa270_income_init,
 326        .map_io         = pxa27x_map_io,
 327        .nr_irqs        = PXA_NR_IRQS,
 328        .init_irq       = pxa27x_init_irq,
 329        .handle_irq     = pxa27x_handle_irq,
 330        .init_time      = pxa_timer_init,
 331        .restart        = pxa_restart,
 332MACHINE_END
 333
 334