From: Doug Anderson <dianders@chromium.org> To: linux-mmc@vger.kernel.org Cc: linux-samsung-soc@vger.kernel.org, Thomas Abraham <thomas.abraham@linaro.org>, Kukjin Kim <kgene.kim@samsung.com>, Olof Johansson <olof@lixom.net>, Arnd Bergmann <arnd@arndb.de>, Will Newton <will.newton@imgtec.com>, Chris Ball <cjb@laptop.org>, Jaehoon Chung <jh80.chung@samsung.com>, Seungwon Jeon <tgih.jun@samsung.com>, linux-kernel@vger.kernel.org, Doug Anderson <dianders@chromium.org>, Grant Likely <grant.likely@secretlab.ca>, Rob Herring <rob.herring@calxeda.com>, Rob Landley <rob@landley.net>, Abhilash Kesavan <a.kesavan@samsung.com>, Kyungmin Park <kyungmin.park@samsung.com>, devicetree-discuss@lists.ozlabs.org, linux-doc@vger.kernel.org Subject: [REPOST PATCH v3 1/4] mmc: dw_mmc: Add "disable-wp" device tree property Date: Thu, 10 Jan 2013 10:24:26 -0800 [thread overview] Message-ID: <1357842269-15062-1-git-send-email-dianders@chromium.org> (raw) In-Reply-To: <1354251857-21587-1-git-send-email-dianders@chromium.org> The "disable-wp" property is used to specify that a given SD card slot doesn't have a concept of write protect. This eliminates the need for special case code for SD slots that should never be write protected (like a micro SD slot or a dev board). The dw_mmc driver is special in needing to specify "disable-wp" because the lack of a "wp-gpios" property means to use the special purpose write protect line. On some other mmc devices the lack of "wp-gpios" means that write protect should be disabled. Signed-off-by: Doug Anderson <dianders@chromium.org> Acked-by: Seungwon Jeon <tgih.jun@samsung.com> --- Changes in v3: - New for this version of the patch series. Chose "disable-wp" rather than the discussed "broken-internal-wp" since it mapped more cleanly to an existing quirk (and the only reason to specify that the internal wp is broken is if you're disabling the write protect anyway). - Reposted series 3 with Seungwon's ack, since it hasn't been picked up by anyone. .../devicetree/bindings/mmc/synopsis-dw-mshc.txt | 12 +++++- drivers/mmc/host/dw_mmc.c | 36 +++++++++++++++++++- include/linux/mmc/dw_mmc.h | 4 ++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt index 06cd32d08..726fd21 100644 --- a/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt +++ b/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt @@ -26,8 +26,16 @@ Required Properties: * bus-width: as documented in mmc core bindings. * wp-gpios: specifies the write protect gpio line. The format of the - gpio specifier depends on the gpio controller. If the write-protect - line is not available, this property is optional. + gpio specifier depends on the gpio controller. If a GPIO is not used + for write-protect, this property is optional. + + * disable-wp: If the wp-gpios property isn't present then (by default) + we'd assume that the write protect is hooked up directly to the + controller's special purpose write protect line (accessible via + the WRTPRT register). However, it's possible that we simply don't + want write protect. In that case specify 'disable-wp'. + NOTE: This property is not required for slots known to always + connect to eMMC or SDIO cards. Optional properties: diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 323c502..bc0b030 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -74,6 +74,7 @@ struct idmac_desc { * 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. @@ -88,6 +89,8 @@ struct dw_mci_slot { struct mmc_host *mmc; struct dw_mci *host; + int quirks; + u32 ctype; struct mmc_request *mrq; @@ -825,7 +828,8 @@ static int dw_mci_get_ro(struct mmc_host *mmc) struct dw_mci_board *brd = slot->host->pdata; /* Use platform get_ro function, else try on board write protect */ - if (brd->quirks & DW_MCI_QUIRK_NO_WRITE_PROTECT) + if ((brd->quirks & DW_MCI_QUIRK_NO_WRITE_PROTECT) || + (slot->quirks & DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT)) read_only = 0; else if (brd->get_ro) read_only = brd->get_ro(slot->id); @@ -1785,6 +1789,30 @@ static struct device_node *dw_mci_of_find_slot_node(struct device *dev, u8 slot) 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) +{ + struct device_node *np = dw_mci_of_find_slot_node(dev, slot); + int quirks = 0; + int idx; + + /* get quirks */ + for (idx = 0; idx < ARRAY_SIZE(of_slot_quirks); idx++) + if (of_get_property(np, of_slot_quirks[idx].quirk, NULL)) + quirks |= of_slot_quirks[idx].id; + + return quirks; +} + /* find out bus-width for a given slot */ static u32 dw_mci_of_get_bus_wd(struct device *dev, u8 slot) { @@ -1800,6 +1828,10 @@ static u32 dw_mci_of_get_bus_wd(struct device *dev, u8 slot) return bus_wd; } #else /* CONFIG_OF */ +static int dw_mci_of_get_slot_quirks(struct device *dev, u8 slot) +{ + return 0; +} static u32 dw_mci_of_get_bus_wd(struct device *dev, u8 slot) { return 1; @@ -1828,6 +1860,8 @@ 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; mmc->f_min = DIV_ROUND_UP(host->bus_hz, 510); mmc->f_max = host->bus_hz; diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 34be4f4..24dc3a8 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -212,6 +212,10 @@ struct dw_mci_dma_ops { /* Write Protect detection not available */ #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; struct block_settings { -- 1.7.7.3
WARNING: multiple messages have this Message-ID (diff)
From: Doug Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> To: linux-mmc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: Kukjin Kim <kgene.kim-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>, linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Seungwon Jeon <tgih.jun-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>, Jaehoon Chung <jh80.chung-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>, Will Newton <will.newton-1AXoQHu6uovQT0dZR+AlfA@public.gmane.org>, Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Abhilash Kesavan <a.kesavan-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>, Chris Ball <cjb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org> Subject: [REPOST PATCH v3 1/4] mmc: dw_mmc: Add "disable-wp" device tree property Date: Thu, 10 Jan 2013 10:24:26 -0800 [thread overview] Message-ID: <1357842269-15062-1-git-send-email-dianders@chromium.org> (raw) In-Reply-To: <1354251857-21587-1-git-send-email-dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> The "disable-wp" property is used to specify that a given SD card slot doesn't have a concept of write protect. This eliminates the need for special case code for SD slots that should never be write protected (like a micro SD slot or a dev board). The dw_mmc driver is special in needing to specify "disable-wp" because the lack of a "wp-gpios" property means to use the special purpose write protect line. On some other mmc devices the lack of "wp-gpios" means that write protect should be disabled. Signed-off-by: Doug Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> Acked-by: Seungwon Jeon <tgih.jun-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- Changes in v3: - New for this version of the patch series. Chose "disable-wp" rather than the discussed "broken-internal-wp" since it mapped more cleanly to an existing quirk (and the only reason to specify that the internal wp is broken is if you're disabling the write protect anyway). - Reposted series 3 with Seungwon's ack, since it hasn't been picked up by anyone. .../devicetree/bindings/mmc/synopsis-dw-mshc.txt | 12 +++++- drivers/mmc/host/dw_mmc.c | 36 +++++++++++++++++++- include/linux/mmc/dw_mmc.h | 4 ++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt index 06cd32d08..726fd21 100644 --- a/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt +++ b/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt @@ -26,8 +26,16 @@ Required Properties: * bus-width: as documented in mmc core bindings. * wp-gpios: specifies the write protect gpio line. The format of the - gpio specifier depends on the gpio controller. If the write-protect - line is not available, this property is optional. + gpio specifier depends on the gpio controller. If a GPIO is not used + for write-protect, this property is optional. + + * disable-wp: If the wp-gpios property isn't present then (by default) + we'd assume that the write protect is hooked up directly to the + controller's special purpose write protect line (accessible via + the WRTPRT register). However, it's possible that we simply don't + want write protect. In that case specify 'disable-wp'. + NOTE: This property is not required for slots known to always + connect to eMMC or SDIO cards. Optional properties: diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 323c502..bc0b030 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -74,6 +74,7 @@ struct idmac_desc { * 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. @@ -88,6 +89,8 @@ struct dw_mci_slot { struct mmc_host *mmc; struct dw_mci *host; + int quirks; + u32 ctype; struct mmc_request *mrq; @@ -825,7 +828,8 @@ static int dw_mci_get_ro(struct mmc_host *mmc) struct dw_mci_board *brd = slot->host->pdata; /* Use platform get_ro function, else try on board write protect */ - if (brd->quirks & DW_MCI_QUIRK_NO_WRITE_PROTECT) + if ((brd->quirks & DW_MCI_QUIRK_NO_WRITE_PROTECT) || + (slot->quirks & DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT)) read_only = 0; else if (brd->get_ro) read_only = brd->get_ro(slot->id); @@ -1785,6 +1789,30 @@ static struct device_node *dw_mci_of_find_slot_node(struct device *dev, u8 slot) 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) +{ + struct device_node *np = dw_mci_of_find_slot_node(dev, slot); + int quirks = 0; + int idx; + + /* get quirks */ + for (idx = 0; idx < ARRAY_SIZE(of_slot_quirks); idx++) + if (of_get_property(np, of_slot_quirks[idx].quirk, NULL)) + quirks |= of_slot_quirks[idx].id; + + return quirks; +} + /* find out bus-width for a given slot */ static u32 dw_mci_of_get_bus_wd(struct device *dev, u8 slot) { @@ -1800,6 +1828,10 @@ static u32 dw_mci_of_get_bus_wd(struct device *dev, u8 slot) return bus_wd; } #else /* CONFIG_OF */ +static int dw_mci_of_get_slot_quirks(struct device *dev, u8 slot) +{ + return 0; +} static u32 dw_mci_of_get_bus_wd(struct device *dev, u8 slot) { return 1; @@ -1828,6 +1860,8 @@ 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; mmc->f_min = DIV_ROUND_UP(host->bus_hz, 510); mmc->f_max = host->bus_hz; diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 34be4f4..24dc3a8 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -212,6 +212,10 @@ struct dw_mci_dma_ops { /* Write Protect detection not available */ #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; struct block_settings { -- 1.7.7.3
next prev parent reply other threads:[~2013-01-10 18:25 UTC|newest] Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top 2012-11-21 22:03 [PATCH 1/2] mmc: dw_mmc: exynos: Stop claiming wp-gpio Doug Anderson 2012-11-21 22:03 ` [PATCH 2/2] mmc: dw_mmc: Handle wp-gpios from device tree Doug Anderson 2012-11-22 1:42 ` Seungwon Jeon 2012-11-22 4:33 ` Doug Anderson 2012-11-22 5:49 ` Seungwon Jeon 2012-11-22 1:55 ` Jaehoon Chung 2012-11-22 4:43 ` Doug Anderson 2012-11-22 22:53 ` [PATCH v2 1/2] mmc: dw_mmc: exynos: Stop claiming wp-gpio Doug Anderson 2012-11-22 22:53 ` [PATCH v2 2/2] mmc: dw_mmc: Handle wp-gpios from device tree Doug Anderson 2012-11-28 9:29 ` [PATCH v2 1/2] mmc: dw_mmc: exynos: Stop claiming wp-gpio Seungwon Jeon 2012-11-28 18:20 ` Doug Anderson 2012-11-29 7:46 ` Seungwon Jeon 2012-11-30 5:07 ` Doug Anderson 2012-11-30 5:04 ` [PATCH v3 1/4] mmc: dw_mmc: Add "disable-wp" device tree property Doug Anderson 2012-11-30 5:04 ` [PATCH v3 2/4] ARM: dts: Add disable-wp for sd card slot on smdk5250 Doug Anderson 2012-11-30 5:04 ` Doug Anderson 2012-11-30 5:04 ` [PATCH v3 3/4] mmc: dw_mmc: exynos: Remove code for wp-gpios Doug Anderson 2012-11-30 5:04 ` [PATCH v3 4/4] mmc: dw_mmc: Handle wp-gpios from device tree Doug Anderson 2012-11-30 11:57 ` [PATCH v3 1/4] mmc: dw_mmc: Add "disable-wp" device tree property Seungwon Jeon 2012-12-20 0:56 ` Doug Anderson 2013-01-10 18:24 ` Doug Anderson [this message] 2013-01-10 18:24 ` [REPOST PATCH " Doug Anderson 2013-01-10 18:24 ` [REPOST PATCH v3 2/4] ARM: dts: Add disable-wp for sd card slot on smdk5250 Doug Anderson 2013-01-10 18:24 ` Doug Anderson 2013-01-10 18:24 ` [REPOST PATCH v3 3/4] mmc: dw_mmc: exynos: Remove code for wp-gpios Doug Anderson 2013-01-10 18:24 ` [REPOST PATCH v3 4/4] mmc: dw_mmc: Handle wp-gpios from device tree Doug Anderson 2013-01-10 23:01 ` [REPOST PATCH v3 1/4] mmc: dw_mmc: Add "disable-wp" device tree property Olof Johansson 2013-01-10 23:23 ` Doug Anderson 2013-01-10 23:57 ` Doug Anderson 2013-01-11 17:03 ` [PATCH v4 1/5] " Doug Anderson 2013-01-11 17:03 ` [PATCH v4 2/5] ARM: dts: Add disable-wp for sd card slot on smdk5250 Doug Anderson 2013-01-11 17:03 ` Doug Anderson 2013-01-15 6:27 ` Olof Johansson 2013-01-15 6:27 ` Olof Johansson 2013-01-11 17:03 ` [PATCH v4 3/5] mmc: dw_mmc: exynos: Remove code for wp-gpios Doug Anderson 2013-01-15 6:25 ` Olof Johansson 2013-01-11 17:03 ` [PATCH v4 4/5] mmc: dw_mmc: Handle wp-gpios from device tree Doug Anderson 2013-01-15 6:27 ` Olof Johansson 2013-01-11 17:03 ` [PATCH v4 5/5] mmc: dw_mmc: Remove DW_MCI_QUIRK_NO_WRITE_PROTECT Doug Anderson 2013-01-14 10:47 ` Will Newton 2013-01-14 16:09 ` Doug Anderson 2013-01-28 21:14 ` Chris Ball 2013-01-28 21:14 ` Chris Ball 2013-01-15 6:28 ` Olof Johansson 2013-01-11 17:12 ` [PATCH v4 1/5] mmc: dw_mmc: Add "disable-wp" device tree property Will Newton 2013-01-15 6:20 ` Olof Johansson 2013-01-15 6:20 ` Olof Johansson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1357842269-15062-1-git-send-email-dianders@chromium.org \ --to=dianders@chromium.org \ --cc=a.kesavan@samsung.com \ --cc=arnd@arndb.de \ --cc=cjb@laptop.org \ --cc=devicetree-discuss@lists.ozlabs.org \ --cc=grant.likely@secretlab.ca \ --cc=jh80.chung@samsung.com \ --cc=kgene.kim@samsung.com \ --cc=kyungmin.park@samsung.com \ --cc=linux-doc@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mmc@vger.kernel.org \ --cc=linux-samsung-soc@vger.kernel.org \ --cc=olof@lixom.net \ --cc=rob.herring@calxeda.com \ --cc=rob@landley.net \ --cc=tgih.jun@samsung.com \ --cc=thomas.abraham@linaro.org \ --cc=will.newton@imgtec.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.