diff options
Diffstat (limited to 'drivers/iio/industrialio-buffer.c')
| -rw-r--r-- | drivers/iio/industrialio-buffer.c | 40 | 
1 files changed, 24 insertions, 16 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 228598b82a2f..80c78bd6bbef 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c @@ -507,13 +507,14 @@ static ssize_t iio_scan_el_store(struct device *dev,  	int ret;  	bool state;  	struct iio_dev *indio_dev = dev_to_iio_dev(dev); +	struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);  	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);  	struct iio_buffer *buffer = this_attr->buffer;  	ret = kstrtobool(buf, &state);  	if (ret < 0)  		return ret; -	mutex_lock(&indio_dev->mlock); +	mutex_lock(&iio_dev_opaque->mlock);  	if (iio_buffer_is_active(buffer)) {  		ret = -EBUSY;  		goto error_ret; @@ -532,7 +533,7 @@ static ssize_t iio_scan_el_store(struct device *dev,  	}  error_ret: -	mutex_unlock(&indio_dev->mlock); +	mutex_unlock(&iio_dev_opaque->mlock);  	return ret < 0 ? ret : len; @@ -554,6 +555,7 @@ static ssize_t iio_scan_el_ts_store(struct device *dev,  {  	int ret;  	struct iio_dev *indio_dev = dev_to_iio_dev(dev); +	struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);  	struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;  	bool state; @@ -561,14 +563,14 @@ static ssize_t iio_scan_el_ts_store(struct device *dev,  	if (ret < 0)  		return ret; -	mutex_lock(&indio_dev->mlock); +	mutex_lock(&iio_dev_opaque->mlock);  	if (iio_buffer_is_active(buffer)) {  		ret = -EBUSY;  		goto error_ret;  	}  	buffer->scan_timestamp = state;  error_ret: -	mutex_unlock(&indio_dev->mlock); +	mutex_unlock(&iio_dev_opaque->mlock);  	return ret ? ret : len;  } @@ -642,6 +644,7 @@ static ssize_t length_store(struct device *dev, struct device_attribute *attr,  			    const char *buf, size_t len)  {  	struct iio_dev *indio_dev = dev_to_iio_dev(dev); +	struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);  	struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;  	unsigned int val;  	int ret; @@ -653,7 +656,7 @@ static ssize_t length_store(struct device *dev, struct device_attribute *attr,  	if (val == buffer->length)  		return len; -	mutex_lock(&indio_dev->mlock); +	mutex_lock(&iio_dev_opaque->mlock);  	if (iio_buffer_is_active(buffer)) {  		ret = -EBUSY;  	} else { @@ -665,7 +668,7 @@ static ssize_t length_store(struct device *dev, struct device_attribute *attr,  	if (buffer->length && buffer->length < buffer->watermark)  		buffer->watermark = buffer->length;  out: -	mutex_unlock(&indio_dev->mlock); +	mutex_unlock(&iio_dev_opaque->mlock);  	return ret ? ret : len;  } @@ -1256,7 +1259,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,  		return -EINVAL;  	mutex_lock(&iio_dev_opaque->info_exist_lock); -	mutex_lock(&indio_dev->mlock); +	mutex_lock(&iio_dev_opaque->mlock);  	if (insert_buffer && iio_buffer_is_active(insert_buffer))  		insert_buffer = NULL; @@ -1277,7 +1280,7 @@ int iio_update_buffers(struct iio_dev *indio_dev,  	ret = __iio_update_buffers(indio_dev, insert_buffer, remove_buffer);  out_unlock: -	mutex_unlock(&indio_dev->mlock); +	mutex_unlock(&iio_dev_opaque->mlock);  	mutex_unlock(&iio_dev_opaque->info_exist_lock);  	return ret; @@ -1296,6 +1299,7 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr,  	int ret;  	bool requested_state;  	struct iio_dev *indio_dev = dev_to_iio_dev(dev); +	struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);  	struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;  	bool inlist; @@ -1303,7 +1307,7 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr,  	if (ret < 0)  		return ret; -	mutex_lock(&indio_dev->mlock); +	mutex_lock(&iio_dev_opaque->mlock);  	/* Find out if it is in the list */  	inlist = iio_buffer_is_active(buffer); @@ -1317,7 +1321,7 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr,  		ret = __iio_update_buffers(indio_dev, NULL, buffer);  done: -	mutex_unlock(&indio_dev->mlock); +	mutex_unlock(&iio_dev_opaque->mlock);  	return (ret < 0) ? ret : len;  } @@ -1334,6 +1338,7 @@ static ssize_t watermark_store(struct device *dev,  			       const char *buf, size_t len)  {  	struct iio_dev *indio_dev = dev_to_iio_dev(dev); +	struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);  	struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer;  	unsigned int val;  	int ret; @@ -1344,7 +1349,7 @@ static ssize_t watermark_store(struct device *dev,  	if (!val)  		return -EINVAL; -	mutex_lock(&indio_dev->mlock); +	mutex_lock(&iio_dev_opaque->mlock);  	if (val > buffer->length) {  		ret = -EINVAL; @@ -1358,7 +1363,7 @@ static ssize_t watermark_store(struct device *dev,  	buffer->watermark = val;  out: -	mutex_unlock(&indio_dev->mlock); +	mutex_unlock(&iio_dev_opaque->mlock);  	return ret ? ret : len;  } @@ -1600,6 +1605,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,  {  	struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);  	struct iio_dev_attr *p; +	const struct iio_dev_attr *id_attr;  	struct attribute **attr;  	int ret, i, attrn, scan_el_attrcount, buffer_attrcount;  	const struct iio_chan_spec *channels; @@ -1609,6 +1615,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,  		while (buffer->attrs[buffer_attrcount] != NULL)  			buffer_attrcount++;  	} +	buffer_attrcount += ARRAY_SIZE(iio_buffer_attrs);  	scan_el_attrcount = 0;  	INIT_LIST_HEAD(&buffer->buffer_attr_list); @@ -1651,7 +1658,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,  		}  	} -	attrn = buffer_attrcount + scan_el_attrcount + ARRAY_SIZE(iio_buffer_attrs); +	attrn = buffer_attrcount + scan_el_attrcount;  	attr = kcalloc(attrn + 1, sizeof(*attr), GFP_KERNEL);  	if (!attr) {  		ret = -ENOMEM; @@ -1666,10 +1673,11 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,  		attr[2] = &dev_attr_watermark_ro.attr;  	if (buffer->attrs) -		memcpy(&attr[ARRAY_SIZE(iio_buffer_attrs)], buffer->attrs, -		       sizeof(struct attribute *) * buffer_attrcount); +		for (i = 0, id_attr = buffer->attrs[i]; +		     (id_attr = buffer->attrs[i]); i++) +			attr[ARRAY_SIZE(iio_buffer_attrs) + i] = +				(struct attribute *)&id_attr->dev_attr.attr; -	buffer_attrcount += ARRAY_SIZE(iio_buffer_attrs);  	buffer->buffer_group.attrs = attr;  	for (i = 0; i < buffer_attrcount; i++) {  |