w1: disable irqs in critical section
Interrupting w1_delay() in w1_read_bit() results in missing the low level on the w1 line and receiving "1" instead of "0". Add local_irq_save()/local_irq_restore() around the critical section Signed-off-by: Jan Weitzel <j.weitzel@phytec.de> Acked-by: Evgeniy Polyakov <zbr@ioremap.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
68a436aec3
commit
3fd306c85a
|
@ -158,13 +158,18 @@ EXPORT_SYMBOL_GPL(w1_write_8);
|
|||
static u8 w1_read_bit(struct w1_master *dev)
|
||||
{
|
||||
int result;
|
||||
unsigned long flags;
|
||||
|
||||
/* sample timing is critical here */
|
||||
local_irq_save(flags);
|
||||
dev->bus_master->write_bit(dev->bus_master->data, 0);
|
||||
w1_delay(6);
|
||||
dev->bus_master->write_bit(dev->bus_master->data, 1);
|
||||
w1_delay(9);
|
||||
|
||||
result = dev->bus_master->read_bit(dev->bus_master->data);
|
||||
local_irq_restore(flags);
|
||||
|
||||
w1_delay(55);
|
||||
|
||||
return result & 0x1;
|
||||
|
|
Loading…
Reference in a new issue