diff options
Diffstat (limited to 'drivers/pps/pps.c')
-rw-r--r-- | drivers/pps/pps.c | 10 |
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 | } |