Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd4361c7 authored by Michael Hennerich's avatar Michael Hennerich Committed by Greg Kroah-Hartman
Browse files

iio: core: constitfy available_scan_mask



The core must not modify available_scan_mask, because it causes problems
with drivers where multiple instances of the driver share the same mask set.
So make this explicit by marking available scan masks as const.

The max1363 driver needs some minor adjustment to accommodate this change.
Pull scan mask allocation into a separate function.

Signed-off-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Acked-by: default avatarJonathan Cameron <jic23@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 004d8133
Loading
Loading
Loading
Loading
+24 −12
Original line number Original line Diff line number Diff line
@@ -1245,10 +1245,31 @@ static int max1363_initial_setup(struct max1363_state *st)
	return max1363_set_scan_mode(st);
	return max1363_set_scan_mode(st);
}
}


static int __devinit max1363_alloc_scan_masks(struct iio_dev *indio_dev)
{
	struct max1363_state *st = iio_priv(indio_dev);
	unsigned long *masks;
	int i;

	masks = kzalloc(BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*sizeof(long)*
			  (st->chip_info->num_modes + 1), GFP_KERNEL);
	if (!masks)
		return -ENOMEM;

	for (i = 0; i < st->chip_info->num_modes; i++)
		bitmap_copy(masks + BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
			    max1363_mode_table[st->chip_info->mode_list[i]]
			    .modemask, MAX1363_MAX_CHANNELS);

	indio_dev->available_scan_masks = masks;

	return 0;
}

static int __devinit max1363_probe(struct i2c_client *client,
static int __devinit max1363_probe(struct i2c_client *client,
				   const struct i2c_device_id *id)
				   const struct i2c_device_id *id)
{
{
	int ret, i;
	int ret;
	struct max1363_state *st;
	struct max1363_state *st;
	struct iio_dev *indio_dev;
	struct iio_dev *indio_dev;
	struct regulator *reg;
	struct regulator *reg;
@@ -1276,19 +1297,10 @@ static int __devinit max1363_probe(struct i2c_client *client,
	st->chip_info = &max1363_chip_info_tbl[id->driver_data];
	st->chip_info = &max1363_chip_info_tbl[id->driver_data];
	st->client = client;
	st->client = client;


	indio_dev->available_scan_masks
	ret = max1363_alloc_scan_masks(indio_dev);
		= kzalloc(BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*sizeof(long)*
	if (ret)
			  (st->chip_info->num_modes + 1), GFP_KERNEL);
	if (!indio_dev->available_scan_masks) {
		ret = -ENOMEM;
		goto error_free_device;
		goto error_free_device;
	}


	for (i = 0; i < st->chip_info->num_modes; i++)
		bitmap_copy(indio_dev->available_scan_masks +
			    BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
			    max1363_mode_table[st->chip_info->mode_list[i]]
			    .modemask, MAX1363_MAX_CHANNELS);
	/* Estabilish that the iio_dev is a child of the i2c device */
	/* Estabilish that the iio_dev is a child of the i2c device */
	indio_dev->dev.parent = &client->dev;
	indio_dev->dev.parent = &client->dev;
	indio_dev->name = id->name;
	indio_dev->name = id->name;
+2 −2
Original line number Original line Diff line number Diff line
@@ -345,9 +345,9 @@ struct iio_dev {
	struct iio_buffer		*buffer;
	struct iio_buffer		*buffer;
	struct mutex			mlock;
	struct mutex			mlock;


	unsigned long			*available_scan_masks;
	const unsigned long		*available_scan_masks;
	unsigned			masklength;
	unsigned			masklength;
	unsigned long			*active_scan_mask;
	const unsigned long		*active_scan_mask;
	struct iio_trigger		*trig;
	struct iio_trigger		*trig;
	struct iio_poll_func		*pollfunc;
	struct iio_poll_func		*pollfunc;


+3 −3
Original line number Original line Diff line number Diff line
@@ -489,9 +489,9 @@ ssize_t iio_buffer_show_enable(struct device *dev,
EXPORT_SYMBOL(iio_buffer_show_enable);
EXPORT_SYMBOL(iio_buffer_show_enable);


/* note NULL used as error indicator as it doesn't make sense. */
/* note NULL used as error indicator as it doesn't make sense. */
static unsigned long *iio_scan_mask_match(unsigned long *av_masks,
static const unsigned long *iio_scan_mask_match(const unsigned long *av_masks,
					  unsigned int masklength,
					  unsigned int masklength,
					  unsigned long *mask)
					  const unsigned long *mask)
{
{
	if (bitmap_empty(mask, masklength))
	if (bitmap_empty(mask, masklength))
		return NULL;
		return NULL;
@@ -554,7 +554,7 @@ EXPORT_SYMBOL(iio_sw_buffer_preenable);
int iio_scan_mask_set(struct iio_dev *indio_dev,
int iio_scan_mask_set(struct iio_dev *indio_dev,
		      struct iio_buffer *buffer, int bit)
		      struct iio_buffer *buffer, int bit)
{
{
	unsigned long *mask;
	const unsigned long *mask;
	unsigned long *trialmask;
	unsigned long *trialmask;


	trialmask = kmalloc(sizeof(*trialmask)*
	trialmask = kmalloc(sizeof(*trialmask)*