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/nuttx.git

commit a52dc0e7858414bf465415cefd44c93e5cc86363
Author: liaoao <[email protected]>
AuthorDate: Thu Feb 27 15:18:40 2025 +0800

    drivers/rpmsg_port_spi_slave: unbind spictrl when peer shutdown
    
    Unbind the spictrl to close the spi controller, and bind it again
    when peer boots.
    This can help to reduce the leak current caused by the spi gpio.
    
    Signed-off-by: liaoao <[email protected]>
---
 drivers/rpmsg/rpmsg_port_spi_slave.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/rpmsg/rpmsg_port_spi_slave.c 
b/drivers/rpmsg/rpmsg_port_spi_slave.c
index f509b9627d8..d2736010ba2 100644
--- a/drivers/rpmsg/rpmsg_port_spi_slave.c
+++ b/drivers/rpmsg/rpmsg_port_spi_slave.c
@@ -83,6 +83,7 @@ struct rpmsg_port_spi_s
   FAR struct spi_slave_ctrlr_s   *spictrlr;
   struct spi_slave_dev_s         spislv;
   FAR struct ioexpander_dev_s    *ioe;
+  bool                           bound;
 
   /* GPIOs used for handshake */
 
@@ -92,6 +93,7 @@ struct rpmsg_port_spi_s
   /* SPI devices' configuration */
 
   int                            nbits;
+  int                            mode;
 
   /* Reserved for cmd send */
 
@@ -542,6 +544,14 @@ static int rpmsg_port_spi_mreq_handler(FAR struct 
ioexpander_dev_s *dev,
   FAR struct rpmsg_port_spi_s *rpspi = arg;
 
   rpmsginfo("received a mreq\n");
+
+  if (!rpspi->bound)
+    {
+      SPIS_CTRLR_BIND(rpspi->spictrlr, &rpspi->spislv,
+                      rpspi->mode, rpspi->nbits);
+      rpspi->bound = true;
+    }
+
   rpmsg_port_spi_exchange(rpspi);
   return 0;
 }
@@ -612,6 +622,8 @@ rpmsg_port_spi_process_packet(FAR struct rpmsg_port_spi_s 
*rpspi,
         flags = spin_lock_irqsave(&rpspi->lock);
         if (rpspi->state == RPMSG_PORT_SPI_STATE_DISCONNECTING)
           {
+            SPIS_CTRLR_UNBIND(rpspi->spictrlr);
+            rpspi->bound = false;
             rpspi->state = RPMSG_PORT_SPI_STATE_UNCONNECTED;
             spin_unlock_irqrestore(&rpspi->lock, flags);
             IOEXP_WRITEPIN(rpspi->ioe, rpspi->sreq, 0);
@@ -752,7 +764,9 @@ rpmsg_port_spi_init_hardware(FAR struct rpmsg_port_spi_s 
*rpspi,
   rpspi->spictrlr = spictrlr;
   rpspi->spislv.ops = &g_rpmsg_port_spi_slave_ops;
   rpspi->nbits = spicfg->nbits;
+  rpspi->mode = spicfg->mode;
   SPIS_CTRLR_BIND(spictrlr, &rpspi->spislv, spicfg->mode, spicfg->nbits);
+  rpspi->bound = true;
 
   return 0;
 }

Reply via email to