diff options
Diffstat (limited to 'drivers/iio')
| -rw-r--r-- | drivers/iio/accel/hid-sensor-accel-3d.c | 3 | ||||
| -rw-r--r-- | drivers/iio/adc/ti_am335x_adc.c | 13 | ||||
| -rw-r--r-- | drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c | 4 | ||||
| -rw-r--r-- | drivers/iio/common/hid-sensors/hid-sensor-attributes.c | 10 | ||||
| -rw-r--r-- | drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 6 | ||||
| -rw-r--r-- | drivers/iio/gyro/bmg160_core.c | 12 | ||||
| -rw-r--r-- | drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 4 | ||||
| -rw-r--r-- | drivers/iio/industrialio-core.c | 7 | ||||
| -rw-r--r-- | drivers/iio/magnetometer/ak8974.c | 4 | ||||
| -rw-r--r-- | drivers/iio/pressure/st_pressure_core.c | 1 |
10 files changed, 49 insertions, 15 deletions
diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c index ca5759c0c318..43a6cb078193 100644 --- a/drivers/iio/accel/hid-sensor-accel-3d.c +++ b/drivers/iio/accel/hid-sensor-accel-3d.c | |||
| @@ -370,10 +370,12 @@ static int hid_accel_3d_probe(struct platform_device *pdev) | |||
| 370 | name = "accel_3d"; | 370 | name = "accel_3d"; |
| 371 | channel_spec = accel_3d_channels; | 371 | channel_spec = accel_3d_channels; |
| 372 | channel_size = sizeof(accel_3d_channels); | 372 | channel_size = sizeof(accel_3d_channels); |
| 373 | indio_dev->num_channels = ARRAY_SIZE(accel_3d_channels); | ||
| 373 | } else { | 374 | } else { |
| 374 | name = "gravity"; | 375 | name = "gravity"; |
| 375 | channel_spec = gravity_channels; | 376 | channel_spec = gravity_channels; |
| 376 | channel_size = sizeof(gravity_channels); | 377 | channel_size = sizeof(gravity_channels); |
| 378 | indio_dev->num_channels = ARRAY_SIZE(gravity_channels); | ||
| 377 | } | 379 | } |
| 378 | ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, | 380 | ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, |
| 379 | &accel_state->common_attributes); | 381 | &accel_state->common_attributes); |
| @@ -395,7 +397,6 @@ static int hid_accel_3d_probe(struct platform_device *pdev) | |||
| 395 | goto error_free_dev_mem; | 397 | goto error_free_dev_mem; |
| 396 | } | 398 | } |
| 397 | 399 | ||
| 398 | indio_dev->num_channels = ARRAY_SIZE(accel_3d_channels); | ||
| 399 | indio_dev->dev.parent = &pdev->dev; | 400 | indio_dev->dev.parent = &pdev->dev; |
| 400 | indio_dev->info = &accel_3d_info; | 401 | indio_dev->info = &accel_3d_info; |
| 401 | indio_dev->name = name; | 402 | indio_dev->name = name; |
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index ad9dec30bb30..4282ceca3d8f 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c | |||
| @@ -169,7 +169,9 @@ static irqreturn_t tiadc_irq_h(int irq, void *private) | |||
| 169 | { | 169 | { |
| 170 | struct iio_dev *indio_dev = private; | 170 | struct iio_dev *indio_dev = private; |
| 171 | struct tiadc_device *adc_dev = iio_priv(indio_dev); | 171 | struct tiadc_device *adc_dev = iio_priv(indio_dev); |
| 172 | unsigned int status, config; | 172 | unsigned int status, config, adc_fsm; |
| 173 | unsigned short count = 0; | ||
| 174 | |||
| 173 | status = tiadc_readl(adc_dev, REG_IRQSTATUS); | 175 | status = tiadc_readl(adc_dev, REG_IRQSTATUS); |
| 174 | 176 | ||
| 175 | /* | 177 | /* |
| @@ -183,6 +185,15 @@ static irqreturn_t tiadc_irq_h(int irq, void *private) | |||
| 183 | tiadc_writel(adc_dev, REG_CTRL, config); | 185 | tiadc_writel(adc_dev, REG_CTRL, config); |
| 184 | tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1OVRRUN | 186 | tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1OVRRUN |
| 185 | | IRQENB_FIFO1UNDRFLW | IRQENB_FIFO1THRES); | 187 | | IRQENB_FIFO1UNDRFLW | IRQENB_FIFO1THRES); |
| 188 | |||
| 189 | /* wait for idle state. | ||
| 190 | * ADC needs to finish the current conversion | ||
| 191 | * before disabling the module | ||
| 192 | */ | ||
| 193 | do { | ||
| 194 | adc_fsm = tiadc_readl(adc_dev, REG_ADCFSM); | ||
| 195 | } while (adc_fsm != 0x10 && count++ < 100); | ||
| 196 | |||
| 186 | tiadc_writel(adc_dev, REG_CTRL, (config | CNTRLREG_TSCSSENB)); | 197 | tiadc_writel(adc_dev, REG_CTRL, (config | CNTRLREG_TSCSSENB)); |
| 187 | return IRQ_HANDLED; | 198 | return IRQ_HANDLED; |
| 188 | } else if (status & IRQENB_FIFO1THRES) { | 199 | } else if (status & IRQENB_FIFO1THRES) { |
diff --git a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c index d6c372bb433b..c17596f7ed2c 100644 --- a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c +++ b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c | |||
| @@ -61,7 +61,7 @@ static int cros_ec_sensors_read(struct iio_dev *indio_dev, | |||
| 61 | ret = st->core.read_ec_sensors_data(indio_dev, 1 << idx, &data); | 61 | ret = st->core.read_ec_sensors_data(indio_dev, 1 << idx, &data); |
| 62 | if (ret < 0) | 62 | if (ret < 0) |
| 63 | break; | 63 | break; |
| 64 | 64 | ret = IIO_VAL_INT; | |
| 65 | *val = data; | 65 | *val = data; |
| 66 | break; | 66 | break; |
| 67 | case IIO_CHAN_INFO_CALIBBIAS: | 67 | case IIO_CHAN_INFO_CALIBBIAS: |
| @@ -76,7 +76,7 @@ static int cros_ec_sensors_read(struct iio_dev *indio_dev, | |||
| 76 | for (i = CROS_EC_SENSOR_X; i < CROS_EC_SENSOR_MAX_AXIS; i++) | 76 | for (i = CROS_EC_SENSOR_X; i < CROS_EC_SENSOR_MAX_AXIS; i++) |
| 77 | st->core.calib[i] = | 77 | st->core.calib[i] = |
| 78 | st->core.resp->sensor_offset.offset[i]; | 78 | st->core.resp->sensor_offset.offset[i]; |
| 79 | 79 | ret = IIO_VAL_INT; | |
| 80 | *val = st->core.calib[idx]; | 80 | *val = st->core.calib[idx]; |
| 81 | break; | 81 | break; |
| 82 | case IIO_CHAN_INFO_SCALE: | 82 | case IIO_CHAN_INFO_SCALE: |
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index 7afdac42ed42..01e02b9926d4 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c | |||
| @@ -379,6 +379,8 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, | |||
| 379 | { | 379 | { |
| 380 | 380 | ||
| 381 | struct hid_sensor_hub_attribute_info timestamp; | 381 | struct hid_sensor_hub_attribute_info timestamp; |
| 382 | s32 value; | ||
| 383 | int ret; | ||
| 382 | 384 | ||
| 383 | hid_sensor_get_reporting_interval(hsdev, usage_id, st); | 385 | hid_sensor_get_reporting_interval(hsdev, usage_id, st); |
| 384 | 386 | ||
| @@ -417,6 +419,14 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, | |||
| 417 | st->sensitivity.index, st->sensitivity.report_id, | 419 | st->sensitivity.index, st->sensitivity.report_id, |
| 418 | timestamp.index, timestamp.report_id); | 420 | timestamp.index, timestamp.report_id); |
| 419 | 421 | ||
| 422 | ret = sensor_hub_get_feature(hsdev, | ||
| 423 | st->power_state.report_id, | ||
| 424 | st->power_state.index, sizeof(value), &value); | ||
| 425 | if (ret < 0) | ||
| 426 | return ret; | ||
| 427 | if (value < 0) | ||
| 428 | return -EINVAL; | ||
| 429 | |||
| 420 | return 0; | 430 | return 0; |
| 421 | } | 431 | } |
| 422 | EXPORT_SYMBOL(hid_sensor_parse_common_attributes); | 432 | EXPORT_SYMBOL(hid_sensor_parse_common_attributes); |
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index a3cce3a38300..ecf592d69043 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c | |||
| @@ -51,8 +51,6 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) | |||
| 51 | st->report_state.report_id, | 51 | st->report_state.report_id, |
| 52 | st->report_state.index, | 52 | st->report_state.index, |
| 53 | HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM); | 53 | HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM); |
| 54 | |||
| 55 | poll_value = hid_sensor_read_poll_value(st); | ||
| 56 | } else { | 54 | } else { |
| 57 | int val; | 55 | int val; |
| 58 | 56 | ||
| @@ -89,7 +87,9 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) | |||
| 89 | sensor_hub_get_feature(st->hsdev, st->power_state.report_id, | 87 | sensor_hub_get_feature(st->hsdev, st->power_state.report_id, |
| 90 | st->power_state.index, | 88 | st->power_state.index, |
| 91 | sizeof(state_val), &state_val); | 89 | sizeof(state_val), &state_val); |
| 92 | if (state && poll_value) | 90 | if (state) |
| 91 | poll_value = hid_sensor_read_poll_value(st); | ||
| 92 | if (poll_value > 0) | ||
| 93 | msleep_interruptible(poll_value * 2); | 93 | msleep_interruptible(poll_value * 2); |
| 94 | 94 | ||
| 95 | return 0; | 95 | return 0; |
diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c index f7fcfa886f72..821919dd245b 100644 --- a/drivers/iio/gyro/bmg160_core.c +++ b/drivers/iio/gyro/bmg160_core.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/iio/trigger_consumer.h> | 27 | #include <linux/iio/trigger_consumer.h> |
| 28 | #include <linux/iio/triggered_buffer.h> | 28 | #include <linux/iio/triggered_buffer.h> |
| 29 | #include <linux/regmap.h> | 29 | #include <linux/regmap.h> |
| 30 | #include <linux/delay.h> | ||
| 30 | #include "bmg160.h" | 31 | #include "bmg160.h" |
| 31 | 32 | ||
| 32 | #define BMG160_IRQ_NAME "bmg160_event" | 33 | #define BMG160_IRQ_NAME "bmg160_event" |
| @@ -52,6 +53,9 @@ | |||
| 52 | #define BMG160_DEF_BW 100 | 53 | #define BMG160_DEF_BW 100 |
| 53 | #define BMG160_REG_PMU_BW_RES BIT(7) | 54 | #define BMG160_REG_PMU_BW_RES BIT(7) |
| 54 | 55 | ||
| 56 | #define BMG160_GYRO_REG_RESET 0x14 | ||
| 57 | #define BMG160_GYRO_RESET_VAL 0xb6 | ||
| 58 | |||
| 55 | #define BMG160_REG_INT_MAP_0 0x17 | 59 | #define BMG160_REG_INT_MAP_0 0x17 |
| 56 | #define BMG160_INT_MAP_0_BIT_ANY BIT(1) | 60 | #define BMG160_INT_MAP_0_BIT_ANY BIT(1) |
| 57 | 61 | ||
| @@ -236,6 +240,14 @@ static int bmg160_chip_init(struct bmg160_data *data) | |||
| 236 | int ret; | 240 | int ret; |
| 237 | unsigned int val; | 241 | unsigned int val; |
| 238 | 242 | ||
| 243 | /* | ||
| 244 | * Reset chip to get it in a known good state. A delay of 30ms after | ||
| 245 | * reset is required according to the datasheet. | ||
| 246 | */ | ||
| 247 | regmap_write(data->regmap, BMG160_GYRO_REG_RESET, | ||
| 248 | BMG160_GYRO_RESET_VAL); | ||
| 249 | usleep_range(30000, 30700); | ||
| 250 | |||
| 239 | ret = regmap_read(data->regmap, BMG160_REG_CHIP_ID, &val); | 251 | ret = regmap_read(data->regmap, BMG160_REG_CHIP_ID, &val); |
| 240 | if (ret < 0) { | 252 | if (ret < 0) { |
| 241 | dev_err(dev, "Error reading reg_chip_id\n"); | 253 | dev_err(dev, "Error reading reg_chip_id\n"); |
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c index 78532ce07449..81b572d7699a 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | |||
| @@ -193,8 +193,8 @@ int st_lsm6dsx_update_watermark(struct st_lsm6dsx_sensor *sensor, u16 watermark) | |||
| 193 | if (err < 0) | 193 | if (err < 0) |
| 194 | goto out; | 194 | goto out; |
| 195 | 195 | ||
| 196 | fifo_watermark = ((data & ~ST_LSM6DSX_FIFO_TH_MASK) << 8) | | 196 | fifo_watermark = ((data << 8) & ~ST_LSM6DSX_FIFO_TH_MASK) | |
| 197 | (fifo_watermark & ST_LSM6DSX_FIFO_TH_MASK); | 197 | (fifo_watermark & ST_LSM6DSX_FIFO_TH_MASK); |
| 198 | 198 | ||
| 199 | wdata = cpu_to_le16(fifo_watermark); | 199 | wdata = cpu_to_le16(fifo_watermark); |
| 200 | err = hw->tf->write(hw->dev, ST_LSM6DSX_REG_FIFO_THL_ADDR, | 200 | err = hw->tf->write(hw->dev, ST_LSM6DSX_REG_FIFO_THL_ADDR, |
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index d18ded45bedd..3ff91e02fee3 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c | |||
| @@ -610,10 +610,9 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type, | |||
| 610 | tmp0 = (int)div_s64_rem(tmp, 1000000000, &tmp1); | 610 | tmp0 = (int)div_s64_rem(tmp, 1000000000, &tmp1); |
| 611 | return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1)); | 611 | return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1)); |
| 612 | case IIO_VAL_FRACTIONAL_LOG2: | 612 | case IIO_VAL_FRACTIONAL_LOG2: |
| 613 | tmp = (s64)vals[0] * 1000000000LL >> vals[1]; | 613 | tmp = shift_right((s64)vals[0] * 1000000000LL, vals[1]); |
| 614 | tmp1 = do_div(tmp, 1000000000LL); | 614 | tmp0 = (int)div_s64_rem(tmp, 1000000000LL, &tmp1); |
| 615 | tmp0 = tmp; | 615 | return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1)); |
| 616 | return snprintf(buf, len, "%d.%09u", tmp0, tmp1); | ||
| 617 | case IIO_VAL_INT_MULTIPLE: | 616 | case IIO_VAL_INT_MULTIPLE: |
| 618 | { | 617 | { |
| 619 | int i; | 618 | int i; |
diff --git a/drivers/iio/magnetometer/ak8974.c b/drivers/iio/magnetometer/ak8974.c index 6dd8cbd7ce95..e13370dc9b1c 100644 --- a/drivers/iio/magnetometer/ak8974.c +++ b/drivers/iio/magnetometer/ak8974.c | |||
| @@ -763,7 +763,7 @@ power_off: | |||
| 763 | return ret; | 763 | return ret; |
| 764 | } | 764 | } |
| 765 | 765 | ||
| 766 | static int __exit ak8974_remove(struct i2c_client *i2c) | 766 | static int ak8974_remove(struct i2c_client *i2c) |
| 767 | { | 767 | { |
| 768 | struct iio_dev *indio_dev = i2c_get_clientdata(i2c); | 768 | struct iio_dev *indio_dev = i2c_get_clientdata(i2c); |
| 769 | struct ak8974 *ak8974 = iio_priv(indio_dev); | 769 | struct ak8974 *ak8974 = iio_priv(indio_dev); |
| @@ -845,7 +845,7 @@ static struct i2c_driver ak8974_driver = { | |||
| 845 | .of_match_table = of_match_ptr(ak8974_of_match), | 845 | .of_match_table = of_match_ptr(ak8974_of_match), |
| 846 | }, | 846 | }, |
| 847 | .probe = ak8974_probe, | 847 | .probe = ak8974_probe, |
| 848 | .remove = __exit_p(ak8974_remove), | 848 | .remove = ak8974_remove, |
| 849 | .id_table = ak8974_id, | 849 | .id_table = ak8974_id, |
| 850 | }; | 850 | }; |
| 851 | module_i2c_driver(ak8974_driver); | 851 | module_i2c_driver(ak8974_driver); |
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c index 5f2680855552..fd0edca0e656 100644 --- a/drivers/iio/pressure/st_pressure_core.c +++ b/drivers/iio/pressure/st_pressure_core.c | |||
| @@ -457,6 +457,7 @@ static const struct st_sensor_settings st_press_sensors_settings[] = { | |||
| 457 | .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, | 457 | .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, |
| 458 | }, | 458 | }, |
| 459 | .multi_read_bit = true, | 459 | .multi_read_bit = true, |
| 460 | .bootime = 2, | ||
| 460 | }, | 461 | }, |
| 461 | }; | 462 | }; |
| 462 | 463 | ||
