On Mon, Apr 19, 2021 at 2:36 PM Tomas Melin <tomas.melin@xxxxxxxxxxx> wrote:
On 4/19/21 2:14 PM, Andy Shevchenko wrote:In such cases I would recommend introducing your own error space (with
On Mon, Apr 19, 2021 at 1:29 PM Tomas Melin <tomas.melin@xxxxxxxxxxx> wrote:I was referring to this:
On 4/17/21 3:39 PM, Andy Shevchenko wrote:...
On Fri, Apr 16, 2021 at 5:21 PM Tomas Melin <tomas.melin@xxxxxxxxxxx> wrote:
Add initial support for Murata SCA3300 3-axis industrial
accelerometer with digital SPI interface. This device also
provides a temperature measurement.
Care to show what kind of testing requires this?Returning EIO here to have full control over the return value from this+ ret = spi_sync_transfer(sca_data->spi, xfers, ARRAY_SIZE(xfers));Why shadowing error code?
+ if (ret < 0) {
+ dev_err(&sca_data->spi->dev,
+ "transfer error, error: %d\n", ret);
+ return -EIO;
function. As return value of this is used for testing
Also why can't it be refactored to accept all error codes?
+static int sca3300_read_reg(struct sca3300_data *sca_data, u8 reg, int *val)
+{
+ int ret;
+
+ mutex_lock(&sca_data->lock);
+ sca_data->txbuf[0] = 0x0 | (reg << 2);
+ ret = sca3300_transfer(sca_data, val);
+ mutex_unlock(&sca_data->lock);
+ if (ret == -EINVAL)
+ ret = sca3300_error_handler(sca_data);
+
+ return ret;
+}
+
+static int sca3300_write_reg(struct sca3300_data *sca_data, u8 reg, int val)
+{
+ int reg_val = 0;
+ int ret;
+
+ mutex_lock(&sca_data->lock);
+ sca_data->txbuf[0] = BIT(7) | (reg << 2);
+ put_unaligned_be16(val, &sca_data->txbuf[1]);
+ ret = sca3300_transfer(sca_data, ®_val);
+ mutex_unlock(&sca_data->lock);
+ if (ret == -EINVAL)
+ ret = sca3300_error_handler(sca_data);
+
+ return ret;
+}
So this goes into error handling only when transfer indicates EINVAL
(which happens when
transfer otherwise is good, but device return status has error flags set
i message).
positive numbers) or playing around with the number of transfers (but
this usually works only if you anticipate several of them in a row).
Something like
#define SCA3300_ERROR_FLAGS 1
...
if (ret > 0)
return error_handler(..., ret); // ret in case if you want to
convert the code to something in Linux error code space.
for possible status error (EINVAL), feels more confident to have it like
this to avoid any confusion. And atleast spi_sync_transfer() return value
would be visible in error message.
+ }