|
@@ -193,53 +193,6 @@ static ssize_t iio_show_fixed_type(struct device *dev,
|
|
|
this_attr->c->scan_type.shift);
|
|
|
}
|
|
|
|
|
|
-static int __iio_add_chan_scan_elattr(const char *postfix,
|
|
|
- const char *group,
|
|
|
- const struct iio_chan_spec *chan,
|
|
|
- struct device *dev,
|
|
|
- struct list_head *attr_list)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- struct iio_scan_el *scan_el;
|
|
|
-
|
|
|
- scan_el = kzalloc(sizeof *scan_el, GFP_KERNEL);
|
|
|
- if (scan_el == NULL) {
|
|
|
- ret = -ENOMEM;
|
|
|
- goto error_ret;
|
|
|
- }
|
|
|
- if (chan->type != IIO_TIMESTAMP)
|
|
|
- ret = __iio_device_attr_init(&scan_el->dev_attr, postfix, chan,
|
|
|
- iio_scan_el_show,
|
|
|
- iio_scan_el_store, 0);
|
|
|
- else /*
|
|
|
- * Timestamp handled separately because it simplifies a lot of
|
|
|
- * drivers by ensuring they don't have to know its magic index
|
|
|
- */
|
|
|
- ret = __iio_device_attr_init(&scan_el->dev_attr, postfix, chan,
|
|
|
- iio_scan_el_ts_show,
|
|
|
- iio_scan_el_ts_store, 0);
|
|
|
- if (ret)
|
|
|
- goto error_free_scan_el;
|
|
|
-
|
|
|
- scan_el->number = chan->scan_index;
|
|
|
-
|
|
|
- ret = sysfs_add_file_to_group(&dev->kobj,
|
|
|
- &scan_el->dev_attr.attr,
|
|
|
- group);
|
|
|
- if (ret < 0)
|
|
|
- goto error_device_attr_deinit;
|
|
|
-
|
|
|
- list_add(&scan_el->l, attr_list);
|
|
|
-
|
|
|
- return 0;
|
|
|
-error_device_attr_deinit:
|
|
|
- __iio_device_attr_deinit(&scan_el->dev_attr);
|
|
|
-error_free_scan_el:
|
|
|
- kfree(scan_el);
|
|
|
-error_ret:
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
static int iio_ring_add_channel_sysfs(struct iio_ring_buffer *ring,
|
|
|
const struct iio_chan_spec *chan)
|
|
|
{
|
|
@@ -268,23 +221,28 @@ static int iio_ring_add_channel_sysfs(struct iio_ring_buffer *ring,
|
|
|
if (ret)
|
|
|
goto error_ret;
|
|
|
|
|
|
- ret = __iio_add_chan_scan_elattr("en", "scan_elements",
|
|
|
- chan, &ring->dev,
|
|
|
- &ring->scan_el_en_attr_list);
|
|
|
-
|
|
|
+ if (chan->type != IIO_TIMESTAMP)
|
|
|
+ ret = __iio_add_chan_devattr("en", "scan_elements",
|
|
|
+ chan,
|
|
|
+ &iio_scan_el_show,
|
|
|
+ &iio_scan_el_store,
|
|
|
+ chan->scan_index,
|
|
|
+ 0,
|
|
|
+ &ring->dev,
|
|
|
+ &ring->scan_el_dev_attr_list);
|
|
|
+ else
|
|
|
+ ret = __iio_add_chan_devattr("en", "scan_elements",
|
|
|
+ chan,
|
|
|
+ &iio_scan_el_ts_show,
|
|
|
+ &iio_scan_el_ts_store,
|
|
|
+ chan->scan_index,
|
|
|
+ 0,
|
|
|
+ &ring->dev,
|
|
|
+ &ring->scan_el_dev_attr_list);
|
|
|
error_ret:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static void iio_ring_remove_and_free_scan_el_attr(struct iio_ring_buffer *ring,
|
|
|
- struct iio_scan_el *p)
|
|
|
-{
|
|
|
- sysfs_remove_file_from_group(&ring->dev.kobj,
|
|
|
- &p->dev_attr.attr, "scan_elements");
|
|
|
- kfree(p->dev_attr.attr.name);
|
|
|
- kfree(p);
|
|
|
-}
|
|
|
-
|
|
|
static void iio_ring_remove_and_free_scan_dev_attr(struct iio_ring_buffer *ring,
|
|
|
struct iio_dev_attr *p)
|
|
|
{
|
|
@@ -306,15 +264,10 @@ static struct attribute_group iio_scan_el_dummy_group = {
|
|
|
static void __iio_ring_attr_cleanup(struct iio_ring_buffer *ring)
|
|
|
{
|
|
|
struct iio_dev_attr *p, *n;
|
|
|
- struct iio_scan_el *q, *m;
|
|
|
- int anydynamic = !(list_empty(&ring->scan_el_dev_attr_list) &&
|
|
|
- list_empty(&ring->scan_el_en_attr_list));
|
|
|
+ int anydynamic = !list_empty(&ring->scan_el_dev_attr_list);
|
|
|
list_for_each_entry_safe(p, n,
|
|
|
&ring->scan_el_dev_attr_list, l)
|
|
|
iio_ring_remove_and_free_scan_dev_attr(ring, p);
|
|
|
- list_for_each_entry_safe(q, m,
|
|
|
- &ring->scan_el_en_attr_list, l)
|
|
|
- iio_ring_remove_and_free_scan_el_attr(ring, q);
|
|
|
|
|
|
if (ring->scan_el_attrs)
|
|
|
sysfs_remove_group(&ring->dev.kobj,
|
|
@@ -352,7 +305,6 @@ int iio_ring_buffer_register_ex(struct iio_ring_buffer *ring, int id,
|
|
|
}
|
|
|
|
|
|
INIT_LIST_HEAD(&ring->scan_el_dev_attr_list);
|
|
|
- INIT_LIST_HEAD(&ring->scan_el_en_attr_list);
|
|
|
if (channels) {
|
|
|
/* new magic */
|
|
|
for (i = 0; i < num_channels; i++) {
|
|
@@ -554,9 +506,9 @@ ssize_t iio_scan_el_show(struct device *dev,
|
|
|
{
|
|
|
int ret;
|
|
|
struct iio_ring_buffer *ring = dev_get_drvdata(dev);
|
|
|
- struct iio_scan_el *this_el = to_iio_scan_el(attr);
|
|
|
+ struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
|
|
|
|
|
|
- ret = iio_scan_mask_query(ring, this_el->number);
|
|
|
+ ret = iio_scan_mask_query(ring, this_attr->address);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
return sprintf(buf, "%d\n", ret);
|
|
@@ -572,7 +524,7 @@ ssize_t iio_scan_el_store(struct device *dev,
|
|
|
bool state;
|
|
|
struct iio_ring_buffer *ring = dev_get_drvdata(dev);
|
|
|
struct iio_dev *indio_dev = ring->indio_dev;
|
|
|
- struct iio_scan_el *this_el = to_iio_scan_el(attr);
|
|
|
+ struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
|
|
|
|
|
|
state = !(buf[0] == '0');
|
|
|
mutex_lock(&indio_dev->mlock);
|
|
@@ -580,20 +532,19 @@ ssize_t iio_scan_el_store(struct device *dev,
|
|
|
ret = -EBUSY;
|
|
|
goto error_ret;
|
|
|
}
|
|
|
- ret = iio_scan_mask_query(ring, this_el->number);
|
|
|
+ ret = iio_scan_mask_query(ring, this_attr->address);
|
|
|
if (ret < 0)
|
|
|
goto error_ret;
|
|
|
if (!state && ret) {
|
|
|
- ret = iio_scan_mask_clear(ring, this_el->number);
|
|
|
+ ret = iio_scan_mask_clear(ring, this_attr->address);
|
|
|
if (ret)
|
|
|
goto error_ret;
|
|
|
} else if (state && !ret) {
|
|
|
- ret = iio_scan_mask_set(ring, this_el->number);
|
|
|
+ ret = iio_scan_mask_set(ring, this_attr->address);
|
|
|
if (ret)
|
|
|
goto error_ret;
|
|
|
}
|
|
|
- if (this_el->set_state)
|
|
|
- ret = this_el->set_state(this_el, indio_dev, state);
|
|
|
+
|
|
|
error_ret:
|
|
|
mutex_unlock(&indio_dev->mlock);
|
|
|
|