mirror of https://gitee.com/openkylin/linux.git
Second set of IIO fixes for the 5.4 cycle.
* adis16480 - Prevent negative numbers being accepted for sampling frequency. * inv_mpu6050 - Fix an issue where fifo overflow bits don't actually work as expected, by checking the fifo count instead. * srf04 - Allow more time for echo to signal as some sensors supported have a higher range. * stm32-adc - Fix a potential race in dma disable by ensuring all transfers are done. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAl255dsRHGppYzIzQGtl cm5lbC5vcmcACgkQVIU0mcT0FogHPg/+KIuto3eAniwzQ20HjlZh9vZd4LXc+eY+ mQ+DFgxN3WqWrLp9PTsk7hgjesphKR3DQ7pBQJ5yvLlf2NCCCLsITrQhrHA3SGMR m43IdwX3ShLk+zaJwAKubkkOadsxWSbsrFcg8Pt0UfSx9+RKzvI4RbcRjXLv4UV2 FE3brznxQ19/7VfBXRN9Qx6hFqeEE6WXaxM1AAugjRbbzRBgkFKp/iVbrzTSxest LHxYZoiNlmnGqk5qX7PXkVpVrE9HWcJT0XOwqyZTT/dSz+1MNsSpoc+w+Z2Y4EhI y41GNEEolGSVPeuH4JbN73EgRQq/SAh4yTioJGoiq/nex0eAHI8qRplpAi9lgK/5 XTf4CYm4UfXkSpwc5ZCuJFZM0hk1GaT14U8bIdWCo/V/Y9CgznTvmF9CoRZMAm/g DmI+vroUDDqa8Oz8KiEHNraw7XsZnUDSSplixrQV9SN4O3Q62LuGgGtgoMWW6DkD ivI5jkWcBsQMLymWK+f3OW/mO4OWQIV/xvYyoMHqtZbUli5amEKlgyKNrKjqbwe1 fwH1/ZU5h2UiUGwwn1i10Erse3WZA85i8VYd0yD6AT4VqlXOAm4foG9JTGI/O1DD l8tGDhPCEHrqPrx/b+yb6cJVffYjRA3D3EfyDVf7p+JWbMwxOHzmuYJsWZoWz2dt b2RVsaiwu6Y= =ikZd -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-5.4b' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Second set of IIO fixes for the 5.4 cycle. * adis16480 - Prevent negative numbers being accepted for sampling frequency. * inv_mpu6050 - Fix an issue where fifo overflow bits don't actually work as expected, by checking the fifo count instead. * srf04 - Allow more time for echo to signal as some sensors supported have a higher range. * stm32-adc - Fix a potential race in dma disable by ensuring all transfers are done. * tag 'iio-fixes-for-5.4b' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: iio: adc: stm32-adc: fix stopping dma iio: imu: inv_mpu6050: fix no data on MPU6050 iio: srf04: fix wrong limitation in distance measuring iio: imu: adis16480: make sure provided frequency is positive
This commit is contained in:
commit
fe4c59394e
|
@ -1399,7 +1399,7 @@ static int stm32_adc_dma_start(struct iio_dev *indio_dev)
|
|||
cookie = dmaengine_submit(desc);
|
||||
ret = dma_submit_error(cookie);
|
||||
if (ret) {
|
||||
dmaengine_terminate_all(adc->dma_chan);
|
||||
dmaengine_terminate_sync(adc->dma_chan);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1477,7 +1477,7 @@ static void __stm32_adc_buffer_predisable(struct iio_dev *indio_dev)
|
|||
stm32_adc_conv_irq_disable(adc);
|
||||
|
||||
if (adc->dma_chan)
|
||||
dmaengine_terminate_all(adc->dma_chan);
|
||||
dmaengine_terminate_sync(adc->dma_chan);
|
||||
|
||||
if (stm32_adc_set_trig(indio_dev, NULL))
|
||||
dev_err(&indio_dev->dev, "Can't clear trigger\n");
|
||||
|
|
|
@ -317,8 +317,11 @@ static int adis16480_set_freq(struct iio_dev *indio_dev, int val, int val2)
|
|||
struct adis16480 *st = iio_priv(indio_dev);
|
||||
unsigned int t, reg;
|
||||
|
||||
if (val < 0 || val2 < 0)
|
||||
return -EINVAL;
|
||||
|
||||
t = val * 1000 + val2 / 1000;
|
||||
if (t <= 0)
|
||||
if (t == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
|
|
|
@ -114,54 +114,63 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.name = "MPU6050",
|
||||
.reg = ®_set_6050,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1024,
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU6500_WHOAMI_VALUE,
|
||||
.name = "MPU6500",
|
||||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU6515_WHOAMI_VALUE,
|
||||
.name = "MPU6515",
|
||||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU6000_WHOAMI_VALUE,
|
||||
.name = "MPU6000",
|
||||
.reg = ®_set_6050,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1024,
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU9150_WHOAMI_VALUE,
|
||||
.name = "MPU9150",
|
||||
.reg = ®_set_6050,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1024,
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU9250_WHOAMI_VALUE,
|
||||
.name = "MPU9250",
|
||||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU9255_WHOAMI_VALUE,
|
||||
.name = "MPU9255",
|
||||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
},
|
||||
{
|
||||
.whoami = INV_ICM20608_WHOAMI_VALUE,
|
||||
.name = "ICM20608",
|
||||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
},
|
||||
{
|
||||
.whoami = INV_ICM20602_WHOAMI_VALUE,
|
||||
.name = "ICM20602",
|
||||
.reg = ®_set_icm20602,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1008,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -100,12 +100,14 @@ struct inv_mpu6050_chip_config {
|
|||
* @name: name of the chip.
|
||||
* @reg: register map of the chip.
|
||||
* @config: configuration of the chip.
|
||||
* @fifo_size: size of the FIFO in bytes.
|
||||
*/
|
||||
struct inv_mpu6050_hw {
|
||||
u8 whoami;
|
||||
u8 *name;
|
||||
const struct inv_mpu6050_reg_map *reg;
|
||||
const struct inv_mpu6050_chip_config *config;
|
||||
size_t fifo_size;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -180,9 +180,6 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
|
|||
"failed to ack interrupt\n");
|
||||
goto flush_fifo;
|
||||
}
|
||||
/* handle fifo overflow by reseting fifo */
|
||||
if (int_status & INV_MPU6050_BIT_FIFO_OVERFLOW_INT)
|
||||
goto flush_fifo;
|
||||
if (!(int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT)) {
|
||||
dev_warn(regmap_get_device(st->map),
|
||||
"spurious interrupt with status 0x%x\n", int_status);
|
||||
|
@ -211,6 +208,18 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
|
|||
if (result)
|
||||
goto end_session;
|
||||
fifo_count = get_unaligned_be16(&data[0]);
|
||||
|
||||
/*
|
||||
* Handle fifo overflow by resetting fifo.
|
||||
* Reset if there is only 3 data set free remaining to mitigate
|
||||
* possible delay between reading fifo count and fifo data.
|
||||
*/
|
||||
nb = 3 * bytes_per_datum;
|
||||
if (fifo_count >= st->hw->fifo_size - nb) {
|
||||
dev_warn(regmap_get_device(st->map), "fifo overflow reset\n");
|
||||
goto flush_fifo;
|
||||
}
|
||||
|
||||
/* compute and process all complete datum */
|
||||
nb = fifo_count / bytes_per_datum;
|
||||
inv_mpu6050_update_period(st, pf->timestamp, nb);
|
||||
|
|
|
@ -110,7 +110,7 @@ static int srf04_read(struct srf04_data *data)
|
|||
udelay(data->cfg->trigger_pulse_us);
|
||||
gpiod_set_value(data->gpiod_trig, 0);
|
||||
|
||||
/* it cannot take more than 20 ms */
|
||||
/* it should not take more than 20 ms until echo is rising */
|
||||
ret = wait_for_completion_killable_timeout(&data->rising, HZ/50);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&data->lock);
|
||||
|
@ -120,7 +120,8 @@ static int srf04_read(struct srf04_data *data)
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
ret = wait_for_completion_killable_timeout(&data->falling, HZ/50);
|
||||
/* it cannot take more than 50 ms until echo is falling */
|
||||
ret = wait_for_completion_killable_timeout(&data->falling, HZ/20);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&data->lock);
|
||||
return ret;
|
||||
|
@ -135,19 +136,19 @@ static int srf04_read(struct srf04_data *data)
|
|||
|
||||
dt_ns = ktime_to_ns(ktime_dt);
|
||||
/*
|
||||
* measuring more than 3 meters is beyond the capabilities of
|
||||
* the sensor
|
||||
* measuring more than 6,45 meters is beyond the capabilities of
|
||||
* the supported sensors
|
||||
* ==> filter out invalid results for not measuring echos of
|
||||
* another us sensor
|
||||
*
|
||||
* formula:
|
||||
* distance 3 m
|
||||
* time = ---------- = --------- = 9404389 ns
|
||||
* speed 319 m/s
|
||||
* distance 6,45 * 2 m
|
||||
* time = ---------- = ------------ = 40438871 ns
|
||||
* speed 319 m/s
|
||||
*
|
||||
* using a minimum speed at -20 °C of 319 m/s
|
||||
*/
|
||||
if (dt_ns > 9404389)
|
||||
if (dt_ns > 40438871)
|
||||
return -EIO;
|
||||
|
||||
time_ns = dt_ns;
|
||||
|
@ -159,20 +160,20 @@ static int srf04_read(struct srf04_data *data)
|
|||
* with Temp in °C
|
||||
* and speed in m/s
|
||||
*
|
||||
* use 343 m/s as ultrasonic speed at 20 °C here in absence of the
|
||||
* use 343,5 m/s as ultrasonic speed at 20 °C here in absence of the
|
||||
* temperature
|
||||
*
|
||||
* therefore:
|
||||
* time 343
|
||||
* distance = ------ * -----
|
||||
* 10^6 2
|
||||
* time 343,5 time * 106
|
||||
* distance = ------ * ------- = ------------
|
||||
* 10^6 2 617176
|
||||
* with time in ns
|
||||
* and distance in mm (one way)
|
||||
*
|
||||
* because we limit to 3 meters the multiplication with 343 just
|
||||
* because we limit to 6,45 meters the multiplication with 106 just
|
||||
* fits into 32 bit
|
||||
*/
|
||||
distance_mm = time_ns * 343 / 2000000;
|
||||
distance_mm = time_ns * 106 / 617176;
|
||||
|
||||
return distance_mm;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue