mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-02 23:30:04 +00:00
3rd round of IIO fixes for the 4.2 cycle.
* bmc150_magn - add missing regmap dependency and ensure on a wrong chip case report hte chip id rather than a previous return value. * mmc35240 - Fill a null pointer derefrence and wrong SET / RESET logic that results in North and South being swapped. * mlx96014 - correct the offset value reported to userspace (wrong sign) * vf610 - Prevent non aligned register reading. * mcp320x - Another null pointer deference bug. * mma8452 - change threshold type from THRESH to MAG to reflect the fact that the sign of the signal is not known when the event is signaled. * stk3310 - move device registert to end of probe to avoid race conditions when coming up, check for invalid client->irq values and make it work for both endian types of host. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJVsUrgAAoJEFSFNJnE9BaI0U4P/1io/Qzbsoj0BTShAfIo4sxo 7zdewcepjkC/X6VwyOgUsLfX9qq4HUOjCyq7HlJVgRpc34QySE0TRQY1sw72LeH8 L5fu2GWk1U7e1+pVN6fA2xz/OY/Emus1FAIAnWI6fzfT4GCSJ3jPbnCmk7Z0c6ce CxJmKPGWs17eMhazhfKXu0NAP8WHGhfoUsKr5I8o1tU/gIZJck2NI4PPjGRT5tLX tACKXba9DIsB7vZPaSGNskvlIBDM0Wxy4RL9ZzmWxBSG63HasLmjqUv9taZf+UX/ eYsbDGhPZwy3CVaf9xa+56juyMYrRR87p33D0bZ7gMsBtTx210WjOBtaPNkO4LyC KjkSKYi46iSwKIOM575wDJPw5pxUXTYZaiS4u3RZ7mDiHsPmkKe7I5/OA/zKJ91J /xHRkU8GXzZdDwzZjaoZ+0BO0q4feWEvOEKkJVUgE6IlLuE//+AQj0N+aMWmVyV5 M/1SfyQFdZhovjrJtSjPkbQFl0l9QhkzBr5vt8Q2c6z2dOokxkahbNOvV1yBX7HA FCreFGbW4eTmNCY8a8CZ0WyOUZXj8jKBShaFkfYBBm8icgw2Zq/CXv5LeypuihzC MP8wmxUbKxZTBWSk4TxWMFYpWCQaGQP42TxQju8DpHQpEiKHhE6SGpX9P+3u1NRo Dej1LTUx5LlKzPpTXBBG =AEVb -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-4.2c' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: 3rd round of IIO fixes for the 4.2 cycle. * bmc150_magn - add missing regmap dependency and ensure on a wrong chip case report hte chip id rather than a previous return value. * mmc35240 - Fill a null pointer derefrence and wrong SET / RESET logic that results in North and South being swapped. * mlx96014 - correct the offset value reported to userspace (wrong sign) * vf610 - Prevent non aligned register reading. * mcp320x - Another null pointer deference bug. * mma8452 - change threshold type from THRESH to MAG to reflect the fact that the sign of the signal is not known when the event is signaled. * stk3310 - move device registert to end of probe to avoid race conditions when coming up, check for invalid client->irq values and make it work for both endian types of host.
This commit is contained in:
commit
00243b1d18
@ -557,21 +557,21 @@ static void mma8452_transient_interrupt(struct iio_dev *indio_dev)
|
||||
if (src & MMA8452_TRANSIENT_SRC_XTRANSE)
|
||||
iio_push_event(indio_dev,
|
||||
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
IIO_EV_TYPE_MAG,
|
||||
IIO_EV_DIR_RISING),
|
||||
ts);
|
||||
|
||||
if (src & MMA8452_TRANSIENT_SRC_YTRANSE)
|
||||
iio_push_event(indio_dev,
|
||||
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
IIO_EV_TYPE_MAG,
|
||||
IIO_EV_DIR_RISING),
|
||||
ts);
|
||||
|
||||
if (src & MMA8452_TRANSIENT_SRC_ZTRANSE)
|
||||
iio_push_event(indio_dev,
|
||||
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
IIO_EV_TYPE_MAG,
|
||||
IIO_EV_DIR_RISING),
|
||||
ts);
|
||||
}
|
||||
@ -644,7 +644,7 @@ static int mma8452_reg_access_dbg(struct iio_dev *indio_dev,
|
||||
|
||||
static const struct iio_event_spec mma8452_transient_event[] = {
|
||||
{
|
||||
.type = IIO_EV_TYPE_THRESH,
|
||||
.type = IIO_EV_TYPE_MAG,
|
||||
.dir = IIO_EV_DIR_RISING,
|
||||
.mask_separate = BIT(IIO_EV_INFO_ENABLE),
|
||||
.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
|
||||
|
@ -299,6 +299,8 @@ static int mcp320x_probe(struct spi_device *spi)
|
||||
indio_dev->channels = chip_info->channels;
|
||||
indio_dev->num_channels = chip_info->num_channels;
|
||||
|
||||
adc->chip_info = chip_info;
|
||||
|
||||
adc->transfer[0].tx_buf = &adc->tx_buf;
|
||||
adc->transfer[0].len = sizeof(adc->tx_buf);
|
||||
adc->transfer[1].rx_buf = adc->rx_buf;
|
||||
|
@ -635,7 +635,7 @@ static int vf610_adc_reg_access(struct iio_dev *indio_dev,
|
||||
struct vf610_adc *info = iio_priv(indio_dev);
|
||||
|
||||
if ((readval == NULL) ||
|
||||
(!(reg % 4) || (reg > VF610_REG_ADC_PCTL)))
|
||||
((reg % 4) || (reg > VF610_REG_ADC_PCTL)))
|
||||
return -EINVAL;
|
||||
|
||||
*readval = readl(info->regs + reg);
|
||||
|
@ -200,7 +200,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev,
|
||||
int *val, int *val2)
|
||||
{
|
||||
u8 reg;
|
||||
u16 buf;
|
||||
__be16 buf;
|
||||
int ret;
|
||||
struct stk3310_data *data = iio_priv(indio_dev);
|
||||
|
||||
@ -222,7 +222,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev,
|
||||
dev_err(&data->client->dev, "register read failed\n");
|
||||
return ret;
|
||||
}
|
||||
*val = swab16(buf);
|
||||
*val = be16_to_cpu(buf);
|
||||
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
@ -235,7 +235,7 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
|
||||
int val, int val2)
|
||||
{
|
||||
u8 reg;
|
||||
u16 buf;
|
||||
__be16 buf;
|
||||
int ret;
|
||||
unsigned int index;
|
||||
struct stk3310_data *data = iio_priv(indio_dev);
|
||||
@ -252,7 +252,7 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
buf = swab16(val);
|
||||
buf = cpu_to_be16(val);
|
||||
ret = regmap_bulk_write(data->regmap, reg, &buf, 2);
|
||||
if (ret < 0)
|
||||
dev_err(&client->dev, "failed to set PS threshold!\n");
|
||||
@ -301,7 +301,7 @@ static int stk3310_read_raw(struct iio_dev *indio_dev,
|
||||
int *val, int *val2, long mask)
|
||||
{
|
||||
u8 reg;
|
||||
u16 buf;
|
||||
__be16 buf;
|
||||
int ret;
|
||||
unsigned int index;
|
||||
struct stk3310_data *data = iio_priv(indio_dev);
|
||||
@ -322,7 +322,7 @@ static int stk3310_read_raw(struct iio_dev *indio_dev,
|
||||
mutex_unlock(&data->lock);
|
||||
return ret;
|
||||
}
|
||||
*val = swab16(buf);
|
||||
*val = be16_to_cpu(buf);
|
||||
mutex_unlock(&data->lock);
|
||||
return IIO_VAL_INT;
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
@ -608,13 +608,7 @@ static int stk3310_probe(struct i2c_client *client,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = iio_device_register(indio_dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "device_register failed\n");
|
||||
stk3310_set_state(data, STK3310_STATE_STANDBY);
|
||||
}
|
||||
|
||||
if (client->irq <= 0)
|
||||
if (client->irq < 0)
|
||||
client->irq = stk3310_gpio_probe(client);
|
||||
|
||||
if (client->irq >= 0) {
|
||||
@ -629,6 +623,12 @@ static int stk3310_probe(struct i2c_client *client,
|
||||
client->irq);
|
||||
}
|
||||
|
||||
ret = iio_device_register(indio_dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "device_register failed\n");
|
||||
stk3310_set_state(data, STK3310_STATE_STANDBY);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -90,6 +90,7 @@ config IIO_ST_MAGN_SPI_3AXIS
|
||||
config BMC150_MAGN
|
||||
tristate "Bosch BMC150 Magnetometer Driver"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
|
@ -706,11 +706,11 @@ static int bmc150_magn_init(struct bmc150_magn_data *data)
|
||||
goto err_poweroff;
|
||||
}
|
||||
if (chip_id != BMC150_MAGN_CHIP_ID_VAL) {
|
||||
dev_err(&data->client->dev, "Invalid chip id 0x%x\n", ret);
|
||||
dev_err(&data->client->dev, "Invalid chip id 0x%x\n", chip_id);
|
||||
ret = -ENODEV;
|
||||
goto err_poweroff;
|
||||
}
|
||||
dev_dbg(&data->client->dev, "Chip id %x\n", ret);
|
||||
dev_dbg(&data->client->dev, "Chip id %x\n", chip_id);
|
||||
|
||||
preset = bmc150_magn_presets_table[BMC150_MAGN_DEFAULT_PRESET];
|
||||
ret = bmc150_magn_set_odr(data, preset.odr);
|
||||
|
@ -202,8 +202,8 @@ static int mmc35240_hw_set(struct mmc35240_data *data, bool set)
|
||||
coil_bit = MMC35240_CTRL0_RESET_BIT;
|
||||
|
||||
return regmap_update_bits(data->regmap, MMC35240_REG_CTRL0,
|
||||
MMC35240_CTRL0_REFILL_BIT,
|
||||
coil_bit);
|
||||
coil_bit, coil_bit);
|
||||
|
||||
}
|
||||
|
||||
static int mmc35240_init(struct mmc35240_data *data)
|
||||
@ -222,14 +222,15 @@ static int mmc35240_init(struct mmc35240_data *data)
|
||||
|
||||
/*
|
||||
* make sure we restore sensor characteristics, by doing
|
||||
* a RESET/SET sequence
|
||||
* a SET/RESET sequence, the axis polarity being naturally
|
||||
* aligned after RESET
|
||||
*/
|
||||
ret = mmc35240_hw_set(data, false);
|
||||
ret = mmc35240_hw_set(data, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
usleep_range(MMC53240_WAIT_SET_RESET, MMC53240_WAIT_SET_RESET + 1);
|
||||
|
||||
ret = mmc35240_hw_set(data, true);
|
||||
ret = mmc35240_hw_set(data, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -503,6 +504,7 @@ static int mmc35240_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
data = iio_priv(indio_dev);
|
||||
i2c_set_clientdata(client, indio_dev);
|
||||
data->client = client;
|
||||
data->regmap = regmap;
|
||||
data->res = MMC35240_16_BITS_SLOW;
|
||||
|
@ -204,7 +204,7 @@ static int mlx90614_read_raw(struct iio_dev *indio_dev,
|
||||
*val = ret;
|
||||
return IIO_VAL_INT;
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
*val = 13657;
|
||||
*val = -13657;
|
||||
*val2 = 500000;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
|
Loading…
Reference in New Issue
Block a user