diff options
Diffstat (limited to 'drivers/w1')
-rw-r--r-- | drivers/w1/w1_io.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/w1/w1_io.c b/drivers/w1/w1_io.c index 97b338a16abc..f4f82f1f486e 100644 --- a/drivers/w1/w1_io.c +++ b/drivers/w1/w1_io.c | |||
@@ -293,12 +293,24 @@ int w1_reset_bus(struct w1_master *dev) | |||
293 | result = dev->bus_master->reset_bus(dev->bus_master->data) & 0x1; | 293 | result = dev->bus_master->reset_bus(dev->bus_master->data) & 0x1; |
294 | else { | 294 | else { |
295 | dev->bus_master->write_bit(dev->bus_master->data, 0); | 295 | dev->bus_master->write_bit(dev->bus_master->data, 0); |
296 | /* minimum 480, max ? us | ||
297 | * be nice and sleep, except 18b20 spec lists 960us maximum, | ||
298 | * so until we can sleep with microsecond accuracy, spin. | ||
299 | * Feel free to come up with some other way to give up the | ||
300 | * cpu for such a short amount of time AND get it back in | ||
301 | * the maximum amount of time. | ||
302 | */ | ||
296 | w1_delay(480); | 303 | w1_delay(480); |
297 | dev->bus_master->write_bit(dev->bus_master->data, 1); | 304 | dev->bus_master->write_bit(dev->bus_master->data, 1); |
298 | w1_delay(70); | 305 | w1_delay(70); |
299 | 306 | ||
300 | result = dev->bus_master->read_bit(dev->bus_master->data) & 0x1; | 307 | result = dev->bus_master->read_bit(dev->bus_master->data) & 0x1; |
301 | w1_delay(410); | 308 | /* minmum 70 (above) + 410 = 480 us |
309 | * There aren't any timing requirements between a reset and | ||
310 | * the following transactions. Sleeping is safe here. | ||
311 | */ | ||
312 | /* w1_delay(410); min required time */ | ||
313 | msleep(1); | ||
302 | } | 314 | } |
303 | 315 | ||
304 | return result; | 316 | return result; |