aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/w1/w1.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/w1/w1.c')
-rw-r--r--drivers/w1/w1.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c
index 4fa959f08554..48da17596d43 100644
--- a/drivers/w1/w1.c
+++ b/drivers/w1/w1.c
@@ -148,6 +148,39 @@ static ssize_t w1_master_attribute_show_name(struct device *dev, struct device_a
148 return count; 148 return count;
149} 149}
150 150
151static ssize_t w1_master_attribute_store_search(struct device * dev,
152 struct device_attribute *attr,
153 const char * buf, size_t count)
154{
155 struct w1_master *md = container_of(dev, struct w1_master, dev);
156
157 if (down_interruptible (&md->mutex))
158 return -EBUSY;
159
160 md->search_count = simple_strtol(buf, NULL, 0);
161
162 up(&md->mutex);
163
164 return count;
165}
166
167static ssize_t w1_master_attribute_show_search(struct device *dev,
168 struct device_attribute *attr,
169 char *buf)
170{
171 struct w1_master *md = container_of(dev, struct w1_master, dev);
172 ssize_t count;
173
174 if (down_interruptible (&md->mutex))
175 return -EBUSY;
176
177 count = sprintf(buf, "%d\n", md->search_count);
178
179 up(&md->mutex);
180
181 return count;
182}
183
151static ssize_t w1_master_attribute_show_pointer(struct device *dev, struct device_attribute *attr, char *buf) 184static ssize_t w1_master_attribute_show_pointer(struct device *dev, struct device_attribute *attr, char *buf)
152{ 185{
153 struct w1_master *md = container_of(dev, struct w1_master, dev); 186 struct w1_master *md = container_of(dev, struct w1_master, dev);
@@ -242,6 +275,12 @@ static ssize_t w1_master_attribute_show_slaves(struct device *dev, struct device
242 __ATTR(w1_master_##_name, _mode, \ 275 __ATTR(w1_master_##_name, _mode, \
243 w1_master_attribute_show_##_name, NULL) 276 w1_master_attribute_show_##_name, NULL)
244 277
278#define W1_MASTER_ATTR_RW(_name, _mode) \
279 struct device_attribute w1_master_attribute_##_name = \
280 __ATTR(w1_master_##_name, _mode, \
281 w1_master_attribute_show_##_name, \
282 w1_master_attribute_store_##_name)
283
245static W1_MASTER_ATTR_RO(name, S_IRUGO); 284static W1_MASTER_ATTR_RO(name, S_IRUGO);
246static W1_MASTER_ATTR_RO(slaves, S_IRUGO); 285static W1_MASTER_ATTR_RO(slaves, S_IRUGO);
247static W1_MASTER_ATTR_RO(slave_count, S_IRUGO); 286static W1_MASTER_ATTR_RO(slave_count, S_IRUGO);
@@ -249,6 +288,7 @@ static W1_MASTER_ATTR_RO(max_slave_count, S_IRUGO);
249static W1_MASTER_ATTR_RO(attempts, S_IRUGO); 288static W1_MASTER_ATTR_RO(attempts, S_IRUGO);
250static W1_MASTER_ATTR_RO(timeout, S_IRUGO); 289static W1_MASTER_ATTR_RO(timeout, S_IRUGO);
251static W1_MASTER_ATTR_RO(pointer, S_IRUGO); 290static W1_MASTER_ATTR_RO(pointer, S_IRUGO);
291static W1_MASTER_ATTR_RW(search, S_IRUGO | S_IWUGO);
252 292
253static struct attribute *w1_master_default_attrs[] = { 293static struct attribute *w1_master_default_attrs[] = {
254 &w1_master_attribute_name.attr, 294 &w1_master_attribute_name.attr,
@@ -258,6 +298,7 @@ static struct attribute *w1_master_default_attrs[] = {
258 &w1_master_attribute_attempts.attr, 298 &w1_master_attribute_attempts.attr,
259 &w1_master_attribute_timeout.attr, 299 &w1_master_attribute_timeout.attr,
260 &w1_master_attribute_pointer.attr, 300 &w1_master_attribute_pointer.attr,
301 &w1_master_attribute_search.attr,
261 NULL 302 NULL
262}; 303};
263 304
@@ -643,11 +684,14 @@ int w1_process(void *data)
643 if (!dev->initialized) 684 if (!dev->initialized)
644 continue; 685 continue;
645 686
687 if (dev->search_count == 0)
688 continue;
689
646 if (down_interruptible(&dev->mutex)) 690 if (down_interruptible(&dev->mutex))
647 continue; 691 continue;
648 692
649 list_for_each_entry(sl, &dev->slist, w1_slave_entry) 693 list_for_each_entry(sl, &dev->slist, w1_slave_entry)
650 clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); 694 clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags);
651 695
652 w1_search_devices(dev, w1_slave_found); 696 w1_search_devices(dev, w1_slave_found);
653 697
@@ -662,6 +706,10 @@ int w1_process(void *data)
662 } else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags)) 706 } else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags))
663 sl->ttl = dev->slave_ttl; 707 sl->ttl = dev->slave_ttl;
664 } 708 }
709
710 if (dev->search_count > 0)
711 dev->search_count--;
712
665 up(&dev->mutex); 713 up(&dev->mutex);
666 } 714 }
667 715