aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Meerwald <pmeerw@pmeerw.net>2014-12-06 01:00:00 -0500
committerJonathan Cameron <jic23@kernel.org>2014-06-14 11:11:55 -0400
commit9d2f79abdf8313682d7b38570de0a717b0e9baf1 (patch)
tree2f14061fbe075721e77167375e94fa342ad00d2c
parent1c70f7bebce44515ffe30bf81358fe5f691656ad (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.c19
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
31static int iio_trig_periodic_rtc_set_state(struct iio_trigger *trig, bool state) 32static 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
41static ssize_t iio_trig_periodic_read_freq(struct device *dev, 47static 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