mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-15 05:11:32 +00:00
The first round of IIO fixes for the 3.11 cycle.
This set is larger than I would like, partly due to my lack of review time in the weeks before the merge window and partly because a couple of large drivers and the subsystem as a whole seem to be getting a lot more exposure and testing recently. 1) A long term bug in trigger handling gave a double free of the device. 2) Wrong return value handling means offsets are ignored in iio_convert_raw_to_processed_unlocked. 3) The iio_channel_has_info utility function was incorrectly updated during the recent info_mask split, this is now fixed. 4) mxs-lradc has a couple of little fixes. 5) A couple of missing .driver_module entries meant that drivers could be removed from underneath their users. 6) Error path fixes for ad7303 and lis3l02dq. 7) The scale value for presure in the lps331ap driver was out by a factor of 100. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.20 (GNU/Linux) iQIcBAABAgAGBQJR5QAJAAoJEFSFNJnE9BaIG2oP/1kV33gxoFwoKMblG7J1paHU h8XdffT93XJTHnCMykCgI9KjohKtr0UmtDLXLXuZD9mkq6T9e6qh6xwpap68Nmwn bCPdaYfqU8cmJ794JV3uK2MUqQphTvV5WhjH4U7qJU8jDesSinPYxEH04DXVnCLC 600PHw8bbl4DGCYLgpDKeq0zZ/4joKFhItVNaRPCpJJB/MYbLkOXE8CLhSoGslKo IfpcBvuN7oYS4CbLqvnkMOmrSaI4a4eI3L6vG42zNuOQLPyL2dNZK3/ViJCJFbqX FbYbYvgApn04liyVkSDQAgW3fkQivF0Lh9R2kkHQ/meTqDMr+r6uvyQ6KDYgw6Px Xh79hwHn/mjT3xRWqtMeMJ85v/9I2dGpKeX2EUm4a8o3+5/gq/oyHR2eF2OZfvBn b3X1PYk29TkGN2K42JKwMJUqHFnVc4w91A9/TWTqz/cqFvBWvdJb8IJmijSug4NG /MN9U07QJgsH5sgRjhkorRe68dXvvBNAhka5ZX3TzrxUO74AdmJ/FscoFulevPgs MTpP8/OxRs4ez94SMNiudK6o6ycNCJYsyKEaF9utDhsJf3W04bXMIP2HvEmZRz14 DCh6v33/vqVjSnrHt95XVa37ahoGUClzAyqvJ+AbnlCXH9yvLjtvP6zLL2p014Zu UcK4x2wZrEhCH6RHPK1y =ratf -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-3.11a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: The first round of IIO fixes for the 3.11 cycle. This set is larger than I would like, partly due to my lack of review time in the weeks before the merge window and partly because a couple of large drivers and the subsystem as a whole seem to be getting a lot more exposure and testing recently. 1) A long term bug in trigger handling gave a double free of the device. 2) Wrong return value handling means offsets are ignored in iio_convert_raw_to_processed_unlocked. 3) The iio_channel_has_info utility function was incorrectly updated during the recent info_mask split, this is now fixed. 4) mxs-lradc has a couple of little fixes. 5) A couple of missing .driver_module entries meant that drivers could be removed from underneath their users. 6) Error path fixes for ad7303 and lis3l02dq. 7) The scale value for presure in the lps331ap driver was out by a factor of 100.
This commit is contained in:
commit
78077256bc
@ -183,6 +183,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
|||||||
|
|
||||||
static const struct iio_info tiadc_info = {
|
static const struct iio_info tiadc_info = {
|
||||||
.read_raw = &tiadc_read_raw,
|
.read_raw = &tiadc_read_raw,
|
||||||
|
.driver_module = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tiadc_probe(struct platform_device *pdev)
|
static int tiadc_probe(struct platform_device *pdev)
|
||||||
|
@ -235,8 +235,10 @@ static int ad7303_probe(struct spi_device *spi)
|
|||||||
|
|
||||||
if (ext_ref) {
|
if (ext_ref) {
|
||||||
st->vref_reg = regulator_get(&spi->dev, "REF");
|
st->vref_reg = regulator_get(&spi->dev, "REF");
|
||||||
if (IS_ERR(st->vref_reg))
|
if (IS_ERR(st->vref_reg)) {
|
||||||
|
ret = PTR_ERR(st->vref_reg);
|
||||||
goto err_disable_vdd_reg;
|
goto err_disable_vdd_reg;
|
||||||
|
}
|
||||||
|
|
||||||
ret = regulator_enable(st->vref_reg);
|
ret = regulator_enable(st->vref_reg);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -104,7 +104,7 @@ void iio_trigger_unregister(struct iio_trigger *trig_info)
|
|||||||
|
|
||||||
ida_simple_remove(&iio_trigger_ida, trig_info->id);
|
ida_simple_remove(&iio_trigger_ida, trig_info->id);
|
||||||
/* Possible issue in here */
|
/* Possible issue in here */
|
||||||
device_unregister(&trig_info->dev);
|
device_del(&trig_info->dev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iio_trigger_unregister);
|
EXPORT_SYMBOL(iio_trigger_unregister);
|
||||||
|
|
||||||
|
@ -451,7 +451,7 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET);
|
ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET);
|
||||||
if (ret == 0)
|
if (ret >= 0)
|
||||||
raw64 += offset;
|
raw64 += offset;
|
||||||
|
|
||||||
scale_type = iio_channel_read(chan, &scale_val, &scale_val2,
|
scale_type = iio_channel_read(chan, &scale_val, &scale_val2,
|
||||||
|
@ -28,7 +28,9 @@
|
|||||||
#include <linux/iio/common/st_sensors.h>
|
#include <linux/iio/common/st_sensors.h>
|
||||||
#include "st_pressure.h"
|
#include "st_pressure.h"
|
||||||
|
|
||||||
#define ST_PRESS_MBAR_TO_KPASCAL(x) (x * 10)
|
#define ST_PRESS_LSB_PER_MBAR 4096UL
|
||||||
|
#define ST_PRESS_KPASCAL_NANO_SCALE (100000000UL / \
|
||||||
|
ST_PRESS_LSB_PER_MBAR)
|
||||||
#define ST_PRESS_NUMBER_DATA_CHANNELS 1
|
#define ST_PRESS_NUMBER_DATA_CHANNELS 1
|
||||||
|
|
||||||
/* DEFAULT VALUE FOR SENSORS */
|
/* DEFAULT VALUE FOR SENSORS */
|
||||||
@ -51,8 +53,8 @@
|
|||||||
#define ST_PRESS_1_FS_ADDR 0x23
|
#define ST_PRESS_1_FS_ADDR 0x23
|
||||||
#define ST_PRESS_1_FS_MASK 0x30
|
#define ST_PRESS_1_FS_MASK 0x30
|
||||||
#define ST_PRESS_1_FS_AVL_1260_VAL 0x00
|
#define ST_PRESS_1_FS_AVL_1260_VAL 0x00
|
||||||
#define ST_PRESS_1_FS_AVL_1260_GAIN ST_PRESS_MBAR_TO_KPASCAL(244141)
|
|
||||||
#define ST_PRESS_1_FS_AVL_TEMP_GAIN 2083000
|
#define ST_PRESS_1_FS_AVL_TEMP_GAIN 2083000
|
||||||
|
#define ST_PRESS_1_FS_AVL_1260_GAIN ST_PRESS_KPASCAL_NANO_SCALE
|
||||||
#define ST_PRESS_1_BDU_ADDR 0x20
|
#define ST_PRESS_1_BDU_ADDR 0x20
|
||||||
#define ST_PRESS_1_BDU_MASK 0x04
|
#define ST_PRESS_1_BDU_MASK 0x04
|
||||||
#define ST_PRESS_1_DRDY_IRQ_ADDR 0x22
|
#define ST_PRESS_1_DRDY_IRQ_ADDR 0x22
|
||||||
|
@ -257,6 +257,8 @@ static int lis3l02dq_read_raw(struct iio_dev *indio_dev,
|
|||||||
ret = lis3l02dq_read_reg_s16(indio_dev, reg, val);
|
ret = lis3l02dq_read_reg_s16(indio_dev, reg, val);
|
||||||
}
|
}
|
||||||
mutex_unlock(&indio_dev->mlock);
|
mutex_unlock(&indio_dev->mlock);
|
||||||
|
if (ret < 0)
|
||||||
|
goto error_ret;
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
case IIO_CHAN_INFO_SCALE:
|
case IIO_CHAN_INFO_SCALE:
|
||||||
*val = 0;
|
*val = 0;
|
||||||
|
@ -517,6 +517,7 @@ static const struct iio_info ad7291_info = {
|
|||||||
.read_event_value = &ad7291_read_event_value,
|
.read_event_value = &ad7291_read_event_value,
|
||||||
.write_event_value = &ad7291_write_event_value,
|
.write_event_value = &ad7291_write_event_value,
|
||||||
.event_attrs = &ad7291_event_attribute_group,
|
.event_attrs = &ad7291_event_attribute_group,
|
||||||
|
.driver_module = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ad7291_probe(struct i2c_client *client,
|
static int ad7291_probe(struct i2c_client *client,
|
||||||
|
@ -234,7 +234,6 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
|
|||||||
{
|
{
|
||||||
struct mxs_lradc *lradc = iio_priv(iio_dev);
|
struct mxs_lradc *lradc = iio_priv(iio_dev);
|
||||||
int ret;
|
int ret;
|
||||||
unsigned long mask;
|
|
||||||
|
|
||||||
if (m != IIO_CHAN_INFO_RAW)
|
if (m != IIO_CHAN_INFO_RAW)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -243,12 +242,6 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
|
|||||||
if (chan->channel > LRADC_MAX_TOTAL_CHANS)
|
if (chan->channel > LRADC_MAX_TOTAL_CHANS)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Validate the channel if it doesn't intersect with reserved chans. */
|
|
||||||
bitmap_set(&mask, chan->channel, 1);
|
|
||||||
ret = iio_validate_scan_mask_onehot(iio_dev, &mask);
|
|
||||||
if (ret)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See if there is no buffered operation in progess. If there is, simply
|
* See if there is no buffered operation in progess. If there is, simply
|
||||||
* bail out. This can be improved to support both buffered and raw IO at
|
* bail out. This can be improved to support both buffered and raw IO at
|
||||||
@ -661,12 +654,13 @@ static int mxs_lradc_trigger_init(struct iio_dev *iio)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct iio_trigger *trig;
|
struct iio_trigger *trig;
|
||||||
|
struct mxs_lradc *lradc = iio_priv(iio);
|
||||||
|
|
||||||
trig = iio_trigger_alloc("%s-dev%i", iio->name, iio->id);
|
trig = iio_trigger_alloc("%s-dev%i", iio->name, iio->id);
|
||||||
if (trig == NULL)
|
if (trig == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
trig->dev.parent = iio->dev.parent;
|
trig->dev.parent = lradc->dev;
|
||||||
iio_trigger_set_drvdata(trig, iio);
|
iio_trigger_set_drvdata(trig, iio);
|
||||||
trig->ops = &mxs_lradc_trigger_ops;
|
trig->ops = &mxs_lradc_trigger_ops;
|
||||||
|
|
||||||
@ -676,15 +670,17 @@ static int mxs_lradc_trigger_init(struct iio_dev *iio)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
iio->trig = trig;
|
lradc->trig = trig;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mxs_lradc_trigger_remove(struct iio_dev *iio)
|
static void mxs_lradc_trigger_remove(struct iio_dev *iio)
|
||||||
{
|
{
|
||||||
iio_trigger_unregister(iio->trig);
|
struct mxs_lradc *lradc = iio_priv(iio);
|
||||||
iio_trigger_free(iio->trig);
|
|
||||||
|
iio_trigger_unregister(lradc->trig);
|
||||||
|
iio_trigger_free(lradc->trig);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mxs_lradc_buffer_preenable(struct iio_dev *iio)
|
static int mxs_lradc_buffer_preenable(struct iio_dev *iio)
|
||||||
|
@ -211,8 +211,8 @@ struct iio_chan_spec {
|
|||||||
static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,
|
static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,
|
||||||
enum iio_chan_info_enum type)
|
enum iio_chan_info_enum type)
|
||||||
{
|
{
|
||||||
return (chan->info_mask_separate & type) |
|
return (chan->info_mask_separate & BIT(type)) |
|
||||||
(chan->info_mask_shared_by_type & type);
|
(chan->info_mask_shared_by_type & BIT(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IIO_ST(si, rb, sb, sh) \
|
#define IIO_ST(si, rb, sb, sh) \
|
||||||
|
Loading…
Reference in New Issue
Block a user