iio: core: constitfy available_scan_mask
authorMichael Hennerich <michael.hennerich@analog.com>
Wed, 22 Feb 2012 12:16:49 +0000 (13:16 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 24 Feb 2012 20:14:04 +0000 (12:14 -0800)
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: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/iio/adc/max1363_core.c
drivers/staging/iio/iio.h
drivers/staging/iio/industrialio-buffer.c

index 3a5bd2084e64565c6940e913b8ebe1f68897b125..7f39ca3c936f11ade4749ec5366573830d4b6322 100644 (file)
@@ -1245,10 +1245,31 @@ static int max1363_initial_setup(struct max1363_state *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,
                                   const struct i2c_device_id *id)
 {
-       int ret, i;
+       int ret;
        struct max1363_state *st;
        struct iio_dev *indio_dev;
        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->client = client;
 
-       indio_dev->available_scan_masks
-               = kzalloc(BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*sizeof(long)*
-                         (st->chip_info->num_modes + 1), GFP_KERNEL);
-       if (!indio_dev->available_scan_masks) {
-               ret = -ENOMEM;
+       ret = max1363_alloc_scan_masks(indio_dev);
+       if (ret)
                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 */
        indio_dev->dev.parent = &client->dev;
        indio_dev->name = id->name;
index b9bce9aeb19e70e33c12ded435474ed976dc35d6..76a3f509e5a67c09a03b73656c48367a7830f927 100644 (file)
@@ -345,9 +345,9 @@ struct iio_dev {
        struct iio_buffer               *buffer;
        struct mutex                    mlock;
 
-       unsigned long                   *available_scan_masks;
+       const unsigned long             *available_scan_masks;
        unsigned                        masklength;
-       unsigned long                   *active_scan_mask;
+       const unsigned long             *active_scan_mask;
        struct iio_trigger              *trig;
        struct iio_poll_func            *pollfunc;
 
index d7b1e9e435aed4fa2302ae9491f79211d031fd35..386ba760f3f1b648578e140bc9361693cd7eea50 100644 (file)
@@ -489,9 +489,9 @@ ssize_t iio_buffer_show_enable(struct device *dev,
 EXPORT_SYMBOL(iio_buffer_show_enable);
 
 /* 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 long *mask)
+                                         const unsigned long *mask)
 {
        if (bitmap_empty(mask, masklength))
                return NULL;
@@ -554,7 +554,7 @@ EXPORT_SYMBOL(iio_sw_buffer_preenable);
 int iio_scan_mask_set(struct iio_dev *indio_dev,
                      struct iio_buffer *buffer, int bit)
 {
-       unsigned long *mask;
+       const unsigned long *mask;
        unsigned long *trialmask;
 
        trialmask = kmalloc(sizeof(*trialmask)*