linux/arch/arm/mach-mx3/mx31moboard-devboard.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2009 Valentin Longchamp, EPFL Mobots group
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License as published by
   6 * the Free Software Foundation; either version 2 of the License, or
   7 * (at your option) any later version.
   8 *
   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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17 */
  18
  19#include <linux/gpio.h>
  20#include <linux/init.h>
  21#include <linux/interrupt.h>
  22#include <linux/platform_device.h>
  23#include <linux/types.h>
  24
  25#include <mach/common.h>
  26#include <mach/imx-uart.h>
  27#include <mach/iomux-mx3.h>
  28#include <mach/hardware.h>
  29#include <mach/mmc.h>
  30
  31#include "devices.h"
  32
  33static unsigned int devboard_pins[] = {
  34        /* UART1 */
  35        MX31_PIN_CTS2__CTS2, MX31_PIN_RTS2__RTS2,
  36        MX31_PIN_TXD2__TXD2, MX31_PIN_RXD2__RXD2,
  37        /* SDHC2 */
  38        MX31_PIN_PC_PWRON__SD2_DATA3, MX31_PIN_PC_VS1__SD2_DATA2,
  39        MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0,
  40        MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD,
  41        MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29,
  42};
  43
  44static struct imxuart_platform_data uart_pdata = {
  45        .flags = IMXUART_HAVE_RTSCTS,
  46};
  47
  48#define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR)
  49#define SDHC2_WP IOMUX_TO_GPIO(MX31_PIN_ATA_DIOW)
  50
  51static int devboard_sdhc2_get_ro(struct device *dev)
  52{
  53        return !gpio_get_value(SDHC2_WP);
  54}
  55
  56static int devboard_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
  57                void *data)
  58{
  59        int ret;
  60
  61        ret = gpio_request(SDHC2_CD, "sdhc-detect");
  62        if (ret)
  63                return ret;
  64
  65        gpio_direction_input(SDHC2_CD);
  66
  67        ret = gpio_request(SDHC2_WP, "sdhc-wp");
  68        if (ret)
  69                goto err_gpio_free;
  70        gpio_direction_input(SDHC2_WP);
  71
  72        ret = request_irq(gpio_to_irq(SDHC2_CD), detect_irq,
  73                IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
  74                "sdhc2-card-detect", data);
  75        if (ret)
  76                goto err_gpio_free_2;
  77
  78        return 0;
  79
  80err_gpio_free_2:
  81        gpio_free(SDHC2_WP);
  82err_gpio_free:
  83        gpio_free(SDHC2_CD);
  84
  85        return ret;
  86}
  87
  88static void devboard_sdhc2_exit(struct device *dev, void *data)
  89{
  90        free_irq(gpio_to_irq(SDHC2_CD), data);
  91        gpio_free(SDHC2_WP);
  92        gpio_free(SDHC2_CD);
  93}
  94
  95static struct imxmmc_platform_data sdhc2_pdata = {
  96        .get_ro = devboard_sdhc2_get_ro,
  97        .init   = devboard_sdhc2_init,
  98        .exit   = devboard_sdhc2_exit,
  99};
 100
 101/*
 102 * system init for baseboard usage. Will be called by mx31moboard init.
 103 */
 104void __init mx31moboard_devboard_init(void)
 105{
 106        printk(KERN_INFO "Initializing mx31devboard peripherals\n");
 107
 108        mxc_iomux_setup_multiple_pins(devboard_pins, ARRAY_SIZE(devboard_pins),
 109                "devboard");
 110
 111        mxc_register_device(&mxc_uart_device1, &uart_pdata);
 112
 113        mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata);
 114}
 115