mmc: dw_mmc: Use core to handle absent write protect line
authorLars-Peter Clausen <lars@metafoo.de>
Wed, 6 May 2015 18:31:22 +0000 (20:31 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 1 Jun 2015 07:07:05 +0000 (09:07 +0200)
Use the new MMC_CAP2_NO_WRITE_PROTECT to let the core handle the case where
no write protect line is present instead of having custom driver code to
handle it.

dw_mci_of_get_slot_quirks() is slightly refactored to directly modify the
mmc_host capabilities instead of returning a quirk mask.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/dw_mmc.c
drivers/mmc/host/dw_mmc.h
include/linux/mmc/dw_mmc.h

index ce66565d50ef572f102a210695ddf48eb7f86cb2..55179f1001fbfda5445dd00991f9b11abca1cd5a 100644 (file)
@@ -1282,10 +1282,7 @@ static int dw_mci_get_ro(struct mmc_host *mmc)
        int gpio_ro = mmc_gpio_get_ro(mmc);
 
        /* Use platform get_ro function, else try on board write protect */
-       if ((slot->quirks & DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT) ||
-                       (slot->host->quirks & DW_MCI_QUIRK_NO_WRITE_PROTECT))
-               read_only = 0;
-       else if (!IS_ERR_VALUE(gpio_ro))
+       if (!IS_ERR_VALUE(gpio_ro))
                read_only = gpio_ro;
        else
                read_only =
@@ -2284,9 +2281,10 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
 }
 
 #ifdef CONFIG_OF
-/* given a slot id, find out the device node representing that slot */
-static struct device_node *dw_mci_of_find_slot_node(struct device *dev, u8 slot)
+/* given a slot, find out the device node representing that slot */
+static struct device_node *dw_mci_of_find_slot_node(struct dw_mci_slot *slot)
 {
+       struct device *dev = slot->mmc->parent;
        struct device_node *np;
        const __be32 *addr;
        int len;
@@ -2298,42 +2296,28 @@ static struct device_node *dw_mci_of_find_slot_node(struct device *dev, u8 slot)
                addr = of_get_property(np, "reg", &len);
                if (!addr || (len < sizeof(int)))
                        continue;
-               if (be32_to_cpup(addr) == slot)
+               if (be32_to_cpup(addr) == slot->id)
                        return np;
        }
        return NULL;
 }
 
-static struct dw_mci_of_slot_quirks {
-       char *quirk;
-       int id;
-} of_slot_quirks[] = {
-       {
-               .quirk  = "disable-wp",
-               .id     = DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT,
-       },
-};
-
-static int dw_mci_of_get_slot_quirks(struct device *dev, u8 slot)
+static void dw_mci_slot_of_parse(struct dw_mci_slot *slot)
 {
-       struct device_node *np = dw_mci_of_find_slot_node(dev, slot);
-       int quirks = 0;
-       int idx;
+       struct device_node *np = dw_mci_of_find_slot_node(slot);
 
-       /* get quirks */
-       for (idx = 0; idx < ARRAY_SIZE(of_slot_quirks); idx++)
-               if (of_get_property(np, of_slot_quirks[idx].quirk, NULL)) {
-                       dev_warn(dev, "Slot quirk %s is deprecated\n",
-                                       of_slot_quirks[idx].quirk);
-                       quirks |= of_slot_quirks[idx].id;
-               }
+       if (!np)
+               return;
 
-       return quirks;
+       if (of_property_read_bool(np, "disable-wp")) {
+               slot->mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT;
+               dev_warn(slot->mmc->parent,
+                       "Slot quirk 'disable-wp' is deprecated\n");
+       }
 }
 #else /* CONFIG_OF */
-static int dw_mci_of_get_slot_quirks(struct device *dev, u8 slot)
+static void dw_mci_slot_of_parse(struct dw_mci_slot *slot)
 {
-       return 0;
 }
 #endif /* CONFIG_OF */
 
@@ -2356,8 +2340,6 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
        slot->host = host;
        host->slot[id] = slot;
 
-       slot->quirks = dw_mci_of_get_slot_quirks(host->dev, slot->id);
-
        mmc->ops = &dw_mci_ops;
        if (of_property_read_u32_array(host->dev->of_node,
                                       "clock-freq-min-max", freq, 2)) {
@@ -2395,6 +2377,8 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
        if (host->pdata->caps2)
                mmc->caps2 = host->pdata->caps2;
 
+       dw_mci_slot_of_parse(slot);
+
        ret = mmc_of_parse(mmc);
        if (ret)
                goto err_host_allocated;
@@ -2622,9 +2606,6 @@ static struct dw_mci_of_quirks {
        {
                .quirk  = "broken-cd",
                .id     = DW_MCI_QUIRK_BROKEN_CARD_DETECTION,
-       }, {
-               .quirk  = "disable-wp",
-               .id     = DW_MCI_QUIRK_NO_WRITE_PROTECT,
        },
 };
 
index c7236170bf98c7f5c98b77df5c7bfd60fb5a79ad..8ce4674730a6ff8efde66e456136aa0d282e06c5 100644 (file)
@@ -227,7 +227,6 @@ extern int dw_mci_resume(struct dw_mci *host);
  * struct dw_mci_slot - MMC slot state
  * @mmc: The mmc_host representing this slot.
  * @host: The MMC controller this slot is using.
- * @quirks: Slot-level quirks (DW_MCI_SLOT_QUIRK_XXX)
  * @ctype: Card type for this slot.
  * @mrq: mmc_request currently being processed or waiting to be
  *     processed, or NULL when the slot is idle.
@@ -245,8 +244,6 @@ struct dw_mci_slot {
        struct mmc_host         *mmc;
        struct dw_mci           *host;
 
-       int                     quirks;
-
        u32                     ctype;
 
        struct mmc_request      *mrq;
index 12111993a3175ede2a43a0c061f5cbaf01b50abf..5be97676f1fa029a9e0b40418bc1c37b83105d44 100644 (file)
@@ -226,12 +226,6 @@ struct dw_mci_dma_ops {
 #define DW_MCI_QUIRK_HIGHSPEED                 BIT(2)
 /* Unreliable card detection */
 #define DW_MCI_QUIRK_BROKEN_CARD_DETECTION     BIT(3)
-/* No write protect */
-#define DW_MCI_QUIRK_NO_WRITE_PROTECT          BIT(4)
-
-/* Slot level quirks */
-/* This slot has no write protect */
-#define DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT     BIT(0)
 
 struct dma_pdata;