ASoC: SOF: Intel: bdw: remove duplicating driver data retrieval
[linux-2.6-microblaze.git] / drivers / iio / industrialio-buffer.c
index b078eb2..06141ca 100644 (file)
@@ -510,7 +510,7 @@ static ssize_t iio_scan_el_store(struct device *dev,
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
        struct iio_buffer *buffer = this_attr->buffer;
 
-       ret = strtobool(buf, &state);
+       ret = kstrtobool(buf, &state);
        if (ret < 0)
                return ret;
        mutex_lock(&indio_dev->mlock);
@@ -557,7 +557,7 @@ static ssize_t iio_scan_el_ts_store(struct device *dev,
        struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
        bool state;
 
-       ret = strtobool(buf, &state);
+       ret = kstrtobool(buf, &state);
        if (ret < 0)
                return ret;
 
@@ -915,7 +915,7 @@ static int iio_verify_update(struct iio_dev *indio_dev,
                if (scan_mask == NULL)
                        return -EINVAL;
        } else {
-           scan_mask = compound_mask;
+               scan_mask = compound_mask;
        }
 
        config->scan_bytes = iio_compute_scan_bytes(indio_dev,
@@ -1059,13 +1059,13 @@ static int iio_enable_buffers(struct iio_dev *indio_dev,
        struct iio_device_config *config)
 {
        struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
-       struct iio_buffer *buffer;
+       struct iio_buffer *buffer, *tmp = NULL;
        int ret;
 
        indio_dev->active_scan_mask = config->scan_mask;
        indio_dev->scan_timestamp = config->scan_timestamp;
        indio_dev->scan_bytes = config->scan_bytes;
-       indio_dev->currentmode = config->mode;
+       iio_dev_opaque->currentmode = config->mode;
 
        iio_update_demux(indio_dev);
 
@@ -1097,11 +1097,13 @@ static int iio_enable_buffers(struct iio_dev *indio_dev,
 
        list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) {
                ret = iio_buffer_enable(buffer, indio_dev);
-               if (ret)
+               if (ret) {
+                       tmp = buffer;
                        goto err_disable_buffers;
+               }
        }
 
-       if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+       if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED) {
                ret = iio_trigger_attach_poll_func(indio_dev->trig,
                                                   indio_dev->pollfunc);
                if (ret)
@@ -1120,11 +1122,12 @@ static int iio_enable_buffers(struct iio_dev *indio_dev,
        return 0;
 
 err_detach_pollfunc:
-       if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+       if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED) {
                iio_trigger_detach_poll_func(indio_dev->trig,
                                             indio_dev->pollfunc);
        }
 err_disable_buffers:
+       buffer = list_prepare_entry(tmp, &iio_dev_opaque->buffer_list, buffer_list);
        list_for_each_entry_continue_reverse(buffer, &iio_dev_opaque->buffer_list,
                                             buffer_list)
                iio_buffer_disable(buffer, indio_dev);
@@ -1132,7 +1135,7 @@ err_run_postdisable:
        if (indio_dev->setup_ops->postdisable)
                indio_dev->setup_ops->postdisable(indio_dev);
 err_undo_config:
-       indio_dev->currentmode = INDIO_DIRECT_MODE;
+       iio_dev_opaque->currentmode = INDIO_DIRECT_MODE;
        indio_dev->active_scan_mask = NULL;
 
        return ret;
@@ -1162,7 +1165,7 @@ static int iio_disable_buffers(struct iio_dev *indio_dev)
                        ret = ret2;
        }
 
-       if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+       if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED) {
                iio_trigger_detach_poll_func(indio_dev->trig,
                                             indio_dev->pollfunc);
        }
@@ -1181,7 +1184,7 @@ static int iio_disable_buffers(struct iio_dev *indio_dev)
 
        iio_free_scan_mask(indio_dev, indio_dev->active_scan_mask);
        indio_dev->active_scan_mask = NULL;
-       indio_dev->currentmode = INDIO_DIRECT_MODE;
+       iio_dev_opaque->currentmode = INDIO_DIRECT_MODE;
 
        return ret;
 }
@@ -1300,7 +1303,7 @@ static ssize_t iio_buffer_store_enable(struct device *dev,
        struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;
        bool inlist;
 
-       ret = strtobool(buf, &requested_state);
+       ret = kstrtobool(buf, &requested_state);
        if (ret < 0)
                return ret;
 
@@ -1629,6 +1632,19 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
                        if (channels[i].scan_index < 0)
                                continue;
 
+                       /* Verify that sample bits fit into storage */
+                       if (channels[i].scan_type.storagebits <
+                           channels[i].scan_type.realbits +
+                           channels[i].scan_type.shift) {
+                               dev_err(&indio_dev->dev,
+                                       "Channel %d storagebits (%d) < shifted realbits (%d + %d)\n",
+                                       i, channels[i].scan_type.storagebits,
+                                       channels[i].scan_type.realbits,
+                                       channels[i].scan_type.shift);
+                               ret = -EINVAL;
+                               goto error_cleanup_dynamic;
+                       }
+
                        ret = iio_buffer_add_channel_sysfs(indio_dev, buffer,
                                                         &channels[i]);
                        if (ret < 0)
@@ -1649,7 +1665,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
        }
 
        attrn = buffer_attrcount + scan_el_attrcount + ARRAY_SIZE(iio_buffer_attrs);
-       attr = kcalloc(attrn + 1, sizeof(* attr), GFP_KERNEL);
+       attr = kcalloc(attrn + 1, sizeof(*attr), GFP_KERNEL);
        if (!attr) {
                ret = -ENOMEM;
                goto error_free_scan_mask;