mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 09:31:50 +00:00
Staging/IIO/Counter fixes for 5.2-rc6
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. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iGwEABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCXQyM7w8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymBUwCYn7LKiishfnvx8PpGF1lGHNmtYACgrNoAWKRZ PUlOWXEbtD7NAPtqn3c= =tXAQ -----END PGP SIGNATURE----- Merge tag 'staging-5.2-rc6' of git://git.kernel.org/pub/scm/linux/kernel/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
This commit is contained in:
commit
db54615e21
@ -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.
|
||||
|
@ -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.
|
||||
@ -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;
|
||||
|
@ -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++) {
|
||||
@ -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)
|
||||
@ -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)
|
||||
|
@ -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 */
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
@ -130,7 +131,7 @@ 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);
|
||||
@ -138,21 +139,23 @@ static int ad7150_read_event_config(struct iio_dev *indio_dev,
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user