diff options
author | Ben Gardner <bgardner@wabtec.com> | 2006-01-18 16:52:06 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-03-23 17:21:50 -0500 |
commit | f933ff504f5b3f0f94b98d69d48fc8d3c1e92267 (patch) | |
tree | 8dab006c4b542ab5f856850e1884e2ac8e1c84a5 | |
parent | 16ffc5c99554bc1630bc3939e0950a75b2b1c811 (diff) |
[PATCH] i2c: scx200_acb fix and speed up the poll loop
scx200_acb: Fix and speed up the poll loop
Signed-off-by: Ben Gardner <bgardner@wabtec.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/i2c/busses/scx200_acb.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index 0ae77f84ffe8..8e646bdb556c 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -47,10 +47,7 @@ static int base[MAX_DEVICES] = { 0x820, 0x840 }; | |||
47 | module_param_array(base, int, NULL, 0); | 47 | module_param_array(base, int, NULL, 0); |
48 | MODULE_PARM_DESC(base, "Base addresses for the ACCESS.bus controllers"); | 48 | MODULE_PARM_DESC(base, "Base addresses for the ACCESS.bus controllers"); |
49 | 49 | ||
50 | /* The hardware supports interrupt driven mode too, but I haven't | 50 | #define POLL_TIMEOUT (HZ/5) |
51 | implemented that. */ | ||
52 | #define POLLED_MODE 1 | ||
53 | #define POLL_TIMEOUT (HZ) | ||
54 | 51 | ||
55 | enum scx200_acb_state { | 52 | enum scx200_acb_state { |
56 | state_idle, | 53 | state_idle, |
@@ -222,7 +219,6 @@ static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status) | |||
222 | iface->needs_reset = 1; | 219 | iface->needs_reset = 1; |
223 | } | 220 | } |
224 | 221 | ||
225 | #ifdef POLLED_MODE | ||
226 | static void scx200_acb_poll(struct scx200_acb_iface *iface) | 222 | static void scx200_acb_poll(struct scx200_acb_iface *iface) |
227 | { | 223 | { |
228 | u8 status; | 224 | u8 status; |
@@ -235,7 +231,7 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface) | |||
235 | scx200_acb_machine(iface, status); | 231 | scx200_acb_machine(iface, status); |
236 | return; | 232 | return; |
237 | } | 233 | } |
238 | msleep(10); | 234 | yield(); |
239 | } | 235 | } |
240 | 236 | ||
241 | dev_err(&iface->adapter.dev, "timeout in state %s\n", | 237 | dev_err(&iface->adapter.dev, "timeout in state %s\n", |
@@ -245,7 +241,6 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface) | |||
245 | iface->result = -EIO; | 241 | iface->result = -EIO; |
246 | iface->needs_reset = 1; | 242 | iface->needs_reset = 1; |
247 | } | 243 | } |
248 | #endif /* POLLED_MODE */ | ||
249 | 244 | ||
250 | static void scx200_acb_reset(struct scx200_acb_iface *iface) | 245 | static void scx200_acb_reset(struct scx200_acb_iface *iface) |
251 | { | 246 | { |
@@ -335,12 +330,8 @@ static s32 scx200_acb_smbus_xfer(struct i2c_adapter *adapter, | |||
335 | else | 330 | else |
336 | iface->state = state_address; | 331 | iface->state = state_address; |
337 | 332 | ||
338 | #ifdef POLLED_MODE | ||
339 | while (iface->state != state_idle) | 333 | while (iface->state != state_idle) |
340 | scx200_acb_poll(iface); | 334 | scx200_acb_poll(iface); |
341 | #else /* POLLED_MODE */ | ||
342 | #error Interrupt driven mode not implemented | ||
343 | #endif /* POLLED_MODE */ | ||
344 | 335 | ||
345 | if (iface->needs_reset) | 336 | if (iface->needs_reset) |
346 | scx200_acb_reset(iface); | 337 | scx200_acb_reset(iface); |