diff options
| author | David S. Miller <davem@sunset.davemloft.net> | 2007-02-26 13:11:35 -0500 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2007-02-26 14:35:49 -0500 |
| commit | 3b36fb8471f8639d565b69c9a456a3ef9413df59 (patch) | |
| tree | 0bee40e06ff42f5a9a15b1e2ff95ac8f9f7719a3 /drivers/sbus | |
| parent | abfd336cd79ea154dc71f09272f578a731b81d8c (diff) | |
[SPARC64] bbc_i2c: Fix kenvctrld eating %100 cpu.
Based almost entirely upon a patch by Joerg Friedrich
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/sbus')
| -rw-r--r-- | drivers/sbus/char/bbc_i2c.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index 22631f8b9b48..8410587348f1 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c | |||
| @@ -187,19 +187,20 @@ static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status) | |||
| 187 | bp->waiting = 1; | 187 | bp->waiting = 1; |
| 188 | add_wait_queue(&bp->wq, &wait); | 188 | add_wait_queue(&bp->wq, &wait); |
| 189 | while (limit-- > 0) { | 189 | while (limit-- > 0) { |
| 190 | u8 val; | 190 | unsigned long val; |
| 191 | 191 | ||
| 192 | set_current_state(TASK_INTERRUPTIBLE); | 192 | val = wait_event_interruptible_timeout( |
| 193 | *status = val = readb(bp->i2c_control_regs + 0); | 193 | bp->wq, |
| 194 | if ((val & I2C_PCF_PIN) == 0) { | 194 | (((*status = readb(bp->i2c_control_regs + 0)) |
| 195 | & I2C_PCF_PIN) == 0), | ||
| 196 | msecs_to_jiffies(250)); | ||
| 197 | if (val > 0) { | ||
| 195 | ret = 0; | 198 | ret = 0; |
| 196 | break; | 199 | break; |
| 197 | } | 200 | } |
| 198 | msleep_interruptible(250); | ||
| 199 | } | 201 | } |
| 200 | remove_wait_queue(&bp->wq, &wait); | 202 | remove_wait_queue(&bp->wq, &wait); |
| 201 | bp->waiting = 0; | 203 | bp->waiting = 0; |
| 202 | current->state = TASK_RUNNING; | ||
| 203 | 204 | ||
| 204 | return ret; | 205 | return ret; |
| 205 | } | 206 | } |
| @@ -340,7 +341,7 @@ static irqreturn_t bbc_i2c_interrupt(int irq, void *dev_id) | |||
| 340 | */ | 341 | */ |
| 341 | if (bp->waiting && | 342 | if (bp->waiting && |
| 342 | !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN)) | 343 | !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN)) |
| 343 | wake_up(&bp->wq); | 344 | wake_up_interruptible(&bp->wq); |
| 344 | 345 | ||
| 345 | return IRQ_HANDLED; | 346 | return IRQ_HANDLED; |
| 346 | } | 347 | } |
