Commit b8528224 authored by Beniamin Bia's avatar Beniamin Bia Committed by Jonathan Cameron

iio: core: Handle 'dB' suffix in core

This patch handles the db suffix used for writing micro db values.
Signed-off-by: default avatarBeniamin Bia <beniamin.bia@analog.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 15e8573d
...@@ -769,17 +769,18 @@ static ssize_t iio_read_channel_info_avail(struct device *dev, ...@@ -769,17 +769,18 @@ static ssize_t iio_read_channel_info_avail(struct device *dev,
} }
/** /**
* iio_str_to_fixpoint() - Parse a fixed-point number from a string * __iio_str_to_fixpoint() - Parse a fixed-point number from a string
* @str: The string to parse * @str: The string to parse
* @fract_mult: Multiplier for the first decimal place, should be a power of 10 * @fract_mult: Multiplier for the first decimal place, should be a power of 10
* @integer: The integer part of the number * @integer: The integer part of the number
* @fract: The fractional part of the number * @fract: The fractional part of the number
* @scale_db: True if this should parse as dB
* *
* Returns 0 on success, or a negative error code if the string could not be * Returns 0 on success, or a negative error code if the string could not be
* parsed. * parsed.
*/ */
int iio_str_to_fixpoint(const char *str, int fract_mult, static int __iio_str_to_fixpoint(const char *str, int fract_mult,
int *integer, int *fract) int *integer, int *fract, bool scale_db)
{ {
int i = 0, f = 0; int i = 0, f = 0;
bool integer_part = true, negative = false; bool integer_part = true, negative = false;
...@@ -810,6 +811,14 @@ int iio_str_to_fixpoint(const char *str, int fract_mult, ...@@ -810,6 +811,14 @@ int iio_str_to_fixpoint(const char *str, int fract_mult,
break; break;
else else
return -EINVAL; return -EINVAL;
} else if (!strncmp(str, " dB", sizeof(" dB") - 1) && scale_db) {
/* Ignore the dB suffix */
str += sizeof(" dB") - 1;
continue;
} else if (!strncmp(str, "dB", sizeof("dB") - 1) && scale_db) {
/* Ignore the dB suffix */
str += sizeof("dB") - 1;
continue;
} else if (*str == '.' && integer_part) { } else if (*str == '.' && integer_part) {
integer_part = false; integer_part = false;
} else { } else {
...@@ -830,6 +839,22 @@ int iio_str_to_fixpoint(const char *str, int fract_mult, ...@@ -830,6 +839,22 @@ int iio_str_to_fixpoint(const char *str, int fract_mult,
return 0; return 0;
} }
/**
* iio_str_to_fixpoint() - Parse a fixed-point number from a string
* @str: The string to parse
* @fract_mult: Multiplier for the first decimal place, should be a power of 10
* @integer: The integer part of the number
* @fract: The fractional part of the number
*
* Returns 0 on success, or a negative error code if the string could not be
* parsed.
*/
int iio_str_to_fixpoint(const char *str, int fract_mult,
int *integer, int *fract)
{
return __iio_str_to_fixpoint(str, fract_mult, integer, fract, false);
}
EXPORT_SYMBOL_GPL(iio_str_to_fixpoint); EXPORT_SYMBOL_GPL(iio_str_to_fixpoint);
static ssize_t iio_write_channel_info(struct device *dev, static ssize_t iio_write_channel_info(struct device *dev,
...@@ -842,6 +867,7 @@ static ssize_t iio_write_channel_info(struct device *dev, ...@@ -842,6 +867,7 @@ static ssize_t iio_write_channel_info(struct device *dev,
int ret, fract_mult = 100000; int ret, fract_mult = 100000;
int integer, fract = 0; int integer, fract = 0;
bool is_char = false; bool is_char = false;
bool scale_db = false;
/* Assumes decimal - precision based on number of digits */ /* Assumes decimal - precision based on number of digits */
if (!indio_dev->info->write_raw) if (!indio_dev->info->write_raw)
...@@ -853,6 +879,9 @@ static ssize_t iio_write_channel_info(struct device *dev, ...@@ -853,6 +879,9 @@ static ssize_t iio_write_channel_info(struct device *dev,
case IIO_VAL_INT: case IIO_VAL_INT:
fract_mult = 0; fract_mult = 0;
break; break;
case IIO_VAL_INT_PLUS_MICRO_DB:
scale_db = true;
/* fall through */
case IIO_VAL_INT_PLUS_MICRO: case IIO_VAL_INT_PLUS_MICRO:
fract_mult = 100000; fract_mult = 100000;
break; break;
...@@ -877,6 +906,10 @@ static ssize_t iio_write_channel_info(struct device *dev, ...@@ -877,6 +906,10 @@ static ssize_t iio_write_channel_info(struct device *dev,
if (ret) if (ret)
return ret; return ret;
} }
ret = __iio_str_to_fixpoint(buf, fract_mult, &integer, &fract,
scale_db);
if (ret)
return ret;
ret = indio_dev->info->write_raw(indio_dev, this_attr->c, ret = indio_dev->info->write_raw(indio_dev, this_attr->c,
integer, fract, this_attr->address); integer, fract, this_attr->address);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment