First set of IIO fixes in the 5.6 cycle.
* adxl372 - Fix marking of buffered values as big endian. * ak8974 - Fix wrong handling of negative values when read from sysfs. * at91-sama5d2 - Fix differential mode by ensuring configuration set correctly. * ping - Use the write sensor type for of_ping_match table. * sps30 - Kconfig build dependency fix. * st-sensors - Fix a wrong identification of which part the SMO8840 ACPI ID indicates. * stm32-dsfdm - Fix a sleep in atomic issue by not using a trigger when it makes no sense. * stm32-timer - Make sure master mode is disabled when stopping. * vcnl400 - Update some sampling periods based on new docs. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAl5lHRwRHGppYzIzQGtl cm5lbC5vcmcACgkQVIU0mcT0FohvfBAAnKMExW+zKhI1lyTnJQNQhed+0VfNMW7t 23VsgNQ0jLpS9eX7+1ztHhO34wP92EcvUq5p4URwEFqtQC4Ofbrm/wcYunLkmkSJ +q1KG62jTUpQjj56iHb6OPfULEL5rdkbU+csDlrxPMk22PlWNwfCZ5mJmBJZnjDL Jlf1ihh/3HcxCE8TavihBiryrPlNE+0C1SHWhVz0M/rOaNxOBPCKU0Oi5jf+RvZT lpc9qhUmuM559yV4PzZQrUoJvz2OQirdzHvCtdvTM1/nbRtqoymqqQ7+6Jvhs/Wk tUea6E5PbVV/RWC80Ezid9Z+ejOdPfBjJbEzqBCdtS2rXAhNBDyXgYjuC5h6IvRR sdl15w6bi52uVcPWpYi016KuX7e8dPexNOS7AmxXB4V+VCORrHHlErTSJK+2O6BU 7Eeb89Jq8Azp+/Ecv9WB606/gSkfHlv94t6a+eujhb0WRqvAR0RlsTMXQnVv4tEN T0R/Nv/kS7xgMCsRMKCeX5ZIMEsIrk0b48yk2iGWWvWzOLFiSjSmW82dcGQRW0kM qCIf9FmAIPD0+gCZxxTMrQd+nQ9X98ZbvLPBhLLjjBim/zksxQgknkvg73jGHdZY 1McwlHrx/x1/5VUeScURA2vsTaU0yZSaSNATN3WBZqLGf8aP2GUe9cXJYb5EWoRC eZr607TuOp0= =uJ0W -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-5.6a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: First set of IIO fixes in the 5.6 cycle. * adxl372 - Fix marking of buffered values as big endian. * ak8974 - Fix wrong handling of negative values when read from sysfs. * at91-sama5d2 - Fix differential mode by ensuring configuration set correctly. * ping - Use the write sensor type for of_ping_match table. * sps30 - Kconfig build dependency fix. * st-sensors - Fix a wrong identification of which part the SMO8840 ACPI ID indicates. * stm32-dsfdm - Fix a sleep in atomic issue by not using a trigger when it makes no sense. * stm32-timer - Make sure master mode is disabled when stopping. * vcnl400 - Update some sampling periods based on new docs. * tag 'iio-fixes-for-5.6a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: iio: ping: set pa_laser_ping_cfg in of_ping_match iio: chemical: sps30: fix missing triggered buffer dependency iio: st_sensors: remap SMO8840 to LIS2DH12 iio: light: vcnl4000: update sampling periods for vcnl4040 iio: light: vcnl4000: update sampling periods for vcnl4200 iio: accel: adxl372: Set iio_chan BE iio: magnetometer: ak8974: Fix negative raw values in sysfs iio: trigger: stm32-timer: disable master mode when stopping iio: adc: stm32-dfsdm: fix sleep in atomic context iio: adc: at91-sama5d2_adc: fix differential channels in triggered modealistair/sensors
commit
14800df6a0
|
@ -237,6 +237,7 @@ static const struct adxl372_axis_lookup adxl372_axis_lookup_table[] = {
|
||||||
.realbits = 12, \
|
.realbits = 12, \
|
||||||
.storagebits = 16, \
|
.storagebits = 16, \
|
||||||
.shift = 4, \
|
.shift = 4, \
|
||||||
|
.endianness = IIO_BE, \
|
||||||
}, \
|
}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,7 @@ MODULE_DEVICE_TABLE(of, st_accel_of_match);
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
static const struct acpi_device_id st_accel_acpi_match[] = {
|
static const struct acpi_device_id st_accel_acpi_match[] = {
|
||||||
{"SMO8840", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME},
|
{"SMO8840", (kernel_ulong_t)LIS2DH12_ACCEL_DEV_NAME},
|
||||||
{"SMO8A90", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME},
|
{"SMO8A90", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
|
@ -723,6 +723,7 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
||||||
|
|
||||||
for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) {
|
for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) {
|
||||||
struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit);
|
struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit);
|
||||||
|
u32 cor;
|
||||||
|
|
||||||
if (!chan)
|
if (!chan)
|
||||||
continue;
|
continue;
|
||||||
|
@ -731,6 +732,20 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
||||||
chan->type == IIO_PRESSURE)
|
chan->type == IIO_PRESSURE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (state) {
|
||||||
|
cor = at91_adc_readl(st, AT91_SAMA5D2_COR);
|
||||||
|
|
||||||
|
if (chan->differential)
|
||||||
|
cor |= (BIT(chan->channel) |
|
||||||
|
BIT(chan->channel2)) <<
|
||||||
|
AT91_SAMA5D2_COR_DIFF_OFFSET;
|
||||||
|
else
|
||||||
|
cor &= ~(BIT(chan->channel) <<
|
||||||
|
AT91_SAMA5D2_COR_DIFF_OFFSET);
|
||||||
|
|
||||||
|
at91_adc_writel(st, AT91_SAMA5D2_COR, cor);
|
||||||
|
}
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
at91_adc_writel(st, AT91_SAMA5D2_CHER,
|
at91_adc_writel(st, AT91_SAMA5D2_CHER,
|
||||||
BIT(chan->channel));
|
BIT(chan->channel));
|
||||||
|
|
|
@ -842,31 +842,6 @@ static inline void stm32_dfsdm_process_data(struct stm32_dfsdm_adc *adc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t stm32_dfsdm_adc_trigger_handler(int irq, void *p)
|
|
||||||
{
|
|
||||||
struct iio_poll_func *pf = p;
|
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
|
||||||
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
|
|
||||||
int available = stm32_dfsdm_adc_dma_residue(adc);
|
|
||||||
|
|
||||||
while (available >= indio_dev->scan_bytes) {
|
|
||||||
s32 *buffer = (s32 *)&adc->rx_buf[adc->bufi];
|
|
||||||
|
|
||||||
stm32_dfsdm_process_data(adc, buffer);
|
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer,
|
|
||||||
pf->timestamp);
|
|
||||||
available -= indio_dev->scan_bytes;
|
|
||||||
adc->bufi += indio_dev->scan_bytes;
|
|
||||||
if (adc->bufi >= adc->buf_sz)
|
|
||||||
adc->bufi = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
iio_trigger_notify_done(indio_dev->trig);
|
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void stm32_dfsdm_dma_buffer_done(void *data)
|
static void stm32_dfsdm_dma_buffer_done(void *data)
|
||||||
{
|
{
|
||||||
struct iio_dev *indio_dev = data;
|
struct iio_dev *indio_dev = data;
|
||||||
|
@ -874,11 +849,6 @@ static void stm32_dfsdm_dma_buffer_done(void *data)
|
||||||
int available = stm32_dfsdm_adc_dma_residue(adc);
|
int available = stm32_dfsdm_adc_dma_residue(adc);
|
||||||
size_t old_pos;
|
size_t old_pos;
|
||||||
|
|
||||||
if (indio_dev->currentmode & INDIO_BUFFER_TRIGGERED) {
|
|
||||||
iio_trigger_poll_chained(indio_dev->trig);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: In Kernel interface does not support cyclic DMA buffer,and
|
* FIXME: In Kernel interface does not support cyclic DMA buffer,and
|
||||||
* offers only an interface to push data samples per samples.
|
* offers only an interface to push data samples per samples.
|
||||||
|
@ -906,7 +876,15 @@ static void stm32_dfsdm_dma_buffer_done(void *data)
|
||||||
adc->bufi = 0;
|
adc->bufi = 0;
|
||||||
old_pos = 0;
|
old_pos = 0;
|
||||||
}
|
}
|
||||||
/* regular iio buffer without trigger */
|
/*
|
||||||
|
* In DMA mode the trigger services of IIO are not used
|
||||||
|
* (e.g. no call to iio_trigger_poll).
|
||||||
|
* Calling irq handler associated to the hardware trigger is not
|
||||||
|
* relevant as the conversions have already been done. Data
|
||||||
|
* transfers are performed directly in DMA callback instead.
|
||||||
|
* This implementation avoids to call trigger irq handler that
|
||||||
|
* may sleep, in an atomic context (DMA irq handler context).
|
||||||
|
*/
|
||||||
if (adc->dev_data->type == DFSDM_IIO)
|
if (adc->dev_data->type == DFSDM_IIO)
|
||||||
iio_push_to_buffers(indio_dev, buffer);
|
iio_push_to_buffers(indio_dev, buffer);
|
||||||
}
|
}
|
||||||
|
@ -1536,8 +1514,7 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iio_triggered_buffer_setup(indio_dev,
|
ret = iio_triggered_buffer_setup(indio_dev,
|
||||||
&iio_pollfunc_store_time,
|
&iio_pollfunc_store_time, NULL,
|
||||||
&stm32_dfsdm_adc_trigger_handler,
|
|
||||||
&stm32_dfsdm_buffer_setup_ops);
|
&stm32_dfsdm_buffer_setup_ops);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
stm32_dfsdm_dma_release(indio_dev);
|
stm32_dfsdm_dma_release(indio_dev);
|
||||||
|
|
|
@ -91,6 +91,8 @@ config SPS30
|
||||||
tristate "SPS30 particulate matter sensor"
|
tristate "SPS30 particulate matter sensor"
|
||||||
depends on I2C
|
depends on I2C
|
||||||
select CRC8
|
select CRC8
|
||||||
|
select IIO_BUFFER
|
||||||
|
select IIO_TRIGGERED_BUFFER
|
||||||
help
|
help
|
||||||
Say Y here to build support for the Sensirion SPS30 particulate
|
Say Y here to build support for the Sensirion SPS30 particulate
|
||||||
matter sensor.
|
matter sensor.
|
||||||
|
|
|
@ -167,16 +167,17 @@ static int vcnl4200_init(struct vcnl4000_data *data)
|
||||||
data->vcnl4200_ps.reg = VCNL4200_PS_DATA;
|
data->vcnl4200_ps.reg = VCNL4200_PS_DATA;
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case VCNL4200_PROD_ID:
|
case VCNL4200_PROD_ID:
|
||||||
/* Integration time is 50ms, but the experiments */
|
/* Default wait time is 50ms, add 20% tolerance. */
|
||||||
/* show 54ms in total. */
|
data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000);
|
||||||
data->vcnl4200_al.sampling_rate = ktime_set(0, 54000 * 1000);
|
/* Default wait time is 4.8ms, add 20% tolerance. */
|
||||||
data->vcnl4200_ps.sampling_rate = ktime_set(0, 4200 * 1000);
|
data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000);
|
||||||
data->al_scale = 24000;
|
data->al_scale = 24000;
|
||||||
break;
|
break;
|
||||||
case VCNL4040_PROD_ID:
|
case VCNL4040_PROD_ID:
|
||||||
/* Integration time is 80ms, add 10ms. */
|
/* Default wait time is 80ms, add 20% tolerance. */
|
||||||
data->vcnl4200_al.sampling_rate = ktime_set(0, 100000 * 1000);
|
data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000);
|
||||||
data->vcnl4200_ps.sampling_rate = ktime_set(0, 100000 * 1000);
|
/* Default wait time is 5ms, add 20% tolerance. */
|
||||||
|
data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000);
|
||||||
data->al_scale = 120000;
|
data->al_scale = 120000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -564,7 +564,7 @@ static int ak8974_read_raw(struct iio_dev *indio_dev,
|
||||||
* We read all axes and discard all but one, for optimized
|
* We read all axes and discard all but one, for optimized
|
||||||
* reading, use the triggered buffer.
|
* reading, use the triggered buffer.
|
||||||
*/
|
*/
|
||||||
*val = le16_to_cpu(hw_values[chan->address]);
|
*val = (s16)le16_to_cpu(hw_values[chan->address]);
|
||||||
|
|
||||||
ret = IIO_VAL_INT;
|
ret = IIO_VAL_INT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,7 +269,7 @@ static const struct iio_chan_spec ping_chan_spec[] = {
|
||||||
|
|
||||||
static const struct of_device_id of_ping_match[] = {
|
static const struct of_device_id of_ping_match[] = {
|
||||||
{ .compatible = "parallax,ping", .data = &pa_ping_cfg},
|
{ .compatible = "parallax,ping", .data = &pa_ping_cfg},
|
||||||
{ .compatible = "parallax,laserping", .data = &pa_ping_cfg},
|
{ .compatible = "parallax,laserping", .data = &pa_laser_ping_cfg},
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -161,7 +161,8 @@ static int stm32_timer_start(struct stm32_timer_trigger *priv,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stm32_timer_stop(struct stm32_timer_trigger *priv)
|
static void stm32_timer_stop(struct stm32_timer_trigger *priv,
|
||||||
|
struct iio_trigger *trig)
|
||||||
{
|
{
|
||||||
u32 ccer, cr1;
|
u32 ccer, cr1;
|
||||||
|
|
||||||
|
@ -179,6 +180,12 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv)
|
||||||
regmap_write(priv->regmap, TIM_PSC, 0);
|
regmap_write(priv->regmap, TIM_PSC, 0);
|
||||||
regmap_write(priv->regmap, TIM_ARR, 0);
|
regmap_write(priv->regmap, TIM_ARR, 0);
|
||||||
|
|
||||||
|
/* Force disable master mode */
|
||||||
|
if (stm32_timer_is_trgo2_name(trig->name))
|
||||||
|
regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0);
|
||||||
|
else
|
||||||
|
regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0);
|
||||||
|
|
||||||
/* Make sure that registers are updated */
|
/* Make sure that registers are updated */
|
||||||
regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
|
regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
|
||||||
}
|
}
|
||||||
|
@ -197,7 +204,7 @@ static ssize_t stm32_tt_store_frequency(struct device *dev,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (freq == 0) {
|
if (freq == 0) {
|
||||||
stm32_timer_stop(priv);
|
stm32_timer_stop(priv, trig);
|
||||||
} else {
|
} else {
|
||||||
ret = stm32_timer_start(priv, trig, freq);
|
ret = stm32_timer_start(priv, trig, freq);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
Loading…
Reference in New Issue