aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/w1
diff options
context:
space:
mode:
authorJean-Francois Dagenais <jeff.dagenais@gmail.com>2013-07-03 18:09:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-07-03 19:08:06 -0400
commitd5528773e68e35512f69dd574e25d8c81e7d3105 (patch)
tree303e9e88c3f97edd17f625b0f88562967e70491b /drivers/w1
parent5af1a9ce3d114bbd49b5a06bfc5f5404d73709e3 (diff)
drivers/w1/slaves/w1_ds2408.c: add magic sequence to disable P0 test mode
Power-up timing The DS2408 is sensitive to the power-on slew rate and can inadvertently power up with a test mode feature enabled. When this occurs, the P0 port does not respond to the Channel Access Write command. For most reliable operation, it is recommended to disable the test mode after every power-on reset using the Disable Test Mode sequence shown below. The 64-bit ROM code must be transmitted in the same bit sequence as with the Match ROM command, i.e., least significant bit first. This precaution is recommended in parasite power mode (VCC pin connected to GND) as well as with VCC power. Disable Test Mode: RST,PD,96h,<64-bit DS2408 ROM Code>,3Ch,RST,PD [akpm@linux-foundation.org: don't use kerenldoc token to introduce a non-kerneldoc comment, tweak whitespace] Signed-off-by: Jean-Francois Dagenais <jeff.dagenais@gmail.com> Cc: Evgeniy Polyakov <zbr@ioremap.net> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/w1')
-rw-r--r--drivers/w1/slaves/w1_ds2408.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/w1/slaves/w1_ds2408.c b/drivers/w1/slaves/w1_ds2408.c
index 91cc2cdf02c0..cb8a8e5d9573 100644
--- a/drivers/w1/slaves/w1_ds2408.c
+++ b/drivers/w1/slaves/w1_ds2408.c
@@ -302,7 +302,33 @@ error:
302 return -EIO; 302 return -EIO;
303} 303}
304 304
305/*
306 * This is a special sequence we must do to ensure the P0 output is not stuck
307 * in test mode. This is described in rev 2 of the ds2408's datasheet
308 * (http://datasheets.maximintegrated.com/en/ds/DS2408.pdf) under
309 * "APPLICATION INFORMATION/Power-up timing".
310 */
311static int w1_f29_disable_test_mode(struct w1_slave *sl)
312{
313 int res;
314 u8 magic[10] = {0x96, };
315 u64 rn = le64_to_cpu(*((u64*)&sl->reg_num));
316
317 memcpy(&magic[1], &rn, 8);
318 magic[9] = 0x3C;
319
320 mutex_lock(&sl->master->bus_mutex);
305 321
322 res = w1_reset_bus(sl->master);
323 if (res)
324 goto out;
325 w1_write_block(sl->master, magic, ARRAY_SIZE(magic));
326
327 res = w1_reset_bus(sl->master);
328out:
329 mutex_unlock(&sl->master->bus_mutex);
330 return res;
331}
306 332
307static struct bin_attribute w1_f29_sysfs_bin_files[] = { 333static struct bin_attribute w1_f29_sysfs_bin_files[] = {
308 { 334 {
@@ -363,6 +389,10 @@ static int w1_f29_add_slave(struct w1_slave *sl)
363 int err = 0; 389 int err = 0;
364 int i; 390 int i;
365 391
392 err = w1_f29_disable_test_mode(sl);
393 if (err)
394 return err;
395
366 for (i = 0; i < ARRAY_SIZE(w1_f29_sysfs_bin_files) && !err; ++i) 396 for (i = 0; i < ARRAY_SIZE(w1_f29_sysfs_bin_files) && !err; ++i)
367 err = sysfs_create_bin_file( 397 err = sysfs_create_bin_file(
368 &sl->dev.kobj, 398 &sl->dev.kobj,