Commit 1be627df authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'staging-4.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging

Pull staging and IIO fixes from Greg KH:
 "Here are some small staging and IIO driver fixes for 4.12-rc6.

  Nothing huge, just a few small driver fixes for reported issues. All
  have been in linux-next with no reported issues"

* tag 'staging-4.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  Staging: rtl8723bs: fix an error code in isFileReadable()
  iio: buffer-dmaengine: Add missing header buffer_impl.h
  iio: buffer-dma: Add missing header buffer_impl.h
  iio: adc: meson-saradc: fix potential crash in meson_sar_adc_clear_fifo
  iio: adc: mxs-lradc: Fix return value check in mxs_lradc_adc_probe()
  iio: imu: inv_mpu6050: add accel lpf setting for chip >= MPU6500
  staging: iio: ad7152: Fix deadlock in ad7152_write_raw_samp_freq()
parents 6e203506 ed6456af
...@@ -468,13 +468,13 @@ static void meson_sar_adc_unlock(struct iio_dev *indio_dev) ...@@ -468,13 +468,13 @@ static void meson_sar_adc_unlock(struct iio_dev *indio_dev)
static void meson_sar_adc_clear_fifo(struct iio_dev *indio_dev) static void meson_sar_adc_clear_fifo(struct iio_dev *indio_dev)
{ {
struct meson_sar_adc_priv *priv = iio_priv(indio_dev); struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
int count; unsigned int count, tmp;
for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) { for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) {
if (!meson_sar_adc_get_fifo_count(indio_dev)) if (!meson_sar_adc_get_fifo_count(indio_dev))
break; break;
regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, 0); regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, &tmp);
} }
} }
......
...@@ -718,9 +718,12 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev) ...@@ -718,9 +718,12 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev)
adc->dev = dev; adc->dev = dev;
iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!iores)
return -EINVAL;
adc->base = devm_ioremap(dev, iores->start, resource_size(iores)); adc->base = devm_ioremap(dev, iores->start, resource_size(iores));
if (IS_ERR(adc->base)) if (!adc->base)
return PTR_ERR(adc->base); return -ENOMEM;
init_completion(&adc->completion); init_completion(&adc->completion);
spin_lock_init(&adc->lock); spin_lock_init(&adc->lock);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/iio/buffer.h> #include <linux/iio/buffer.h>
#include <linux/iio/buffer_impl.h>
#include <linux/iio/buffer-dma.h> #include <linux/iio/buffer-dma.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/sizes.h> #include <linux/sizes.h>
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/iio/buffer.h> #include <linux/iio/buffer.h>
#include <linux/iio/buffer_impl.h>
#include <linux/iio/buffer-dma.h> #include <linux/iio/buffer-dma.h>
#include <linux/iio/buffer-dmaengine.h> #include <linux/iio/buffer-dmaengine.h>
......
...@@ -41,6 +41,7 @@ static const int accel_scale[] = {598, 1196, 2392, 4785}; ...@@ -41,6 +41,7 @@ static const int accel_scale[] = {598, 1196, 2392, 4785};
static const struct inv_mpu6050_reg_map reg_set_6500 = { static const struct inv_mpu6050_reg_map reg_set_6500 = {
.sample_rate_div = INV_MPU6050_REG_SAMPLE_RATE_DIV, .sample_rate_div = INV_MPU6050_REG_SAMPLE_RATE_DIV,
.lpf = INV_MPU6050_REG_CONFIG, .lpf = INV_MPU6050_REG_CONFIG,
.accel_lpf = INV_MPU6500_REG_ACCEL_CONFIG_2,
.user_ctrl = INV_MPU6050_REG_USER_CTRL, .user_ctrl = INV_MPU6050_REG_USER_CTRL,
.fifo_en = INV_MPU6050_REG_FIFO_EN, .fifo_en = INV_MPU6050_REG_FIFO_EN,
.gyro_config = INV_MPU6050_REG_GYRO_CONFIG, .gyro_config = INV_MPU6050_REG_GYRO_CONFIG,
...@@ -210,6 +211,37 @@ int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st, bool power_on) ...@@ -210,6 +211,37 @@ int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st, bool power_on)
} }
EXPORT_SYMBOL_GPL(inv_mpu6050_set_power_itg); EXPORT_SYMBOL_GPL(inv_mpu6050_set_power_itg);
/**
* inv_mpu6050_set_lpf_regs() - set low pass filter registers, chip dependent
*
* MPU60xx/MPU9150 use only 1 register for accelerometer + gyroscope
* MPU6500 and above have a dedicated register for accelerometer
*/
static int inv_mpu6050_set_lpf_regs(struct inv_mpu6050_state *st,
enum inv_mpu6050_filter_e val)
{
int result;
result = regmap_write(st->map, st->reg->lpf, val);
if (result)
return result;
switch (st->chip_type) {
case INV_MPU6050:
case INV_MPU6000:
case INV_MPU9150:
/* old chips, nothing to do */
result = 0;
break;
default:
/* set accel lpf */
result = regmap_write(st->map, st->reg->accel_lpf, val);
break;
}
return result;
}
/** /**
* inv_mpu6050_init_config() - Initialize hardware, disable FIFO. * inv_mpu6050_init_config() - Initialize hardware, disable FIFO.
* *
...@@ -233,8 +265,7 @@ static int inv_mpu6050_init_config(struct iio_dev *indio_dev) ...@@ -233,8 +265,7 @@ static int inv_mpu6050_init_config(struct iio_dev *indio_dev)
if (result) if (result)
return result; return result;
d = INV_MPU6050_FILTER_20HZ; result = inv_mpu6050_set_lpf_regs(st, INV_MPU6050_FILTER_20HZ);
result = regmap_write(st->map, st->reg->lpf, d);
if (result) if (result)
return result; return result;
...@@ -537,6 +568,8 @@ static int inv_mpu6050_write_raw(struct iio_dev *indio_dev, ...@@ -537,6 +568,8 @@ static int inv_mpu6050_write_raw(struct iio_dev *indio_dev,
* would be alising. This function basically search for the * would be alising. This function basically search for the
* correct low pass parameters based on the fifo rate, e.g, * correct low pass parameters based on the fifo rate, e.g,
* sampling frequency. * sampling frequency.
*
* lpf is set automatically when setting sampling rate to avoid any aliases.
*/ */
static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)
{ {
...@@ -552,7 +585,7 @@ static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) ...@@ -552,7 +585,7 @@ static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)
while ((h < hz[i]) && (i < ARRAY_SIZE(d) - 1)) while ((h < hz[i]) && (i < ARRAY_SIZE(d) - 1))
i++; i++;
data = d[i]; data = d[i];
result = regmap_write(st->map, st->reg->lpf, data); result = inv_mpu6050_set_lpf_regs(st, data);
if (result) if (result)
return result; return result;
st->chip_config.lpf = data; st->chip_config.lpf = data;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
* struct inv_mpu6050_reg_map - Notable registers. * struct inv_mpu6050_reg_map - Notable registers.
* @sample_rate_div: Divider applied to gyro output rate. * @sample_rate_div: Divider applied to gyro output rate.
* @lpf: Configures internal low pass filter. * @lpf: Configures internal low pass filter.
* @accel_lpf: Configures accelerometer low pass filter.
* @user_ctrl: Enables/resets the FIFO. * @user_ctrl: Enables/resets the FIFO.
* @fifo_en: Determines which data will appear in FIFO. * @fifo_en: Determines which data will appear in FIFO.
* @gyro_config: gyro config register. * @gyro_config: gyro config register.
...@@ -47,6 +48,7 @@ ...@@ -47,6 +48,7 @@
struct inv_mpu6050_reg_map { struct inv_mpu6050_reg_map {
u8 sample_rate_div; u8 sample_rate_div;
u8 lpf; u8 lpf;
u8 accel_lpf;
u8 user_ctrl; u8 user_ctrl;
u8 fifo_en; u8 fifo_en;
u8 gyro_config; u8 gyro_config;
...@@ -188,6 +190,7 @@ struct inv_mpu6050_state { ...@@ -188,6 +190,7 @@ struct inv_mpu6050_state {
#define INV_MPU6050_FIFO_THRESHOLD 500 #define INV_MPU6050_FIFO_THRESHOLD 500
/* mpu6500 registers */ /* mpu6500 registers */
#define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D
#define INV_MPU6500_REG_ACCEL_OFFSET 0x77 #define INV_MPU6500_REG_ACCEL_OFFSET 0x77
/* delay time in milliseconds */ /* delay time in milliseconds */
......
...@@ -231,16 +231,12 @@ static int ad7152_write_raw_samp_freq(struct device *dev, int val) ...@@ -231,16 +231,12 @@ static int ad7152_write_raw_samp_freq(struct device *dev, int val)
if (i >= ARRAY_SIZE(ad7152_filter_rate_table)) if (i >= ARRAY_SIZE(ad7152_filter_rate_table))
i = ARRAY_SIZE(ad7152_filter_rate_table) - 1; i = ARRAY_SIZE(ad7152_filter_rate_table) - 1;
mutex_lock(&chip->state_lock);
ret = i2c_smbus_write_byte_data(chip->client, ret = i2c_smbus_write_byte_data(chip->client,
AD7152_REG_CFG2, AD7152_CFG2_OSR(i)); AD7152_REG_CFG2, AD7152_CFG2_OSR(i));
if (ret < 0) { if (ret < 0)
mutex_unlock(&chip->state_lock);
return ret; return ret;
}
chip->filter_rate_setup = i; chip->filter_rate_setup = i;
mutex_unlock(&chip->state_lock);
return ret; return ret;
} }
......
...@@ -160,7 +160,7 @@ static int isFileReadable(char *path) ...@@ -160,7 +160,7 @@ static int isFileReadable(char *path)
oldfs = get_fs(); set_fs(get_ds()); oldfs = get_fs(); set_fs(get_ds());
if (1!=readFile(fp, &buf, 1)) if (1!=readFile(fp, &buf, 1))
ret = PTR_ERR(fp); ret = -EINVAL;
set_fs(oldfs); set_fs(oldfs);
filp_close(fp, NULL); filp_close(fp, NULL);
......
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