11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
27785925dd8e0d2f389d4a9168f1683c6b249a552Evgeniy Polyakov *	w1_io.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4a801876638c5ce650223476c4eb8f37cea32dc1cEvgeniy Polyakov * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
57785925dd8e0d2f389d4a9168f1683c6b249a552Evgeniy Polyakov *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful,
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details.
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/moduleparam.h>
26339f07236b481371ffb4993cf309dd1f1b3382abAndrew Morton#include <linux/module.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "w1.h"
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "w1_log.h"
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31a9fb1c7b950bed4afe208c9d67e20f086bb6abbbAdrian Bunkstatic int w1_delay_parm = 1;
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_named(delay_coef, w1_delay_parm, int, 0);
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u8 w1_crc8_table[] = {
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5370d484bff43013e9b08f5d970b1c5941e9d98e16Evgeniy Polyakovstatic void w1_delay(unsigned long tm)
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	udelay(tm * w1_delay_parm);
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakovstatic void w1_write_bit(struct w1_master *dev, int bit);
59be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakovstatic u8 w1_read_bit(struct w1_master *dev);
60be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov
61be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
62be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Generates a write-0 or write-1 cycle and samples the level.
63be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
6470d484bff43013e9b08f5d970b1c5941e9d98e16Evgeniy Polyakovstatic u8 w1_touch_bit(struct w1_master *dev, int bit)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus_master->touch_bit)
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return dev->bus_master->touch_bit(dev->bus_master->data, bit);
68be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov	else if (bit)
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return w1_read_bit(dev);
70be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov	else {
71be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov		w1_write_bit(dev, 0);
7223c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack		return 0;
73be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov	}
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
77be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Generates a write-0 or write-1 cycle.
78be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Only call if dev->bus_master->touch_bit is NULL
79be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
80be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakovstatic void w1_write_bit(struct w1_master *dev, int bit)
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (bit) {
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_bit(dev->bus_master->data, 0);
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		w1_delay(6);
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_bit(dev->bus_master->data, 1);
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		w1_delay(64);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_bit(dev->bus_master->data, 0);
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		w1_delay(60);
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_bit(dev->bus_master->data, 1);
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		w1_delay(10);
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
95be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
966a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * Pre-write operation, currently only supporting strong pullups.
976a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * Program the hardware for a strong pullup, if one has been requested and
986a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * the hardware supports it.
996a158c0de791a81eb761ccf26ead1bd0834abac2David Fries *
1006a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * @param dev     the master device
1016a158c0de791a81eb761ccf26ead1bd0834abac2David Fries */
1026a158c0de791a81eb761ccf26ead1bd0834abac2David Friesstatic void w1_pre_write(struct w1_master *dev)
1036a158c0de791a81eb761ccf26ead1bd0834abac2David Fries{
1046a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	if (dev->pullup_duration &&
1056a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		dev->enable_pullup && dev->bus_master->set_pullup) {
1066a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		dev->bus_master->set_pullup(dev->bus_master->data,
1076a158c0de791a81eb761ccf26ead1bd0834abac2David Fries			dev->pullup_duration);
1086a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	}
1096a158c0de791a81eb761ccf26ead1bd0834abac2David Fries}
1106a158c0de791a81eb761ccf26ead1bd0834abac2David Fries
1116a158c0de791a81eb761ccf26ead1bd0834abac2David Fries/**
1126a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * Post-write operation, currently only supporting strong pullups.
1136a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * If a strong pullup was requested, clear it if the hardware supports
1146a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * them, or execute the delay otherwise, in either case clear the request.
1156a158c0de791a81eb761ccf26ead1bd0834abac2David Fries *
1166a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * @param dev     the master device
1176a158c0de791a81eb761ccf26ead1bd0834abac2David Fries */
1186a158c0de791a81eb761ccf26ead1bd0834abac2David Friesstatic void w1_post_write(struct w1_master *dev)
1196a158c0de791a81eb761ccf26ead1bd0834abac2David Fries{
1206a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	if (dev->pullup_duration) {
1216a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		if (dev->enable_pullup && dev->bus_master->set_pullup)
1226a158c0de791a81eb761ccf26ead1bd0834abac2David Fries			dev->bus_master->set_pullup(dev->bus_master->data, 0);
1236a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		else
1246a158c0de791a81eb761ccf26ead1bd0834abac2David Fries			msleep(dev->pullup_duration);
1256a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		dev->pullup_duration = 0;
1266a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	}
1276a158c0de791a81eb761ccf26ead1bd0834abac2David Fries}
1286a158c0de791a81eb761ccf26ead1bd0834abac2David Fries
1296a158c0de791a81eb761ccf26ead1bd0834abac2David Fries/**
130be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Writes 8 bits.
131be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov *
132be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param dev     the master device
133be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param byte    the byte to write
134be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid w1_write_8(struct w1_master *dev, u8 byte)
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1396a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	if (dev->bus_master->write_byte) {
1406a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		w1_pre_write(dev);
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_byte(dev->bus_master->data, byte);
1426a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	}
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
1446a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		for (i = 0; i < 8; ++i) {
1456a158c0de791a81eb761ccf26ead1bd0834abac2David Fries			if (i == 7)
1466a158c0de791a81eb761ccf26ead1bd0834abac2David Fries				w1_pre_write(dev);
147be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov			w1_touch_bit(dev, (byte >> i) & 0x1);
1486a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		}
1496a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	w1_post_write(dev);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
151339f07236b481371ffb4993cf309dd1f1b3382abAndrew MortonEXPORT_SYMBOL_GPL(w1_write_8);
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
153be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov
154be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
155be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Generates a write-1 cycle and samples the level.
156be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Only call if dev->bus_master->touch_bit is NULL
157be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
158be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakovstatic u8 w1_read_bit(struct w1_master *dev)
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int result;
1613fd306c85adcde7209281cb663dd8ea247e97cc3Jan Weitzel	unsigned long flags;
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1633fd306c85adcde7209281cb663dd8ea247e97cc3Jan Weitzel	/* sample timing is critical here */
1643fd306c85adcde7209281cb663dd8ea247e97cc3Jan Weitzel	local_irq_save(flags);
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->bus_master->write_bit(dev->bus_master->data, 0);
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	w1_delay(6);
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->bus_master->write_bit(dev->bus_master->data, 1);
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	w1_delay(9);
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	result = dev->bus_master->read_bit(dev->bus_master->data);
1713fd306c85adcde7209281cb663dd8ea247e97cc3Jan Weitzel	local_irq_restore(flags);
1723fd306c85adcde7209281cb663dd8ea247e97cc3Jan Weitzel
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	w1_delay(55);
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return result & 0x1;
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
178be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
1796b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov * Does a triplet - used for searching ROM addresses.
1806b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov * Return bits:
1816b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov *  bit 0 = id_bit
1826b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov *  bit 1 = comp_bit
1836b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov *  bit 2 = dir_taken
1846b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov * If both bits 0 & 1 are set, the search should be restarted.
1856b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov *
1866b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov * @param dev     the master device
1876b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov * @param bdir    the bit to write if both id_bit and comp_bit are 0
1886b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov * @return        bit fields - see above
1896b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov */
1906b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakovu8 w1_triplet(struct w1_master *dev, int bdir)
1916b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov{
19223c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack	if (dev->bus_master->triplet)
19323c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack		return dev->bus_master->triplet(dev->bus_master->data, bdir);
1946b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov	else {
1956b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov		u8 id_bit   = w1_touch_bit(dev, 1);
1966b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov		u8 comp_bit = w1_touch_bit(dev, 1);
1976b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov		u8 retval;
1986b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov
19923c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack		if (id_bit && comp_bit)
20023c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack			return 0x03;  /* error */
2016b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov
20223c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack		if (!id_bit && !comp_bit) {
2036b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			/* Both bits are valid, take the direction given */
2046b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			retval = bdir ? 0x04 : 0;
2056b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov		} else {
2066b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			/* Only one bit is valid, take that direction */
2076b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			bdir = id_bit;
2086b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			retval = id_bit ? 0x05 : 0x02;
2096b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov		}
2106b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov
21123c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack		if (dev->bus_master->touch_bit)
2126b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			w1_touch_bit(dev, bdir);
2136b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov		else
2146b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov			w1_write_bit(dev, bdir);
21523c36c1aec895fd52d7dd8cd3ce4bbce43c969fdDaniel Mack		return retval;
2166b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov	}
2176b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov}
2186b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov
2196b729861831177b270a2932a13e79cb41d673146Evgeniy Polyakov/**
220be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Reads 8 bits.
221be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov *
222be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param dev     the master device
223be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @return        the byte read
224be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
22534e453d45584ea9dc1f62833ace17c79a379deb4Madhusudhan Chikkatureu8 w1_read_8(struct w1_master *dev)
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 res = 0;
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus_master->read_byte)
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		res = dev->bus_master->read_byte(dev->bus_master->data);
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (i = 0; i < 8; ++i)
234be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov			res |= (w1_touch_bit(dev,1) << i);
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return res;
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
23834e453d45584ea9dc1f62833ace17c79a379deb4Madhusudhan ChikkatureEXPORT_SYMBOL_GPL(w1_read_8);
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
240be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
241be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Writes a series of bytes.
242be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov *
243be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param dev     the master device
244be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param buf     pointer to the data to write
245be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param len     the number of bytes to write
246be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
247be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakovvoid w1_write_block(struct w1_master *dev, const u8 *buf, int len)
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2516a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	if (dev->bus_master->write_block) {
2526a158c0de791a81eb761ccf26ead1bd0834abac2David Fries		w1_pre_write(dev);
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_block(dev->bus_master->data, buf, len);
2546a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	}
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (i = 0; i < len; ++i)
2576a158c0de791a81eb761ccf26ead1bd0834abac2David Fries			w1_write_8(dev, buf[i]); /* calls w1_pre_write */
2586a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	w1_post_write(dev);
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
260339f07236b481371ffb4993cf309dd1f1b3382abAndrew MortonEXPORT_SYMBOL_GPL(w1_write_block);
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
262be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
2639be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov * Touches a series of bytes.
2649be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov *
2659be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov * @param dev     the master device
2669be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov * @param buf     pointer to the data to write
2679be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov * @param len     the number of bytes to write
2689be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov */
2699be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakovvoid w1_touch_block(struct w1_master *dev, u8 *buf, int len)
2709be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov{
2719be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov	int i, j;
2729be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov	u8 tmp;
2739be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov
2749be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov	for (i = 0; i < len; ++i) {
2759be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov		tmp = 0;
2769be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov		for (j = 0; j < 8; ++j) {
2779be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov			if (j == 7)
2789be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov				w1_pre_write(dev);
2799be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov			tmp |= w1_touch_bit(dev, (buf[i] >> j) & 0x1) << j;
2809be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov		}
2819be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov
2829be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov		buf[i] = tmp;
2839be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov	}
2849be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov}
2859be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy PolyakovEXPORT_SYMBOL_GPL(w1_touch_block);
2869be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov
2879be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43dbEvgeniy Polyakov/**
288be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Reads a series of bytes.
289be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov *
290be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param dev     the master device
291be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param buf     pointer to the buffer to fill
292be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param len     the number of bytes to read
293be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @return        the number of bytes read
294be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsu8 w1_read_block(struct w1_master *dev, u8 *buf, int len)
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 ret;
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus_master->read_block)
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = dev->bus_master->read_block(dev->bus_master->data, buf, len);
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (i = 0; i < len; ++i)
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			buf[i] = w1_read_8(dev);
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = len;
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
310339f07236b481371ffb4993cf309dd1f1b3382abAndrew MortonEXPORT_SYMBOL_GPL(w1_read_block);
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
312be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov/**
313be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * Issues a reset bus sequence.
314be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov *
315be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @param  dev The bus master pointer
316be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov * @return     0=Device present, 1=No device present or error
317be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov */
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint w1_reset_bus(struct w1_master *dev)
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
320be57ce267fd558c52d2389530c15618681b7cfa7Evgeniy Polyakov	int result;
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus_master->reset_bus)
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		result = dev->bus_master->reset_bus(dev->bus_master->data) & 0x1;
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_bit(dev->bus_master->data, 0);
3268e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		/* minimum 480, max ? us
3278e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * be nice and sleep, except 18b20 spec lists 960us maximum,
3288e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * so until we can sleep with microsecond accuracy, spin.
3298e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * Feel free to come up with some other way to give up the
3308e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * cpu for such a short amount of time AND get it back in
3318e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * the maximum amount of time.
3328e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 */
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		w1_delay(480);
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->bus_master->write_bit(dev->bus_master->data, 1);
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		w1_delay(70);
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		result = dev->bus_master->read_bit(dev->bus_master->data) & 0x1;
3388e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		/* minmum 70 (above) + 410 = 480 us
3398e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * There aren't any timing requirements between a reset and
3408e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 * the following transactions.  Sleeping is safe here.
3418e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		 */
3428e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		/* w1_delay(410); min required time */
3438e3dae2b4727dc216e2dc16d2f0271b5f31b680cDavid Fries		msleep(1);
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return result;
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
348339f07236b481371ffb4993cf309dd1f1b3382abAndrew MortonEXPORT_SYMBOL_GPL(w1_reset_bus);
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsu8 w1_calc_crc8(u8 * data, int len)
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 crc = 0;
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (len--)
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		crc = w1_crc8_table[crc ^ *data++];
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return crc;
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
359339f07236b481371ffb4993cf309dd1f1b3382abAndrew MortonEXPORT_SYMBOL_GPL(w1_calc_crc8);
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36112003375acd879e498c6c511faf27531296f9640Evgeniy Polyakovvoid w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb)
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->attempts++;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus_master->search)
365c30c9b15187e977ab5928f7276e9dfcd8d6f9460David Fries		dev->bus_master->search(dev->bus_master->data, dev,
366c30c9b15187e977ab5928f7276e9dfcd8d6f9460David Fries			search_type, cb);
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
36812003375acd879e498c6c511faf27531296f9640Evgeniy Polyakov		w1_search(dev, search_type, cb);
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
371ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov/**
372ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov * Resets the bus and then selects the slave by sending either a skip rom
373ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov * or a rom match.
374ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov * The w1 master lock must be held.
375ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov *
376ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov * @param sl	the slave to select
377ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov * @return 	0=success, anything else=error
378ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov */
379ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakovint w1_reset_select_slave(struct w1_slave *sl)
380ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov{
381ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov	if (w1_reset_bus(sl->master))
382ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov		return -1;
383ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov
384ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov	if (sl->master->slave_count == 1)
385ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov		w1_write_8(sl->master, W1_SKIP_ROM);
386ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov	else {
387ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov		u8 match[9] = {W1_MATCH_ROM, };
388f00a189257836e5237ace3265f6991ef66a16c86Evgeniy Polyakov		u64 rn = le64_to_cpu(*((u64*)&sl->reg_num));
389f00a189257836e5237ace3265f6991ef66a16c86Evgeniy Polyakov
390f00a189257836e5237ace3265f6991ef66a16c86Evgeniy Polyakov		memcpy(&match[1], &rn, 8);
391ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov		w1_write_block(sl->master, match, 9);
392ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov	}
393ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov	return 0;
394ea7d8f65c865ebfa1d7cd67c360a87333ff013c1Evgeniy Polyakov}
395339f07236b481371ffb4993cf309dd1f1b3382abAndrew MortonEXPORT_SYMBOL_GPL(w1_reset_select_slave);
3966a158c0de791a81eb761ccf26ead1bd0834abac2David Fries
3976a158c0de791a81eb761ccf26ead1bd0834abac2David Fries/**
39867dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * When the workflow with a slave amongst many requires several
39967dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * successive commands a reset between each, this function is similar
40067dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * to doing a reset then a match ROM for the last matched ROM. The
40167dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * advantage being that the matched ROM step is skipped in favor of the
40267dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * resume command. The slave must support the command of course.
40367dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais *
40467dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * If the bus has only one slave, traditionnaly the match ROM is skipped
40567dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * and a "SKIP ROM" is done for efficiency. On multi-slave busses, this
40667dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * doesn't work of course, but the resume command is the next best thing.
40767dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais *
40867dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * The w1 master lock must be held.
40967dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais *
41067dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais * @param dev     the master device
41167dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais */
41267dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenaisint w1_reset_resume_command(struct w1_master *dev)
41367dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais{
41467dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais	if (w1_reset_bus(dev))
41567dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais		return -1;
41667dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais
41767dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais	/* This will make only the last matched slave perform a skip ROM. */
41867dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais	w1_write_8(dev, W1_RESUME_CMD);
41967dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais	return 0;
42067dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais}
42167dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François DagenaisEXPORT_SYMBOL_GPL(w1_reset_resume_command);
42267dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais
42367dfd54c2d83a76a5756760f7fee0c8cfac52b1cJean-François Dagenais/**
4246a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * Put out a strong pull-up of the specified duration after the next write
4256a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * operation.  Not all hardware supports strong pullups.  Hardware that
4266a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * doesn't support strong pullups will sleep for the given time after the
4276a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * write operation without a strong pullup.  This is a one shot request for
4286a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * the next write, specifying zero will clear a previous request.
4296a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * The w1 master lock must be held.
4306a158c0de791a81eb761ccf26ead1bd0834abac2David Fries *
4316a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * @param delay	time in milliseconds
4326a158c0de791a81eb761ccf26ead1bd0834abac2David Fries * @return	0=success, anything else=error
4336a158c0de791a81eb761ccf26ead1bd0834abac2David Fries */
4346a158c0de791a81eb761ccf26ead1bd0834abac2David Friesvoid w1_next_pullup(struct w1_master *dev, int delay)
4356a158c0de791a81eb761ccf26ead1bd0834abac2David Fries{
4366a158c0de791a81eb761ccf26ead1bd0834abac2David Fries	dev->pullup_duration = delay;
4376a158c0de791a81eb761ccf26ead1bd0834abac2David Fries}
4386a158c0de791a81eb761ccf26ead1bd0834abac2David FriesEXPORT_SYMBOL_GPL(w1_next_pullup);
439