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

Commit a88b3ebc authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman
Browse files

staging:iio: rip out scan_el attributes. Now handled as iio_dev_attrs like everything else.



Drivers have no need to use this functionality any more and we save a lot of
code by getting rid of it.

Signed-off-by: default avatarJonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8a27a023
Loading
Loading
Loading
Loading
+26 −75
Original line number Diff line number Diff line
@@ -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);

+0 −108
Original line number Diff line number Diff line
@@ -108,7 +108,6 @@ struct iio_ring_buffer {
	int				(*postdisable)(struct iio_dev *);

	struct list_head scan_el_dev_attr_list;
	struct list_head scan_el_en_attr_list;

	wait_queue_head_t pollq;
	bool stufftoread;
@@ -136,29 +135,6 @@ static inline void __iio_update_ring_buffer(struct iio_ring_buffer *ring,
	ring->loopcount = 0;
}

/**
 * struct iio_scan_el - an individual element of a scan
 * @dev_attr:		control attribute (if directly controllable)
 * @number:		unique identifier of element (used for bit mask)
 * @label:		useful data for the scan el (often reg address)
 * @set_state:		for some devices datardy signals are generated
 *			for any enabled lines.  This allows unwanted lines
 *			to be disabled and hence not get in the way.
 **/
struct iio_scan_el {
	struct device_attribute		dev_attr;
	unsigned int			number;
	unsigned int			label;
	struct list_head l;

	int (*set_state)(struct iio_scan_el *scanel,
			 struct iio_dev *dev_info,
			 bool state);
};

#define to_iio_scan_el(_dev_attr)				\
	container_of(_dev_attr, struct iio_scan_el, dev_attr);

/**
 * iio_scan_el_store() - sysfs scan element selection interface
 * @dev: the target device
@@ -197,90 +173,6 @@ ssize_t iio_scan_el_ts_store(struct device *dev, struct device_attribute *attr,
 **/
ssize_t iio_scan_el_ts_show(struct device *dev, struct device_attribute *attr,
			    char *buf);
/**
 * IIO_SCAN_EL_C - declare and initialize a scan element with a control func
 *
 * @_name:	identifying name. Resulting struct is iio_scan_el_##_name,
 *		sysfs element, _name##_en.
 * @_number:	unique id number for the scan element.
 *		length devices).
 * @_label:	indentification variable used by drivers.  Often a reg address.
 * @_controlfunc: function used to notify hardware of whether state changes
 **/
#define __IIO_SCAN_EL_C(_name, _number, _label, _controlfunc)	\
	struct iio_scan_el iio_scan_el_##_name = {			\
		.dev_attr = __ATTR(_name##_en,				\
				   S_IRUGO | S_IWUSR,			\
				   iio_scan_el_show,			\
				   iio_scan_el_store),			\
		.number =  _number,					\
		.label = _label,					\
		.set_state = _controlfunc,				\
	};								\
	static IIO_CONST_ATTR(_name##_index, #_number)

#define IIO_SCAN_EL_C(_name, _number, _label, _controlfunc)	\
	__IIO_SCAN_EL_C(_name, _number, _label, _controlfunc)

#define __IIO_SCAN_NAMED_EL_C(_name, _string, _number, _label, _cf)	\
	struct iio_scan_el iio_scan_el_##_name = {			\
		.dev_attr = __ATTR(_string##_en,			\
				   S_IRUGO | S_IWUSR,			\
				   iio_scan_el_show,			\
				   iio_scan_el_store),			\
		.number =  _number,					\
		.label = _label,					\
		.set_state = _cf,					\
	};								\
	static struct iio_const_attr iio_const_attr_##_name##_index = {	\
		.string = #_number,					\
		.dev_attr = __ATTR(_string##_index,			\
				   S_IRUGO, iio_read_const_attr, NULL)	\
	}


#define IIO_SCAN_NAMED_EL_C(_name, _string, _number, _label, _cf) \
	__IIO_SCAN_NAMED_EL_C(_name, _string, _number, _label, _cf)
/**
 * IIO_SCAN_EL_TIMESTAMP - declare a special scan element for timestamps
 * @number: specify where in the scan order this is stored.
 *
 * Odd one out. Handled slightly differently from other scan elements.
 **/
#define IIO_SCAN_EL_TIMESTAMP(number)				\
	struct iio_scan_el iio_scan_el_timestamp = {		\
		.dev_attr = __ATTR(timestamp_en,		\
				   S_IRUGO | S_IWUSR,		\
				   iio_scan_el_ts_show,		\
				   iio_scan_el_ts_store),	\
	};							\
	static IIO_CONST_ATTR(timestamp_index, #number)

/**
 * IIO_CONST_ATTR_SCAN_EL_TYPE - attr to specify the data format of a scan el
 * @name: the scan el name (may be more general and cover a set of scan elements
 * @_sign: either s or u for signed or unsigned
 * @_bits: number of actual bits occuplied by the value
 * @_storagebits: number of bits _bits is padded to when read out of buffer
 **/
#define IIO_CONST_ATTR_SCAN_EL_TYPE(_name, _sign, _bits, _storagebits) \
	IIO_CONST_ATTR(_name##_type, #_sign#_bits"/"#_storagebits);

/**
 * IIO_CONST_ATTR_SCAN_EL_TYPE_WITH_SHIFT - attr to specify the data format of a scan el
 * @name: the scan el name (may be more general and cover a set of scan elements
 * @_sign: either s or u for signed or unsigned
 * @_bits: number of actual bits occuplied by the value
 * @_storagebits: number of bits _bits is padded to when read out of buffer
 * @_shiftbits: number of bits _shiftbits the result must be shifted
 **/
#define IIO_CONST_ATTR_SCAN_EL_TYPE_WITH_SHIFT(_name, _sign, _bits, \
					       _storagebits, _shiftbits) \
	IIO_CONST_ATTR(_name##_type, #_sign#_bits"/"#_storagebits \
		       ">>"#_shiftbits);

#define IIO_SCAN_EL_TYPE_SIGNED         's'
#define IIO_SCAN_EL_TYPE_UNSIGNED       'u'

/*
 * These are mainly provided to allow for a change of implementation if a device