Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b36fb84 authored by David S. Miller's avatar David S. Miller
Browse files

[SPARC64] bbc_i2c: Fix kenvctrld eating %100 cpu.



Based almost entirely upon a patch by Joerg Friedrich

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent abfd336c
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -187,19 +187,20 @@ static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status)
	bp->waiting = 1;
	add_wait_queue(&bp->wq, &wait);
	while (limit-- > 0) {
		u8 val;

		set_current_state(TASK_INTERRUPTIBLE);
		*status = val = readb(bp->i2c_control_regs + 0);
		if ((val & I2C_PCF_PIN) == 0) {
		unsigned long val;

		val = wait_event_interruptible_timeout(
				bp->wq,
				(((*status = readb(bp->i2c_control_regs + 0))
				  & I2C_PCF_PIN) == 0),
				msecs_to_jiffies(250));
		if (val > 0) {
			ret = 0;
			break;
		}
		msleep_interruptible(250);
	}
	remove_wait_queue(&bp->wq, &wait);
	bp->waiting = 0;
	current->state = TASK_RUNNING;

	return ret;
}
@@ -340,7 +341,7 @@ static irqreturn_t bbc_i2c_interrupt(int irq, void *dev_id)
	 */
	if (bp->waiting &&
	    !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN))
		wake_up(&bp->wq);
		wake_up_interruptible(&bp->wq);

	return IRQ_HANDLED;
}