staging:iio:adc:ad7606 unwind use of is_visible for attrs.
This is the most controversial of this set of is_visible removals. There are two conditions controlling availability of attrs resulting in 4 different attribute groups. Still for a few more lines things are clearer to read to my mind. Signed-off-by: Jonathan Cameron <jic23@kernel.org> Acked-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7389266cc9
commit
9214cc6e13
|
@ -197,7 +197,7 @@ static IIO_DEVICE_ATTR(oversampling_ratio, S_IRUGO | S_IWUSR,
|
|||
ad7606_store_oversampling_ratio, 0);
|
||||
static IIO_CONST_ATTR(oversampling_ratio_available, "0 2 4 8 16 32 64");
|
||||
|
||||
static struct attribute *ad7606_attributes[] = {
|
||||
static struct attribute *ad7606_attributes_os_and_range[] = {
|
||||
&iio_dev_attr_in_voltage_range.dev_attr.attr,
|
||||
&iio_const_attr_in_voltage_range_available.dev_attr.attr,
|
||||
&iio_dev_attr_oversampling_ratio.dev_attr.attr,
|
||||
|
@ -205,34 +205,28 @@ static struct attribute *ad7606_attributes[] = {
|
|||
NULL,
|
||||
};
|
||||
|
||||
static umode_t ad7606_attr_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int n)
|
||||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
struct ad7606_state *st = iio_priv(indio_dev);
|
||||
static const struct attribute_group ad7606_attribute_group_os_and_range = {
|
||||
.attrs = ad7606_attributes_os_and_range,
|
||||
};
|
||||
|
||||
umode_t mode = attr->mode;
|
||||
static struct attribute *ad7606_attributes_os[] = {
|
||||
&iio_dev_attr_oversampling_ratio.dev_attr.attr,
|
||||
&iio_const_attr_oversampling_ratio_available.dev_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
if (!(gpio_is_valid(st->pdata->gpio_os0) &&
|
||||
gpio_is_valid(st->pdata->gpio_os1) &&
|
||||
gpio_is_valid(st->pdata->gpio_os2)) &&
|
||||
(attr == &iio_dev_attr_oversampling_ratio.dev_attr.attr ||
|
||||
attr ==
|
||||
&iio_const_attr_oversampling_ratio_available.dev_attr.attr))
|
||||
mode = 0;
|
||||
else if (!gpio_is_valid(st->pdata->gpio_range) &&
|
||||
(attr == &iio_dev_attr_in_voltage_range.dev_attr.attr ||
|
||||
attr ==
|
||||
&iio_const_attr_in_voltage_range_available.dev_attr.attr))
|
||||
mode = 0;
|
||||
static const struct attribute_group ad7606_attribute_group_os = {
|
||||
.attrs = ad7606_attributes_os,
|
||||
};
|
||||
|
||||
return mode;
|
||||
}
|
||||
static struct attribute *ad7606_attributes_range[] = {
|
||||
&iio_dev_attr_in_voltage_range.dev_attr.attr,
|
||||
&iio_const_attr_in_voltage_range_available.dev_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const struct attribute_group ad7606_attribute_group = {
|
||||
.attrs = ad7606_attributes,
|
||||
.is_visible = ad7606_attr_is_visible,
|
||||
static const struct attribute_group ad7606_attribute_group_range = {
|
||||
.attrs = ad7606_attributes_range,
|
||||
};
|
||||
|
||||
#define AD7606_CHANNEL(num) \
|
||||
|
@ -435,10 +429,27 @@ static irqreturn_t ad7606_interrupt(int irq, void *dev_id)
|
|||
return IRQ_HANDLED;
|
||||
};
|
||||
|
||||
static const struct iio_info ad7606_info = {
|
||||
static const struct iio_info ad7606_info_no_os_or_range = {
|
||||
.driver_module = THIS_MODULE,
|
||||
.read_raw = &ad7606_read_raw,
|
||||
.attrs = &ad7606_attribute_group,
|
||||
};
|
||||
|
||||
static const struct iio_info ad7606_info_os_and_range = {
|
||||
.driver_module = THIS_MODULE,
|
||||
.read_raw = &ad7606_read_raw,
|
||||
.attrs = &ad7606_attribute_group_os_and_range,
|
||||
};
|
||||
|
||||
static const struct iio_info ad7606_info_os = {
|
||||
.driver_module = THIS_MODULE,
|
||||
.read_raw = &ad7606_read_raw,
|
||||
.attrs = &ad7606_attribute_group_os,
|
||||
};
|
||||
|
||||
static const struct iio_info ad7606_info_range = {
|
||||
.driver_module = THIS_MODULE,
|
||||
.read_raw = &ad7606_read_raw,
|
||||
.attrs = &ad7606_attribute_group_range,
|
||||
};
|
||||
|
||||
struct iio_dev *ad7606_probe(struct device *dev, int irq,
|
||||
|
@ -483,7 +494,19 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq,
|
|||
st->chip_info = &ad7606_chip_info_tbl[id];
|
||||
|
||||
indio_dev->dev.parent = dev;
|
||||
indio_dev->info = &ad7606_info;
|
||||
if (gpio_is_valid(st->pdata->gpio_os0) &&
|
||||
gpio_is_valid(st->pdata->gpio_os1) &&
|
||||
gpio_is_valid(st->pdata->gpio_os2)) {
|
||||
if (gpio_is_valid(st->pdata->gpio_range))
|
||||
indio_dev->info = &ad7606_info_os_and_range;
|
||||
else
|
||||
indio_dev->info = &ad7606_info_os;
|
||||
} else {
|
||||
if (gpio_is_valid(st->pdata->gpio_range))
|
||||
indio_dev->info = &ad7606_info_range;
|
||||
else
|
||||
indio_dev->info = &ad7606_info_no_os_or_range;
|
||||
}
|
||||
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||
indio_dev->name = st->chip_info->name;
|
||||
indio_dev->channels = st->chip_info->channels;
|
||||
|
|
Loading…
Reference in New Issue