linux/arch/arm/mach-imx/mach-mx31lilly.c
<<
>>
Prefs
   1/*
   2 *  LILLY-1131 module support
   3 *
   4 *    Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
   5 *
   6 *  based on code for other MX31 boards,
   7 *
   8 *    Copyright 2005-2007 Freescale Semiconductor
   9 *    Copyright (c) 2009 Alberto Panizzo <maramaopercheseimorto@gmail.com>
  10 *    Copyright (C) 2009 Valentin Longchamp, EPFL Mobots group
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License as published by
  14 * the Free Software Foundation; either version 2 of the License, or
  15 * (at your option) any later version.
  16 *
  17 * This program is distributed in the hope that it will be useful,
  18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20 * GNU General Public License for more details.
  21 */
  22
  23#include <linux/types.h>
  24#include <linux/init.h>
  25#include <linux/clk.h>
  26#include <linux/gpio.h>
  27#include <linux/delay.h>
  28#include <linux/platform_device.h>
  29#include <linux/interrupt.h>
  30#include <linux/moduleparam.h>
  31#include <linux/smsc911x.h>
  32#include <linux/mtd/physmap.h>
  33#include <linux/spi/spi.h>
  34#include <linux/mfd/mc13783.h>
  35#include <linux/usb/otg.h>
  36#include <linux/usb/ulpi.h>
  37#include <linux/regulator/machine.h>
  38#include <linux/regulator/fixed.h>
  39
  40#include <asm/mach-types.h>
  41#include <asm/mach/arch.h>
  42#include <asm/mach/time.h>
  43#include <asm/mach/map.h>
  44
  45#include "board-mx31lilly.h"
  46#include "common.h"
  47#include "devices-imx31.h"
  48#include "ehci.h"
  49#include "hardware.h"
  50#include "iomux-mx3.h"
  51#include "ulpi.h"
  52
  53/*
  54 * This file contains module-specific initialization routines for LILLY-1131.
  55 * Initialization of peripherals found on the baseboard is implemented in the
  56 * appropriate baseboard support code.
  57 */
  58
  59/* SMSC ethernet support */
  60
  61static struct resource smsc91x_resources[] = {
  62        {
  63                .start  = MX31_CS4_BASE_ADDR,
  64                .end    = MX31_CS4_BASE_ADDR + 0xffff,
  65                .flags  = IORESOURCE_MEM,
  66        },
  67        {
  68                /* irq number is run-time assigned */
  69                .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING,
  70        }
  71};
  72
  73static struct smsc911x_platform_config smsc911x_config = {
  74        .phy_interface  = PHY_INTERFACE_MODE_MII,
  75        .irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
  76        .irq_type       = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
  77        .flags          = SMSC911X_USE_32BIT |
  78                          SMSC911X_SAVE_MAC_ADDRESS |
  79                          SMSC911X_FORCE_INTERNAL_PHY,
  80};
  81
  82static struct platform_device smsc91x_device = {
  83        .name           = "smsc911x",
  84        .id             = -1,
  85        .num_resources  = ARRAY_SIZE(smsc91x_resources),
  86        .resource       = smsc91x_resources,
  87        .dev            = {
  88                .platform_data = &smsc911x_config,
  89        }
  90};
  91
  92/* NOR flash */
  93static struct physmap_flash_data nor_flash_data = {
  94        .width  = 2,
  95};
  96
  97static struct resource nor_flash_resource = {
  98        .start  = 0xa0000000,
  99        .end    = 0xa1ffffff,
 100        .flags  = IORESOURCE_MEM,
 101};
 102
 103static struct platform_device physmap_flash_device = {
 104        .name   = "physmap-flash",
 105        .id     = 0,
 106        .dev    = {
 107                .platform_data  = &nor_flash_data,
 108        },
 109        .resource = &nor_flash_resource,
 110        .num_resources = 1,
 111};
 112
 113/* USB */
 114
 115#define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
 116                        PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU)
 117
 118static int usbh1_init(struct platform_device *pdev)
 119{
 120        int pins[] = {
 121                MX31_PIN_CSPI1_MOSI__USBH1_RXDM,
 122                MX31_PIN_CSPI1_MISO__USBH1_RXDP,
 123                MX31_PIN_CSPI1_SS0__USBH1_TXDM,
 124                MX31_PIN_CSPI1_SS1__USBH1_TXDP,
 125                MX31_PIN_CSPI1_SS2__USBH1_RCV,
 126                MX31_PIN_CSPI1_SCLK__USBH1_OEB,
 127                MX31_PIN_CSPI1_SPI_RDY__USBH1_FS,
 128        };
 129
 130        mxc_iomux_setup_multiple_pins(pins, ARRAY_SIZE(pins), "USB H1");
 131
 132        mxc_iomux_set_pad(MX31_PIN_CSPI1_MOSI, USB_PAD_CFG);
 133        mxc_iomux_set_pad(MX31_PIN_CSPI1_MISO, USB_PAD_CFG);
 134        mxc_iomux_set_pad(MX31_PIN_CSPI1_SS0, USB_PAD_CFG);
 135        mxc_iomux_set_pad(MX31_PIN_CSPI1_SS1, USB_PAD_CFG);
 136        mxc_iomux_set_pad(MX31_PIN_CSPI1_SS2, USB_PAD_CFG);
 137        mxc_iomux_set_pad(MX31_PIN_CSPI1_SCLK, USB_PAD_CFG);
 138        mxc_iomux_set_pad(MX31_PIN_CSPI1_SPI_RDY, USB_PAD_CFG);
 139
 140        mxc_iomux_set_gpr(MUX_PGP_USB_SUSPEND, true);
 141
 142        mdelay(10);
 143
 144        return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED |
 145                        MXC_EHCI_INTERFACE_SINGLE_UNI);
 146}
 147
 148static int usbh2_init(struct platform_device *pdev)
 149{
 150        int pins[] = {
 151                MX31_PIN_USBH2_DATA0__USBH2_DATA0,
 152                MX31_PIN_USBH2_DATA1__USBH2_DATA1,
 153                MX31_PIN_USBH2_CLK__USBH2_CLK,
 154                MX31_PIN_USBH2_DIR__USBH2_DIR,
 155                MX31_PIN_USBH2_NXT__USBH2_NXT,
 156                MX31_PIN_USBH2_STP__USBH2_STP,
 157        };
 158
 159        mxc_iomux_setup_multiple_pins(pins, ARRAY_SIZE(pins), "USB H2");
 160
 161        mxc_iomux_set_pad(MX31_PIN_USBH2_CLK, USB_PAD_CFG);
 162        mxc_iomux_set_pad(MX31_PIN_USBH2_DIR, USB_PAD_CFG);
 163        mxc_iomux_set_pad(MX31_PIN_USBH2_NXT, USB_PAD_CFG);
 164        mxc_iomux_set_pad(MX31_PIN_USBH2_STP, USB_PAD_CFG);
 165        mxc_iomux_set_pad(MX31_PIN_USBH2_DATA0, USB_PAD_CFG);
 166        mxc_iomux_set_pad(MX31_PIN_USBH2_DATA1, USB_PAD_CFG);
 167        mxc_iomux_set_pad(MX31_PIN_SRXD6, USB_PAD_CFG);
 168        mxc_iomux_set_pad(MX31_PIN_STXD6, USB_PAD_CFG);
 169        mxc_iomux_set_pad(MX31_PIN_SFS3, USB_PAD_CFG);
 170        mxc_iomux_set_pad(MX31_PIN_SCK3, USB_PAD_CFG);
 171        mxc_iomux_set_pad(MX31_PIN_SRXD3, USB_PAD_CFG);
 172        mxc_iomux_set_pad(MX31_PIN_STXD3, USB_PAD_CFG);
 173
 174        mxc_iomux_set_gpr(MUX_PGP_UH2, true);
 175
 176        /* chip select */
 177        mxc_iomux_alloc_pin(IOMUX_MODE(MX31_PIN_DTR_DCE1, IOMUX_CONFIG_GPIO),
 178                                "USBH2_CS");
 179        gpio_request(IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1), "USBH2 CS");
 180        gpio_direction_output(IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1), 0);
 181
 182        mdelay(10);
 183
 184        return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED);
 185}
 186
 187static const struct mxc_usbh_platform_data usbh1_pdata __initconst = {
 188        .init   = usbh1_init,
 189        .portsc = MXC_EHCI_MODE_UTMI | MXC_EHCI_SERIAL,
 190};
 191
 192static struct mxc_usbh_platform_data usbh2_pdata __initdata = {
 193        .init   = usbh2_init,
 194        .portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT,
 195};
 196
 197static void __init lilly1131_usb_init(void)
 198{
 199        imx31_add_mxc_ehci_hs(1, &usbh1_pdata);
 200
 201        usbh2_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
 202                        ULPI_OTG_DRVVBUS_EXT);
 203        if (usbh2_pdata.otg)
 204                imx31_add_mxc_ehci_hs(2, &usbh2_pdata);
 205}
 206
 207/* SPI */
 208
 209static int spi_internal_chipselect[] = {
 210        MXC_SPI_CS(0),
 211        MXC_SPI_CS(1),
 212        MXC_SPI_CS(2),
 213};
 214
 215static const struct spi_imx_master spi0_pdata __initconst = {
 216        .chipselect = spi_internal_chipselect,
 217        .num_chipselect = ARRAY_SIZE(spi_internal_chipselect),
 218};
 219
 220static const struct spi_imx_master spi1_pdata __initconst = {
 221        .chipselect = spi_internal_chipselect,
 222        .num_chipselect = ARRAY_SIZE(spi_internal_chipselect),
 223};
 224
 225static struct mc13xxx_platform_data mc13783_pdata __initdata = {
 226        .flags = MC13XXX_USE_RTC | MC13XXX_USE_TOUCHSCREEN,
 227};
 228
 229static struct spi_board_info mc13783_dev __initdata = {
 230        .modalias       = "mc13783",
 231        .max_speed_hz   = 1000000,
 232        .bus_num        = 1,
 233        .chip_select    = 0,
 234        .platform_data  = &mc13783_pdata,
 235        /* irq number is run-time assigned */
 236};
 237
 238static struct platform_device *devices[] __initdata = {
 239        &smsc91x_device,
 240        &physmap_flash_device,
 241};
 242
 243static int mx31lilly_baseboard;
 244core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444);
 245
 246static struct regulator_consumer_supply dummy_supplies[] = {
 247        REGULATOR_SUPPLY("vdd33a", "smsc911x"),
 248        REGULATOR_SUPPLY("vddvario", "smsc911x"),
 249};
 250
 251static void __init mx31lilly_board_init(void)
 252{
 253        imx31_soc_init();
 254
 255        switch (mx31lilly_baseboard) {
 256        case MX31LILLY_NOBOARD:
 257                break;
 258        case MX31LILLY_DB:
 259                mx31lilly_db_init();
 260                break;
 261        default:
 262                printk(KERN_ERR "Illegal mx31lilly_baseboard type %d\n",
 263                        mx31lilly_baseboard);
 264        }
 265
 266        mxc_iomux_alloc_pin(MX31_PIN_CS4__CS4, "Ethernet CS");
 267
 268        /* SPI */
 269        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_SCLK__SCLK, "SPI1_CLK");
 270        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_MOSI__MOSI, "SPI1_TX");
 271        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_MISO__MISO, "SPI1_RX");
 272        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_SPI_RDY__SPI_RDY, "SPI1_RDY");
 273        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_SS0__SS0, "SPI1_SS0");
 274        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_SS1__SS1, "SPI1_SS1");
 275        mxc_iomux_alloc_pin(MX31_PIN_CSPI1_SS2__SS2, "SPI1_SS2");
 276
 277        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_SCLK__SCLK, "SPI2_CLK");
 278        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_MOSI__MOSI, "SPI2_TX");
 279        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_MISO__MISO, "SPI2_RX");
 280        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_SPI_RDY__SPI_RDY, "SPI2_RDY");
 281        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_SS0__SS0, "SPI2_SS0");
 282        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_SS1__SS1, "SPI2_SS1");
 283        mxc_iomux_alloc_pin(MX31_PIN_CSPI2_SS2__SS2, "SPI2_SS2");
 284
 285        imx31_add_spi_imx0(&spi0_pdata);
 286        imx31_add_spi_imx1(&spi1_pdata);
 287        mc13783_dev.irq = gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3));
 288        spi_register_board_info(&mc13783_dev, 1);
 289
 290        regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 291
 292        smsc91x_resources[1].start =
 293                        gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0));
 294        smsc91x_resources[1].end =
 295                        gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0));
 296        platform_add_devices(devices, ARRAY_SIZE(devices));
 297
 298        /* USB */
 299        lilly1131_usb_init();
 300}
 301
 302static void __init mx31lilly_timer_init(void)
 303{
 304        mx31_clocks_init(26000000);
 305}
 306
 307MACHINE_START(LILLY1131, "INCO startec LILLY-1131")
 308        .atag_offset = 0x100,
 309        .map_io = mx31_map_io,
 310        .init_early = imx31_init_early,
 311        .init_irq = mx31_init_irq,
 312        .init_time      = mx31lilly_timer_init,
 313        .init_machine = mx31lilly_board_init,
 314        .restart        = mxc_restart,
 315MACHINE_END
 316