You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/05/13 12:41:32 UTC

[incubator-nuttx] 01/02: drivers/sdio: Call SDIO_LOCK before and after the transaction

This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 679bc88cabd7b03703209bf67a779eb33ad94058
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Thu May 12 07:23:02 2022 +0800

    drivers/sdio: Call SDIO_LOCK before and after the transaction
    
    follow the same behaviour in drivers/mmcsd/mmcsd_sdio.c
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 drivers/mmcsd/sdio.c | 51 +++++++++++++++++++++++++++++++++++----------------
 include/nuttx/sdio.h |  3 ---
 2 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/drivers/mmcsd/sdio.c b/drivers/mmcsd/sdio.c
index 003b52bae3..4550f97b92 100644
--- a/drivers/mmcsd/sdio.c
+++ b/drivers/mmcsd/sdio.c
@@ -38,6 +38,14 @@
 #define SDIO_CMD53_TIMEOUT_MS 100
 #define SDIO_IDLE_DELAY_MS    50
 
+#ifdef CONFIG_SDIO_MUXBUS
+#  define SDIO_TAKELOCK(dev)  SDIO_LOCK(dev, true)
+#  define SDIO_GIVELOCK(dev)  SDIO_LOCK(dev, false)
+#else
+#  define SDIO_TAKELOCK(dev)
+#  define SDIO_GIVELOCK(dev)
+#endif
+
 /****************************************************************************
  * Private Types
  ****************************************************************************/
@@ -89,10 +97,11 @@ union sdio_cmd5x
 };
 
 /****************************************************************************
- * Public Functions
+ * Private Functions
  ****************************************************************************/
 
-int sdio_sendcmdpoll(FAR struct sdio_dev_s *dev, uint32_t cmd, uint32_t arg)
+static int sdio_sendcmdpoll(FAR struct sdio_dev_s *dev,
+                            uint32_t cmd, uint32_t arg)
 {
   int ret;
 
@@ -115,6 +124,10 @@ int sdio_sendcmdpoll(FAR struct sdio_dev_s *dev, uint32_t cmd, uint32_t arg)
   return ret;
 }
 
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
 int sdio_io_rw_direct(FAR struct sdio_dev_s *dev, bool write,
                       uint8_t function, uint32_t address,
                       uint8_t inb, uint8_t *outb)
@@ -130,11 +143,11 @@ int sdio_io_rw_direct(FAR struct sdio_dev_s *dev, bool write,
 
   if (write)
     {
-      arg.cmd52.write_data       = inb;
+      arg.cmd52.write_data   = inb;
     }
   else
     {
-      arg.cmd52.write_data       = 0;
+      arg.cmd52.write_data   = 0;
     }
 
   arg.cmd52.register_address = address & 0x1ffff;
@@ -144,8 +157,10 @@ int sdio_io_rw_direct(FAR struct sdio_dev_s *dev, bool write,
 
   /* Send CMD52 command */
 
+  SDIO_TAKELOCK(dev);
   sdio_sendcmdpoll(dev, SD_ACMD52, arg.value);
   ret = SDIO_RECVR5(dev, SD_ACMD52, &data);
+  SDIO_GIVELOCK(dev);
 
   if (ret != OK)
     {
@@ -212,6 +227,8 @@ int sdio_io_rw_extended(FAR struct sdio_dev_s *dev, bool write,
       arg.cmd53.byte_block_count = nblocks;
     }
 
+  SDIO_TAKELOCK(dev);
+
   /* Send CMD53 command */
 
   SDIO_BLOCKSETUP(dev, blocklen, nblocks);
@@ -258,6 +275,7 @@ int sdio_io_rw_extended(FAR struct sdio_dev_s *dev, bool write,
   /* There may not be a response to this, so don't look for one */
 
   SDIO_RECVR1(dev, SD_ACMD52ABRT, &data);
+  SDIO_GIVELOCK(dev);
 
   if (ret != OK)
     {
@@ -323,12 +341,14 @@ int sdio_probe(FAR struct sdio_dev_s *dev)
   int ret;
   uint32_t data = 0;
 
+  SDIO_TAKELOCK(dev);
+
   /* Set device state from reset to idle */
 
   ret = sdio_sendcmdpoll(dev, MMCSD_CMD0, 0);
   if (ret != OK)
     {
-      return ret;
+      goto err;
     }
 
   up_mdelay(SDIO_IDLE_DELAY_MS);
@@ -338,7 +358,7 @@ int sdio_probe(FAR struct sdio_dev_s *dev)
   ret = sdio_sendcmdpoll(dev, SDIO_CMD5, 0);
   if (ret != OK)
     {
-      return ret;
+      goto err;
     }
 
   /* Receive R4 response */
@@ -346,7 +366,7 @@ int sdio_probe(FAR struct sdio_dev_s *dev)
   ret = SDIO_RECVR4(dev, SDIO_CMD5, &data);
   if (ret != OK)
     {
-      return ret;
+      goto err;
     }
 
   /* Device is in Card Identification Mode, request device RCA */
@@ -354,14 +374,14 @@ int sdio_probe(FAR struct sdio_dev_s *dev)
   ret = sdio_sendcmdpoll(dev, SD_CMD3, 0);
   if (ret != OK)
     {
-      return ret;
+      goto err;
     }
 
   ret = SDIO_RECVR6(dev, SD_CMD3, &data);
   if (ret != OK)
     {
       wlerr("ERROR: RCA request failed: %d\n", ret);
-      return ret;
+      goto err;
     }
 
   wlinfo("rca is %" PRIx32 "\n", data >> 16);
@@ -374,24 +394,23 @@ int sdio_probe(FAR struct sdio_dev_s *dev)
   if (ret != OK)
     {
       wlerr("ERROR: CMD7 request failed: %d\n", ret);
-      return ret;
+      goto err;
     }
 
   ret = SDIO_RECVR1(dev, MMCSD_CMD7S, &data);
   if (ret != OK)
     {
       wlerr("ERROR: card selection failed: %d\n", ret);
-      return ret;
+      goto err;
     }
 
   /* Configure 4 bits bus width */
 
-  ret = sdio_set_wide_bus(dev);
-  if (ret != OK)
-    {
-      return ret;
-    }
+  SDIO_GIVELOCK(dev);
+  return sdio_set_wide_bus(dev);
 
+err:
+  SDIO_GIVELOCK(dev);
   return OK;
 }
 
diff --git a/include/nuttx/sdio.h b/include/nuttx/sdio.h
index fbf449cb9f..af3f3692be 100644
--- a/include/nuttx/sdio.h
+++ b/include/nuttx/sdio.h
@@ -1044,9 +1044,6 @@ int sdio_enable_function(FAR struct sdio_dev_s *dev, uint8_t function);
 
 int sdio_enable_interrupt(FAR struct sdio_dev_s *dev, uint8_t function);
 
-int sdio_sendcmdpoll(FAR struct sdio_dev_s *dev,
-                     uint32_t cmd, uint32_t arg);
-
 int sdio_io_rw_direct(FAR struct sdio_dev_s *dev, bool write,
                       uint8_t function, uint32_t address,
                       uint8_t inb, uint8_t *outb);