Commit 4bffd2c7 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'iio-fixes-for-6.3a' of...

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
parents 4dd52392 363c7dc7
...@@ -864,7 +864,7 @@ static irqreturn_t kx022a_trigger_handler(int irq, void *p) ...@@ -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);
......
...@@ -253,7 +253,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = { ...@@ -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,
......
...@@ -28,7 +28,6 @@ struct ltc2497_driverdata { ...@@ -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, ...@@ -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) ...@@ -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);
......
...@@ -414,13 +414,17 @@ static int max11410_sample(struct max11410_state *st, int *sample_raw, ...@@ -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, ...@@ -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)
......
...@@ -639,7 +639,7 @@ static int palmas_gpadc_probe(struct platform_device *pdev) ...@@ -639,7 +639,7 @@ static int palmas_gpadc_probe(struct platform_device *pdev)
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)
......
...@@ -628,12 +628,20 @@ static int adc5_get_fw_channel_data(struct adc5_chip *adc, ...@@ -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);
......
...@@ -634,6 +634,7 @@ static int ti_ads7950_probe(struct spi_device *spi) ...@@ -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;
......
...@@ -66,8 +66,8 @@ static int cio_dac_write_raw(struct iio_dev *indio_dev, ...@@ -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;
......
...@@ -47,6 +47,7 @@ config ADIS16480 ...@@ -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.
......
...@@ -203,24 +203,27 @@ static ssize_t iio_buffer_write(struct file *filp, const char __user *buf, ...@@ -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;
} }
/** /**
......
...@@ -429,6 +429,14 @@ static const struct iio_info cm32181_info = { ...@@ -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) ...@@ -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);
......
...@@ -208,7 +208,6 @@ static int vcnl4000_init(struct vcnl4000_data *data) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment