aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Vorontsov <avorontsov@ru.mvista.com>2008-06-17 10:17:39 -0400
committerPierre Ossman <drzeus@drzeus.cx>2008-07-15 08:14:41 -0400
commit08f80bb5196517a0dfe50dc7c10f234c0ff2f0e8 (patch)
treeaee5e1808521eb3c00ff37d50a2e8957bebbd34b
parent619ef4b42128709de4d89d209b2c874f560deecd (diff)
mmc: change .get_ro() callback semantics
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> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
-rw-r--r--drivers/mmc/core/sd.c4
-rw-r--r--drivers/mmc/host/at91_mci.c18
-rw-r--r--drivers/mmc/host/imxmmc.c9
-rw-r--r--drivers/mmc/host/mmc_spi.c9
-rw-r--r--drivers/mmc/host/pxamci.c9
-rw-r--r--drivers/mmc/host/wbsd.c2
-rw-r--r--include/linux/mmc/host.h12
7 files changed, 40 insertions, 23 deletions
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 7ef3b15c5e3d..b122eb9ea453 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,
494 * Check if read-only switch is active. 494 * Check if read-only switch is active.
495 */ 495 */
496 if (!oldcard) { 496 if (!oldcard) {
497 if (!host->ops->get_ro) { 497 if (!host->ops->get_ro || host->ops->get_ro(host) < 0) {
498 printk(KERN_WARNING "%s: host does not " 498 printk(KERN_WARNING "%s: host does not "
499 "support reading read-only " 499 "support reading read-only "
500 "switch. assuming write-enable.\n", 500 "switch. assuming write-enable.\n",
501 mmc_hostname(host)); 501 mmc_hostname(host));
502 } else { 502 } else {
503 if (host->ops->get_ro(host)) 503 if (host->ops->get_ro(host) > 0)
504 mmc_card_set_readonly(card); 504 mmc_card_set_readonly(card);
505 } 505 }
506 } 506 }
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
index 8979ad330a4d..b9d4ed6b29b1 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)
793 793
794static int at91_mci_get_ro(struct mmc_host *mmc) 794static int at91_mci_get_ro(struct mmc_host *mmc)
795{ 795{
796 int read_only = 0;
797 struct at91mci_host *host = mmc_priv(mmc); 796 struct at91mci_host *host = mmc_priv(mmc);
798 797
799 if (host->board->wp_pin) { 798 if (host->board->wp_pin)
800 read_only = gpio_get_value(host->board->wp_pin); 799 return !!gpio_get_value(host->board->wp_pin);
801 printk(KERN_WARNING "%s: card is %s\n", mmc_hostname(mmc), 800 /*
802 (read_only ? "read-only" : "read-write") ); 801 * Board doesn't support read only detection; let the mmc core
803 } 802 * decide what to do.
804 else { 803 */
805 printk(KERN_WARNING "%s: host does not support reading read-only " 804 return -ENOSYS;
806 "switch. Assuming write-enable.\n", mmc_hostname(mmc));
807 }
808 return read_only;
809} 805}
810 806
811static const struct mmc_host_ops at91_mci_ops = { 807static const struct mmc_host_ops at91_mci_ops = {
diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c
index eed211b2ac70..5e880c0f1349 100644
--- a/drivers/mmc/host/imxmmc.c
+++ b/drivers/mmc/host/imxmmc.c
@@ -892,9 +892,12 @@ static int imxmci_get_ro(struct mmc_host *mmc)
892 struct imxmci_host *host = mmc_priv(mmc); 892 struct imxmci_host *host = mmc_priv(mmc);
893 893
894 if (host->pdata && host->pdata->get_ro) 894 if (host->pdata && host->pdata->get_ro)
895 return host->pdata->get_ro(mmc_dev(mmc)); 895 return !!host->pdata->get_ro(mmc_dev(mmc));
896 /* Host doesn't support read only detection so assume writeable */ 896 /*
897 return 0; 897 * Board doesn't support read only detection; let the mmc core
898 * decide what to do.
899 */
900 return -ENOSYS;
898} 901}
899 902
900 903
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 547eb857b1b3..4e82f64a96bc 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)
1126 struct mmc_spi_host *host = mmc_priv(mmc); 1126 struct mmc_spi_host *host = mmc_priv(mmc);
1127 1127
1128 if (host->pdata && host->pdata->get_ro) 1128 if (host->pdata && host->pdata->get_ro)
1129 return host->pdata->get_ro(mmc->parent); 1129 return !!host->pdata->get_ro(mmc->parent);
1130 /* board doesn't support read only detection; assume writeable */ 1130 /*
1131 return 0; 1131 * Board doesn't support read only detection; let the mmc core
1132 * decide what to do.
1133 */
1134 return -ENOSYS;
1132} 1135}
1133 1136
1134static int mmc_spi_get_cd(struct mmc_host *mmc) 1137static int mmc_spi_get_cd(struct mmc_host *mmc)
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
index d89475d36988..d39f59738866 100644
--- a/drivers/mmc/host/pxamci.c
+++ b/drivers/mmc/host/pxamci.c
@@ -374,9 +374,12 @@ static int pxamci_get_ro(struct mmc_host *mmc)
374 struct pxamci_host *host = mmc_priv(mmc); 374 struct pxamci_host *host = mmc_priv(mmc);
375 375
376 if (host->pdata && host->pdata->get_ro) 376 if (host->pdata && host->pdata->get_ro)
377 return host->pdata->get_ro(mmc_dev(mmc)); 377 return !!host->pdata->get_ro(mmc_dev(mmc));
378 /* Host doesn't support read only detection so assume writeable */ 378 /*
379 return 0; 379 * Board doesn't support read only detection; let the mmc core
380 * decide what to do.
381 */
382 return -ENOSYS;
380} 383}
381 384
382static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) 385static 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 c303e7f57ab4..67e5a9b80f53 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)
939 939
940 spin_unlock_bh(&host->lock); 940 spin_unlock_bh(&host->lock);
941 941
942 return csr & WBSD_WRPT; 942 return !!(csr & WBSD_WRPT);
943} 943}
944 944
945static const struct mmc_host_ops wbsd_ops = { 945static const struct mmc_host_ops wbsd_ops = {
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 6188e19d2331..753b7231b887 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -58,6 +58,18 @@ struct mmc_host_ops {
58 * 58 *
59 * Also note that these functions might sleep, so don't call them 59 * Also note that these functions might sleep, so don't call them
60 * in the atomic contexts! 60 * in the atomic contexts!
61 *
62 * Return values for the get_ro callback should be:
63 * 0 for a read/write card
64 * 1 for a read-only card
65 * -ENOSYS when not supported (equal to NULL callback)
66 * or a negative errno value when something bad happened
67 *
68 * Return values for the get_ro callback should be:
69 * 0 for a absent card
70 * 1 for a present card
71 * -ENOSYS when not supported (equal to NULL callback)
72 * or a negative errno value when something bad happened
61 */ 73 */
62 void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios); 74 void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
63 int (*get_ro)(struct mmc_host *host); 75 int (*get_ro)(struct mmc_host *host);