aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-06-14 06:00:41 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-06-14 06:00:41 -0400
commit64c667fe29ea697af0fce94857f26ae857951843 (patch)
tree954dca6a0266d31913a07427bdb965fa0220de41
parent32c1431eea4881a6b17bd7c639315010aeefa452 (diff)
parent7981dc07fe317e3506d706e5ef91b94da02656f4 (diff)
Merge tag 'iio-fixes-for-4.12b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes: Second set of IIO fixes for the 4.12 cycle. * buffer-dma / buffer-dmaengine - Fix missing include of buffer_impl.h after the split of buffer.h. No driver in mainline is currently using these buffers so it wasn't picked up by automated build tests. * ad7152 - Fix a deadlock in ad7152_write_raw_samp_freq as the chip_state lock was already held. * inv_mpu6050 - Add low pass filter setting for chips newer than the MPU6500. None of use previously picked up no the fact it was different on these newer chips. It is separately set for the acceleration on these parts. There is no normal reason to set it differently so the userspace interface remains the same as for early parts. * meson-saradc: - Fix a potential crash by NULL pointer dereference in meson_sar_adc_clear_fifo. * mxs-lradc - Fix a return value check where IS_ERR is used on a function that returns NULL on error
-rw-r--r--drivers/iio/adc/meson_saradc.c4
-rw-r--r--drivers/iio/adc/mxs-lradc-adc.c7
-rw-r--r--drivers/iio/buffer/industrialio-buffer-dma.c1
-rw-r--r--drivers/iio/buffer/industrialio-buffer-dmaengine.c1
-rw-r--r--drivers/iio/imu/inv_mpu6050/inv_mpu_core.c39
-rw-r--r--drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h3
-rw-r--r--drivers/staging/iio/cdc/ad7152.c6
7 files changed, 49 insertions, 12 deletions
diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
index dd4190b50df6..6066bbfc42fe 100644
--- a/drivers/iio/adc/meson_saradc.c
+++ b/drivers/iio/adc/meson_saradc.c
@@ -468,13 +468,13 @@ static void meson_sar_adc_unlock(struct iio_dev *indio_dev)
468static void meson_sar_adc_clear_fifo(struct iio_dev *indio_dev) 468static void meson_sar_adc_clear_fifo(struct iio_dev *indio_dev)
469{ 469{
470 struct meson_sar_adc_priv *priv = iio_priv(indio_dev); 470 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
471 int count; 471 unsigned int count, tmp;
472 472
473 for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) { 473 for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) {
474 if (!meson_sar_adc_get_fifo_count(indio_dev)) 474 if (!meson_sar_adc_get_fifo_count(indio_dev))
475 break; 475 break;
476 476
477 regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, 0); 477 regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, &tmp);
478 } 478 }
479} 479}
480 480
diff --git a/drivers/iio/adc/mxs-lradc-adc.c b/drivers/iio/adc/mxs-lradc-adc.c
index b0c7d8ee5cb8..6888167ca1e6 100644
--- a/drivers/iio/adc/mxs-lradc-adc.c
+++ b/drivers/iio/adc/mxs-lradc-adc.c
@@ -718,9 +718,12 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev)
718 adc->dev = dev; 718 adc->dev = dev;
719 719
720 iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 720 iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
721 if (!iores)
722 return -EINVAL;
723
721 adc->base = devm_ioremap(dev, iores->start, resource_size(iores)); 724 adc->base = devm_ioremap(dev, iores->start, resource_size(iores));
722 if (IS_ERR(adc->base)) 725 if (!adc->base)
723 return PTR_ERR(adc->base); 726 return -ENOMEM;
724 727
725 init_completion(&adc->completion); 728 init_completion(&adc->completion);
726 spin_lock_init(&adc->lock); 729 spin_lock_init(&adc->lock);
diff --git a/drivers/iio/buffer/industrialio-buffer-dma.c b/drivers/iio/buffer/industrialio-buffer-dma.c
index dd99d273bae9..ff03324dee13 100644
--- a/drivers/iio/buffer/industrialio-buffer-dma.c
+++ b/drivers/iio/buffer/industrialio-buffer-dma.c
@@ -14,6 +14,7 @@
14#include <linux/sched.h> 14#include <linux/sched.h>
15#include <linux/poll.h> 15#include <linux/poll.h>
16#include <linux/iio/buffer.h> 16#include <linux/iio/buffer.h>
17#include <linux/iio/buffer_impl.h>
17#include <linux/iio/buffer-dma.h> 18#include <linux/iio/buffer-dma.h>
18#include <linux/dma-mapping.h> 19#include <linux/dma-mapping.h>
19#include <linux/sizes.h> 20#include <linux/sizes.h>
diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
index 9fabed47053d..2b5a320f42c5 100644
--- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
+++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
@@ -14,6 +14,7 @@
14 14
15#include <linux/iio/iio.h> 15#include <linux/iio/iio.h>
16#include <linux/iio/buffer.h> 16#include <linux/iio/buffer.h>
17#include <linux/iio/buffer_impl.h>
17#include <linux/iio/buffer-dma.h> 18#include <linux/iio/buffer-dma.h>
18#include <linux/iio/buffer-dmaengine.h> 19#include <linux/iio/buffer-dmaengine.h>
19 20
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index 96dabbd2f004..88a7c5d4e4d2 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -41,6 +41,7 @@ static const int accel_scale[] = {598, 1196, 2392, 4785};
41static const struct inv_mpu6050_reg_map reg_set_6500 = { 41static const struct inv_mpu6050_reg_map reg_set_6500 = {
42 .sample_rate_div = INV_MPU6050_REG_SAMPLE_RATE_DIV, 42 .sample_rate_div = INV_MPU6050_REG_SAMPLE_RATE_DIV,
43 .lpf = INV_MPU6050_REG_CONFIG, 43 .lpf = INV_MPU6050_REG_CONFIG,
44 .accel_lpf = INV_MPU6500_REG_ACCEL_CONFIG_2,
44 .user_ctrl = INV_MPU6050_REG_USER_CTRL, 45 .user_ctrl = INV_MPU6050_REG_USER_CTRL,
45 .fifo_en = INV_MPU6050_REG_FIFO_EN, 46 .fifo_en = INV_MPU6050_REG_FIFO_EN,
46 .gyro_config = INV_MPU6050_REG_GYRO_CONFIG, 47 .gyro_config = INV_MPU6050_REG_GYRO_CONFIG,
@@ -211,6 +212,37 @@ int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st, bool power_on)
211EXPORT_SYMBOL_GPL(inv_mpu6050_set_power_itg); 212EXPORT_SYMBOL_GPL(inv_mpu6050_set_power_itg);
212 213
213/** 214/**
215 * inv_mpu6050_set_lpf_regs() - set low pass filter registers, chip dependent
216 *
217 * MPU60xx/MPU9150 use only 1 register for accelerometer + gyroscope
218 * MPU6500 and above have a dedicated register for accelerometer
219 */
220static int inv_mpu6050_set_lpf_regs(struct inv_mpu6050_state *st,
221 enum inv_mpu6050_filter_e val)
222{
223 int result;
224
225 result = regmap_write(st->map, st->reg->lpf, val);
226 if (result)
227 return result;
228
229 switch (st->chip_type) {
230 case INV_MPU6050:
231 case INV_MPU6000:
232 case INV_MPU9150:
233 /* old chips, nothing to do */
234 result = 0;
235 break;
236 default:
237 /* set accel lpf */
238 result = regmap_write(st->map, st->reg->accel_lpf, val);
239 break;
240 }
241
242 return result;
243}
244
245/**
214 * inv_mpu6050_init_config() - Initialize hardware, disable FIFO. 246 * inv_mpu6050_init_config() - Initialize hardware, disable FIFO.
215 * 247 *
216 * Initial configuration: 248 * Initial configuration:
@@ -233,8 +265,7 @@ static int inv_mpu6050_init_config(struct iio_dev *indio_dev)
233 if (result) 265 if (result)
234 return result; 266 return result;
235 267
236 d = INV_MPU6050_FILTER_20HZ; 268 result = inv_mpu6050_set_lpf_regs(st, INV_MPU6050_FILTER_20HZ);
237 result = regmap_write(st->map, st->reg->lpf, d);
238 if (result) 269 if (result)
239 return result; 270 return result;
240 271
@@ -537,6 +568,8 @@ error_write_raw:
537 * would be alising. This function basically search for the 568 * would be alising. This function basically search for the
538 * correct low pass parameters based on the fifo rate, e.g, 569 * correct low pass parameters based on the fifo rate, e.g,
539 * sampling frequency. 570 * sampling frequency.
571 *
572 * lpf is set automatically when setting sampling rate to avoid any aliases.
540 */ 573 */
541static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) 574static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)
542{ 575{
@@ -552,7 +585,7 @@ static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)
552 while ((h < hz[i]) && (i < ARRAY_SIZE(d) - 1)) 585 while ((h < hz[i]) && (i < ARRAY_SIZE(d) - 1))
553 i++; 586 i++;
554 data = d[i]; 587 data = d[i];
555 result = regmap_write(st->map, st->reg->lpf, data); 588 result = inv_mpu6050_set_lpf_regs(st, data);
556 if (result) 589 if (result)
557 return result; 590 return result;
558 st->chip_config.lpf = data; 591 st->chip_config.lpf = data;
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
index ef13de7a2c20..953a0c09d568 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
@@ -28,6 +28,7 @@
28 * struct inv_mpu6050_reg_map - Notable registers. 28 * struct inv_mpu6050_reg_map - Notable registers.
29 * @sample_rate_div: Divider applied to gyro output rate. 29 * @sample_rate_div: Divider applied to gyro output rate.
30 * @lpf: Configures internal low pass filter. 30 * @lpf: Configures internal low pass filter.
31 * @accel_lpf: Configures accelerometer low pass filter.
31 * @user_ctrl: Enables/resets the FIFO. 32 * @user_ctrl: Enables/resets the FIFO.
32 * @fifo_en: Determines which data will appear in FIFO. 33 * @fifo_en: Determines which data will appear in FIFO.
33 * @gyro_config: gyro config register. 34 * @gyro_config: gyro config register.
@@ -47,6 +48,7 @@
47struct inv_mpu6050_reg_map { 48struct inv_mpu6050_reg_map {
48 u8 sample_rate_div; 49 u8 sample_rate_div;
49 u8 lpf; 50 u8 lpf;
51 u8 accel_lpf;
50 u8 user_ctrl; 52 u8 user_ctrl;
51 u8 fifo_en; 53 u8 fifo_en;
52 u8 gyro_config; 54 u8 gyro_config;
@@ -188,6 +190,7 @@ struct inv_mpu6050_state {
188#define INV_MPU6050_FIFO_THRESHOLD 500 190#define INV_MPU6050_FIFO_THRESHOLD 500
189 191
190/* mpu6500 registers */ 192/* mpu6500 registers */
193#define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D
191#define INV_MPU6500_REG_ACCEL_OFFSET 0x77 194#define INV_MPU6500_REG_ACCEL_OFFSET 0x77
192 195
193/* delay time in milliseconds */ 196/* delay time in milliseconds */
diff --git a/drivers/staging/iio/cdc/ad7152.c b/drivers/staging/iio/cdc/ad7152.c
index dc6ecd824365..ff10d1f0a7e4 100644
--- a/drivers/staging/iio/cdc/ad7152.c
+++ b/drivers/staging/iio/cdc/ad7152.c
@@ -231,16 +231,12 @@ static int ad7152_write_raw_samp_freq(struct device *dev, int val)
231 if (i >= ARRAY_SIZE(ad7152_filter_rate_table)) 231 if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
232 i = ARRAY_SIZE(ad7152_filter_rate_table) - 1; 232 i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
233 233
234 mutex_lock(&chip->state_lock);
235 ret = i2c_smbus_write_byte_data(chip->client, 234 ret = i2c_smbus_write_byte_data(chip->client,
236 AD7152_REG_CFG2, AD7152_CFG2_OSR(i)); 235 AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
237 if (ret < 0) { 236 if (ret < 0)
238 mutex_unlock(&chip->state_lock);
239 return ret; 237 return ret;
240 }
241 238
242 chip->filter_rate_setup = i; 239 chip->filter_rate_setup = i;
243 mutex_unlock(&chip->state_lock);
244 240
245 return ret; 241 return ret;
246} 242}