[OpenWrt-Devel] AsiaRF MT7620a mounting sdhci drive readonly

Luis Soltero lsoltero at globalmarinenet.com
Sat Aug 23 17:26:37 EDT 2014

Hello All,

Been trying to get an AsiaRF based MT7620a board running using CC r42230 and having issue getting the MMC SD card reader
to mount rw.

I have been in communication with the manufacturer to discover the GPIO (if any) used for the WP line for the SDHCI card
reader on the board.  They have not gotten back to me.  In the mean time I have attempted to use some of the mmc driver
properties such as wp-inverted to no avail.  In desperation I implemented a patch based on
which tells the driver to ignore the write protect line and assume r/w always... yet the card still mounts read only.  
note that when mounting the same SD card using a USB based reader the file system mounts rw as expected.

here is the mount table showing the ro mount

root at OpenWRT:~# mount
rootfs on / type rootfs (rw)
/dev/mmcblk0p2 on /wxa type ext4 (ro,relatime,data=ordered)

here is the DTS definition for the board

        sdhci at 10130000 {
                status = "okay";

following is the patch (some of you might find it useful).  Any thoughts would greatly be appreciated.

$ cat target/linux/ramips/patches-3.10/0402-mmc-add-broken-wp.patch
--- a/Documentation/devicetree/bindings/mmc/mmc.txt    2014-08-23 12:39:54.816004290 -0700
+++ b/Documentation/devicetree/bindings/mmc/mmc.txt    2014-08-23 12:40:56.574123135 -0700
@@ -21,6 +21,8 @@
   below for the case, when a GPIO is used for the CD line
 - wp-inverted: when present, polarity on the WP line is inverted. See the note
   below for the case, when a GPIO is used for the WP line
+- broken-wp: when present, no indication of write protection is available,
+  and write protection is assumed always off.
 - max-frequency: maximum operating clock frequency
 - no-1-8-v: when present, denotes that 1.8v card voltage is not supported on
   this system, even if the controller claims it is.
--- a/drivers/mmc/host/sdhci-pltfm.c    2014-08-23 12:44:02.648454500 -0700
+++ b/drivers/mmc/host/sdhci-pltfm.c    2014-08-23 12:45:52.009124011 -0700
@@ -80,7 +80,9 @@
             bus_width == 1))
             host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;
-        if (sdhci_of_wp_inverted(np))
+        if (of_get_property(np, "sdhci,broken-wp", NULL) || of_get_property(np, "broken-wp", NULL))
+            host->quirks2 |= SDHCI_QUIRK2_BROKEN_WRITE_PROTECT;
+        else if (sdhci_of_wp_inverted(np))
             host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT;
         if (of_get_property(np, "broken-cd", NULL))
--- a/drivers/mmc/host/sdhci.c    2014-08-23 12:46:10.028575138 -0700
+++ b/drivers/mmc/host/sdhci.c    2014-08-23 12:48:23.588506665 -0700
@@ -1621,6 +1621,8 @@
     if (host->flags & SDHCI_DEVICE_DEAD)
         is_readonly = 0;
+    else if (host->quirks2 & SDHCI_QUIRK2_BROKEN_WRITE_PROTECT)
+        is_readonly = 0;
     else if (host->ops->get_ro)
         is_readonly = host->ops->get_ro(host);
--- a/include/linux/mmc/sdhci.h    2014-08-23 12:56:38.005445877 -0700
+++ b/include/linux/mmc/sdhci.h    2014-08-23 12:58:58.113178602 -0700
@@ -95,6 +95,8 @@
 /* The system physically doesn't support 1.8v, even if the host does */
 #define SDHCI_QUIRK2_NO_1_8_V                (1<<2)
 #define SDHCI_QUIRK2_PRESET_VALUE_BROKEN        (1<<3)
+/* There is no indication for write protection at all, assume RW */
+#define SDHCI_QUIRK2_BROKEN_WRITE_PROTECT        (1<<4)
     int irq;        /* Device IRQ */
     void __iomem *ioaddr;    /* Mapped address */


Luis Soltero, Ph.D., MCS
Director of Software Development, CTO
Global Marine Networks, LLC
StarPilot, LLC
Tel: +1.865.379.8723
Fax: +1.865.681.5017
E-Mail: lsoltero at globalmarinenet.net
Web: http://www.globalmarinenet.net
Web: http://www.redportglobal.com
Web: http://www.starpilotllc.com
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org

More information about the openwrt-devel mailing list