1 From 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 Mon Sep 17 00:00:00 2001
2 From: Clifton Barnes <cabarnes@indesign-llc.com>
3 Date: Wed, 2 Nov 2011 13:39:52 -0700
4 Subject: drivers/power/ds2780_battery.c: add a nolock function to w1 interface
6 From: Clifton Barnes <cabarnes@indesign-llc.com>
8 commit 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 upstream.
10 Adds a nolock function to the w1 interface to avoid locking the
13 Signed-off-by: Clifton Barnes <cabarnes@indesign-llc.com>
14 Cc: Evgeniy Polyakov <zbr@ioremap.net>
15 Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
16 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
20 drivers/w1/slaves/w1_ds2780.c | 48 ++++++++++++++++++++++++++++++------------
21 drivers/w1/slaves/w1_ds2780.h | 2 +
22 2 files changed, 37 insertions(+), 13 deletions(-)
24 --- a/drivers/w1/slaves/w1_ds2780.c
25 +++ b/drivers/w1/slaves/w1_ds2780.c
27 #include "../w1_family.h"
28 #include "w1_ds2780.h"
30 -int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count,
32 +static int w1_ds2780_do_io(struct device *dev, char *buf, int addr,
33 + size_t count, int io)
35 struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
40 - mutex_lock(&sl->master->mutex);
41 + if (addr > DS2780_DATA_SIZE || addr < 0)
44 - if (addr > DS2780_DATA_SIZE || addr < 0) {
48 count = min_t(int, count, DS2780_DATA_SIZE - addr);
50 if (w1_reset_select_slave(sl) == 0) {
51 @@ -47,7 +41,6 @@ int w1_ds2780_io(struct device *dev, cha
52 w1_write_8(sl->master, W1_DS2780_WRITE_DATA);
53 w1_write_8(sl->master, addr);
54 w1_write_block(sl->master, buf, count);
55 - /* XXX w1_write_block returns void, not n_written */
57 w1_write_8(sl->master, W1_DS2780_READ_DATA);
58 w1_write_8(sl->master, addr);
59 @@ -55,13 +48,42 @@ int w1_ds2780_io(struct device *dev, cha
67 +int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count,
70 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
76 + mutex_lock(&sl->master->mutex);
78 + ret = w1_ds2780_do_io(dev, buf, addr, count, io);
80 mutex_unlock(&sl->master->mutex);
85 EXPORT_SYMBOL(w1_ds2780_io);
87 +int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr, size_t count,
95 + ret = w1_ds2780_do_io(dev, buf, addr, count, io);
99 +EXPORT_SYMBOL(w1_ds2780_io_nolock);
101 int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd)
103 struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
104 --- a/drivers/w1/slaves/w1_ds2780.h
105 +++ b/drivers/w1/slaves/w1_ds2780.h
108 extern int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count,
110 +extern int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr,
111 + size_t count, int io);
112 extern int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd);
114 #endif /* !_W1_DS2780_H */