drivers: handle I2C_TRANSFER return value consistently. Some I2C peripherals transfers return zero on success, others number of completed transfers. Make drivers robust against this.

This commit is contained in:
Juha Niskanen
2017-08-04 07:31:36 -06:00
committed by Gregory Nutt
parent 4cc13f8d94
commit 0113b0db95
15 changed files with 68 additions and 38 deletions
+3 -1
View File
@@ -71,6 +71,7 @@ int i2c_read(FAR struct i2c_master_s *dev,
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
unsigned int flags; unsigned int flags;
int ret;
/* 7- or 10-bit? */ /* 7- or 10-bit? */
@@ -86,5 +87,6 @@ int i2c_read(FAR struct i2c_master_s *dev,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(dev, &msg, 1); ret = I2C_TRANSFER(dev, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
+3 -1
View File
@@ -71,6 +71,7 @@ int i2c_write(FAR struct i2c_master_s *dev,
FAR const uint8_t *buffer, int buflen) FAR const uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -82,5 +83,6 @@ int i2c_write(FAR struct i2c_master_s *dev,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(dev, &msg, 1); ret = I2C_TRANSFER(dev, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
+3 -1
View File
@@ -74,6 +74,7 @@ int i2c_writeread(FAR struct i2c_master_s *dev,
{ {
struct i2c_msg_s msg[2]; struct i2c_msg_s msg[2];
unsigned int flags; unsigned int flags;
int ret;
/* 7- or 10-bit address? */ /* 7- or 10-bit address? */
@@ -109,6 +110,7 @@ int i2c_writeread(FAR struct i2c_master_s *dev,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(dev, msg, 2); ret = I2C_TRANSFER(dev, msg, 2);
return (ret >= 0) ? OK : ret;
} }
+1
View File
@@ -1837,6 +1837,7 @@ static int mxt_hwinitialize(FAR struct mxt_dev_s *priv)
if (priv->sample == NULL) if (priv->sample == NULL)
{ {
ierr("ERROR: Failed to allocate object table\n"); ierr("ERROR: Failed to allocate object table\n");
ret = -ENOMEM;
goto errout_with_objtab; goto errout_with_objtab;
} }
+3 -1
View File
@@ -172,6 +172,7 @@ static inline int pca9555_write(FAR struct pca9555_dev_s *pca,
FAR const uint8_t *wbuffer, int wbuflen) FAR const uint8_t *wbuffer, int wbuflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -183,7 +184,8 @@ static inline int pca9555_write(FAR struct pca9555_dev_s *pca,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(pca->i2c, &msg, 1); ret = I2C_TRANSFER(pca->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
+6 -2
View File
@@ -182,6 +182,7 @@ static void pcf8574_lock(FAR struct pcf8574_dev_s *priv)
static int pcf8574_read(FAR struct pcf8574_dev_s *priv, FAR uint8_t *portval) static int pcf8574_read(FAR struct pcf8574_dev_s *priv, FAR uint8_t *portval)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
DEBUGASSERT(priv != NULL && priv->i2c != NULL && priv->config != NULL); DEBUGASSERT(priv != NULL && priv->i2c != NULL && priv->config != NULL);
@@ -195,7 +196,8 @@ static int pcf8574_read(FAR struct pcf8574_dev_s *priv, FAR uint8_t *portval)
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
@@ -212,6 +214,7 @@ static int pcf8574_read(FAR struct pcf8574_dev_s *priv, FAR uint8_t *portval)
static int pcf8574_write(struct pcf8574_dev_s *priv, uint8_t portval) static int pcf8574_write(struct pcf8574_dev_s *priv, uint8_t portval)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
DEBUGASSERT(priv != NULL && priv->i2c != NULL && priv->config != NULL); DEBUGASSERT(priv != NULL && priv->i2c != NULL && priv->config != NULL);
@@ -225,7 +228,8 @@ static int pcf8574_write(struct pcf8574_dev_s *priv, uint8_t portval)
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
+4 -4
View File
@@ -342,14 +342,14 @@ static int tca64_getreg(FAR struct tca64_dev_s *priv, uint8_t regaddr,
{ {
gpioerr("ERROR: I2C addr=%02x regaddr=%02x: failed, ret=%d!\n", gpioerr("ERROR: I2C addr=%02x regaddr=%02x: failed, ret=%d!\n",
priv->config->address, regaddr, ret); priv->config->address, regaddr, ret);
return ret;
} }
else else
{ {
gpioinfo("I2C addr=%02x regaddr=%02x: read %02x\n", gpioinfo("I2C addr=%02x regaddr=%02x: read %02x\n",
priv->config->address, regaddr, *regval); priv->config->address, regaddr, *regval);
return OK;
} }
return ret;
} }
/**************************************************************************** /****************************************************************************
@@ -390,14 +390,14 @@ static int tca64_putreg(struct tca64_dev_s *priv, uint8_t regaddr,
{ {
gpioerr("ERROR: claddr=%02x, regaddr=%02x: failed, ret=%d!\n", gpioerr("ERROR: claddr=%02x, regaddr=%02x: failed, ret=%d!\n",
priv->config->address, regaddr, ret); priv->config->address, regaddr, ret);
return ret;
} }
else else
{ {
gpioinfo("claddr=%02x, regaddr=%02x, regval=%02x\n", gpioinfo("claddr=%02x, regaddr=%02x, regval=%02x\n",
priv->config->address, regaddr, regval); priv->config->address, regaddr, regval);
return OK;
} }
return ret;
} }
/**************************************************************************** /****************************************************************************
+11 -8
View File
@@ -551,12 +551,16 @@ static ssize_t lis2dh_write(FAR struct file *filep, FAR const char *buffer,
static int lis2dh_ioctl(FAR struct file *filep, int cmd, unsigned long arg) static int lis2dh_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{ {
FAR struct inode *inode = filep->f_inode; FAR struct inode *inode;
FAR struct lis2dh_dev_s *priv = inode->i_private; FAR struct lis2dh_dev_s *priv;
int ret; int ret;
uint8_t buf; uint8_t buf;
DEBUGASSERT(filep != NULL); DEBUGASSERT(filep);
inode = filep->f_inode;
DEBUGASSERT(inode && inode->i_private);
priv = (FAR struct lis2dh_dev_s *)inode->i_private;
ret = sem_wait(&priv->devsem); ret = sem_wait(&priv->devsem);
if (ret < 0) if (ret < 0)
@@ -564,17 +568,16 @@ static int lis2dh_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
return -EINTR; return -EINTR;
} }
ret = OK;
switch (cmd) switch (cmd)
{ {
case SNIOC_WRITESETUP: case SNIOC_WRITESETUP:
{ {
/* Write to the configuration registers. Arg: uint8_t value */ /* Write to the configuration registers. */
ret = lis2dh_setup(priv, (struct lis2dh_setup *)arg); ret = lis2dh_setup(priv, (struct lis2dh_setup *)arg);
lis2dh_dbg("lis2dh: conf: %02x ret: %d\n", *(uint8_t*)arg, ret); lis2dh_dbg("lis2dh: conf: %p ret: %d\n", (struct lis2dh_setup *)arg, ret);
/* Make sure interrupt will get cleared (by reading this register) in /* Make sure interrupt will get cleared in
* case of latched configuration. * case of latched configuration.
*/ */
@@ -1614,7 +1617,7 @@ static int lis2dh_access(FAR struct lis2dh_dev_s *dev, uint8_t subaddr,
}; };
retval = I2C_TRANSFER(dev->i2c, msgv, 2); retval = I2C_TRANSFER(dev->i2c, msgv, 2);
if (retval == OK) if (retval >= 0)
{ {
return length; return length;
} }
+3 -2
View File
@@ -125,7 +125,7 @@ struct lis331dl_dev_s
* of -length * of -length
* *
* Returned Value: * Returned Value:
* Returns OK on success or errno is set. * Returns actual length of data on success or negative value on error.
* *
****************************************************************************/ ****************************************************************************/
@@ -206,7 +206,8 @@ static int lis331dl_access(FAR struct lis331dl_dev_s *dev, uint8_t subaddr,
} }
}; };
if ((retval = I2C_TRANSFER(dev->i2c, msgv, 2)) == OK) retval = I2C_TRANSFER(dev->i2c, msgv, 2);
if (retval >= 0)
{ {
return length; return length;
} }
+6 -2
View File
@@ -137,6 +137,7 @@ static int lm75_i2c_write(FAR struct lm75_dev_s *priv,
FAR const uint8_t *buffer, int buflen) FAR const uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -148,7 +149,8 @@ static int lm75_i2c_write(FAR struct lm75_dev_s *priv,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
@@ -163,6 +165,7 @@ static int lm75_i2c_read(FAR struct lm75_dev_s *priv,
FAR uint8_t *buffer, int buflen) FAR uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -174,7 +177,8 @@ static int lm75_i2c_read(FAR struct lm75_dev_s *priv,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
+6 -2
View File
@@ -139,6 +139,7 @@ static int lm92_i2c_write(FAR struct lm92_dev_s *priv,
FAR const uint8_t *buffer, int buflen) FAR const uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -150,7 +151,8 @@ static int lm92_i2c_write(FAR struct lm92_dev_s *priv,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
@@ -165,6 +167,7 @@ static int lm92_i2c_read(FAR struct lm92_dev_s *priv,
FAR uint8_t *buffer, int buflen) FAR uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -176,7 +179,8 @@ static int lm92_i2c_read(FAR struct lm92_dev_s *priv,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
+6 -2
View File
@@ -253,6 +253,7 @@ static int ms58xx_i2c_write(FAR struct ms58xx_dev_s *priv,
FAR const uint8_t *buffer, int buflen) FAR const uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -264,7 +265,8 @@ static int ms58xx_i2c_write(FAR struct ms58xx_dev_s *priv,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
@@ -279,6 +281,7 @@ static int ms58xx_i2c_read(FAR struct ms58xx_dev_s *priv,
FAR uint8_t *buffer, int buflen) FAR uint8_t *buffer, int buflen)
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
int ret;
/* Setup for the transfer */ /* Setup for the transfer */
@@ -290,7 +293,8 @@ static int ms58xx_i2c_read(FAR struct ms58xx_dev_s *priv,
/* Then perform the transfer. */ /* Then perform the transfer. */
return I2C_TRANSFER(priv->i2c, &msg, 1); ret = I2C_TRANSFER(priv->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
-3
View File
@@ -151,7 +151,6 @@ config RTC_DSXXXX
bool "DS130x/DS323x RTC Driver" bool "DS130x/DS323x RTC Driver"
default n default n
select I2C select I2C
select I2C_TRANSFER
select RTC_DATETIME select RTC_DATETIME
depends on RTC_EXTERNAL depends on RTC_EXTERNAL
---help--- ---help---
@@ -204,7 +203,6 @@ config RTC_PCF85263
bool "PCF85263 RTC Driver" bool "PCF85263 RTC Driver"
default n default n
select I2C select I2C
select I2C_TRANSFER
select RTC_DATETIME select RTC_DATETIME
depends on RTC_EXTERNAL depends on RTC_EXTERNAL
---help--- ---help---
@@ -239,7 +237,6 @@ endif # WATCHDOG
config TIMERS_CS2100CP config TIMERS_CS2100CP
bool "CS2100-CP Fraction-N Clock Multiplier" bool "CS2100-CP Fraction-N Clock Multiplier"
depends on I2C depends on I2C
select I2C_TRANSFER
if TIMERS_CS2100CP if TIMERS_CS2100CP
+12 -8
View File
@@ -120,6 +120,7 @@ static int cs2100_write_reg(FAR const struct cs2100_config_s *config,
uint8_t regaddr, uint8_t regval) uint8_t regaddr, uint8_t regval)
{ {
struct i2c_msg_s msgs[2]; struct i2c_msg_s msgs[2];
int ret;
reginfo("%02x<-%02x\n", regaddr, regval); reginfo("%02x<-%02x\n", regaddr, regval);
DEBUGASSERT(config->i2c->ops && config->i2c->ops->transfer); DEBUGASSERT(config->i2c->ops && config->i2c->ops->transfer);
@@ -140,7 +141,8 @@ static int cs2100_write_reg(FAR const struct cs2100_config_s *config,
/* Send the message */ /* Send the message */
return I2C_TRANSFER(config->i2c, msgs, 2); ret = I2C_TRANSFER(config->i2c, msgs, 2);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
@@ -179,7 +181,7 @@ static int cs2100_read_reg(FAR const struct cs2100_config_s *config,
/* Send the address followed by a STOP */ /* Send the address followed by a STOP */
ret = I2C_TRANSFER(config->i2c, &msg, 1); ret = I2C_TRANSFER(config->i2c, &msg, 1);
if (ret == OK) if (ret >= 0)
{ {
msg.frequency = config->i2cfreq; msg.frequency = config->i2cfreq;
msg.addr = config->i2caddr; msg.addr = config->i2caddr;
@@ -190,13 +192,13 @@ static int cs2100_read_reg(FAR const struct cs2100_config_s *config,
/* Read the register beginning with another START */ /* Read the register beginning with another START */
ret = I2C_TRANSFER(config->i2c, &msg, 1); ret = I2C_TRANSFER(config->i2c, &msg, 1);
if (ret == OK) if (ret >= 0)
{ {
reginfo("%02x->%02x\n", regaddr, *regval); reginfo("%02x->%02x\n", regaddr, *regval);
} }
} }
return ret; return (ret >= 0) ? OK : ret;
} }
#endif #endif
@@ -220,6 +222,7 @@ static int cs2100_write_ratio(FAR const struct cs2100_config_s *config,
{ {
struct i2c_msg_s msg; struct i2c_msg_s msg;
uint8_t buffer[5]; uint8_t buffer[5];
int ret;
reginfo("%02x<-%04l\n", CS2100_RATIO0, (unsigned long)ratio); reginfo("%02x<-%04l\n", CS2100_RATIO0, (unsigned long)ratio);
DEBUGASSERT(config->i2c->ops && config->i2c->ops->transfer); DEBUGASSERT(config->i2c->ops && config->i2c->ops->transfer);
@@ -240,7 +243,8 @@ static int cs2100_write_ratio(FAR const struct cs2100_config_s *config,
/* Send the message */ /* Send the message */
return I2C_TRANSFER(config->i2c, &msg, 1); ret = I2C_TRANSFER(config->i2c, &msg, 1);
return (ret >= 0) ? OK : ret;
} }
/**************************************************************************** /****************************************************************************
@@ -281,7 +285,7 @@ static int cs2100_read_ratio(FAR const struct cs2100_config_s *config,
/* Send the address followed by a STOP */ /* Send the address followed by a STOP */
ret = I2C_TRANSFER(config->i2c, &msg, 1); ret = I2C_TRANSFER(config->i2c, &msg, 1);
if (ret == OK) if (ret >= 0)
{ {
msg.frequency = config->i2cfreq; msg.frequency = config->i2cfreq;
msg.addr = config->i2caddr; msg.addr = config->i2caddr;
@@ -295,7 +299,7 @@ static int cs2100_read_ratio(FAR const struct cs2100_config_s *config,
/* Return the ratio */ /* Return the ratio */
if (ret == OK) if (ret >= 0)
{ {
*ratio = ((uint32_t)buffer[0] << 24) | *ratio = ((uint32_t)buffer[0] << 24) |
((uint32_t)buffer[1] << 16) | ((uint32_t)buffer[1] << 16) |
@@ -306,7 +310,7 @@ static int cs2100_read_ratio(FAR const struct cs2100_config_s *config,
} }
} }
return ret; return (ret >= 0) ? OK : ret;
} }
#endif #endif
+1 -1
View File
@@ -167,7 +167,7 @@ static int fusb301_getreg(FAR struct fusb301_dev_s *priv, uint8_t reg)
for (retries = 0; retries < FUSB301_I2C_RETRIES; retries++) for (retries = 0; retries < FUSB301_I2C_RETRIES; retries++)
{ {
ret = I2C_TRANSFER(priv->i2c, msg, 2); ret = I2C_TRANSFER(priv->i2c, msg, 2);
if (ret == OK) if (ret >= 0)
{ {
fusb301_info("reg:%02X, value:%02X\n", reg, regval); fusb301_info("reg:%02X, value:%02X\n", reg, regval);
return regval; return regval;