From 0c30d94b9184657d4dd013227c41f40d50d38a2f Mon Sep 17 00:00:00 2001 From: Jean-Christophe PLAGNIOL-VILLARD Date: Mon, 28 Jan 2013 23:23:00 +0100 Subject: w1: add dual search support Some 1-wire device need to be search twice to be detected Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Sascha Hauer --- drivers/w1/Kconfig | 5 +++++ drivers/w1/w1.c | 27 ++++++++++++++++++++++++++- drivers/w1/w1.h | 2 ++ 3 files changed, 33 insertions(+), 1 deletion(-) (limited to 'drivers/w1') diff --git a/drivers/w1/Kconfig b/drivers/w1/Kconfig index ab349977a4..dbc1e3c948 100644 --- a/drivers/w1/Kconfig +++ b/drivers/w1/Kconfig @@ -11,4 +11,9 @@ if W1 source drivers/w1/masters/Kconfig source drivers/w1/slaves/Kconfig +config W1_DUAL_SEARCH + bool "dual search" + ---help--- + Some device need to be searched twice to be detected + endif # W1 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; } diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index 1373f69f62..b92d8cdb95 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h @@ -133,6 +133,8 @@ struct w1_bus int max_slave_count, slave_count; + bool is_searched; + void *data; struct list_head list; }; -- cgit v1.2.3