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 | 25 | #include <mach/common.h> |
220bbcea | 26 | #include <mach/hardware.h> |
e00f0b4a VL |
27 | #include <mach/imx-uart.h> |
28 | #include <mach/iomux-mx3.h> | |
45b131a7 | 29 | #include <mach/mmc.h> |
e00f0b4a VL |
30 | |
31 | #include "devices.h" | |
32 | ||
56c7a45b VL |
33 | static unsigned int marxbot_pins[] = { |
34 | /* SDHC2 */ | |
35 | MX31_PIN_PC_PWRON__SD2_DATA3, MX31_PIN_PC_VS1__SD2_DATA2, | |
36 | MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0, | |
37 | MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD, | |
38 | MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29, | |
39 | /* CSI */ | |
40 | MX31_PIN_CSI_D4__CSI_D4, MX31_PIN_CSI_D5__CSI_D5, | |
41 | MX31_PIN_CSI_D6__CSI_D6, MX31_PIN_CSI_D7__CSI_D7, | |
42 | MX31_PIN_CSI_D8__CSI_D8, MX31_PIN_CSI_D9__CSI_D9, | |
43 | MX31_PIN_CSI_D10__CSI_D10, MX31_PIN_CSI_D11__CSI_D11, | |
44 | MX31_PIN_CSI_D12__CSI_D12, MX31_PIN_CSI_D13__CSI_D13, | |
45 | MX31_PIN_CSI_D14__CSI_D14, MX31_PIN_CSI_D15__CSI_D15, | |
46 | MX31_PIN_CSI_HSYNC__CSI_HSYNC, MX31_PIN_CSI_MCLK__CSI_MCLK, | |
47 | MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC, | |
48 | MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1, | |
49 | MX31_PIN_TXD2__GPIO1_28, | |
50 | }; | |
51 | ||
45b131a7 VL |
52 | #define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR) |
53 | #define SDHC2_WP IOMUX_TO_GPIO(MX31_PIN_ATA_DIOW) | |
54 | ||
55 | static int marxbot_sdhc2_get_ro(struct device *dev) | |
56 | { | |
57 | return gpio_get_value(SDHC2_WP); | |
58 | } | |
59 | ||
60 | static int marxbot_sdhc2_init(struct device *dev, irq_handler_t detect_irq, | |
61 | void *data) | |
62 | { | |
4f163eb8 SH |
63 | int ret; |
64 | ||
65 | ret = gpio_request(SDHC2_CD, "sdhc-detect"); | |
66 | if (ret) | |
67 | return ret; | |
68 | ||
69 | gpio_direction_input(SDHC2_CD); | |
70 | ||
71 | ret = gpio_request(SDHC2_WP, "sdhc-wp"); | |
72 | if (ret) | |
73 | goto err_gpio_free; | |
74 | gpio_direction_input(SDHC2_WP); | |
75 | ||
76 | ret = request_irq(gpio_to_irq(SDHC2_CD), detect_irq, | |
45b131a7 VL |
77 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
78 | "sdhc2-card-detect", data); | |
4f163eb8 SH |
79 | if (ret) |
80 | goto err_gpio_free_2; | |
81 | ||
82 | return 0; | |
83 | ||
84 | err_gpio_free_2: | |
85 | gpio_free(SDHC2_WP); | |
86 | err_gpio_free: | |
87 | gpio_free(SDHC2_CD); | |
88 | ||
89 | return ret; | |
45b131a7 VL |
90 | } |
91 | ||
92 | static void marxbot_sdhc2_exit(struct device *dev, void *data) | |
93 | { | |
94 | free_irq(gpio_to_irq(SDHC2_CD), data); | |
4f163eb8 SH |
95 | gpio_free(SDHC2_WP); |
96 | gpio_free(SDHC2_CD); | |
45b131a7 VL |
97 | } |
98 | ||
99 | static struct imxmmc_platform_data sdhc2_pdata = { | |
100 | .get_ro = marxbot_sdhc2_get_ro, | |
101 | .init = marxbot_sdhc2_init, | |
102 | .exit = marxbot_sdhc2_exit, | |
103 | }; | |
104 | ||
e00f0b4a VL |
105 | /* |
106 | * system init for baseboard usage. Will be called by mx31moboard init. | |
107 | */ | |
108 | void __init mx31moboard_marxbot_init(void) | |
109 | { | |
110 | printk(KERN_INFO "Initializing mx31marxbot peripherals\n"); | |
56c7a45b VL |
111 | |
112 | mxc_iomux_setup_multiple_pins(marxbot_pins, ARRAY_SIZE(marxbot_pins), | |
113 | "marxbot"); | |
45b131a7 VL |
114 | |
115 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); | |
e00f0b4a | 116 | } |