linux/arch/arm/mach-omap2/board-cm-t3517.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-omap2/board-cm-t3517.c
   3 *
   4 * Support for the CompuLab CM-T3517 modules
   5 *
   6 * Copyright (C) 2010 CompuLab, Ltd.
   7 * Author: Igor Grinberg <grinberg@compulab.co.il>
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License
  11 * version 2 as published by the Free Software Foundation.
  12 *
  13 * This program is distributed in the hope that it will be useful, but
  14 * WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16 * General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  21 * 02110-1301 USA
  22 *
  23 */
  24
  25#include <linux/kernel.h>
  26#include <linux/init.h>
  27#include <linux/platform_device.h>
  28#include <linux/delay.h>
  29#include <linux/gpio.h>
  30#include <linux/leds.h>
  31#include <linux/rtc-v3020.h>
  32#include <linux/mtd/mtd.h>
  33#include <linux/mtd/nand.h>
  34#include <linux/mtd/partitions.h>
  35#include <linux/mmc/host.h>
  36#include <linux/can/platform/ti_hecc.h>
  37
  38#include <asm/mach-types.h>
  39#include <asm/mach/arch.h>
  40#include <asm/mach/map.h>
  41
  42#include "common.h"
  43#include <linux/platform_data/mtd-nand-omap2.h>
  44#include "gpmc.h"
  45
  46#include "am35xx.h"
  47
  48#include "mux.h"
  49#include "control.h"
  50#include "hsmmc.h"
  51#include "common-board-devices.h"
  52#include "am35xx-emac.h"
  53#include "gpmc-nand.h"
  54
  55#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
  56static struct gpio_led cm_t3517_leds[] = {
  57        [0] = {
  58                .gpio                   = 186,
  59                .name                   = "cm-t3517:green",
  60                .default_trigger        = "heartbeat",
  61                .active_low             = 0,
  62        },
  63};
  64
  65static struct gpio_led_platform_data cm_t3517_led_pdata = {
  66        .num_leds       = ARRAY_SIZE(cm_t3517_leds),
  67        .leds           = cm_t3517_leds,
  68};
  69
  70static struct platform_device cm_t3517_led_device = {
  71        .name           = "leds-gpio",
  72        .id             = -1,
  73        .dev            = {
  74                .platform_data  = &cm_t3517_led_pdata,
  75        },
  76};
  77
  78static void __init cm_t3517_init_leds(void)
  79{
  80        platform_device_register(&cm_t3517_led_device);
  81}
  82#else
  83static inline void cm_t3517_init_leds(void) {}
  84#endif
  85
  86#if defined(CONFIG_CAN_TI_HECC) || defined(CONFIG_CAN_TI_HECC_MODULE)
  87static struct resource cm_t3517_hecc_resources[] = {
  88        {
  89                .start  = AM35XX_IPSS_HECC_BASE,
  90                .end    = AM35XX_IPSS_HECC_BASE + SZ_16K - 1,
  91                .flags  = IORESOURCE_MEM,
  92        },
  93        {
  94                .start  = 24 + OMAP_INTC_START,
  95                .flags  = IORESOURCE_IRQ,
  96        },
  97};
  98
  99static struct ti_hecc_platform_data cm_t3517_hecc_pdata = {
 100        .scc_hecc_offset        = AM35XX_HECC_SCC_HECC_OFFSET,
 101        .scc_ram_offset         = AM35XX_HECC_SCC_RAM_OFFSET,
 102        .hecc_ram_offset        = AM35XX_HECC_RAM_OFFSET,
 103        .mbx_offset             = AM35XX_HECC_MBOX_OFFSET,
 104        .int_line               = AM35XX_HECC_INT_LINE,
 105        .version                = AM35XX_HECC_VERSION,
 106};
 107
 108static struct platform_device cm_t3517_hecc_device = {
 109        .name           = "ti_hecc",
 110        .id             = 1,
 111        .num_resources  = ARRAY_SIZE(cm_t3517_hecc_resources),
 112        .resource       = cm_t3517_hecc_resources,
 113        .dev            = {
 114                .platform_data  = &cm_t3517_hecc_pdata,
 115        },
 116};
 117
 118static void cm_t3517_init_hecc(void)
 119{
 120        platform_device_register(&cm_t3517_hecc_device);
 121}
 122#else
 123static inline void cm_t3517_init_hecc(void) {}
 124#endif
 125
 126#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
 127static struct omap2_hsmmc_info cm_t3517_mmc[] = {
 128        {
 129                .mmc            = 1,
 130                .caps           = MMC_CAP_4_BIT_DATA,
 131                .gpio_cd        = 144,
 132                .gpio_wp        = 59,
 133        },
 134        {
 135                .mmc            = 2,
 136                .caps           = MMC_CAP_4_BIT_DATA,
 137                .gpio_cd        = -EINVAL,
 138                .gpio_wp        = -EINVAL,
 139        },
 140        {}      /* Terminator */
 141};
 142#else
 143#define cm_t3517_mmc NULL
 144#endif
 145
 146#if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE)
 147#define RTC_IO_GPIO             (153)
 148#define RTC_WR_GPIO             (154)
 149#define RTC_RD_GPIO             (53)
 150#define RTC_CS_GPIO             (163)
 151#define RTC_CS_EN_GPIO          (160)
 152
 153struct v3020_platform_data cm_t3517_v3020_pdata = {
 154        .use_gpio       = 1,
 155        .gpio_cs        = RTC_CS_GPIO,
 156        .gpio_wr        = RTC_WR_GPIO,
 157        .gpio_rd        = RTC_RD_GPIO,
 158        .gpio_io        = RTC_IO_GPIO,
 159};
 160
 161static struct platform_device cm_t3517_rtc_device = {
 162        .name           = "v3020",
 163        .id             = -1,
 164        .dev            = {
 165                .platform_data = &cm_t3517_v3020_pdata,
 166        }
 167};
 168
 169static void __init cm_t3517_init_rtc(void)
 170{
 171        int err;
 172
 173        err = gpio_request_one(RTC_CS_EN_GPIO, GPIOF_OUT_INIT_HIGH,
 174                               "rtc cs en");
 175        if (err) {
 176                pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err);
 177                return;
 178        }
 179
 180        platform_device_register(&cm_t3517_rtc_device);
 181}
 182#else
 183static inline void cm_t3517_init_rtc(void) {}
 184#endif
 185
 186#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
 187#define HSUSB1_RESET_GPIO       (146)
 188#define HSUSB2_RESET_GPIO       (147)
 189#define USB_HUB_RESET_GPIO      (152)
 190
 191static struct usbhs_phy_data phy_data[] __initdata = {
 192        {
 193                .port = 1,
 194                .reset_gpio = HSUSB1_RESET_GPIO,
 195                .vcc_gpio = -EINVAL,
 196        },
 197        {
 198                .port = 2,
 199                .reset_gpio = HSUSB2_RESET_GPIO,
 200                .vcc_gpio = -EINVAL,
 201        },
 202};
 203
 204static struct usbhs_omap_platform_data cm_t3517_ehci_pdata __initdata = {
 205        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
 206        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
 207};
 208
 209static int __init cm_t3517_init_usbh(void)
 210{
 211        int err;
 212
 213        err = gpio_request_one(USB_HUB_RESET_GPIO, GPIOF_OUT_INIT_LOW,
 214                               "usb hub rst");
 215        if (err) {
 216                pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err);
 217        } else {
 218                udelay(10);
 219                gpio_set_value(USB_HUB_RESET_GPIO, 1);
 220                msleep(1);
 221        }
 222
 223        usbhs_init_phys(phy_data, ARRAY_SIZE(phy_data));
 224        usbhs_init(&cm_t3517_ehci_pdata);
 225
 226        return 0;
 227}
 228#else
 229static inline int cm_t3517_init_usbh(void)
 230{
 231        return 0;
 232}
 233#endif
 234
 235#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
 236static struct mtd_partition cm_t3517_nand_partitions[] = {
 237        {
 238                .name           = "xloader",
 239                .offset         = 0,                    /* Offset = 0x00000 */
 240                .size           = 4 * NAND_BLOCK_SIZE,
 241                .mask_flags     = MTD_WRITEABLE
 242        },
 243        {
 244                .name           = "uboot",
 245                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x80000 */
 246                .size           = 15 * NAND_BLOCK_SIZE,
 247        },
 248        {
 249                .name           = "uboot environment",
 250                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x260000 */
 251                .size           = 2 * NAND_BLOCK_SIZE,
 252        },
 253        {
 254                .name           = "linux",
 255                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x2A0000 */
 256                .size           = 32 * NAND_BLOCK_SIZE,
 257        },
 258        {
 259                .name           = "rootfs",
 260                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x6A0000 */
 261                .size           = MTDPART_SIZ_FULL,
 262        },
 263};
 264
 265static struct omap_nand_platform_data cm_t3517_nand_data = {
 266        .parts                  = cm_t3517_nand_partitions,
 267        .nr_parts               = ARRAY_SIZE(cm_t3517_nand_partitions),
 268        .cs                     = 0,
 269};
 270
 271static void __init cm_t3517_init_nand(void)
 272{
 273        if (gpmc_nand_init(&cm_t3517_nand_data, NULL) < 0)
 274                pr_err("CM-T3517: NAND initialization failed\n");
 275}
 276#else
 277static inline void cm_t3517_init_nand(void) {}
 278#endif
 279
 280#ifdef CONFIG_OMAP_MUX
 281static struct omap_board_mux board_mux[] __initdata = {
 282        /* GPIO186 - Green LED */
 283        OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
 284
 285        /* RTC GPIOs: */
 286        /* IO - GPIO153 */
 287        OMAP3_MUX(MCBSP4_DR, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
 288        /* WR# - GPIO154 */
 289        OMAP3_MUX(MCBSP4_DX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
 290        /* RD# - GPIO53 */
 291        OMAP3_MUX(GPMC_NCS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
 292        /* CS# - GPIO163 */
 293        OMAP3_MUX(UART3_CTS_RCTX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
 294        /* CS EN - GPIO160 */
 295        OMAP3_MUX(MCBSP_CLKS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
 296
 297        /* HSUSB1 RESET */
 298        OMAP3_MUX(UART2_TX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
 299        /* HSUSB2 RESET */
 300        OMAP3_MUX(UART2_RX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
 301        /* CM-T3517 USB HUB nRESET */
 302        OMAP3_MUX(MCBSP4_CLKX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
 303
 304        /* CD - GPIO144 and WP - GPIO59 for MMC1 - SB-T35 */
 305        OMAP3_MUX(UART2_CTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP),
 306        OMAP3_MUX(GPMC_CLK, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP),
 307
 308        { .reg_offset = OMAP_MUX_TERMINATOR },
 309};
 310#endif
 311
 312static void __init cm_t3517_init(void)
 313{
 314        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
 315        omap_serial_init();
 316        omap_sdrc_init(NULL, NULL);
 317        cm_t3517_init_leds();
 318        cm_t3517_init_nand();
 319        cm_t3517_init_rtc();
 320        cm_t3517_init_usbh();
 321        cm_t3517_init_hecc();
 322        am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1);
 323        omap_hsmmc_init(cm_t3517_mmc);
 324}
 325
 326MACHINE_START(CM_T3517, "Compulab CM-T3517")
 327        .atag_offset    = 0x100,
 328        .reserve        = omap_reserve,
 329        .map_io         = omap3_map_io,
 330        .init_early     = am35xx_init_early,
 331        .init_irq       = omap3_init_irq,
 332        .handle_irq     = omap3_intc_handle_irq,
 333        .init_machine   = cm_t3517_init,
 334        .init_late      = am35xx_init_late,
 335        .init_time      = omap3_gptimer_timer_init,
 336        .restart        = omap3xxx_restart,
 337MACHINE_END
 338