]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
MMC: OMAP: Supporting MMC multislot structures for Siemens SX1 board
authorCarlos Eduardo Aguiar <carlos.aguiar@indt.org.br>
Thu, 29 Nov 2007 17:52:53 +0000 (13:52 -0400)
committerTony Lindgren <tony@atomide.com>
Sat, 1 Dec 2007 00:08:36 +0000 (16:08 -0800)
Proposes the new board-sx1-mmc.c file to handle all the MMC
specific code for multislot support.

Signed-off-by: Carlos Eduardo Aguiar <carlos.aguiar@indt.org.br>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/board-sx1-mmc.c [new file with mode: 0644]
arch/arm/mach-omap1/board-sx1.c
include/asm-arm/arch-omap/board-sx1.h

diff --git a/arch/arm/mach-omap1/board-sx1-mmc.c b/arch/arm/mach-omap1/board-sx1-mmc.c
new file mode 100644 (file)
index 0000000..45c2fbb
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * linux/arch/arm/mach-omap1/board-sx1-mmc.c
+ *
+ * Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
+ * Author: Carlos Eduardo Aguiar <carlos.aguiar@indt.org.br>
+ *
+ * This code is based on linux/arch/arm/mach-omap1/board-h2-mmc.c, which is:
+ * Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <asm/arch/hardware.h>
+#include <asm/arch/mmc.h>
+#include <asm/arch/gpio.h>
+
+#ifdef CONFIG_MMC_OMAP
+static int slot_cover_open;
+static struct device *mmc_device;
+
+static int sx1_mmc_set_power(struct device *dev, int slot, int power_on,
+                               int vdd)
+{
+       int err;
+       u8 dat = 0;
+
+#ifdef CONFIG_MMC_DEBUG
+       dev_dbg(dev, "Set slot %d power: %s (vdd %d)\n", slot + 1,
+               power_on ? "on" : "off", vdd);
+#endif
+
+       if (slot != 0) {
+               dev_err(dev, "No such slot %d\n", slot + 1);
+               return -ENODEV;
+       }
+
+       err = i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);
+       if (err < 0)
+               return err;
+
+       if (power_on)
+               dat |= SOFIA_MMC_POWER;
+       else
+               dat &= ~SOFIA_MMC_POWER;
+
+       return i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
+}
+
+static int sx1_mmc_set_bus_mode(struct device *dev, int slot, int bus_mode)
+{
+#ifdef CONFIG_MMC_DEBUG
+       dev_dbg(dev, "Set slot %d bus_mode %s\n", slot + 1,
+               bus_mode == MMC_BUSMODE_OPENDRAIN ? "open-drain" : "push-pull");
+#endif
+       if (slot != 0) {
+               dev_err(dev, "No such slot %d\n", slot + 1);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+static int sx1_mmc_get_cover_state(struct device *dev, int slot)
+{
+       BUG_ON(slot != 0);
+
+       return slot_cover_open;
+}
+
+void sx1_mmc_slot_cover_handler(void *arg, int state)
+{
+       if (mmc_device == NULL)
+               return;
+
+       slot_cover_open = state;
+       omap_mmc_notify_cover_event(mmc_device, 0, state);
+}
+
+static int sx1_mmc_late_init(struct device *dev)
+{
+       int ret = 0;
+
+       mmc_device = dev;
+
+       return ret;
+}
+
+static void sx1_mmc_cleanup(struct device *dev)
+{
+}
+
+static struct omap_mmc_platform_data sx1_mmc_data = {
+       .nr_slots                       = 1,
+       .switch_slot                    = NULL,
+       .init                           = sx1_mmc_late_init,
+       .cleanup                        = sx1_mmc_cleanup,
+       .slots[0]       = {
+               .set_power              = sx1_mmc_set_power,
+               .set_bus_mode           = sx1_mmc_set_bus_mode,
+               .get_ro                 = NULL,
+               .get_cover_state        = sx1_mmc_get_cover_state,
+               .ocr_mask               = MMC_VDD_28_29 | MMC_VDD_30_31 |
+                                         MMC_VDD_32_33 | MMC_VDD_33_34,
+               .name                   = "mmcblk",
+       },
+};
+
+void __init sx1_mmc_init(void)
+{
+       omap_set_mmc_info(1, &sx1_mmc_data);
+}
+
+#else
+
+void __init sx1_mmc_init(void)
+{
+}
+
+void sx1_mmc_slot_cover_handler(void *arg, int state)
+{
+}
+#endif
index 389d3fa1137b5240574aadec6f924fb6f27a8276..b4ca20bb08dfd94d933f68c6a33b973fa65e7358 100644 (file)
@@ -134,20 +134,7 @@ int sx1_setmmipower(u8 onoff)
                dat &= ~SOFIA_MMILIGHT_POWER;
        return i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
 }
-/* set MMC power on/off */
-int sx1_setmmcpower(u8 onoff)
-{
-       int err;
-       u8 dat = 0;
-       err = i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);
-       if (err < 0)
-               return err;
-       if (onoff)
-               dat |= SOFIA_MMC_POWER;
-       else
-               dat &= ~SOFIA_MMC_POWER;
-       return i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
-}
+
 /* set USB power on/off */
 int sx1_setusbpower(u8 onoff)
 {
@@ -168,7 +155,6 @@ EXPORT_SYMBOL(sx1_getkeylight);
 EXPORT_SYMBOL(sx1_setbacklight);
 EXPORT_SYMBOL(sx1_getbacklight);
 EXPORT_SYMBOL(sx1_setmmipower);
-EXPORT_SYMBOL(sx1_setmmcpower);
 EXPORT_SYMBOL(sx1_setusbpower);
 
 /*----------- Keypad -------------------------*/
@@ -432,6 +418,9 @@ static struct omap_board_config_kernel sx1_config[] __initdata = {
        { OMAP_TAG_UART,        &sx1_uart_config },
 };
 /*-----------------------------------------*/
+
+extern void __init sx1_mmc_init(void);
+
 static void __init omap_sx1_init(void)
 {
        platform_add_devices(sx1_devices, ARRAY_SIZE(sx1_devices));
index 2bb8dd6e2d14db850ec61009d443e403d9ee1689..75dd8c3463e400d19a51b9b230fc04b4e5e5d978 100644 (file)
@@ -41,6 +41,12 @@ int sx1_getkeylight(u8 *keylight);
 
 int sx1_setmmipower(u8 onoff);
 int sx1_setusbpower(u8 onoff);
-int sx1_setmmcpower(u8 onoff);
+
+int i2c_write_byte(u8 devaddr, u8 regoffset, u8 value);
+int i2c_read_byte(u8 devaddr, u8 regoffset, u8 * value);
+
+/* MMC prototypes */
+
+extern void sx1_mmc_slot_cover_handler(void *arg, int state);
 
 #endif /* __ASM_ARCH_SX1_I2C_CHIPS_H */