Skip to content

Commit

Permalink
Merge tag 'staging-5.2-rc6' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/gregkh/staging

Pull staging/IIO/counter fixes from Greg KH:
 "Here are some small driver bugfixes for some staging/iio/counter
  drivers.

  Staging and IIO have been lumped together for a while, as those
  subsystems cross the areas a log, and counter is used by IIO, so
  that's why they are all in one pull request here.

  These are small fixes for reported issues in some iio drivers, the
  erofs filesystem, and a build issue for counter code.

  All have been in linux-next with no reported issues"

* tag 'staging-5.2-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  staging: erofs: add requirements field in superblock
  counter/ftm-quaddec: Add missing dependencies in Kconfig
  staging: iio: adt7316: Fix build errors when GPIOLIB is not set
  iio: temperature: mlx90632 Relax the compatibility check
  iio: imu: st_lsm6dsx: fix PM support for st_lsm6dsx i2c controller
  staging:iio:ad7150: fix threshold mode config bit
  • Loading branch information
Linus Torvalds committed Jun 21, 2019
2 parents b7b8a44 + 9b94107 commit db54615
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 22 deletions.
1 change: 1 addition & 0 deletions drivers/counter/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ config STM32_LPTIMER_CNT

config FTM_QUADDEC
tristate "Flex Timer Module Quadrature decoder driver"
depends on HAS_IOMEM && OF
help
Select this option to enable the Flex Timer Quadrature decoder
driver.
Expand Down
2 changes: 2 additions & 0 deletions drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ struct st_lsm6dsx_sensor {
* @conf_lock: Mutex to prevent concurrent FIFO configuration update.
* @page_lock: Mutex to prevent concurrent memory page configuration.
* @fifo_mode: FIFO operating mode supported by the device.
* @suspend_mask: Suspended sensor bitmask.
* @enable_mask: Enabled sensor bitmask.
* @ts_sip: Total number of timestamp samples in a given pattern.
* @sip: Total number of samples (acc/gyro/ts) in a given pattern.
Expand All @@ -287,6 +288,7 @@ struct st_lsm6dsx_hw {
struct mutex page_lock;

enum st_lsm6dsx_fifo_mode fifo_mode;
u8 suspend_mask;
u8 enable_mask;
u8 ts_sip;
u8 sip;
Expand Down
25 changes: 17 additions & 8 deletions drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1109,8 +1109,6 @@ static int __maybe_unused st_lsm6dsx_suspend(struct device *dev)
{
struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
struct st_lsm6dsx_sensor *sensor;
const struct st_lsm6dsx_reg *reg;
unsigned int data;
int i, err = 0;

for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {
Expand All @@ -1121,12 +1119,16 @@ static int __maybe_unused st_lsm6dsx_suspend(struct device *dev)
if (!(hw->enable_mask & BIT(sensor->id)))
continue;

reg = &st_lsm6dsx_odr_table[sensor->id].reg;
data = ST_LSM6DSX_SHIFT_VAL(0, reg->mask);
err = st_lsm6dsx_update_bits_locked(hw, reg->addr, reg->mask,
data);
if (sensor->id == ST_LSM6DSX_ID_EXT0 ||
sensor->id == ST_LSM6DSX_ID_EXT1 ||
sensor->id == ST_LSM6DSX_ID_EXT2)
err = st_lsm6dsx_shub_set_enable(sensor, false);
else
err = st_lsm6dsx_sensor_set_enable(sensor, false);
if (err < 0)
return err;

hw->suspend_mask |= BIT(sensor->id);
}

if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS)
Expand All @@ -1146,12 +1148,19 @@ static int __maybe_unused st_lsm6dsx_resume(struct device *dev)
continue;

sensor = iio_priv(hw->iio_devs[i]);
if (!(hw->enable_mask & BIT(sensor->id)))
if (!(hw->suspend_mask & BIT(sensor->id)))
continue;

err = st_lsm6dsx_set_odr(sensor, sensor->odr);
if (sensor->id == ST_LSM6DSX_ID_EXT0 ||
sensor->id == ST_LSM6DSX_ID_EXT1 ||
sensor->id == ST_LSM6DSX_ID_EXT2)
err = st_lsm6dsx_shub_set_enable(sensor, true);
else
err = st_lsm6dsx_sensor_set_enable(sensor, true);
if (err < 0)
return err;

hw->suspend_mask &= ~BIT(sensor->id);
}

if (hw->enable_mask)
Expand Down
9 changes: 7 additions & 2 deletions drivers/iio/temperature/mlx90632.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@
/* Magic constants */
#define MLX90632_ID_MEDICAL 0x0105 /* EEPROM DSPv5 Medical device id */
#define MLX90632_ID_CONSUMER 0x0205 /* EEPROM DSPv5 Consumer device id */
#define MLX90632_DSP_VERSION 5 /* DSP version */
#define MLX90632_DSP_MASK GENMASK(7, 0) /* DSP version in EE_VERSION */
#define MLX90632_RESET_CMD 0x0006 /* Reset sensor (address or global) */
#define MLX90632_REF_12 12LL /**< ResCtrlRef value of Ch 1 or Ch 2 */
#define MLX90632_REF_3 12LL /**< ResCtrlRef value of Channel 3 */
Expand Down Expand Up @@ -667,10 +669,13 @@ static int mlx90632_probe(struct i2c_client *client,
} else if (read == MLX90632_ID_CONSUMER) {
dev_dbg(&client->dev,
"Detected Consumer EEPROM calibration %x\n", read);
} else if ((read & MLX90632_DSP_MASK) == MLX90632_DSP_VERSION) {
dev_dbg(&client->dev,
"Detected Unknown EEPROM calibration %x\n", read);
} else {
dev_err(&client->dev,
"EEPROM version mismatch %x (expected %x or %x)\n",
read, MLX90632_ID_CONSUMER, MLX90632_ID_MEDICAL);
"Wrong DSP version %x (expected %x)\n",
read, MLX90632_DSP_VERSION);
return -EPROTONOSUPPORT;
}

Expand Down
13 changes: 10 additions & 3 deletions drivers/staging/erofs/erofs_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,16 @@
#define EROFS_SUPER_MAGIC_V1 0xE0F5E1E2
#define EROFS_SUPER_OFFSET 1024

/*
* Any bits that aren't in EROFS_ALL_REQUIREMENTS should be
* incompatible with this kernel version.
*/
#define EROFS_ALL_REQUIREMENTS 0

struct erofs_super_block {
/* 0 */__le32 magic; /* in the little endian */
/* 4 */__le32 checksum; /* crc32c(super_block) */
/* 8 */__le32 features;
/* 8 */__le32 features; /* (aka. feature_compat) */
/* 12 */__u8 blkszbits; /* support block_size == PAGE_SIZE only */
/* 13 */__u8 reserved;

Expand All @@ -34,9 +40,10 @@ struct erofs_super_block {
/* 44 */__le32 xattr_blkaddr;
/* 48 */__u8 uuid[16]; /* 128-bit uuid for volume */
/* 64 */__u8 volume_name[16]; /* volume name */
/* 80 */__le32 requirements; /* (aka. feature_incompat) */

/* 80 */__u8 reserved2[48]; /* 128 bytes */
} __packed;
/* 84 */__u8 reserved2[44];
} __packed; /* 128 bytes */

/*
* erofs inode data mapping:
Expand Down
2 changes: 2 additions & 0 deletions drivers/staging/erofs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ struct erofs_sb_info {

u8 uuid[16]; /* 128-bit uuid for volume */
u8 volume_name[16]; /* volume name */
u32 requirements;

char *dev_name;

unsigned int mount_opt;
Expand Down
19 changes: 19 additions & 0 deletions drivers/staging/erofs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,22 @@ static void free_inode(struct inode *inode)
kmem_cache_free(erofs_inode_cachep, vi);
}

static bool check_layout_compatibility(struct super_block *sb,
struct erofs_super_block *layout)
{
const unsigned int requirements = le32_to_cpu(layout->requirements);

EROFS_SB(sb)->requirements = requirements;

/* check if current kernel meets all mandatory requirements */
if (requirements & (~EROFS_ALL_REQUIREMENTS)) {
errln("unidentified requirements %x, please upgrade kernel version",
requirements & ~EROFS_ALL_REQUIREMENTS);
return false;
}
return true;
}

static int superblock_read(struct super_block *sb)
{
struct erofs_sb_info *sbi;
Expand Down Expand Up @@ -104,6 +120,9 @@ static int superblock_read(struct super_block *sb)
goto out;
}

if (!check_layout_compatibility(sb, layout))
goto out;

sbi->blocks = le32_to_cpu(layout->blocks);
sbi->meta_blkaddr = le32_to_cpu(layout->meta_blkaddr);
#ifdef CONFIG_EROFS_FS_XATTR
Expand Down
3 changes: 2 additions & 1 deletion drivers/staging/iio/addac/adt7316.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
*/

#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/irq.h>
#include <linux/workqueue.h>
#include <linux/device.h>
#include <linux/kernel.h>
Expand Down
19 changes: 11 additions & 8 deletions drivers/staging/iio/cdc/ad7150.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* Copyright 2010-2011 Analog Devices Inc.
*/

#include <linux/bitfield.h>
#include <linux/interrupt.h>
#include <linux/device.h>
#include <linux/kernel.h>
Expand Down Expand Up @@ -130,29 +131,31 @@ static int ad7150_read_event_config(struct iio_dev *indio_dev,
{
int ret;
u8 threshtype;
bool adaptive;
bool thrfixed;
struct ad7150_chip_info *chip = iio_priv(indio_dev);

ret = i2c_smbus_read_byte_data(chip->client, AD7150_CFG);
if (ret < 0)
return ret;

threshtype = (ret >> 5) & 0x03;
adaptive = !!(ret & 0x80);

/*check if threshold mode is fixed or adaptive*/
thrfixed = FIELD_GET(AD7150_CFG_FIX, ret);

switch (type) {
case IIO_EV_TYPE_MAG_ADAPTIVE:
if (dir == IIO_EV_DIR_RISING)
return adaptive && (threshtype == 0x1);
return adaptive && (threshtype == 0x0);
return !thrfixed && (threshtype == 0x1);
return !thrfixed && (threshtype == 0x0);
case IIO_EV_TYPE_THRESH_ADAPTIVE:
if (dir == IIO_EV_DIR_RISING)
return adaptive && (threshtype == 0x3);
return adaptive && (threshtype == 0x2);
return !thrfixed && (threshtype == 0x3);
return !thrfixed && (threshtype == 0x2);
case IIO_EV_TYPE_THRESH:
if (dir == IIO_EV_DIR_RISING)
return !adaptive && (threshtype == 0x1);
return !adaptive && (threshtype == 0x0);
return thrfixed && (threshtype == 0x1);
return thrfixed && (threshtype == 0x0);
default:
break;
}
Expand Down

0 comments on commit db54615

Please sign in to comment.