w1: introduce an ability to specify microseconds bus scanning intervals
authorDmitry Khromov <dk@icelogic.net>
Tue, 12 May 2015 19:29:44 +0000 (22:29 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 24 May 2015 19:08:59 +0000 (12:08 -0700)
Some of 1-Wire devices commonly associated with physical access control
systems are attached/generate presence for as short as 100 ms - hence
the tens-to-hundreds milliseconds scan intervals are required.

Signed-off-by: Dmitry Khromov <dk@icelogic.net>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/stable/sysfs-bus-w1 [new file with mode: 0644]
Documentation/w1/w1.generic
drivers/w1/w1.c

diff --git a/Documentation/ABI/stable/sysfs-bus-w1 b/Documentation/ABI/stable/sysfs-bus-w1
new file mode 100644 (file)
index 0000000..140d85b
--- /dev/null
@@ -0,0 +1,11 @@
+What:          /sys/bus/w1/devices/.../w1_master_timeout_us
+Date:          April 2015
+Contact:       Dmitry Khromov <dk@icelogic.net>
+Description:   Bus scanning interval, microseconds component.
+               Some of 1-Wire devices commonly associated with physical access
+               control systems are attached/generate presence for as short as
+               100 ms - hence the tens-to-hundreds milliseconds scan intervals
+               are required.
+               see Documentation/w1/w1.generic for detailed information.
+Users:         any user space application which wants to know bus scanning
+               interval
index b2033c64c7da54ab959a3f9573a0950c7cf388f4..b3ffaf8cfab20fe630a631c4abe835414a2f5c30 100644 (file)
@@ -76,21 +76,24 @@ See struct w1_bus_master definition in w1.h for details.
 
 w1 master sysfs interface
 ------------------------------------------------------------------
-<xx-xxxxxxxxxxxxx> - a directory for a found device. The format is family-serial
+<xx-xxxxxxxxxxxxx> - A directory for a found device. The format is family-serial
 bus                - (standard) symlink to the w1 bus
 driver             - (standard) symlink to the w1 driver
-w1_master_add      - Manually register a slave device
-w1_master_attempts - the number of times a search was attempted
+w1_master_add      - (rw) manually register a slave device
+w1_master_attempts - (ro) the number of times a search was attempted
 w1_master_max_slave_count
-                   - maximum number of slaves to search for at a time
-w1_master_name     - the name of the device (w1_bus_masterX)
-w1_master_pullup   - 5V strong pullup 0 enabled, 1 disabled
-w1_master_remove   - Manually remove a slave device
-w1_master_search   - the number of searches left to do, -1=continual (default)
+                   - (rw) maximum number of slaves to search for at a time
+w1_master_name     - (ro) the name of the device (w1_bus_masterX)
+w1_master_pullup   - (rw) 5V strong pullup 0 enabled, 1 disabled
+w1_master_remove   - (rw) manually remove a slave device
+w1_master_search   - (rw) the number of searches left to do,
+                    -1=continual (default)
 w1_master_slave_count
-                   - the number of slaves found
-w1_master_slaves   - the names of the slaves, one per line
-w1_master_timeout  - the delay in seconds between searches
+                   - (ro) the number of slaves found
+w1_master_slaves   - (ro) the names of the slaves, one per line
+w1_master_timeout  - (ro) the delay in seconds between searches
+w1_master_timeout_us
+                   - (ro) the delay in microseconds beetwen searches
 
 If you have a w1 bus that never changes (you don't add or remove devices),
 you can set the module parameter search_count to a small positive number
@@ -101,6 +104,11 @@ generally only make sense when searching is disabled, as a search will
 redetect manually removed devices that are present and timeout manually
 added devices that aren't on the bus.
 
+Bus searches occur at an interval, specified as a summ of timeout and
+timeout_us module parameters (either of which may be 0) for as long as
+w1_master_search remains greater than 0 or is -1.  Each search attempt
+decrements w1_master_search by 1 (down to 0) and increments
+w1_master_attempts by 1.
 
 w1 slave sysfs interface
 ------------------------------------------------------------------
index 181f41cb960be0a9e7292058848af081ca8ac092..c9a7ff67d395244a1b4cc4bd628979838a6b8d05 100644 (file)
@@ -46,11 +46,15 @@ MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
 MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol.");
 
 static int w1_timeout = 10;
+static int w1_timeout_us = 0;
 int w1_max_slave_count = 64;
 int w1_max_slave_ttl = 10;
 
 module_param_named(timeout, w1_timeout, int, 0);
 MODULE_PARM_DESC(timeout, "time in seconds between automatic slave searches");
+module_param_named(timeout_us, w1_timeout_us, int, 0);
+MODULE_PARM_DESC(timeout, "time in microseconds between automatic slave"
+                         " searches");
 /* A search stops when w1_max_slave_count devices have been found in that
  * search.  The next search will start over and detect the same set of devices
  * on a static 1-wire bus.  Memory is not allocated based on this number, just
@@ -317,6 +321,14 @@ static ssize_t w1_master_attribute_show_timeout(struct device *dev, struct devic
        return count;
 }
 
+static ssize_t w1_master_attribute_show_timeout_us(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+       ssize_t count;
+       count = sprintf(buf, "%d\n", w1_timeout_us);
+       return count;
+}
+
 static ssize_t w1_master_attribute_store_max_slave_count(struct device *dev,
        struct device_attribute *attr, const char *buf, size_t count)
 {
@@ -543,6 +555,7 @@ static W1_MASTER_ATTR_RO(slave_count, S_IRUGO);
 static W1_MASTER_ATTR_RW(max_slave_count, S_IRUGO | S_IWUSR | S_IWGRP);
 static W1_MASTER_ATTR_RO(attempts, S_IRUGO);
 static W1_MASTER_ATTR_RO(timeout, S_IRUGO);
+static W1_MASTER_ATTR_RO(timeout_us, S_IRUGO);
 static W1_MASTER_ATTR_RO(pointer, S_IRUGO);
 static W1_MASTER_ATTR_RW(search, S_IRUGO | S_IWUSR | S_IWGRP);
 static W1_MASTER_ATTR_RW(pullup, S_IRUGO | S_IWUSR | S_IWGRP);
@@ -556,6 +569,7 @@ static struct attribute *w1_master_default_attrs[] = {
        &w1_master_attribute_max_slave_count.attr,
        &w1_master_attribute_attempts.attr,
        &w1_master_attribute_timeout.attr,
+       &w1_master_attribute_timeout_us.attr,
        &w1_master_attribute_pointer.attr,
        &w1_master_attribute_search.attr,
        &w1_master_attribute_pullup.attr,
@@ -1108,7 +1122,8 @@ int w1_process(void *data)
        /* As long as w1_timeout is only set by a module parameter the sleep
         * time can be calculated in jiffies once.
         */
-       const unsigned long jtime = msecs_to_jiffies(w1_timeout * 1000);
+       const unsigned long jtime =
+         usecs_to_jiffies(w1_timeout * 1000000 + w1_timeout_us);
        /* remainder if it woke up early */
        unsigned long jremain = 0;