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

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

commit 0123243f9a46f5446b4d10959581322e043a9be9
Author: Abdelatif Guettouche <abdelatif.guettou...@espressif.com>
AuthorDate: Mon Aug 30 11:44:01 2021 +0200

    esp32/esp32_i2c.c: Use device specific locks.
    
    Signed-off-by: Abdelatif Guettouche <abdelatif.guettou...@espressif.com>
---
 arch/xtensa/src/esp32/esp32_i2c.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/arch/xtensa/src/esp32/esp32_i2c.c 
b/arch/xtensa/src/esp32/esp32_i2c.c
index 34d4e8e..e53f058 100644
--- a/arch/xtensa/src/esp32/esp32_i2c.c
+++ b/arch/xtensa/src/esp32/esp32_i2c.c
@@ -41,6 +41,7 @@
 #include <nuttx/irq.h>
 #include <nuttx/clock.h>
 #include <nuttx/semaphore.h>
+#include <nuttx/spinlock.h>
 #include <nuttx/i2c/i2c_master.h>
 
 #include <arch/board/board.h>
@@ -219,6 +220,8 @@ struct esp32_i2c_priv_s
 
   uint32_t clk_freq;           /* Current I2C Clock frequency */
 
+  spinlock_t lock;             /* Device specific lock */
+
   /* I2C trace support */
 
 #ifdef CONFIG_I2C_TRACE
@@ -1172,7 +1175,7 @@ static int esp32_i2c_reset(struct i2c_master_s *dev)
 
   DEBUGASSERT(priv->refs > 0);
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&priv->lock);
 
   esp32_i2c_deinit(priv);
 
@@ -1185,7 +1188,7 @@ static int esp32_i2c_reset(struct i2c_master_s *dev)
   priv->bytes = 0;
   priv->ready_read = 0;
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&priv->lock, flags);
 
   return OK;
 }
@@ -1428,7 +1431,7 @@ static inline void esp32_i2c_process(struct 
esp32_i2c_priv_s *priv,
       esp32_i2c_traceevent(priv, I2CEVENT_ERROR, priv->error,
                            esp32_i2c_get_reg(priv, I2C_SR_OFFSET));
       esp32_i2c_set_reg(priv, I2C_INT_ENA_OFFSET, 0);
-#ifndef CONFIG_I2C_POLLED      
+#ifndef CONFIG_I2C_POLLED
       nxsem_post(&priv->sem_isr);
 #endif
     }
@@ -1553,11 +1556,11 @@ struct i2c_master_s *esp32_i2cbus_initialize(int port)
       return NULL;
     }
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&priv->lock);
 
   if ((volatile int)priv->refs++ != 0)
     {
-      leave_critical_section(flags);
+      spin_unlock_irqrestore(&priv->lock, flags);
 
       return (struct i2c_master_s *)priv;
     }
@@ -1574,7 +1577,7 @@ struct i2c_master_s *esp32_i2cbus_initialize(int port)
     {
       /* Failed to allocate a CPU interrupt of this type */
 
-      leave_critical_section(flags);
+      spin_unlock_irqrestore(&priv->lock, flags);
 
       return NULL;
     }
@@ -1584,7 +1587,7 @@ struct i2c_master_s *esp32_i2cbus_initialize(int port)
     {
       esp32_teardown_irq(priv->cpu, config->periph, priv->cpuint);
 
-      leave_critical_section(flags);
+      spin_unlock_irqrestore(&priv->lock, flags);
 
       return NULL;
     }
@@ -1596,7 +1599,7 @@ struct i2c_master_s *esp32_i2cbus_initialize(int port)
 
   esp32_i2c_init(priv);
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&priv->lock, flags);
 
   return (struct i2c_master_s *)priv;
 }
@@ -1621,15 +1624,15 @@ int esp32_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&priv->lock);
 
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      spin_unlock_irqrestore(&priv->lock, flags);
       return OK;
     }
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&priv->lock, flags);
 
 #ifndef CONFIG_I2C_POLLED
   up_disable_irq(priv->config->irq);

Reply via email to