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:
commit
4bffd2c7a3
|
@ -864,7 +864,7 @@ static irqreturn_t kx022a_trigger_handler(int irq, void *p)
|
|||
if (ret < 0)
|
||||
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:
|
||||
iio_trigger_notify_done(idev->trig);
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = {
|
|||
.has_registers = true,
|
||||
.addr_shift = 4,
|
||||
.read_mask = BIT(3),
|
||||
.irq_flags = IRQF_TRIGGER_LOW,
|
||||
.irq_flags = IRQF_TRIGGER_FALLING,
|
||||
};
|
||||
|
||||
static int ad7791_read_raw(struct iio_dev *indio_dev,
|
||||
|
|
|
@ -28,7 +28,6 @@ struct ltc2497_driverdata {
|
|||
struct ltc2497core_driverdata common_ddata;
|
||||
struct i2c_client *client;
|
||||
u32 recv_size;
|
||||
u32 sub_lsb;
|
||||
/*
|
||||
* DMA (thus cache coherency maintenance) may require the
|
||||
* 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.
|
||||
*/
|
||||
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);
|
||||
} 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);
|
||||
}
|
||||
|
||||
|
@ -122,7 +121,6 @@ static int ltc2497_probe(struct i2c_client *client)
|
|||
st->common_ddata.chip_info = chip_info;
|
||||
|
||||
resolution = chip_info->resolution;
|
||||
st->sub_lsb = 31 - (resolution + 1);
|
||||
st->recv_size = BITS_TO_BYTES(resolution) + 1;
|
||||
|
||||
return ltc2497core_probe(dev, indio_dev);
|
||||
|
|
|
@ -414,13 +414,17 @@ static int max11410_sample(struct max11410_state *st, int *sample_raw,
|
|||
if (!ret)
|
||||
return -ETIMEDOUT;
|
||||
} else {
|
||||
int ret2;
|
||||
|
||||
/* Wait for status register Conversion Ready flag */
|
||||
ret = read_poll_timeout(max11410_read_reg, ret,
|
||||
ret || (val & MAX11410_STATUS_CONV_READY_BIT),
|
||||
ret = read_poll_timeout(max11410_read_reg, ret2,
|
||||
ret2 || (val & MAX11410_STATUS_CONV_READY_BIT),
|
||||
5000, MAX11410_CONVERSION_TIMEOUT_MS * 1000,
|
||||
true, st, MAX11410_REG_STATUS, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret2)
|
||||
return ret2;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
int ret, val;
|
||||
int ret, ret2, val;
|
||||
|
||||
ret = max11410_write_reg(st, MAX11410_REG_CAL_START, cal_type);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Wait for status register Calibration Ready flag */
|
||||
return read_poll_timeout(max11410_read_reg, ret,
|
||||
ret || (val & MAX11410_STATUS_CAL_READY_BIT),
|
||||
50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true,
|
||||
st, MAX11410_REG_STATUS, &val);
|
||||
ret = read_poll_timeout(max11410_read_reg, ret2,
|
||||
ret2 || (val & MAX11410_STATUS_CAL_READY_BIT),
|
||||
50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true,
|
||||
st, MAX11410_REG_STATUS, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret2;
|
||||
}
|
||||
|
||||
static int max11410_self_calibrate(struct max11410_state *st)
|
||||
|
|
|
@ -639,7 +639,7 @@ out:
|
|||
|
||||
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);
|
||||
|
||||
if (adc->wakeup1_enable || adc->wakeup2_enable)
|
||||
|
|
|
@ -628,12 +628,20 @@ static int adc5_get_fw_channel_data(struct adc5_chip *adc,
|
|||
struct fwnode_handle *fwnode,
|
||||
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 sid = 0;
|
||||
int ret;
|
||||
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);
|
||||
if (ret) {
|
||||
dev_err(dev, "invalid channel number %s\n", name);
|
||||
|
|
|
@ -634,6 +634,7 @@ static int ti_ads7950_probe(struct spi_device *spi)
|
|||
st->chip.label = dev_name(&st->spi->dev);
|
||||
st->chip.parent = &st->spi->dev;
|
||||
st->chip.owner = THIS_MODULE;
|
||||
st->chip.can_sleep = true;
|
||||
st->chip.base = -1;
|
||||
st->chip.ngpio = TI_ADS7950_NUM_GPIOS;
|
||||
st->chip.get_direction = ti_ads7950_get_direction;
|
||||
|
|
|
@ -66,8 +66,8 @@ static int cio_dac_write_raw(struct iio_dev *indio_dev,
|
|||
if (mask != IIO_CHAN_INFO_RAW)
|
||||
return -EINVAL;
|
||||
|
||||
/* DAC can only accept up to a 16-bit value */
|
||||
if ((unsigned int)val > 65535)
|
||||
/* DAC can only accept up to a 12-bit value */
|
||||
if ((unsigned int)val > 4095)
|
||||
return -EINVAL;
|
||||
|
||||
priv->chan_out_states[chan->channel] = val;
|
||||
|
|
|
@ -47,6 +47,7 @@ config ADIS16480
|
|||
depends on SPI
|
||||
select IIO_ADIS_LIB
|
||||
select IIO_ADIS_LIB_BUFFER if IIO_BUFFER
|
||||
select CRC32
|
||||
help
|
||||
Say yes here to build support for Analog Devices ADIS16375, ADIS16480,
|
||||
ADIS16485, ADIS16488 inertial sensors.
|
||||
|
|
|
@ -203,24 +203,27 @@ static ssize_t iio_buffer_write(struct file *filp, const char __user *buf,
|
|||
break;
|
||||
}
|
||||
|
||||
if (filp->f_flags & O_NONBLOCK) {
|
||||
if (!written)
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
wait_woken(&wait, TASK_INTERRUPTIBLE,
|
||||
MAX_SCHEDULE_TIMEOUT);
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = rb->access->write(rb, n - written, buf + written);
|
||||
if (ret == 0 && (filp->f_flags & O_NONBLOCK))
|
||||
ret = -EAGAIN;
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
if (ret > 0) {
|
||||
written += ret;
|
||||
if (written != n && !(filp->f_flags & O_NONBLOCK))
|
||||
continue;
|
||||
}
|
||||
} while (ret == 0);
|
||||
written += ret;
|
||||
|
||||
} while (written != n);
|
||||
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 = {
|
|||
.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)
|
||||
{
|
||||
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);
|
||||
if (IS_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);
|
||||
|
|
|
@ -208,7 +208,6 @@ static int vcnl4000_init(struct vcnl4000_data *data)
|
|||
|
||||
data->rev = ret & 0xf;
|
||||
data->al_scale = 250000;
|
||||
mutex_init(&data->vcnl4000_lock);
|
||||
|
||||
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->chip_spec = &vcnl4000_chip_spec_cfg[data->id];
|
||||
|
||||
mutex_init(&data->vcnl4000_lock);
|
||||
|
||||
ret = data->chip_spec->init(data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue