diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2013-01-28 23:23:00 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-01-29 09:58:07 +0100 |
commit | 0c30d94b9184657d4dd013227c41f40d50d38a2f (patch) | |
tree | 36fc3ad848c626360b748b4f3ef61dea642b2aae /drivers/w1/w1.c | |
parent | 8d5faa862c6fa7a0dff4ac25e5ba72eb466b6f3c (diff) | |
download | barebox-0c30d94b9184657d4dd013227c41f40d50d38a2f.tar.gz barebox-0c30d94b9184657d4dd013227c41f40d50d38a2f.tar.xz |
w1: add dual search support
Some 1-wire device need to be search twice to be detected
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/w1/w1.c')
-rw-r--r-- | drivers/w1/w1.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index d2f94c938d..eb6bec89ab 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -402,6 +402,21 @@ struct bus_type w1_bustype= { .remove = w1_bus_remove, }; +static bool w1_is_registered(struct w1_bus *bus, u64 rn) +{ + struct device_d *dev = NULL; + struct w1_device *w1_dev; + + bus_for_each_device(&w1_bustype, dev) { + w1_dev = to_w1_device(dev); + + if (w1_dev->bus == bus && w1_dev->reg_num == rn) + return true; + } + + return false; +} + static int w1_device_register(struct w1_bus *bus, struct w1_device *dev) { char str[18]; @@ -442,9 +457,15 @@ int w1_driver_register(struct w1_driver *drv) void w1_found(struct w1_bus *bus, u64 rn) { - struct w1_device *dev = xzalloc(sizeof(*dev)); + struct w1_device *dev; u64 tmp = be64_to_cpu(rn); + if (IS_ENABLED(CONFIG_W1_DUAL_SEARCH) + && bus->is_searched && w1_is_registered(bus, rn)) + return; + + dev = xzalloc(sizeof(*dev)); + dev->reg_num = rn; dev->fid = tmp >> 56; dev->id = (tmp >> 8) & 0xffffffffffff; @@ -605,7 +626,11 @@ int w1_bus_register(struct w1_bus *bus) if (ret) return ret; + bus->is_searched = false; w1_search(bus, W1_SEARCH); + bus->is_searched = true; + if (IS_ENABLED(CONFIG_W1_DUAL_SEARCH)) + w1_search(bus, W1_SEARCH); return 0; } |