Commit 12ec5408 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

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

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

Jonathan writes:

First set of IIO and counter fixes for the 5.12 cycle

adi,ad7949
* Fix a wrong bitmask that could lead to an undefined bit being included.
adi,adi-axi-adc
* Add missing Kconfig dependencies
adi,adis16400
* Wrong error code handling in adis16400 that could lead to failed probe.
hid-sensor-humidity, temperature
* Fix alignment and space for timestamp channel.
hid-sensor-prox
* Fix an issue with handling of exponent on the channel scaling.
invensense,mpu3050
* Fix a hole in error handling.
qcom,spi-vadc
* Correct scaling
st,ab8500-adc
* Fix wrong scaling (by factor of 1000)
st,stm32-adc
* Add missing HAS_IOMEM dependency
st,stm32-timer-cnt
* Report count when running off internal clock
* Fix issue with not checking ceiling before trying to write to hardware
* Ensure driver doesn't have stashed state which doesn't match hardware by
  rereading from hardware in a slow path.

* tag 'iio-fixes-for-5.12a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
  iio: gyro: mpu3050: Fix error handling in mpu3050_trigger_handler
  iio: hid-sensor-temperature: Fix issues of timestamp channel
  iio: hid-sensor-humidity: Fix alignment issue of timestamp channel
  counter: stm32-timer-cnt: fix ceiling miss-alignment with reload register
  counter: stm32-timer-cnt: fix ceiling write max value
  counter: stm32-timer-cnt: Report count function when SLAVE_MODE_DISABLED
  iio: adc: ab8500-gpadc: Fix off by 10 to 3
  iio:adc:stm32-adc: Add HAS_IOMEM dependency
  iio: adis16400: Fix an error code in adis16400_initial_setup()
  iio: adc: adi-axi-adc: add proper Kconfig dependencies
  iio: adc: ad7949: fix wrong ADC result due to incorrect bit mask
  iio: hid-sensor-prox: Fix scale not correct issue
  iio:adc:qcom-spmi-vadc: add default scale to LR_MUX2_BAT_ID channel
parents 1e28eed1 6dbbbe4c
...@@ -31,7 +31,7 @@ struct stm32_timer_cnt { ...@@ -31,7 +31,7 @@ struct stm32_timer_cnt {
struct counter_device counter; struct counter_device counter;
struct regmap *regmap; struct regmap *regmap;
struct clk *clk; struct clk *clk;
u32 ceiling; u32 max_arr;
bool enabled; bool enabled;
struct stm32_timer_regs bak; struct stm32_timer_regs bak;
}; };
...@@ -44,13 +44,14 @@ struct stm32_timer_cnt { ...@@ -44,13 +44,14 @@ struct stm32_timer_cnt {
* @STM32_COUNT_ENCODER_MODE_3: counts on both TI1FP1 and TI2FP2 edges * @STM32_COUNT_ENCODER_MODE_3: counts on both TI1FP1 and TI2FP2 edges
*/ */
enum stm32_count_function { enum stm32_count_function {
STM32_COUNT_SLAVE_MODE_DISABLED = -1, STM32_COUNT_SLAVE_MODE_DISABLED,
STM32_COUNT_ENCODER_MODE_1, STM32_COUNT_ENCODER_MODE_1,
STM32_COUNT_ENCODER_MODE_2, STM32_COUNT_ENCODER_MODE_2,
STM32_COUNT_ENCODER_MODE_3, STM32_COUNT_ENCODER_MODE_3,
}; };
static enum counter_count_function stm32_count_functions[] = { static enum counter_count_function stm32_count_functions[] = {
[STM32_COUNT_SLAVE_MODE_DISABLED] = COUNTER_COUNT_FUNCTION_INCREASE,
[STM32_COUNT_ENCODER_MODE_1] = COUNTER_COUNT_FUNCTION_QUADRATURE_X2_A, [STM32_COUNT_ENCODER_MODE_1] = COUNTER_COUNT_FUNCTION_QUADRATURE_X2_A,
[STM32_COUNT_ENCODER_MODE_2] = COUNTER_COUNT_FUNCTION_QUADRATURE_X2_B, [STM32_COUNT_ENCODER_MODE_2] = COUNTER_COUNT_FUNCTION_QUADRATURE_X2_B,
[STM32_COUNT_ENCODER_MODE_3] = COUNTER_COUNT_FUNCTION_QUADRATURE_X4, [STM32_COUNT_ENCODER_MODE_3] = COUNTER_COUNT_FUNCTION_QUADRATURE_X4,
...@@ -73,8 +74,10 @@ static int stm32_count_write(struct counter_device *counter, ...@@ -73,8 +74,10 @@ static int stm32_count_write(struct counter_device *counter,
const unsigned long val) const unsigned long val)
{ {
struct stm32_timer_cnt *const priv = counter->priv; struct stm32_timer_cnt *const priv = counter->priv;
u32 ceiling;
if (val > priv->ceiling) regmap_read(priv->regmap, TIM_ARR, &ceiling);
if (val > ceiling)
return -EINVAL; return -EINVAL;
return regmap_write(priv->regmap, TIM_CNT, val); return regmap_write(priv->regmap, TIM_CNT, val);
...@@ -90,6 +93,9 @@ static int stm32_count_function_get(struct counter_device *counter, ...@@ -90,6 +93,9 @@ static int stm32_count_function_get(struct counter_device *counter,
regmap_read(priv->regmap, TIM_SMCR, &smcr); regmap_read(priv->regmap, TIM_SMCR, &smcr);
switch (smcr & TIM_SMCR_SMS) { switch (smcr & TIM_SMCR_SMS) {
case 0:
*function = STM32_COUNT_SLAVE_MODE_DISABLED;
return 0;
case 1: case 1:
*function = STM32_COUNT_ENCODER_MODE_1; *function = STM32_COUNT_ENCODER_MODE_1;
return 0; return 0;
...@@ -99,9 +105,9 @@ static int stm32_count_function_get(struct counter_device *counter, ...@@ -99,9 +105,9 @@ static int stm32_count_function_get(struct counter_device *counter,
case 3: case 3:
*function = STM32_COUNT_ENCODER_MODE_3; *function = STM32_COUNT_ENCODER_MODE_3;
return 0; return 0;
} default:
return -EINVAL; return -EINVAL;
}
} }
static int stm32_count_function_set(struct counter_device *counter, static int stm32_count_function_set(struct counter_device *counter,
...@@ -112,6 +118,9 @@ static int stm32_count_function_set(struct counter_device *counter, ...@@ -112,6 +118,9 @@ static int stm32_count_function_set(struct counter_device *counter,
u32 cr1, sms; u32 cr1, sms;
switch (function) { switch (function) {
case STM32_COUNT_SLAVE_MODE_DISABLED:
sms = 0;
break;
case STM32_COUNT_ENCODER_MODE_1: case STM32_COUNT_ENCODER_MODE_1:
sms = 1; sms = 1;
break; break;
...@@ -122,8 +131,7 @@ static int stm32_count_function_set(struct counter_device *counter, ...@@ -122,8 +131,7 @@ static int stm32_count_function_set(struct counter_device *counter,
sms = 3; sms = 3;
break; break;
default: default:
sms = 0; return -EINVAL;
break;
} }
/* Store enable status */ /* Store enable status */
...@@ -131,10 +139,6 @@ static int stm32_count_function_set(struct counter_device *counter, ...@@ -131,10 +139,6 @@ static int stm32_count_function_set(struct counter_device *counter,
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
/* TIMx_ARR register shouldn't be buffered (ARPE=0) */
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
regmap_write(priv->regmap, TIM_ARR, priv->ceiling);
regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, sms); regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, sms);
/* Make sure that registers are updated */ /* Make sure that registers are updated */
...@@ -185,11 +189,13 @@ static ssize_t stm32_count_ceiling_write(struct counter_device *counter, ...@@ -185,11 +189,13 @@ static ssize_t stm32_count_ceiling_write(struct counter_device *counter,
if (ret) if (ret)
return ret; return ret;
if (ceiling > priv->max_arr)
return -ERANGE;
/* TIMx_ARR register shouldn't be buffered (ARPE=0) */ /* TIMx_ARR register shouldn't be buffered (ARPE=0) */
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0); regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
regmap_write(priv->regmap, TIM_ARR, ceiling); regmap_write(priv->regmap, TIM_ARR, ceiling);
priv->ceiling = ceiling;
return len; return len;
} }
...@@ -274,31 +280,36 @@ static int stm32_action_get(struct counter_device *counter, ...@@ -274,31 +280,36 @@ static int stm32_action_get(struct counter_device *counter,
size_t function; size_t function;
int err; int err;
/* Default action mode (e.g. STM32_COUNT_SLAVE_MODE_DISABLED) */
*action = STM32_SYNAPSE_ACTION_NONE;
err = stm32_count_function_get(counter, count, &function); err = stm32_count_function_get(counter, count, &function);
if (err) if (err)
return 0; return err;
switch (function) { switch (function) {
case STM32_COUNT_SLAVE_MODE_DISABLED:
/* counts on internal clock when CEN=1 */
*action = STM32_SYNAPSE_ACTION_NONE;
return 0;
case STM32_COUNT_ENCODER_MODE_1: case STM32_COUNT_ENCODER_MODE_1:
/* counts up/down on TI1FP1 edge depending on TI2FP2 level */ /* counts up/down on TI1FP1 edge depending on TI2FP2 level */
if (synapse->signal->id == count->synapses[0].signal->id) if (synapse->signal->id == count->synapses[0].signal->id)
*action = STM32_SYNAPSE_ACTION_BOTH_EDGES; *action = STM32_SYNAPSE_ACTION_BOTH_EDGES;
break; else
*action = STM32_SYNAPSE_ACTION_NONE;
return 0;
case STM32_COUNT_ENCODER_MODE_2: case STM32_COUNT_ENCODER_MODE_2:
/* counts up/down on TI2FP2 edge depending on TI1FP1 level */ /* counts up/down on TI2FP2 edge depending on TI1FP1 level */
if (synapse->signal->id == count->synapses[1].signal->id) if (synapse->signal->id == count->synapses[1].signal->id)
*action = STM32_SYNAPSE_ACTION_BOTH_EDGES; *action = STM32_SYNAPSE_ACTION_BOTH_EDGES;
break; else
*action = STM32_SYNAPSE_ACTION_NONE;
return 0;
case STM32_COUNT_ENCODER_MODE_3: case STM32_COUNT_ENCODER_MODE_3:
/* counts up/down on both TI1FP1 and TI2FP2 edges */ /* counts up/down on both TI1FP1 and TI2FP2 edges */
*action = STM32_SYNAPSE_ACTION_BOTH_EDGES; *action = STM32_SYNAPSE_ACTION_BOTH_EDGES;
break;
}
return 0; return 0;
default:
return -EINVAL;
}
} }
static const struct counter_ops stm32_timer_cnt_ops = { static const struct counter_ops stm32_timer_cnt_ops = {
...@@ -359,7 +370,7 @@ static int stm32_timer_cnt_probe(struct platform_device *pdev) ...@@ -359,7 +370,7 @@ static int stm32_timer_cnt_probe(struct platform_device *pdev)
priv->regmap = ddata->regmap; priv->regmap = ddata->regmap;
priv->clk = ddata->clk; priv->clk = ddata->clk;
priv->ceiling = ddata->max_arr; priv->max_arr = ddata->max_arr;
priv->counter.name = dev_name(dev); priv->counter.name = dev_name(dev);
priv->counter.parent = dev; priv->counter.parent = dev;
......
...@@ -266,6 +266,8 @@ config ADI_AXI_ADC ...@@ -266,6 +266,8 @@ config ADI_AXI_ADC
select IIO_BUFFER select IIO_BUFFER
select IIO_BUFFER_HW_CONSUMER select IIO_BUFFER_HW_CONSUMER
select IIO_BUFFER_DMAENGINE select IIO_BUFFER_DMAENGINE
depends on HAS_IOMEM
depends on OF
help help
Say yes here to build support for Analog Devices Generic Say yes here to build support for Analog Devices Generic
AXI ADC IP core. The IP core is used for interfacing with AXI ADC IP core. The IP core is used for interfacing with
...@@ -923,6 +925,7 @@ config STM32_ADC_CORE ...@@ -923,6 +925,7 @@ config STM32_ADC_CORE
depends on ARCH_STM32 || COMPILE_TEST depends on ARCH_STM32 || COMPILE_TEST
depends on OF depends on OF
depends on REGULATOR depends on REGULATOR
depends on HAS_IOMEM
select IIO_BUFFER select IIO_BUFFER
select MFD_STM32_TIMERS select MFD_STM32_TIMERS
select IIO_STM32_TIMER_TRIGGER select IIO_STM32_TIMER_TRIGGER
......
...@@ -918,7 +918,7 @@ static int ab8500_gpadc_read_raw(struct iio_dev *indio_dev, ...@@ -918,7 +918,7 @@ static int ab8500_gpadc_read_raw(struct iio_dev *indio_dev,
return processed; return processed;
/* Return millivolt or milliamps or millicentigrades */ /* Return millivolt or milliamps or millicentigrades */
*val = processed * 1000; *val = processed;
return IIO_VAL_INT; return IIO_VAL_INT;
} }
......
...@@ -91,7 +91,7 @@ static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val, ...@@ -91,7 +91,7 @@ static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val,
int ret; int ret;
int i; int i;
int bits_per_word = ad7949_adc->resolution; int bits_per_word = ad7949_adc->resolution;
int mask = GENMASK(ad7949_adc->resolution, 0); int mask = GENMASK(ad7949_adc->resolution - 1, 0);
struct spi_message msg; struct spi_message msg;
struct spi_transfer tx[] = { struct spi_transfer tx[] = {
{ {
......
...@@ -597,7 +597,7 @@ static const struct vadc_channels vadc_chans[] = { ...@@ -597,7 +597,7 @@ static const struct vadc_channels vadc_chans[] = {
VADC_CHAN_NO_SCALE(P_MUX16_1_3, 1) VADC_CHAN_NO_SCALE(P_MUX16_1_3, 1)
VADC_CHAN_NO_SCALE(LR_MUX1_BAT_THERM, 0) VADC_CHAN_NO_SCALE(LR_MUX1_BAT_THERM, 0)
VADC_CHAN_NO_SCALE(LR_MUX2_BAT_ID, 0) VADC_CHAN_VOLT(LR_MUX2_BAT_ID, 0, SCALE_DEFAULT)
VADC_CHAN_NO_SCALE(LR_MUX3_XO_THERM, 0) VADC_CHAN_NO_SCALE(LR_MUX3_XO_THERM, 0)
VADC_CHAN_NO_SCALE(LR_MUX4_AMUX_THM1, 0) VADC_CHAN_NO_SCALE(LR_MUX4_AMUX_THM1, 0)
VADC_CHAN_NO_SCALE(LR_MUX5_AMUX_THM2, 0) VADC_CHAN_NO_SCALE(LR_MUX5_AMUX_THM2, 0)
......
...@@ -551,6 +551,8 @@ static irqreturn_t mpu3050_trigger_handler(int irq, void *p) ...@@ -551,6 +551,8 @@ static irqreturn_t mpu3050_trigger_handler(int irq, void *p)
MPU3050_FIFO_R, MPU3050_FIFO_R,
&fifo_values[offset], &fifo_values[offset],
toread); toread);
if (ret)
goto out_trigger_unlock;
dev_dbg(mpu3050->dev, dev_dbg(mpu3050->dev,
"%04x %04x %04x %04x %04x\n", "%04x %04x %04x %04x %04x\n",
......
...@@ -15,7 +15,10 @@ ...@@ -15,7 +15,10 @@
struct hid_humidity_state { struct hid_humidity_state {
struct hid_sensor_common common_attributes; struct hid_sensor_common common_attributes;
struct hid_sensor_hub_attribute_info humidity_attr; struct hid_sensor_hub_attribute_info humidity_attr;
struct {
s32 humidity_data; s32 humidity_data;
u64 timestamp __aligned(8);
} scan;
int scale_pre_decml; int scale_pre_decml;
int scale_post_decml; int scale_post_decml;
int scale_precision; int scale_precision;
...@@ -125,8 +128,7 @@ static int humidity_proc_event(struct hid_sensor_hub_device *hsdev, ...@@ -125,8 +128,7 @@ static int humidity_proc_event(struct hid_sensor_hub_device *hsdev,
struct hid_humidity_state *humid_st = iio_priv(indio_dev); struct hid_humidity_state *humid_st = iio_priv(indio_dev);
if (atomic_read(&humid_st->common_attributes.data_ready)) if (atomic_read(&humid_st->common_attributes.data_ready))
iio_push_to_buffers_with_timestamp(indio_dev, iio_push_to_buffers_with_timestamp(indio_dev, &humid_st->scan,
&humid_st->humidity_data,
iio_get_time_ns(indio_dev)); iio_get_time_ns(indio_dev));
return 0; return 0;
...@@ -142,7 +144,7 @@ static int humidity_capture_sample(struct hid_sensor_hub_device *hsdev, ...@@ -142,7 +144,7 @@ static int humidity_capture_sample(struct hid_sensor_hub_device *hsdev,
switch (usage_id) { switch (usage_id) {
case HID_USAGE_SENSOR_ATMOSPHERIC_HUMIDITY: case HID_USAGE_SENSOR_ATMOSPHERIC_HUMIDITY:
humid_st->humidity_data = *(s32 *)raw_data; humid_st->scan.humidity_data = *(s32 *)raw_data;
return 0; return 0;
default: default:
......
...@@ -462,8 +462,7 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev) ...@@ -462,8 +462,7 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev)
if (ret) if (ret)
goto err_ret; goto err_ret;
ret = sscanf(indio_dev->name, "adis%u\n", &device_id); if (sscanf(indio_dev->name, "adis%u\n", &device_id) != 1) {
if (ret != 1) {
ret = -EINVAL; ret = -EINVAL;
goto err_ret; goto err_ret;
} }
......
...@@ -23,6 +23,9 @@ struct prox_state { ...@@ -23,6 +23,9 @@ struct prox_state {
struct hid_sensor_common common_attributes; struct hid_sensor_common common_attributes;
struct hid_sensor_hub_attribute_info prox_attr; struct hid_sensor_hub_attribute_info prox_attr;
u32 human_presence; u32 human_presence;
int scale_pre_decml;
int scale_post_decml;
int scale_precision;
}; };
/* Channel definitions */ /* Channel definitions */
...@@ -93,8 +96,9 @@ static int prox_read_raw(struct iio_dev *indio_dev, ...@@ -93,8 +96,9 @@ static int prox_read_raw(struct iio_dev *indio_dev,
ret_type = IIO_VAL_INT; ret_type = IIO_VAL_INT;
break; break;
case IIO_CHAN_INFO_SCALE: case IIO_CHAN_INFO_SCALE:
*val = prox_state->prox_attr.units; *val = prox_state->scale_pre_decml;
ret_type = IIO_VAL_INT; *val2 = prox_state->scale_post_decml;
ret_type = prox_state->scale_precision;
break; break;
case IIO_CHAN_INFO_OFFSET: case IIO_CHAN_INFO_OFFSET:
*val = hid_sensor_convert_exponent( *val = hid_sensor_convert_exponent(
...@@ -234,6 +238,11 @@ static int prox_parse_report(struct platform_device *pdev, ...@@ -234,6 +238,11 @@ static int prox_parse_report(struct platform_device *pdev,
HID_USAGE_SENSOR_HUMAN_PRESENCE, HID_USAGE_SENSOR_HUMAN_PRESENCE,
&st->common_attributes.sensitivity); &st->common_attributes.sensitivity);
st->scale_precision = hid_sensor_format_scale(
hsdev->usage,
&st->prox_attr,
&st->scale_pre_decml, &st->scale_post_decml);
return ret; return ret;
} }
......
...@@ -15,7 +15,10 @@ ...@@ -15,7 +15,10 @@
struct temperature_state { struct temperature_state {
struct hid_sensor_common common_attributes; struct hid_sensor_common common_attributes;
struct hid_sensor_hub_attribute_info temperature_attr; struct hid_sensor_hub_attribute_info temperature_attr;
struct {
s32 temperature_data; s32 temperature_data;
u64 timestamp __aligned(8);
} scan;
int scale_pre_decml; int scale_pre_decml;
int scale_post_decml; int scale_post_decml;
int scale_precision; int scale_precision;
...@@ -32,7 +35,7 @@ static const struct iio_chan_spec temperature_channels[] = { ...@@ -32,7 +35,7 @@ static const struct iio_chan_spec temperature_channels[] = {
BIT(IIO_CHAN_INFO_SAMP_FREQ) | BIT(IIO_CHAN_INFO_SAMP_FREQ) |
BIT(IIO_CHAN_INFO_HYSTERESIS), BIT(IIO_CHAN_INFO_HYSTERESIS),
}, },
IIO_CHAN_SOFT_TIMESTAMP(3), IIO_CHAN_SOFT_TIMESTAMP(1),
}; };
/* Adjust channel real bits based on report descriptor */ /* Adjust channel real bits based on report descriptor */
...@@ -123,8 +126,7 @@ static int temperature_proc_event(struct hid_sensor_hub_device *hsdev, ...@@ -123,8 +126,7 @@ static int temperature_proc_event(struct hid_sensor_hub_device *hsdev,
struct temperature_state *temp_st = iio_priv(indio_dev); struct temperature_state *temp_st = iio_priv(indio_dev);
if (atomic_read(&temp_st->common_attributes.data_ready)) if (atomic_read(&temp_st->common_attributes.data_ready))
iio_push_to_buffers_with_timestamp(indio_dev, iio_push_to_buffers_with_timestamp(indio_dev, &temp_st->scan,
&temp_st->temperature_data,
iio_get_time_ns(indio_dev)); iio_get_time_ns(indio_dev));
return 0; return 0;
...@@ -140,7 +142,7 @@ static int temperature_capture_sample(struct hid_sensor_hub_device *hsdev, ...@@ -140,7 +142,7 @@ static int temperature_capture_sample(struct hid_sensor_hub_device *hsdev,
switch (usage_id) { switch (usage_id) {
case HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE: case HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE:
temp_st->temperature_data = *(s32 *)raw_data; temp_st->scan.temperature_data = *(s32 *)raw_data;
return 0; return 0;
default: default:
return -EINVAL; return -EINVAL;
......
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