From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Pierre Ossman <drzeus-mmc@drzeus.cx>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 3/3] mmc: change .get_ro() callback semantics
Date: Tue, 17 Jun 2008 18:17:39 +0400 [thread overview]
Message-ID: <20080617141739.GC8376@polina.dev.rtsoft.ru> (raw)
In-Reply-To: <20080617141607.GA2712@polina.dev.rtsoft.ru>
Now get_ro() callback must return 0/1 values for its logical states, and
negative errno values in case of error. If particular host instance doesn't
support RO/WP switch, it should return -ENOSYS.
This patch changes some hosts in two ways:
1. Now functions should be smart to not return negative values in
"RO asserted" case (particularly gpio_ calls could return negative
values for the outermost GPIOs).
Also, board code usually passes get_ro() callbacks that directly return
gpioreg & bit result, so at91_mci, imxmmc, pxamci and mmc_spi's get_ro()
handlers need take special care when returning platform's values to the
mmc core.
2. In case of host instance didn't implement get_ro() callback, it should
really return -ENOSYS and let the mmc core decide what to do about it
(mmc core thinks the same way as the hosts, so it isn't functional
change).
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---
drivers/mmc/core/sd.c | 4 ++--
drivers/mmc/host/at91_mci.c | 18 +++++++-----------
drivers/mmc/host/imxmmc.c | 9 ++++++---
drivers/mmc/host/mmc_spi.c | 9 ++++++---
drivers/mmc/host/pxamci.c | 9 ++++++---
drivers/mmc/host/wbsd.c | 2 +-
include/linux/mmc/host.h | 12 ++++++++++++
7 files changed, 40 insertions(+), 23 deletions(-)
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 7ef3b15..b122eb9 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -494,13 +494,13 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
* Check if read-only switch is active.
*/
if (!oldcard) {
- if (!host->ops->get_ro) {
+ if (!host->ops->get_ro || host->ops->get_ro(host) < 0) {
printk(KERN_WARNING "%s: host does not "
"support reading read-only "
"switch. assuming write-enable.\n",
mmc_hostname(host));
} else {
- if (host->ops->get_ro(host))
+ if (host->ops->get_ro(host) > 0)
mmc_card_set_readonly(card);
}
}
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
index 8979ad3..b9d4ed6 100644
--- a/drivers/mmc/host/at91_mci.c
+++ b/drivers/mmc/host/at91_mci.c
@@ -793,19 +793,15 @@ static irqreturn_t at91_mmc_det_irq(int irq, void *_host)
static int at91_mci_get_ro(struct mmc_host *mmc)
{
- int read_only = 0;
struct at91mci_host *host = mmc_priv(mmc);
- if (host->board->wp_pin) {
- read_only = gpio_get_value(host->board->wp_pin);
- printk(KERN_WARNING "%s: card is %s\n", mmc_hostname(mmc),
- (read_only ? "read-only" : "read-write") );
- }
- else {
- printk(KERN_WARNING "%s: host does not support reading read-only "
- "switch. Assuming write-enable.\n", mmc_hostname(mmc));
- }
- return read_only;
+ if (host->board->wp_pin)
+ return !!gpio_get_value(host->board->wp_pin);
+ /*
+ * Board doesn't support read only detection; let the mmc core
+ * decide what to do.
+ */
+ return -ENOSYS;
}
static const struct mmc_host_ops at91_mci_ops = {
diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c
index 95f33e8..5167679 100644
--- a/drivers/mmc/host/imxmmc.c
+++ b/drivers/mmc/host/imxmmc.c
@@ -889,9 +889,12 @@ static int imxmci_get_ro(struct mmc_host *mmc)
struct imxmci_host *host = mmc_priv(mmc);
if (host->pdata && host->pdata->get_ro)
- return host->pdata->get_ro(mmc_dev(mmc));
- /* Host doesn't support read only detection so assume writeable */
- return 0;
+ return !!host->pdata->get_ro(mmc_dev(mmc));
+ /*
+ * Board doesn't support read only detection; let the mmc core
+ * decide what to do.
+ */
+ return -ENOSYS;
}
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 547eb85..4e82f64 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -1126,9 +1126,12 @@ static int mmc_spi_get_ro(struct mmc_host *mmc)
struct mmc_spi_host *host = mmc_priv(mmc);
if (host->pdata && host->pdata->get_ro)
- return host->pdata->get_ro(mmc->parent);
- /* board doesn't support read only detection; assume writeable */
- return 0;
+ return !!host->pdata->get_ro(mmc->parent);
+ /*
+ * Board doesn't support read only detection; let the mmc core
+ * decide what to do.
+ */
+ return -ENOSYS;
}
static int mmc_spi_get_cd(struct mmc_host *mmc)
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
index 65210fc..b6056bd 100644
--- a/drivers/mmc/host/pxamci.c
+++ b/drivers/mmc/host/pxamci.c
@@ -361,9 +361,12 @@ static int pxamci_get_ro(struct mmc_host *mmc)
struct pxamci_host *host = mmc_priv(mmc);
if (host->pdata && host->pdata->get_ro)
- return host->pdata->get_ro(mmc_dev(mmc));
- /* Host doesn't support read only detection so assume writeable */
- return 0;
+ return !!host->pdata->get_ro(mmc_dev(mmc));
+ /*
+ * Board doesn't support read only detection; let the mmc core
+ * decide what to do.
+ */
+ return -ENOSYS;
}
static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c
index be624a0..9283b85 100644
--- a/drivers/mmc/host/wbsd.c
+++ b/drivers/mmc/host/wbsd.c
@@ -939,7 +939,7 @@ static int wbsd_get_ro(struct mmc_host *mmc)
spin_unlock_bh(&host->lock);
- return csr & WBSD_WRPT;
+ return !!(csr & WBSD_WRPT);
}
static const struct mmc_host_ops wbsd_ops = {
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 6188e19..753b723 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -58,6 +58,18 @@ struct mmc_host_ops {
*
* Also note that these functions might sleep, so don't call them
* in the atomic contexts!
+ *
+ * Return values for the get_ro callback should be:
+ * 0 for a read/write card
+ * 1 for a read-only card
+ * -ENOSYS when not supported (equal to NULL callback)
+ * or a negative errno value when something bad happened
+ *
+ * Return values for the get_ro callback should be:
+ * 0 for a absent card
+ * 1 for a present card
+ * -ENOSYS when not supported (equal to NULL callback)
+ * or a negative errno value when something bad happened
*/
void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
int (*get_ro)(struct mmc_host *host);
--
1.5.5.4
next prev parent reply other threads:[~2008-06-17 14:17 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-16 16:50 [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Anton Vorontsov
2008-05-16 16:50 ` Anton Vorontsov
[not found] ` <20080516165057.GC24196-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-17 11:36 ` Pierre Ossman
2008-05-17 11:36 ` Pierre Ossman
2008-05-17 11:36 ` Pierre Ossman
[not found] ` <20080517133633.5aa26938-OhHrUh4vRMSnewYJFaQfwJ5kstrrjoWp@public.gmane.org>
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
[not found] ` <20080521184713.GA30284-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-21 18:47 ` [PATCH 1/2] mmc: add support for card-detection polling Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` [PATCH 2/2] mmc_spi: " Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 19:28 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Pierre Ossman
2008-05-21 19:28 ` Pierre Ossman
2008-05-22 18:17 ` Anton Vorontsov
2008-05-22 18:17 ` Anton Vorontsov
[not found] ` <20080522181713.GA26918-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-22 18:18 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 18:18 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 19:34 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Pierre Ossman
2008-05-22 19:34 ` Pierre Ossman
2008-05-23 15:42 ` Anton Vorontsov
2008-05-23 15:42 ` Anton Vorontsov
2008-05-23 15:43 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
[not found] ` <20080523154340.GA24862-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-01 10:23 ` Pierre Ossman
2008-06-01 10:23 ` Pierre Ossman
[not found] ` <20080523154204.GA19803-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-23 15:43 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
2008-05-23 15:43 ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
[not found] ` <20080523154347.GC24862-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-03 10:07 ` Marc Pignat
2008-06-03 10:07 ` Marc Pignat
2008-06-03 10:07 ` Marc Pignat
2008-06-05 14:43 ` Anton Vorontsov
2008-06-05 14:43 ` Anton Vorontsov
[not found] ` <20080605144310.GA31596-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-05 15:58 ` Marc Pignat
2008-06-05 15:58 ` Marc Pignat
2008-06-05 15:58 ` Marc Pignat
2008-06-05 17:10 ` [PATCH] mmc: toughen get_ro() and get_cd() return values Anton Vorontsov
2008-06-05 17:10 ` Anton Vorontsov
[not found] ` <20080605171013.GA10513-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-14 14:36 ` Pierre Ossman
2008-06-14 14:36 ` Pierre Ossman
2008-06-17 14:16 ` Anton Vorontsov
2008-06-17 14:17 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-06-17 14:17 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-06-17 14:17 ` Anton Vorontsov [this message]
2008-06-20 15:40 ` [PATCH] mmc: toughen get_ro() and get_cd() return values Pierre Ossman
2008-05-22 18:18 ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-19 3:02 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detectline Chen Gong
2008-05-19 3:02 ` Chen Gong
2008-05-19 3:02 ` Chen Gong
[not found] ` <58A20A281BAF1047B4EAE68DE5C0BDC2F16E6A-bKEhWGtIRULiD3AT8lUqWFjVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2008-05-22 12:38 ` Anton Vorontsov
2008-05-22 12:38 ` Anton Vorontsov
2008-05-22 12:38 ` Anton Vorontsov
[not found] ` <20080522123838.GA27149-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-22 13:44 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the carddetectline Chen Gong
2008-05-22 13:44 ` Chen Gong
2008-05-22 13:44 ` Chen Gong
[not found] ` <58A20A281BAF1047B4EAE68DE5C0BDC2F176EF-bKEhWGtIRULiD3AT8lUqWFjVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2008-05-26 15:37 ` Anton Vorontsov
2008-05-26 15:37 ` Anton Vorontsov
2008-05-26 15:37 ` Anton Vorontsov
[not found] ` <20080526153747.GA31663-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-27 2:11 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for thecarddetectline Chen Gong
2008-05-27 2:11 ` Chen Gong
2008-05-27 2:11 ` Chen Gong
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=20080617141739.GC8376@polina.dev.rtsoft.ru \
--to=avorontsov@ru.mvista.com \
--cc=drzeus-mmc@drzeus.cx \
--cc=linux-kernel@vger.kernel.org \
/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: link
Be 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.