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; }
