/** * w1_triplet() - * Does a triplet - used for searching ROM addresses. * @dev: the master device * @bdir: the bit to write if both id_bit and comp_bit are 0 * * Return bits: * bit 0 = id_bit * bit 1 = comp_bit * bit 2 = dir_taken * If both bits 0 & 1 are set, the search should be restarted. * * Return: bit fields - see above */ u8 w1_triplet(struct w1_master *dev, int bdir) { if (dev->bus_master->triplet) return dev->bus_master->triplet(dev->bus_master->data, bdir); else { u8 id_bit = w1_touch_bit(dev, 1); u8 comp_bit = w1_touch_bit(dev, 1); u8 retval; if (id_bit && comp_bit) return 0x03; /* error */ if (!id_bit && !comp_bit) { /* Both bits are valid, take the direction given */ retval = bdir ? 0x04 : 0; } else { /* Only one bit is valid, take that direction */ bdir = id_bit; retval = id_bit ? 0x05 : 0x02; } if (dev->bus_master->touch_bit) w1_touch_bit(dev, bdir); else w1_write_bit(dev, bdir); return retval; } }
u8 w1_triplet(struct w1_master *dev, int bdir) { if (dev->bus_master->triplet) return dev->bus_master->triplet(dev->bus_master->data, bdir); else { u8 id_bit = w1_touch_bit(dev, 1); u8 comp_bit = w1_touch_bit(dev, 1); u8 retval; if (id_bit && comp_bit) return 0x03; /* */ if (!id_bit && !comp_bit) { /* */ retval = bdir ? 0x04 : 0; } else { /* */ bdir = id_bit; retval = id_bit ? 0x05 : 0x02; } if (dev->bus_master->touch_bit) w1_touch_bit(dev, bdir); else w1_write_bit(dev, bdir); return retval; } }
/** * w1_touch_bit() - Generates a write-0 or write-1 cycle and samples the level. * @dev: the master device * @bit: 0 - write a 0, 1 - write a 0 read the level */ static u8 w1_touch_bit(struct w1_master *dev, int bit) { if (dev->bus_master->touch_bit) return dev->bus_master->touch_bit(dev->bus_master->data, bit); else if (bit) return w1_read_bit(dev); else { w1_write_bit(dev, 0); return 0; } }