Commit 6ed5db86 authored by Nishanth Aravamudan's avatar Nishanth Aravamudan Committed by Greg Kroah-Hartman

[PATCH] i2c/i2c-mpc: replace schedule_timeout() with msleep_interruptible()

Properly orders set_current_state() and add_wait_queue().  Uses
msleep_interruptible() in place of schedule_timeout() to guarantee the
task delays as expected. Uses set_current_state() instead of direct
assignment of current->state.
Signed-off-by: default avatarNishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 8978afef
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <asm/ocp.h> #include <asm/ocp.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h>
#define MPC_I2C_ADDR 0x00 #define MPC_I2C_ADDR 0x00
#define MPC_I2C_FDR 0x04 #define MPC_I2C_FDR 0x04
...@@ -91,9 +92,9 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) ...@@ -91,9 +92,9 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
x = readb(i2c->base + MPC_I2C_SR); x = readb(i2c->base + MPC_I2C_SR);
writeb(0, i2c->base + MPC_I2C_SR); writeb(0, i2c->base + MPC_I2C_SR);
} else { } else {
set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&i2c->queue, &wait); add_wait_queue(&i2c->queue, &wait);
while (!(i2c->interrupt & CSR_MIF)) { while (!(i2c->interrupt & CSR_MIF)) {
set_current_state(TASK_INTERRUPTIBLE);
if (signal_pending(current)) { if (signal_pending(current)) {
pr_debug("I2C: Interrupted\n"); pr_debug("I2C: Interrupted\n");
result = -EINTR; result = -EINTR;
...@@ -104,9 +105,9 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) ...@@ -104,9 +105,9 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
result = -EIO; result = -EIO;
break; break;
} }
schedule_timeout(timeout); msleep_interruptible(jiffies_to_msecs(timeout));
} }
current->state = TASK_RUNNING; set_current_state(TASK_RUNNING);
remove_wait_queue(&i2c->queue, &wait); remove_wait_queue(&i2c->queue, &wait);
x = i2c->interrupt; x = i2c->interrupt;
i2c->interrupt = 0; i2c->interrupt = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment