linux/arch/arm/mach-mx2/pca100.c
<<
>>
Prefs
   1/*
   2 * Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
   3 * Copyright (C) 2009 Sascha Hauer (kernel@pengutronix.de)
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License
   7 * as published by the Free Software Foundation; either version 2
   8 * of the License, or (at your option) any later version.
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  17 * MA 02110-1301, USA.
  18 */
  19
  20#include <linux/platform_device.h>
  21#include <linux/io.h>
  22#include <linux/i2c.h>
  23#include <linux/i2c/at24.h>
  24#include <linux/dma-mapping.h>
  25#include <linux/spi/spi.h>
  26#include <linux/spi/eeprom.h>
  27#include <linux/irq.h>
  28#include <linux/gpio.h>
  29
  30#include <asm/mach/arch.h>
  31#include <asm/mach-types.h>
  32#include <mach/common.h>
  33#include <mach/hardware.h>
  34#include <mach/iomux.h>
  35#include <mach/i2c.h>
  36#include <asm/mach/time.h>
  37#if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE)
  38#include <mach/spi.h>
  39#endif
  40#include <mach/imx-uart.h>
  41#include <mach/mxc_nand.h>
  42#include <mach/irqs.h>
  43#include <mach/mmc.h>
  44
  45#include "devices.h"
  46
  47static int pca100_pins[] = {
  48        /* UART1 */
  49        PE12_PF_UART1_TXD,
  50        PE13_PF_UART1_RXD,
  51        PE14_PF_UART1_CTS,
  52        PE15_PF_UART1_RTS,
  53        /* SDHC */
  54        PB4_PF_SD2_D0,
  55        PB5_PF_SD2_D1,
  56        PB6_PF_SD2_D2,
  57        PB7_PF_SD2_D3,
  58        PB8_PF_SD2_CMD,
  59        PB9_PF_SD2_CLK,
  60        /* FEC */
  61        PD0_AIN_FEC_TXD0,
  62        PD1_AIN_FEC_TXD1,
  63        PD2_AIN_FEC_TXD2,
  64        PD3_AIN_FEC_TXD3,
  65        PD4_AOUT_FEC_RX_ER,
  66        PD5_AOUT_FEC_RXD1,
  67        PD6_AOUT_FEC_RXD2,
  68        PD7_AOUT_FEC_RXD3,
  69        PD8_AF_FEC_MDIO,
  70        PD9_AIN_FEC_MDC,
  71        PD10_AOUT_FEC_CRS,
  72        PD11_AOUT_FEC_TX_CLK,
  73        PD12_AOUT_FEC_RXD0,
  74        PD13_AOUT_FEC_RX_DV,
  75        PD14_AOUT_FEC_RX_CLK,
  76        PD15_AOUT_FEC_COL,
  77        PD16_AIN_FEC_TX_ER,
  78        PF23_AIN_FEC_TX_EN,
  79        /* SSI1 */
  80        PC20_PF_SSI1_FS,
  81        PC21_PF_SSI1_RXD,
  82        PC22_PF_SSI1_TXD,
  83        PC23_PF_SSI1_CLK,
  84        /* onboard I2C */
  85        PC5_PF_I2C2_SDA,
  86        PC6_PF_I2C2_SCL,
  87        /* external I2C */
  88        PD17_PF_I2C_DATA,
  89        PD18_PF_I2C_CLK,
  90        /* SPI1 */
  91        PD25_PF_CSPI1_RDY,
  92        PD29_PF_CSPI1_SCLK,
  93        PD30_PF_CSPI1_MISO,
  94        PD31_PF_CSPI1_MOSI,
  95};
  96
  97static struct imxuart_platform_data uart_pdata = {
  98        .flags = IMXUART_HAVE_RTSCTS,
  99};
 100
 101static struct mxc_nand_platform_data pca100_nand_board_info = {
 102        .width = 1,
 103        .hw_ecc = 1,
 104};
 105
 106static struct platform_device *platform_devices[] __initdata = {
 107        &mxc_w1_master_device,
 108        &mxc_fec_device,
 109};
 110
 111static struct imxi2c_platform_data pca100_i2c_1_data = {
 112        .bitrate = 100000,
 113};
 114
 115static struct at24_platform_data board_eeprom = {
 116        .byte_len = 4096,
 117        .page_size = 32,
 118        .flags = AT24_FLAG_ADDR16,
 119};
 120
 121static struct i2c_board_info pca100_i2c_devices[] = {
 122        {
 123                I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */
 124                .platform_data = &board_eeprom,
 125        }, {
 126                I2C_BOARD_INFO("rtc-pcf8563", 0x51),
 127                .type = "pcf8563"
 128        }, {
 129                I2C_BOARD_INFO("lm75", 0x4a),
 130                .type = "lm75"
 131        }
 132};
 133
 134#if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE)
 135static struct spi_eeprom at25320 = {
 136        .name           = "at25320an",
 137        .byte_len       = 4096,
 138        .page_size      = 32,
 139        .flags          = EE_ADDR2,
 140};
 141
 142static struct spi_board_info pca100_spi_board_info[] __initdata = {
 143        {
 144                .modalias = "at25",
 145                .max_speed_hz = 30000,
 146                .bus_num = 0,
 147                .chip_select = 1,
 148                .platform_data = &at25320,
 149        },
 150};
 151
 152static int pca100_spi_cs[] = {GPIO_PORTD + 28, GPIO_PORTD + 27};
 153
 154static struct spi_imx_master pca100_spi_0_data = {
 155        .chipselect     = pca100_spi_cs,
 156        .num_chipselect = ARRAY_SIZE(pca100_spi_cs),
 157};
 158#endif
 159
 160static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
 161                void *data)
 162{
 163        int ret;
 164
 165        ret = request_irq(IRQ_GPIOC(29), detect_irq,
 166                          IRQF_DISABLED | IRQF_TRIGGER_FALLING,
 167                          "imx-mmc-detect", data);
 168        if (ret)
 169                printk(KERN_ERR
 170                        "pca100: Failed to reuest irq for sd/mmc detection\n");
 171
 172        return ret;
 173}
 174
 175static void pca100_sdhc2_exit(struct device *dev, void *data)
 176{
 177        free_irq(IRQ_GPIOC(29), data);
 178}
 179
 180static struct imxmmc_platform_data sdhc_pdata = {
 181        .init = pca100_sdhc2_init,
 182        .exit = pca100_sdhc2_exit,
 183};
 184
 185static void __init pca100_init(void)
 186{
 187        int ret;
 188
 189        ret = mxc_gpio_setup_multiple_pins(pca100_pins,
 190                        ARRAY_SIZE(pca100_pins), "PCA100");
 191        if (ret)
 192                printk(KERN_ERR "pca100: Failed to setup pins (%d)\n", ret);
 193
 194        mxc_register_device(&mxc_uart_device0, &uart_pdata);
 195
 196        mxc_gpio_mode(GPIO_PORTC | 29 | GPIO_GPIO | GPIO_IN);
 197        mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata);
 198
 199        mxc_register_device(&mxc_nand_device, &pca100_nand_board_info);
 200
 201        /* only the i2c master 1 is used on this CPU card */
 202        i2c_register_board_info(1, pca100_i2c_devices,
 203                                ARRAY_SIZE(pca100_i2c_devices));
 204
 205        mxc_register_device(&mxc_i2c_device1, &pca100_i2c_1_data);
 206
 207        mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);
 208        mxc_gpio_mode(GPIO_PORTD | 27 | GPIO_GPIO | GPIO_OUT);
 209
 210        /* GPIO0_IRQ */
 211        mxc_gpio_mode(GPIO_PORTC | 31 | GPIO_GPIO | GPIO_IN);
 212        /* GPIO1_IRQ */
 213        mxc_gpio_mode(GPIO_PORTC | 25 | GPIO_GPIO | GPIO_IN);
 214        /* GPIO2_IRQ */
 215        mxc_gpio_mode(GPIO_PORTE | 5 | GPIO_GPIO | GPIO_IN);
 216
 217#if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE)
 218        spi_register_board_info(pca100_spi_board_info,
 219                                ARRAY_SIZE(pca100_spi_board_info));
 220        mxc_register_device(&mxc_spi_device0, &pca100_spi_0_data);
 221#endif
 222
 223        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
 224}
 225
 226static void __init pca100_timer_init(void)
 227{
 228        mx27_clocks_init(26000000);
 229}
 230
 231static struct sys_timer pca100_timer = {
 232        .init = pca100_timer_init,
 233};
 234
 235MACHINE_START(PCA100, "phyCARD-i.MX27")
 236        .phys_io        = AIPI_BASE_ADDR,
 237        .io_pg_offst    = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
 238        .boot_params    = PHYS_OFFSET + 0x100,
 239        .map_io         = mx27_map_io,
 240        .init_irq       = mxc_init_irq,
 241        .init_machine   = pca100_init,
 242        .timer          = &pca100_timer,
 243MACHINE_END
 244
 245