1st set of IIO fixes for 6.3

Usual mixed bag:
 
 - core - output buffers
   Fix return of bytes written when only some succeed.
   Fix O_NONBLOCK handling to not block.
 
 - adi,ad7791
   Fix IRQ type.  Not confirmed to have any impact but good to correct it anyway
 
 - adi,adis16400
   Missing CONFIG_CRC32
 
 - capella,cm32181
   Unregister 2nd I2C client if one is used.
 
 - cio-dac
   Fix bitdepth for range check on write.
 
 - linear,ltc2497
   Fix a wrong shift of the LSB introduced when switching to be24 handling.
 
 - maxim,max11410
   Fix handling of return code in read_poll_timeout()
 
 - qcom,spmi-adc
   Fix an accidental change of channel name to include the reg value from OF.
 
 - ti,palmas
   Fix a null dereference on remove due to wrong function used to get the
   drvdata.
 
 - ti,ads7950
   Mark GPIO as can sleep.
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAmQgfMMRHGppYzIzQGtl
 cm5lbC5vcmcACgkQVIU0mcT0FoiFqBAAisoI3rSjyelYy4+EfafRPFzzyGQPhuUk
 UYgjzhXfBVIRvAtjqM/tgWSXoFHEWZznC07Kelz8ErXrDkTEIR10YnqaQ1OoH57c
 58Es93Y0+W5xnHyNuNc36+fAjgSARFDRkD84utu4Q7sxrLDN18f2CpYspC0XAVG5
 4RXXl8W9RXQ+0hcLQIYwXtwl1fdThPqtAOLj4/0awNPdPnsg5ZWrgzK8yfS2IJwz
 M7ilBlkey1K6F+7KhmmGz6IRxsE1zCzAh8AzvIcQYIT5zgYi2xYZg1rAaSCyd4ti
 kR1sieDyWx9sAWunprfC64uCjXvze50lpXxa0CLRK9estrcEyKcAC/ZtVD+5MF9g
 NlD2IrlJ78ol0TrWjK5QKMED0BaNetxO2cCZNBnyX99ESsUJCXHlSyUYkHHt0p3e
 /myd8ap5T8B/6yiqT5uxnZFvxPLmJ17Cm9vtONf0X/H6Dpaf7B+otjjecNiSKV+w
 9careBV3EU0D2upGpkuD4Dfc2H+NJzaAeTbtKjo7mkUgdpluhTlgRYnG/w85z2Tk
 8KSlMcrGUfBbxi4R3WrJkXeHZIRto+YDeH+uzr7BvAHc5nPCY9LGxS9TE/Mosr+A
 ncBIm/yoPItO7G0xDpknVjI0k2ncbo6zwd798VO7Xx1UIvRd4It/FSjXQsHS/wU0
 T2XPtIBpGPM=
 =8wF1
 -----END PGP SIGNATURE-----

Merge tag 'iio-fixes-for-6.3a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-linus

Jonathan writes:

1st set of IIO fixes for 6.3

Usual mixed bag:

- core - output buffers
  Fix return of bytes written when only some succeed.
  Fix O_NONBLOCK handling to not block.

- adi,ad7791
  Fix IRQ type.  Not confirmed to have any impact but good to correct it anyway

- adi,adis16400
  Missing CONFIG_CRC32

- capella,cm32181
  Unregister 2nd I2C client if one is used.

- cio-dac
  Fix bitdepth for range check on write.

- linear,ltc2497
  Fix a wrong shift of the LSB introduced when switching to be24 handling.

- maxim,max11410
  Fix handling of return code in read_poll_timeout()

- qcom,spmi-adc
  Fix an accidental change of channel name to include the reg value from OF.

- ti,palmas
  Fix a null dereference on remove due to wrong function used to get the
  drvdata.

- ti,ads7950
  Mark GPIO as can sleep.

* tag 'iio-fixes-for-6.3a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
  iio: adc: ti-ads7950: Set `can_sleep` flag for GPIO chip
  iio: adc: palmas_gpadc: fix NULL dereference on rmmod
  iio: adc: max11410: fix read_poll_timeout() usage
  iio: dac: cio-dac: Fix max DAC write value check for 12-bit
  iio: light: cm32181: Unregister second I2C client if present
  iio: accel: kionix-kx022a: Get the timestamp from the driver's private data in the trigger_handler
  iio: adc: ad7791: fix IRQ flags
  iio: buffer: make sure O_NONBLOCK is respected
  iio: buffer: correctly return bytes written in output buffers
  iio: light: vcnl4000: Fix WARN_ON on uninitialized lock
  iio: adis16480: select CONFIG_CRC32
  drivers: iio: adc: ltc2497: fix LSB shift
  iio: adc: qcom-spmi-adc5: Fix the channel name
This commit is contained in:
Greg Kroah-Hartman 2023-03-28 13:30:55 +02:00
commit 4bffd2c7a3
12 changed files with 59 additions and 27 deletions

View File

@ -864,7 +864,7 @@ static irqreturn_t kx022a_trigger_handler(int irq, void *p)
if (ret < 0) if (ret < 0)
goto err_read; goto err_read;
iio_push_to_buffers_with_timestamp(idev, data->buffer, pf->timestamp); iio_push_to_buffers_with_timestamp(idev, data->buffer, data->timestamp);
err_read: err_read:
iio_trigger_notify_done(idev->trig); iio_trigger_notify_done(idev->trig);

View File

@ -253,7 +253,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = {
.has_registers = true, .has_registers = true,
.addr_shift = 4, .addr_shift = 4,
.read_mask = BIT(3), .read_mask = BIT(3),
.irq_flags = IRQF_TRIGGER_LOW, .irq_flags = IRQF_TRIGGER_FALLING,
}; };
static int ad7791_read_raw(struct iio_dev *indio_dev, static int ad7791_read_raw(struct iio_dev *indio_dev,

View File

@ -28,7 +28,6 @@ struct ltc2497_driverdata {
struct ltc2497core_driverdata common_ddata; struct ltc2497core_driverdata common_ddata;
struct i2c_client *client; struct i2c_client *client;
u32 recv_size; u32 recv_size;
u32 sub_lsb;
/* /*
* DMA (thus cache coherency maintenance) may require the * DMA (thus cache coherency maintenance) may require the
* transfer buffers to live in their own cache lines. * transfer buffers to live in their own cache lines.
@ -65,10 +64,10 @@ static int ltc2497_result_and_measure(struct ltc2497core_driverdata *ddata,
* equivalent to a sign extension. * equivalent to a sign extension.
*/ */
if (st->recv_size == 3) { if (st->recv_size == 3) {
*val = (get_unaligned_be24(st->data.d8) >> st->sub_lsb) *val = (get_unaligned_be24(st->data.d8) >> 6)
- BIT(ddata->chip_info->resolution + 1); - BIT(ddata->chip_info->resolution + 1);
} else { } else {
*val = (be32_to_cpu(st->data.d32) >> st->sub_lsb) *val = (be32_to_cpu(st->data.d32) >> 6)
- BIT(ddata->chip_info->resolution + 1); - BIT(ddata->chip_info->resolution + 1);
} }
@ -122,7 +121,6 @@ static int ltc2497_probe(struct i2c_client *client)
st->common_ddata.chip_info = chip_info; st->common_ddata.chip_info = chip_info;
resolution = chip_info->resolution; resolution = chip_info->resolution;
st->sub_lsb = 31 - (resolution + 1);
st->recv_size = BITS_TO_BYTES(resolution) + 1; st->recv_size = BITS_TO_BYTES(resolution) + 1;
return ltc2497core_probe(dev, indio_dev); return ltc2497core_probe(dev, indio_dev);

View File

@ -414,13 +414,17 @@ static int max11410_sample(struct max11410_state *st, int *sample_raw,
if (!ret) if (!ret)
return -ETIMEDOUT; return -ETIMEDOUT;
} else { } else {
int ret2;
/* Wait for status register Conversion Ready flag */ /* Wait for status register Conversion Ready flag */
ret = read_poll_timeout(max11410_read_reg, ret, ret = read_poll_timeout(max11410_read_reg, ret2,
ret || (val & MAX11410_STATUS_CONV_READY_BIT), ret2 || (val & MAX11410_STATUS_CONV_READY_BIT),
5000, MAX11410_CONVERSION_TIMEOUT_MS * 1000, 5000, MAX11410_CONVERSION_TIMEOUT_MS * 1000,
true, st, MAX11410_REG_STATUS, &val); true, st, MAX11410_REG_STATUS, &val);
if (ret) if (ret)
return ret; return ret;
if (ret2)
return ret2;
} }
/* Read ADC Data */ /* Read ADC Data */
@ -851,17 +855,21 @@ static int max11410_init_vref(struct device *dev,
static int max11410_calibrate(struct max11410_state *st, u32 cal_type) static int max11410_calibrate(struct max11410_state *st, u32 cal_type)
{ {
int ret, val; int ret, ret2, val;
ret = max11410_write_reg(st, MAX11410_REG_CAL_START, cal_type); ret = max11410_write_reg(st, MAX11410_REG_CAL_START, cal_type);
if (ret) if (ret)
return ret; return ret;
/* Wait for status register Calibration Ready flag */ /* Wait for status register Calibration Ready flag */
return read_poll_timeout(max11410_read_reg, ret, ret = read_poll_timeout(max11410_read_reg, ret2,
ret || (val & MAX11410_STATUS_CAL_READY_BIT), ret2 || (val & MAX11410_STATUS_CAL_READY_BIT),
50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true, 50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true,
st, MAX11410_REG_STATUS, &val); st, MAX11410_REG_STATUS, &val);
if (ret)
return ret;
return ret2;
} }
static int max11410_self_calibrate(struct max11410_state *st) static int max11410_self_calibrate(struct max11410_state *st)

View File

@ -639,7 +639,7 @@ out:
static int palmas_gpadc_remove(struct platform_device *pdev) static int palmas_gpadc_remove(struct platform_device *pdev)
{ {
struct iio_dev *indio_dev = dev_to_iio_dev(&pdev->dev); struct iio_dev *indio_dev = dev_get_drvdata(&pdev->dev);
struct palmas_gpadc *adc = iio_priv(indio_dev); struct palmas_gpadc *adc = iio_priv(indio_dev);
if (adc->wakeup1_enable || adc->wakeup2_enable) if (adc->wakeup1_enable || adc->wakeup2_enable)

View File

@ -628,12 +628,20 @@ static int adc5_get_fw_channel_data(struct adc5_chip *adc,
struct fwnode_handle *fwnode, struct fwnode_handle *fwnode,
const struct adc5_data *data) const struct adc5_data *data)
{ {
const char *name = fwnode_get_name(fwnode), *channel_name; const char *channel_name;
char *name;
u32 chan, value, varr[2]; u32 chan, value, varr[2];
u32 sid = 0; u32 sid = 0;
int ret; int ret;
struct device *dev = adc->dev; struct device *dev = adc->dev;
name = devm_kasprintf(dev, GFP_KERNEL, "%pfwP", fwnode);
if (!name)
return -ENOMEM;
/* Cut the address part */
name[strchrnul(name, '@') - name] = '\0';
ret = fwnode_property_read_u32(fwnode, "reg", &chan); ret = fwnode_property_read_u32(fwnode, "reg", &chan);
if (ret) { if (ret) {
dev_err(dev, "invalid channel number %s\n", name); dev_err(dev, "invalid channel number %s\n", name);

View File

@ -634,6 +634,7 @@ static int ti_ads7950_probe(struct spi_device *spi)
st->chip.label = dev_name(&st->spi->dev); st->chip.label = dev_name(&st->spi->dev);
st->chip.parent = &st->spi->dev; st->chip.parent = &st->spi->dev;
st->chip.owner = THIS_MODULE; st->chip.owner = THIS_MODULE;
st->chip.can_sleep = true;
st->chip.base = -1; st->chip.base = -1;
st->chip.ngpio = TI_ADS7950_NUM_GPIOS; st->chip.ngpio = TI_ADS7950_NUM_GPIOS;
st->chip.get_direction = ti_ads7950_get_direction; st->chip.get_direction = ti_ads7950_get_direction;

View File

@ -66,8 +66,8 @@ static int cio_dac_write_raw(struct iio_dev *indio_dev,
if (mask != IIO_CHAN_INFO_RAW) if (mask != IIO_CHAN_INFO_RAW)
return -EINVAL; return -EINVAL;
/* DAC can only accept up to a 16-bit value */ /* DAC can only accept up to a 12-bit value */
if ((unsigned int)val > 65535) if ((unsigned int)val > 4095)
return -EINVAL; return -EINVAL;
priv->chan_out_states[chan->channel] = val; priv->chan_out_states[chan->channel] = val;

View File

@ -47,6 +47,7 @@ config ADIS16480
depends on SPI depends on SPI
select IIO_ADIS_LIB select IIO_ADIS_LIB
select IIO_ADIS_LIB_BUFFER if IIO_BUFFER select IIO_ADIS_LIB_BUFFER if IIO_BUFFER
select CRC32
help help
Say yes here to build support for Analog Devices ADIS16375, ADIS16480, Say yes here to build support for Analog Devices ADIS16375, ADIS16480,
ADIS16485, ADIS16488 inertial sensors. ADIS16485, ADIS16488 inertial sensors.

View File

@ -203,24 +203,27 @@ static ssize_t iio_buffer_write(struct file *filp, const char __user *buf,
break; break;
} }
if (filp->f_flags & O_NONBLOCK) {
if (!written)
ret = -EAGAIN;
break;
}
wait_woken(&wait, TASK_INTERRUPTIBLE, wait_woken(&wait, TASK_INTERRUPTIBLE,
MAX_SCHEDULE_TIMEOUT); MAX_SCHEDULE_TIMEOUT);
continue; continue;
} }
ret = rb->access->write(rb, n - written, buf + written); ret = rb->access->write(rb, n - written, buf + written);
if (ret == 0 && (filp->f_flags & O_NONBLOCK)) if (ret < 0)
ret = -EAGAIN; break;
if (ret > 0) { written += ret;
written += ret;
if (written != n && !(filp->f_flags & O_NONBLOCK)) } while (written != n);
continue;
}
} while (ret == 0);
remove_wait_queue(&rb->pollq, &wait); remove_wait_queue(&rb->pollq, &wait);
return ret < 0 ? ret : n; return ret < 0 ? ret : written;
} }
/** /**

View File

@ -429,6 +429,14 @@ static const struct iio_info cm32181_info = {
.attrs = &cm32181_attribute_group, .attrs = &cm32181_attribute_group,
}; };
static void cm32181_unregister_dummy_client(void *data)
{
struct i2c_client *client = data;
/* Unregister the dummy client */
i2c_unregister_device(client);
}
static int cm32181_probe(struct i2c_client *client) static int cm32181_probe(struct i2c_client *client)
{ {
struct device *dev = &client->dev; struct device *dev = &client->dev;
@ -460,6 +468,10 @@ static int cm32181_probe(struct i2c_client *client)
client = i2c_acpi_new_device(dev, 1, &board_info); client = i2c_acpi_new_device(dev, 1, &board_info);
if (IS_ERR(client)) if (IS_ERR(client))
return PTR_ERR(client); return PTR_ERR(client);
ret = devm_add_action_or_reset(dev, cm32181_unregister_dummy_client, client);
if (ret)
return ret;
} }
cm32181 = iio_priv(indio_dev); cm32181 = iio_priv(indio_dev);

View File

@ -208,7 +208,6 @@ static int vcnl4000_init(struct vcnl4000_data *data)
data->rev = ret & 0xf; data->rev = ret & 0xf;
data->al_scale = 250000; data->al_scale = 250000;
mutex_init(&data->vcnl4000_lock);
return data->chip_spec->set_power_state(data, true); return data->chip_spec->set_power_state(data, true);
}; };
@ -1367,6 +1366,8 @@ static int vcnl4000_probe(struct i2c_client *client)
data->id = id->driver_data; data->id = id->driver_data;
data->chip_spec = &vcnl4000_chip_spec_cfg[data->id]; data->chip_spec = &vcnl4000_chip_spec_cfg[data->id];
mutex_init(&data->vcnl4000_lock);
ret = data->chip_spec->init(data); ret = data->chip_spec->init(data);
if (ret < 0) if (ret < 0)
return ret; return ret;