Commit | Line | Data |
---|---|---|
e00f0b4a VL |
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 | ||
45b131a7 | 19 | #include <linux/gpio.h> |
e00f0b4a | 20 | #include <linux/init.h> |
45b131a7 | 21 | #include <linux/interrupt.h> |
e00f0b4a | 22 | #include <linux/platform_device.h> |
220bbcea | 23 | #include <linux/types.h> |
e00f0b4a | 24 | |
e00f0b4a VL |
25 | #include <mach/common.h> |
26 | #include <mach/imx-uart.h> | |
27 | #include <mach/iomux-mx3.h> | |
220bbcea | 28 | #include <mach/hardware.h> |
45b131a7 | 29 | #include <mach/mmc.h> |
e00f0b4a VL |
30 | |
31 | #include "devices.h" | |
32 | ||
220bbcea VL |
33 | static unsigned int devboard_pins[] = { |
34 | /* UART1 */ | |
e00f0b4a VL |
35 | MX31_PIN_CTS2__CTS2, MX31_PIN_RTS2__RTS2, |
36 | MX31_PIN_TXD2__TXD2, MX31_PIN_RXD2__RXD2, | |
56c7a45b VL |
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, | |
e00f0b4a VL |
42 | }; |
43 | ||
220bbcea VL |
44 | static struct imxuart_platform_data uart_pdata = { |
45 | .flags = IMXUART_HAVE_RTSCTS, | |
46 | }; | |
47 | ||
45b131a7 VL |
48 | #define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR) |
49 | #define SDHC2_WP IOMUX_TO_GPIO(MX31_PIN_ATA_DIOW) | |
50 | ||
51 | static int devboard_sdhc2_get_ro(struct device *dev) | |
52 | { | |
563abb4b | 53 | return !gpio_get_value(SDHC2_WP); |
45b131a7 VL |
54 | } |
55 | ||
56 | static int devboard_sdhc2_init(struct device *dev, irq_handler_t detect_irq, | |
57 | void *data) | |
58 | { | |
4f163eb8 SH |
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, | |
45b131a7 VL |
73 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
74 | "sdhc2-card-detect", data); | |
4f163eb8 SH |
75 | if (ret) |
76 | goto err_gpio_free_2; | |
77 | ||
78 | return 0; | |
79 | ||
80 | err_gpio_free_2: | |
81 | gpio_free(SDHC2_WP); | |
82 | err_gpio_free: | |
83 | gpio_free(SDHC2_CD); | |
84 | ||
85 | return ret; | |
45b131a7 VL |
86 | } |
87 | ||
88 | static void devboard_sdhc2_exit(struct device *dev, void *data) | |
89 | { | |
90 | free_irq(gpio_to_irq(SDHC2_CD), data); | |
4f163eb8 SH |
91 | gpio_free(SDHC2_WP); |
92 | gpio_free(SDHC2_CD); | |
45b131a7 VL |
93 | } |
94 | ||
95 | static 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 | ||
e00f0b4a VL |
101 | /* |
102 | * system init for baseboard usage. Will be called by mx31moboard init. | |
103 | */ | |
104 | void __init mx31moboard_devboard_init(void) | |
105 | { | |
106 | printk(KERN_INFO "Initializing mx31devboard peripherals\n"); | |
220bbcea VL |
107 | |
108 | mxc_iomux_setup_multiple_pins(devboard_pins, ARRAY_SIZE(devboard_pins), | |
109 | "devboard"); | |
110 | ||
e00f0b4a | 111 | mxc_register_device(&mxc_uart_device1, &uart_pdata); |
45b131a7 VL |
112 | |
113 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); | |
e00f0b4a | 114 | } |