1
0
Fork 0

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.
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAmBOGa4RHGppYzIzQGtl
 cm5lbC5vcmcACgkQVIU0mcT0FojkDw//YDGkDIUEsx/je8xBjLevNvMd1+6Hc2TA
 eKxzQ8ihwJtc8o2ShHuqYdUXvZJIJjtzu9BA/kuEUGE1EmjPZztWGT3mJFwUuA82
 Woy9G/NStX6Cy/3z9rMEusGqIKysSWfvIVnEX3zLoyGUpskJYn6QDqifcFBLTyDa
 uXPSQ0x2sB0wufGxhAMXGAzUClqzcGIFp/VZSaLTYqT1P30WgQ5N2D/epYdVTQHD
 WbYn+HHP8+74sz2ozj/g5mCG/pE0FB9PyjoCqFz1kRdIm/4K/EGfsBRu4rjVhcNz
 NEsM+B+54MUcQv0vzop8Ip6J5XEy6zHNIlXT5B0ckxuU46s8vQnAZhtA03jXgWOT
 JbnonjMMJv/04q3dMbkYxvFpy4mBFlYmsQu+8JUfXMYlCPTHVHbkZhWE36Q7zT63
 wMX/yIMYTuNGozBrQkQeymrQpaa8zUlVjwPzkAmMt+w0Bh3mR5XXyxh7EncmevdG
 ZR8Znd7g0WidaEnXeuFy2sEJwljIGBiUbO2UurWD5EBsFshu9ZC7n9+gS1gaICva
 dEh2JmdYAq9cB2Enqw7jq8WyIsAmc++M3XXz6prgq1g0tcm/5od7AqeU7AiqPQVX
 Gxd0YyL4ihGBMcrZLJcB1HxBGv27w7fQzwfxW2e1fa8bPNepUajsyXpRj/iz9vRR
 x+IiixCgKbw=
 =L5Yl
 -----END PGP SIGNATURE-----

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
rM2-mainline
Greg Kroah-Hartman 2021-03-15 16:34:39 +01:00
commit 12ec5408d2
10 changed files with 68 additions and 40 deletions

View File

@ -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 {
* @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,
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,
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,
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,
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,
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,
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,
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,
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;
default:
return -EINVAL;
} }
return 0;
} }
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)
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;

View File

@ -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
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

View File

@ -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;
} }

View File

@ -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[] = {
{ {

View File

@ -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)

View File

@ -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",

View File

@ -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;
s32 humidity_data; struct {
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,9 +128,8 @@ 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,
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:

View File

@ -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;
} }

View File

@ -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,
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,
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;
} }

View File

@ -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;
s32 temperature_data; struct {
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[] = {
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,9 +126,8 @@ 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,
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;