mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
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:
parent
0207483b22
commit
6b92ba0a30
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user