aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/w1
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/w1')
-rw-r--r--drivers/w1/w1_io.c24
-rw-r--r--drivers/w1/w1_io.h1
-rw-r--r--drivers/w1/w1_therm.c11
3 files changed, 27 insertions, 9 deletions
diff --git a/drivers/w1/w1_io.c b/drivers/w1/w1_io.c
index 00f032220173..e2a043354ddf 100644
--- a/drivers/w1/w1_io.c
+++ b/drivers/w1/w1_io.c
@@ -277,6 +277,29 @@ void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb)
277 w1_search(dev, cb); 277 w1_search(dev, cb);
278} 278}
279 279
280/**
281 * Resets the bus and then selects the slave by sending either a skip rom
282 * or a rom match.
283 * The w1 master lock must be held.
284 *
285 * @param sl the slave to select
286 * @return 0=success, anything else=error
287 */
288int w1_reset_select_slave(struct w1_slave *sl)
289{
290 if (w1_reset_bus(sl->master))
291 return -1;
292
293 if (sl->master->slave_count == 1)
294 w1_write_8(sl->master, W1_SKIP_ROM);
295 else {
296 u8 match[9] = {W1_MATCH_ROM, };
297 memcpy(&match[1], (u8 *)&sl->reg_num, 8);
298 w1_write_block(sl->master, match, 9);
299 }
300 return 0;
301}
302
280EXPORT_SYMBOL(w1_touch_bit); 303EXPORT_SYMBOL(w1_touch_bit);
281EXPORT_SYMBOL(w1_write_8); 304EXPORT_SYMBOL(w1_write_8);
282EXPORT_SYMBOL(w1_read_8); 305EXPORT_SYMBOL(w1_read_8);
@@ -286,3 +309,4 @@ EXPORT_SYMBOL(w1_delay);
286EXPORT_SYMBOL(w1_read_block); 309EXPORT_SYMBOL(w1_read_block);
287EXPORT_SYMBOL(w1_write_block); 310EXPORT_SYMBOL(w1_write_block);
288EXPORT_SYMBOL(w1_search_devices); 311EXPORT_SYMBOL(w1_search_devices);
312EXPORT_SYMBOL(w1_reset_select_slave);
diff --git a/drivers/w1/w1_io.h b/drivers/w1/w1_io.h
index af5829778aaa..232860184a29 100644
--- a/drivers/w1/w1_io.h
+++ b/drivers/w1/w1_io.h
@@ -34,5 +34,6 @@ u8 w1_calc_crc8(u8 *, int);
34void w1_write_block(struct w1_master *, const u8 *, int); 34void w1_write_block(struct w1_master *, const u8 *, int);
35u8 w1_read_block(struct w1_master *, u8 *, int); 35u8 w1_read_block(struct w1_master *, u8 *, int);
36void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb); 36void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb);
37int w1_reset_select_slave(struct w1_slave *sl);
37 38
38#endif /* __W1_IO_H */ 39#endif /* __W1_IO_H */
diff --git a/drivers/w1/w1_therm.c b/drivers/w1/w1_therm.c
index 2259f3d851ff..2ed0e0f48268 100644
--- a/drivers/w1/w1_therm.c
+++ b/drivers/w1/w1_therm.c
@@ -176,15 +176,10 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si
176 crc = 0; 176 crc = 0;
177 177
178 while (max_trying--) { 178 while (max_trying--) {
179 if (!w1_reset_bus (dev)) { 179 if (!w1_reset_select_slave(sl)) {
180 int count = 0; 180 int count = 0;
181 u8 match[9] = {W1_MATCH_ROM, };
182 unsigned int tm = 750; 181 unsigned int tm = 750;
183 182
184 memcpy(&match[1], (u64 *) & sl->reg_num, 8);
185
186 w1_write_block(dev, match, 9);
187
188 w1_write_8(dev, W1_CONVERT_TEMP); 183 w1_write_8(dev, W1_CONVERT_TEMP);
189 184
190 while (tm) { 185 while (tm) {
@@ -193,8 +188,7 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si
193 flush_signals(current); 188 flush_signals(current);
194 } 189 }
195 190
196 if (!w1_reset_bus (dev)) { 191 if (!w1_reset_select_slave(sl)) {
197 w1_write_block(dev, match, 9);
198 192
199 w1_write_8(dev, W1_READ_SCRATCHPAD); 193 w1_write_8(dev, W1_READ_SCRATCHPAD);
200 if ((count = w1_read_block(dev, rom, 9)) != 9) { 194 if ((count = w1_read_block(dev, rom, 9)) != 9) {
@@ -205,7 +199,6 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si
205 199
206 if (rom[8] == crc && rom[0]) 200 if (rom[8] == crc && rom[0])
207 verdict = 1; 201 verdict = 1;
208
209 } 202 }
210 } 203 }
211 204