diff options
author | Peter Meerwald <pmeerw@pmeerw.net> | 2014-12-06 01:00:00 -0500 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2014-06-14 11:11:55 -0400 |
commit | 9d2f79abdf8313682d7b38570de0a717b0e9baf1 (patch) | |
tree | 2f14061fbe075721e77167375e94fa342ad00d2c | |
parent | 1c70f7bebce44515ffe30bf81358fe5f691656ad (diff) |
staging:iio-trig-periodic-rtc: Allow to reset frequency to 0
periodic rtc trigger initially has frequency 0
it is possible to change trigger frequency on-the-fly, but it is not
possible to set frequency back to 0
this patch allows to set trigger frequency to 0, thereby disabling
the rtc interrupt
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r-- | drivers/staging/iio/trigger/iio-trig-periodic-rtc.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c b/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c index 362a54a16e58..b5108a163e37 100644 --- a/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c +++ b/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c | |||
@@ -26,16 +26,22 @@ struct iio_prtc_trigger_info { | |||
26 | struct rtc_device *rtc; | 26 | struct rtc_device *rtc; |
27 | int frequency; | 27 | int frequency; |
28 | struct rtc_task task; | 28 | struct rtc_task task; |
29 | bool state; | ||
29 | }; | 30 | }; |
30 | 31 | ||
31 | static int iio_trig_periodic_rtc_set_state(struct iio_trigger *trig, bool state) | 32 | static int iio_trig_periodic_rtc_set_state(struct iio_trigger *trig, bool state) |
32 | { | 33 | { |
33 | struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig); | 34 | struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig); |
34 | if (trig_info->frequency == 0) | 35 | int ret; |
36 | if (trig_info->frequency == 0 && state) | ||
35 | return -EINVAL; | 37 | return -EINVAL; |
36 | dev_dbg(&trig_info->rtc->dev, "trigger frequency is %d\n", | 38 | dev_dbg(&trig_info->rtc->dev, "trigger frequency is %d\n", |
37 | trig_info->frequency); | 39 | trig_info->frequency); |
38 | return rtc_irq_set_state(trig_info->rtc, &trig_info->task, state); | 40 | ret = rtc_irq_set_state(trig_info->rtc, &trig_info->task, state); |
41 | if (ret == 0) | ||
42 | trig_info->state = state; | ||
43 | |||
44 | return ret; | ||
39 | } | 45 | } |
40 | 46 | ||
41 | static ssize_t iio_trig_periodic_read_freq(struct device *dev, | 47 | static ssize_t iio_trig_periodic_read_freq(struct device *dev, |
@@ -61,7 +67,14 @@ static ssize_t iio_trig_periodic_write_freq(struct device *dev, | |||
61 | if (ret) | 67 | if (ret) |
62 | goto error_ret; | 68 | goto error_ret; |
63 | 69 | ||
64 | ret = rtc_irq_set_freq(trig_info->rtc, &trig_info->task, val); | 70 | if (val > 0) { |
71 | ret = rtc_irq_set_freq(trig_info->rtc, &trig_info->task, val); | ||
72 | if (ret == 0 && trig_info->state && trig_info->frequency == 0) | ||
73 | ret = rtc_irq_set_state(trig_info->rtc, &trig_info->task, 1); | ||
74 | } else if (val == 0) { | ||
75 | ret = rtc_irq_set_state(trig_info->rtc, &trig_info->task, 0); | ||
76 | } else | ||
77 | ret = -EINVAL; | ||
65 | if (ret) | 78 | if (ret) |
66 | goto error_ret; | 79 | goto error_ret; |
67 | 80 | ||