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