iio: __iio_format_value(): Convert to sysfs_emit_at()

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>
This commit is contained in:
Lars-Peter Clausen 2021-03-20 08:14:04 +01:00 committed by Jonathan Cameron
parent 0207483b22
commit 6b92ba0a30

View 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;
}