aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/w1/w1.h2
-rw-r--r--drivers/w1/w1_io.c26
2 files changed, 28 insertions, 0 deletions
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h
index d8a9709f3449..f804eba89b7b 100644
--- a/drivers/w1/w1.h
+++ b/drivers/w1/w1.h
@@ -55,6 +55,7 @@ struct w1_reg_num
55#define W1_READ_ROM 0x33 55#define W1_READ_ROM 0x33
56#define W1_READ_PSUPPLY 0xB4 56#define W1_READ_PSUPPLY 0xB4
57#define W1_MATCH_ROM 0x55 57#define W1_MATCH_ROM 0x55
58#define W1_RESUME_CMD 0xA5
58 59
59#define W1_SLAVE_ACTIVE 0 60#define W1_SLAVE_ACTIVE 0
60 61
@@ -213,6 +214,7 @@ void w1_write_block(struct w1_master *, const u8 *, int);
213void w1_touch_block(struct w1_master *, u8 *, int); 214void w1_touch_block(struct w1_master *, u8 *, int);
214u8 w1_read_block(struct w1_master *, u8 *, int); 215u8 w1_read_block(struct w1_master *, u8 *, int);
215int w1_reset_select_slave(struct w1_slave *sl); 216int w1_reset_select_slave(struct w1_slave *sl);
217int w1_reset_resume_command(struct w1_master *);
216void w1_next_pullup(struct w1_master *, int); 218void w1_next_pullup(struct w1_master *, int);
217 219
218static inline struct w1_slave* dev_to_w1_slave(struct device *dev) 220static inline struct w1_slave* dev_to_w1_slave(struct device *dev)
diff --git a/drivers/w1/w1_io.c b/drivers/w1/w1_io.c
index 3ebe9726a9e5..8e8b64cfafb6 100644
--- a/drivers/w1/w1_io.c
+++ b/drivers/w1/w1_io.c
@@ -390,6 +390,32 @@ int w1_reset_select_slave(struct w1_slave *sl)
390EXPORT_SYMBOL_GPL(w1_reset_select_slave); 390EXPORT_SYMBOL_GPL(w1_reset_select_slave);
391 391
392/** 392/**
393 * When the workflow with a slave amongst many requires several
394 * successive commands a reset between each, this function is similar
395 * to doing a reset then a match ROM for the last matched ROM. The
396 * advantage being that the matched ROM step is skipped in favor of the
397 * resume command. The slave must support the command of course.
398 *
399 * If the bus has only one slave, traditionnaly the match ROM is skipped
400 * and a "SKIP ROM" is done for efficiency. On multi-slave busses, this
401 * doesn't work of course, but the resume command is the next best thing.
402 *
403 * The w1 master lock must be held.
404 *
405 * @param dev the master device
406 */
407int w1_reset_resume_command(struct w1_master *dev)
408{
409 if (w1_reset_bus(dev))
410 return -1;
411
412 /* This will make only the last matched slave perform a skip ROM. */
413 w1_write_8(dev, W1_RESUME_CMD);
414 return 0;
415}
416EXPORT_SYMBOL_GPL(w1_reset_resume_command);
417
418/**
393 * Put out a strong pull-up of the specified duration after the next write 419 * Put out a strong pull-up of the specified duration after the next write
394 * operation. Not all hardware supports strong pullups. Hardware that 420 * operation. Not all hardware supports strong pullups. Hardware that
395 * doesn't support strong pullups will sleep for the given time after the 421 * doesn't support strong pullups will sleep for the given time after the