aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pps/pps.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pps/pps.c')
-rw-r--r--drivers/pps/pps.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
index c76afb980a98..dc7e66cb2762 100644
--- a/drivers/pps/pps.c
+++ b/drivers/pps/pps.c
@@ -136,6 +136,7 @@ static long pps_cdev_ioctl(struct file *file,
136 136
137 case PPS_FETCH: { 137 case PPS_FETCH: {
138 struct pps_fdata fdata; 138 struct pps_fdata fdata;
139 unsigned int ev;
139 140
140 pr_debug("PPS_FETCH: source %d\n", pps->id); 141 pr_debug("PPS_FETCH: source %d\n", pps->id);
141 142
@@ -143,11 +144,12 @@ static long pps_cdev_ioctl(struct file *file,
143 if (err) 144 if (err)
144 return -EFAULT; 145 return -EFAULT;
145 146
146 pps->go = 0; 147 ev = pps->last_ev;
147 148
148 /* Manage the timeout */ 149 /* Manage the timeout */
149 if (fdata.timeout.flags & PPS_TIME_INVALID) 150 if (fdata.timeout.flags & PPS_TIME_INVALID)
150 err = wait_event_interruptible(pps->queue, pps->go); 151 err = wait_event_interruptible(pps->queue,
152 ev != pps->last_ev);
151 else { 153 else {
152 unsigned long ticks; 154 unsigned long ticks;
153 155
@@ -159,7 +161,9 @@ static long pps_cdev_ioctl(struct file *file,
159 161
160 if (ticks != 0) { 162 if (ticks != 0) {
161 err = wait_event_interruptible_timeout( 163 err = wait_event_interruptible_timeout(
162 pps->queue, pps->go, ticks); 164 pps->queue,
165 ev != pps->last_ev,
166 ticks);
163 if (err == 0) 167 if (err == 0)
164 return -ETIMEDOUT; 168 return -ETIMEDOUT;
165 } 169 }