diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pps/kapi.c | 4 | ||||
| -rw-r--r-- | drivers/pps/pps.c | 10 |
2 files changed, 9 insertions, 5 deletions
diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index 55f39618261b..3f89f5eba81c 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c | |||
| @@ -326,8 +326,8 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) | |||
| 326 | 326 | ||
| 327 | /* Wake up if captured something */ | 327 | /* Wake up if captured something */ |
| 328 | if (captured) { | 328 | if (captured) { |
| 329 | pps->go = ~0; | 329 | pps->last_ev++; |
| 330 | wake_up_interruptible(&pps->queue); | 330 | wake_up_interruptible_all(&pps->queue); |
| 331 | 331 | ||
| 332 | kill_fasync(&pps->async_queue, SIGIO, POLL_IN); | 332 | kill_fasync(&pps->async_queue, SIGIO, POLL_IN); |
| 333 | } | 333 | } |
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 | } |
