]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: adc: ad7768-1: replace manual attribute declaration
authorJonathan Santos <Jonathan.Santos@analog.com>
Wed, 11 Jun 2025 11:51:38 +0000 (08:51 -0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 26 Jun 2025 18:32:54 +0000 (19:32 +0100)
Use read_avail callback from struct iio_info to replace the manual
declaration of sampling_frequency_available attribute.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Marcelo Schmitt <marcelo.schmitt@analog.com>
Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/b2653d270131b2c873373a6f81cde9a5bdf5d1ff.1749569957.git.Jonathan.Santos@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7768-1.c

index c1e05755b9d5157a30c26eaec1509906db5bb895..0be5e17260cfc1639b912f053e196fcc1e8e518e 100644 (file)
@@ -189,6 +189,7 @@ static const struct iio_chan_spec ad7768_channels[] = {
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
                .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+               .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
                .indexed = 1,
                .channel = 0,
                .scan_index = 0,
@@ -209,6 +210,7 @@ struct ad7768_state {
        unsigned int mclk_freq;
        unsigned int dec_rate;
        unsigned int samp_freq;
+       unsigned int samp_freq_avail[ARRAY_SIZE(ad7768_clk_config)];
        struct completion completion;
        struct iio_trigger *trig;
        struct gpio_desc *gpio_sync_in;
@@ -322,6 +324,15 @@ static int ad7768_send_sync_pulse(struct ad7768_state *st)
        return 0;
 }
 
+static void ad7768_fill_samp_freq_tbl(struct ad7768_state *st)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(ad7768_clk_config); i++)
+               st->samp_freq_avail[i] =
+                       DIV_ROUND_CLOSEST(st->mclk_freq, ad7768_clk_config[i].clk_div);
+}
+
 static int ad7768_set_mode(struct ad7768_state *st,
                           enum ad7768_conv_mode mode)
 {
@@ -579,28 +590,6 @@ static int ad7768_set_freq(struct ad7768_state *st,
        return 0;
 }
 
-static ssize_t ad7768_sampling_freq_avail(struct device *dev,
-                                         struct device_attribute *attr,
-                                         char *buf)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ad7768_state *st = iio_priv(indio_dev);
-       unsigned int freq;
-       int i, len = 0;
-
-       for (i = 0; i < ARRAY_SIZE(ad7768_clk_config); i++) {
-               freq = DIV_ROUND_CLOSEST(st->mclk_freq,
-                                        ad7768_clk_config[i].clk_div);
-               len += scnprintf(buf + len, PAGE_SIZE - len, "%d ", freq);
-       }
-
-       buf[len - 1] = '\n';
-
-       return len;
-}
-
-static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(ad7768_sampling_freq_avail);
-
 static int ad7768_read_raw(struct iio_dev *indio_dev,
                           struct iio_chan_spec const *chan,
                           int *val, int *val2, long info)
@@ -646,6 +635,24 @@ static int ad7768_read_raw(struct iio_dev *indio_dev,
        return -EINVAL;
 }
 
+static int ad7768_read_avail(struct iio_dev *indio_dev,
+                            struct iio_chan_spec const *chan,
+                            const int **vals, int *type, int *length,
+                            long info)
+{
+       struct ad7768_state *st = iio_priv(indio_dev);
+
+       switch (info) {
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               *vals = (int *)st->samp_freq_avail;
+               *length = ARRAY_SIZE(ad7768_clk_config);
+               *type = IIO_VAL_INT;
+               return IIO_AVAIL_LIST;
+       default:
+               return -EINVAL;
+       }
+}
+
 static int ad7768_write_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *chan,
                            int val, int val2, long info)
@@ -668,15 +675,6 @@ static int ad7768_read_label(struct iio_dev *indio_dev,
        return sprintf(label, "%s\n", st->labels[chan->channel]);
 }
 
-static struct attribute *ad7768_attributes[] = {
-       &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
-       NULL
-};
-
-static const struct attribute_group ad7768_group = {
-       .attrs = ad7768_attributes,
-};
-
 static int ad7768_get_current_scan_type(const struct iio_dev *indio_dev,
                                        const struct iio_chan_spec *chan)
 {
@@ -687,8 +685,8 @@ static int ad7768_get_current_scan_type(const struct iio_dev *indio_dev,
 }
 
 static const struct iio_info ad7768_info = {
-       .attrs = &ad7768_group,
        .read_raw = &ad7768_read_raw,
+       .read_avail = &ad7768_read_avail,
        .write_raw = &ad7768_write_raw,
        .read_label = ad7768_read_label,
        .get_current_scan_type = &ad7768_get_current_scan_type,
@@ -1152,6 +1150,7 @@ static int ad7768_probe(struct spi_device *spi)
                return PTR_ERR(st->mclk);
 
        st->mclk_freq = clk_get_rate(st->mclk);
+       ad7768_fill_samp_freq_tbl(st);
 
        indio_dev->channels = ad7768_channels;
        indio_dev->num_channels = ARRAY_SIZE(ad7768_channels);