diff options
Diffstat (limited to 'drivers/iio/trigger/iio-trig-hrtimer.c')
| -rw-r--r-- | drivers/iio/trigger/iio-trig-hrtimer.c | 37 | 
1 files changed, 25 insertions, 12 deletions
| diff --git a/drivers/iio/trigger/iio-trig-hrtimer.c b/drivers/iio/trigger/iio-trig-hrtimer.c index 410de837d041..716c795d08fb 100644 --- a/drivers/iio/trigger/iio-trig-hrtimer.c +++ b/drivers/iio/trigger/iio-trig-hrtimer.c @@ -1,5 +1,5 @@  // SPDX-License-Identifier: GPL-2.0-only -/** +/*   * The industrial I/O periodic hrtimer trigger driver   *   * Copyright (C) Intuitive Aerial AB @@ -16,13 +16,16 @@  #include <linux/iio/trigger.h>  #include <linux/iio/sw_trigger.h> +/* Defined locally, not in time64.h yet. */ +#define PSEC_PER_SEC   1000000000000LL +  /* default sampling frequency - 100Hz */  #define HRTIMER_DEFAULT_SAMPLING_FREQUENCY 100  struct iio_hrtimer_info {  	struct iio_sw_trigger swt;  	struct hrtimer timer; -	unsigned long sampling_frequency; +	int sampling_frequency[2];  	ktime_t period;  }; @@ -38,7 +41,9 @@ ssize_t iio_hrtimer_show_sampling_frequency(struct device *dev,  	struct iio_trigger *trig = to_iio_trigger(dev);  	struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); -	return snprintf(buf, PAGE_SIZE, "%lu\n", info->sampling_frequency); +	return iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, +			ARRAY_SIZE(info->sampling_frequency), +			info->sampling_frequency);  }  static @@ -48,18 +53,26 @@ ssize_t iio_hrtimer_store_sampling_frequency(struct device *dev,  {  	struct iio_trigger *trig = to_iio_trigger(dev);  	struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); -	unsigned long val; -	int ret; +	unsigned long long val; +	u64 period; +	int integer, fract, ret; -	ret = kstrtoul(buf, 10, &val); +	ret = iio_str_to_fixpoint(buf, 100, &integer, &fract);  	if (ret)  		return ret; +	if (integer < 0 || fract < 0) +		return -ERANGE; + +	val = fract + 1000ULL * integer;  /* mHz */ -	if (!val || val > NSEC_PER_SEC) +	if (!val || val > UINT_MAX)  		return -EINVAL; -	info->sampling_frequency = val; -	info->period = NSEC_PER_SEC / val; +	info->sampling_frequency[0] = integer;  /* Hz */ +	info->sampling_frequency[1] = fract * 1000;  /* uHz */ +	period = PSEC_PER_SEC; +	do_div(period, val); +	info->period = period;  /* nS */  	return len;  } @@ -122,7 +135,7 @@ static struct iio_sw_trigger *iio_trig_hrtimer_probe(const char *name)  	if (!trig_info)  		return ERR_PTR(-ENOMEM); -	trig_info->swt.trigger = iio_trigger_alloc("%s", name); +	trig_info->swt.trigger = iio_trigger_alloc(NULL, "%s", name);  	if (!trig_info->swt.trigger) {  		ret = -ENOMEM;  		goto err_free_trig_info; @@ -135,8 +148,8 @@ static struct iio_sw_trigger *iio_trig_hrtimer_probe(const char *name)  	hrtimer_init(&trig_info->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);  	trig_info->timer.function = iio_hrtimer_trig_handler; -	trig_info->sampling_frequency = HRTIMER_DEFAULT_SAMPLING_FREQUENCY; -	trig_info->period = NSEC_PER_SEC / trig_info->sampling_frequency; +	trig_info->sampling_frequency[0] = HRTIMER_DEFAULT_SAMPLING_FREQUENCY; +	trig_info->period = NSEC_PER_SEC / trig_info->sampling_frequency[0];  	ret = iio_trigger_register(trig_info->swt.trigger);  	if (ret) | 
