iio: __iio_format_value(): Convert to sysfs_emit_at()
authorLars-Peter Clausen <lars@metafoo.de>
Sat, 20 Mar 2021 07:14:04 +0000 (08:14 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 29 Mar 2021 10:12:30 +0000 (11:12 +0100)
sysfs_emit() is preferred over raw s*printf() for sysfs attributes since it
knows about the sysfs buffer specifics and has some built-in sanity checks.

Convert __iio_format_value() and related functions to use this new
interface.

This conversion involves changing the signature of __iio_format_value() so
that it similar to sysfs_emit_at() and takes the buffers start address and
an offset where to write within the buffer.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Link: https://lore.kernel.org/r/20210320071405.9347-4-lars@metafoo.de
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/industrialio-core.c

index e0fdf91..d92c58a 100644 (file)
@@ -623,7 +623,7 @@ int iio_read_mount_matrix(struct device *dev, const char *propname,
 }
 EXPORT_SYMBOL(iio_read_mount_matrix);
 
-static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
+static ssize_t __iio_format_value(char *buf, size_t offset, unsigned int type,
                                  int size, const int *vals)
 {
        int tmp0, tmp1;
@@ -632,52 +632,53 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
 
        switch (type) {
        case IIO_VAL_INT:
-               return scnprintf(buf, len, "%d", vals[0]);
+               return sysfs_emit_at(buf, offset, "%d", vals[0]);
        case IIO_VAL_INT_PLUS_MICRO_DB:
                scale_db = true;
                fallthrough;
        case IIO_VAL_INT_PLUS_MICRO:
                if (vals[1] < 0)
-                       return scnprintf(buf, len, "-%d.%06u%s", abs(vals[0]),
-                                       -vals[1], scale_db ? " dB" : "");
+                       return sysfs_emit_at(buf, offset, "-%d.%06u%s",
+                                            abs(vals[0]), -vals[1],
+                                            scale_db ? " dB" : "");
                else
-                       return scnprintf(buf, len, "%d.%06u%s", vals[0], vals[1],
-                                       scale_db ? " dB" : "");
+                       return sysfs_emit_at(buf, offset, "%d.%06u%s", vals[0],
+                                            vals[1], scale_db ? " dB" : "");
        case IIO_VAL_INT_PLUS_NANO:
                if (vals[1] < 0)
-                       return scnprintf(buf, len, "-%d.%09u", abs(vals[0]),
-                                       -vals[1]);
+                       return sysfs_emit_at(buf, offset, "-%d.%09u",
+                                            abs(vals[0]), -vals[1]);
                else
-                       return scnprintf(buf, len, "%d.%09u", vals[0], vals[1]);
+                       return sysfs_emit_at(buf, offset, "%d.%09u", vals[0],
+                                            vals[1]);
        case IIO_VAL_FRACTIONAL:
                tmp2 = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
                tmp1 = vals[1];
                tmp0 = (int)div_s64_rem(tmp2, 1000000000, &tmp1);
                if ((tmp2 < 0) && (tmp0 == 0))
-                       return snprintf(buf, len, "-0.%09u", abs(tmp1));
+                       return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1));
                else
-                       return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
+                       return sysfs_emit_at(buf, offset, "%d.%09u", tmp0,
+                                            abs(tmp1));
        case IIO_VAL_FRACTIONAL_LOG2:
                tmp2 = shift_right((s64)vals[0] * 1000000000LL, vals[1]);
                tmp0 = (int)div_s64_rem(tmp2, 1000000000LL, &tmp1);
                if (tmp0 == 0 && tmp2 < 0)
-                       return snprintf(buf, len, "-0.%09u", abs(tmp1));
+                       return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1));
                else
-                       return scnprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
+                       return sysfs_emit_at(buf, offset, "%d.%09u", tmp0,
+                                            abs(tmp1));
        case IIO_VAL_INT_MULTIPLE:
        {
                int i;
                int l = 0;
 
-               for (i = 0; i < size; ++i) {
-                       l += scnprintf(&buf[l], len - l, "%d ", vals[i]);
-                       if (l >= len)
-                               break;
-               }
+               for (i = 0; i < size; ++i)
+                       l += sysfs_emit_at(buf, offset + l, "%d ", vals[i]);
                return l;
        }
        case IIO_VAL_CHAR:
-               return scnprintf(buf, len, "%c", (char)vals[0]);
+               return sysfs_emit_at(buf, offset, "%c", (char)vals[0]);
        default:
                return 0;
        }
@@ -701,11 +702,11 @@ ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals)
 {
        ssize_t len;
 
-       len = __iio_format_value(buf, PAGE_SIZE, type, size, vals);
+       len = __iio_format_value(buf, 0, type, size, vals);
        if (len >= PAGE_SIZE - 1)
                return -EFBIG;
 
-       return len + sprintf(buf + len, "\n");
+       return len + sysfs_emit_at(buf, len, "\n");
 }
 EXPORT_SYMBOL_GPL(iio_format_value);
 
@@ -763,22 +764,21 @@ static ssize_t iio_format_list(char *buf, const int *vals, int type, int length,
                break;
        }
 
-       len = scnprintf(buf, PAGE_SIZE, prefix);
+       len = sysfs_emit(buf, prefix);
 
        for (i = 0; i <= length - stride; i += stride) {
                if (i != 0) {
-                       len += scnprintf(buf + len, PAGE_SIZE - len, " ");
+                       len += sysfs_emit_at(buf, len, " ");
                        if (len >= PAGE_SIZE)
                                return -EFBIG;
                }
 
-               len += __iio_format_value(buf + len, PAGE_SIZE - len, type,
-                                         stride, &vals[i]);
+               len += __iio_format_value(buf, len, type, stride, &vals[i]);
                if (len >= PAGE_SIZE)
                        return -EFBIG;
        }
 
-       len += scnprintf(buf + len, PAGE_SIZE - len, "%s\n", suffix);
+       len += sysfs_emit_at(buf, len, "%s\n", suffix);
 
        return len;
 }