Merge branch 'iop-raid6' into async-tx-next
[pandora-kernel.git] / arch / arm / mach-omap2 / mmc-twl4030.c
index d9fad8d..dc40b3e 100644 (file)
@@ -100,6 +100,14 @@ static int twl_mmc_get_ro(struct device *dev, int slot)
        return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
 }
 
+static int twl_mmc_get_cover_state(struct device *dev, int slot)
+{
+       struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+       /* NOTE: assumes card detect signal is active-low */
+       return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
+}
+
 /*
  * MMC Slot Initialization.
  */
@@ -178,7 +186,10 @@ static int twl_mmc_resume(struct device *dev, int slot)
 static int twl_mmc_set_voltage(struct twl_mmc_controller *c, int vdd)
 {
        int ret;
-       u8 vmmc, dev_grp_val;
+       u8 vmmc = 0, dev_grp_val;
+
+       if (!vdd)
+               goto doit;
 
        if (c->twl_vmmc_dev_grp == VMMC1_DEV_GRP) {
                /* VMMC1:  max 220 mA.  And for 8-bit mode,
@@ -203,8 +214,7 @@ static int twl_mmc_set_voltage(struct twl_mmc_controller *c, int vdd)
                        /* error if VSIM needed */
                        break;
                default:
-                       vmmc = 0;
-                       break;
+                       return -EINVAL;
                }
        } else if (c->twl_vmmc_dev_grp == VMMC2_DEV_GRP) {
                /* VMMC2:  max 100 mA */
@@ -230,21 +240,21 @@ static int twl_mmc_set_voltage(struct twl_mmc_controller *c, int vdd)
                        vmmc = VMMC2_315V;
                        break;
                default:
-                       vmmc = 0;
-                       break;
+                       return -EINVAL;
                }
        } else {
-               return 0;
+               return -EINVAL;
        }
 
-       if (vmmc)
+doit:
+       if (vdd)
                dev_grp_val = VMMC_DEV_GRP_P1;  /* Power up */
        else
                dev_grp_val = LDO_CLR;          /* Power down */
 
        ret = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
                                        dev_grp_val, c->twl_vmmc_dev_grp);
-       if (ret)
+       if (ret || !vdd)
                return ret;
 
        ret = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
@@ -392,8 +402,11 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
                        return;
                }
 
-               snprintf(twl->name, ARRAY_SIZE(twl->name), "mmc%islot%i",
-                               c->mmc, 1);
+               if (c->name)
+                       strncpy(twl->name, c->name, HSMMC_NAME_LEN);
+               else
+                       snprintf(twl->name, ARRAY_SIZE(twl->name),
+                               "mmc%islot%i", c->mmc, 1);
                mmc->slots[0].name = twl->name;
                mmc->nr_slots = 1;
                mmc->slots[0].wires = c->wires;
@@ -409,7 +422,10 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
 
                        mmc->slots[0].switch_pin = c->gpio_cd;
                        mmc->slots[0].card_detect_irq = gpio_to_irq(c->gpio_cd);
-                       mmc->slots[0].card_detect = twl_mmc_card_detect;
+                       if (c->cover_only)
+                               mmc->slots[0].get_cover_state = twl_mmc_get_cover_state;
+                       else
+                               mmc->slots[0].card_detect = twl_mmc_card_detect;
                } else
                        mmc->slots[0].switch_pin = -EINVAL;