aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap1/board-h2-mmc.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2008-12-10 20:37:16 -0500
committerTony Lindgren <tony@atomide.com>2008-12-10 20:37:16 -0500
commitd88746652b4d133284d1fdd05b5e999e8f44c998 (patch)
tree2a6cfd6fe175a18eb4b4f600e0a79444259c9a5d /arch/arm/mach-omap1/board-h2-mmc.c
parent652bcd8f72cc0cdf4499ce7d73990514e5e3e4b9 (diff)
omap mmc: Add better MMC low-level init
This will simplify the MMC low-level init, and make it more flexible to add support for a newer MMC controller in the following patches. The patch rearranges platform data and gets rid of slot vs controller confusion in the old data structures. Also fix device id numbering in the clock code. Some code snippets are based on an earlier patch by Russell King <linux@arm.linux.org.uk>. Cc: Pierre Ossman <drzeus-mmc@drzeus.cx> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap1/board-h2-mmc.c')
-rw-r--r--arch/arm/mach-omap1/board-h2-mmc.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/arch/arm/mach-omap1/board-h2-mmc.c b/arch/arm/mach-omap1/board-h2-mmc.c
index 504ae881360f..409fa56d0a87 100644
--- a/arch/arm/mach-omap1/board-h2-mmc.c
+++ b/arch/arm/mach-omap1/board-h2-mmc.c
@@ -12,13 +12,74 @@
12 * published by the Free Software Foundation. 12 * published by the Free Software Foundation.
13 */ 13 */
14 14
15#include <linux/platform_device.h>
16
17#include <linux/i2c/tps65010.h>
18
15#include <mach/mmc.h> 19#include <mach/mmc.h>
16#include <mach/gpio.h> 20#include <mach/gpio.h>
17 21
22#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
23
24static int mmc_set_power(struct device *dev, int slot, int power_on,
25 int vdd)
26{
27 if (power_on)
28 gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 1);
29 else
30 gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 0);
31
32 return 0;
33}
34
35static int mmc_late_init(struct device *dev)
36{
37 int ret;
38
39 ret = gpio_request(H2_TPS_GPIO_MMC_PWR_EN, "MMC power");
40 if (ret < 0)
41 return ret;
42
43 gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 0);
44
45 return ret;
46}
47
48static void mmc_shutdown(struct device *dev)
49{
50 gpio_free(H2_TPS_GPIO_MMC_PWR_EN);
51}
52
53/*
54 * H2 could use the following functions tested:
55 * - mmc_get_cover_state that uses OMAP_MPUIO(1)
56 * - mmc_get_wp that uses OMAP_MPUIO(3)
57 */
58static struct omap_mmc_platform_data mmc1_data = {
59 .nr_slots = 1,
60 .init = mmc_late_init,
61 .shutdown = mmc_shutdown,
62 .dma_mask = 0xffffffff,
63 .slots[0] = {
64 .set_power = mmc_set_power,
65 .ocr_mask = MMC_VDD_28_29 | MMC_VDD_30_31 |
66 MMC_VDD_32_33 | MMC_VDD_33_34,
67 .name = "mmcblk",
68 },
69};
70
71static struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC];
72
18void __init h2_mmc_init(void) 73void __init h2_mmc_init(void)
19{ 74{
75 mmc_data[0] = &mmc1_data;
76 omap1_init_mmc(mmc_data, OMAP16XX_NR_MMC);
20} 77}
21 78
22void h2_mmc_slot_cover_handler(void *arg, int state) 79#else
80
81void __init h2_mmc_init(void)
23{ 82{
24} 83}
84
85#endif