arch/nrf52/nrf53/nrf91: allow zero-length I2C transfers
Some checks are pending
Build Documentation / build-html (push) Waiting to run
MemBrowse Memory Report / changes-filter (push) Waiting to run
MemBrowse Memory Report / load-targets (push) Waiting to run
MemBrowse Memory Report / identical (push) Blocked by required conditions
MemBrowse Memory Report / analyze (push) Blocked by required conditions

Allow zero-length I2C transfers when DEBUGASSERT is enabled.

Zero-length transfers (used for I2C bus scanning) never access the
transfer buffer, so any EasyDMA pointer is valid.

Signed-off-by: raiden00pl <raiden00@railab.me>
Assisted-by: Claude Code
This commit is contained in:
raiden00pl 2026-07-14 20:00:42 +02:00 committed by Xiang Xiao
parent 659f47a824
commit 461e3fd362
3 changed files with 24 additions and 12 deletions

View file

@ -358,10 +358,12 @@ static int nrf52_i2c_transfer(struct i2c_master_s *dev,
}
#endif
/* Write TXD data pointer */
/* Write TXD data pointer. Zero-length transfers (used for bus
* scanning) never access the buffer, so any pointer is valid.
*/
regval = (uint32_t)priv->ptr;
DEBUGASSERT(nrf52_easydma_valid(regval));
DEBUGASSERT(priv->dcnt == 0 || nrf52_easydma_valid(regval));
nrf52_i2c_putreg(priv, NRF52_TWIM_TXDPTR_OFFSET, regval);
/* Write number of bytes in TXD buffer */
@ -380,10 +382,12 @@ static int nrf52_i2c_transfer(struct i2c_master_s *dev,
}
else
{
/* Write RXD data pointer */
/* Write RXD data pointer. Zero-length transfers (used for bus
* scanning) never access the buffer, so any pointer is valid.
*/
regval = (uint32_t)priv->ptr;
DEBUGASSERT(nrf52_easydma_valid(regval));
DEBUGASSERT(priv->dcnt == 0 || nrf52_easydma_valid(regval));
nrf52_i2c_putreg(priv, NRF52_TWIM_RXDPTR_OFFSET, regval);
/* Write number of bytes in RXD buffer */

View file

@ -408,10 +408,12 @@ static int nrf53_i2c_transfer(struct i2c_master_s *dev,
}
#endif
/* Write TXD data pointer */
/* Write TXD data pointer. Zero-length transfers (used for bus
* scanning) never access the buffer, so any pointer is valid.
*/
regval = (uint32_t)priv->ptr;
DEBUGASSERT(nrf53_easydma_valid(regval));
DEBUGASSERT(priv->dcnt == 0 || nrf53_easydma_valid(regval));
nrf53_i2c_putreg(priv, NRF53_TWIM_TXDPTR_OFFSET, regval);
/* Write number of bytes in TXD buffer */
@ -430,10 +432,12 @@ static int nrf53_i2c_transfer(struct i2c_master_s *dev,
}
else
{
/* Write RXD data pointer */
/* Write RXD data pointer. Zero-length transfers (used for bus
* scanning) never access the buffer, so any pointer is valid.
*/
regval = (uint32_t)priv->ptr;
DEBUGASSERT(nrf53_easydma_valid(regval));
DEBUGASSERT(priv->dcnt == 0 || nrf53_easydma_valid(regval));
nrf53_i2c_putreg(priv, NRF53_TWIM_RXDPTR_OFFSET, regval);
/* Write number of bytes in RXD buffer */

View file

@ -408,10 +408,12 @@ static int nrf91_i2c_transfer(struct i2c_master_s *dev,
}
#endif
/* Write TXD data pointer */
/* Write TXD data pointer. Zero-length transfers (used for bus
* scanning) never access the buffer, so any pointer is valid.
*/
regval = (uint32_t)priv->ptr;
DEBUGASSERT(nrf91_easydma_valid(regval));
DEBUGASSERT(priv->dcnt == 0 || nrf91_easydma_valid(regval));
nrf91_i2c_putreg(priv, NRF91_TWIM_TXDPTR_OFFSET, regval);
/* Write number of bytes in TXD buffer */
@ -430,10 +432,12 @@ static int nrf91_i2c_transfer(struct i2c_master_s *dev,
}
else
{
/* Write RXD data pointer */
/* Write RXD data pointer. Zero-length transfers (used for bus
* scanning) never access the buffer, so any pointer is valid.
*/
regval = (uint32_t)priv->ptr;
DEBUGASSERT(nrf91_easydma_valid(regval));
DEBUGASSERT(priv->dcnt == 0 || nrf91_easydma_valid(regval));
nrf91_i2c_putreg(priv, NRF91_TWIM_RXDPTR_OFFSET, regval);
/* Write number of bytes in RXD buffer */