]>
Commit | Line | Data |
---|---|---|
f1755e8a GKH |
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 | |
5 | ||
6 | From: Clifton Barnes <cabarnes@indesign-llc.com> | |
7 | ||
8 | commit 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 upstream. | |
9 | ||
10 | Adds a nolock function to the w1 interface to avoid locking the | |
11 | mutex if needed. | |
12 | ||
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> | |
18 | ||
19 | --- | |
20 | drivers/w1/slaves/w1_ds2780.c | 48 ++++++++++++++++++++++++++++++------------ | |
21 | drivers/w1/slaves/w1_ds2780.h | 2 + | |
22 | 2 files changed, 37 insertions(+), 13 deletions(-) | |
23 | ||
24 | --- a/drivers/w1/slaves/w1_ds2780.c | |
25 | +++ b/drivers/w1/slaves/w1_ds2780.c | |
26 | @@ -26,20 +26,14 @@ | |
27 | #include "../w1_family.h" | |
28 | #include "w1_ds2780.h" | |
29 | ||
30 | -int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | |
31 | - int io) | |
32 | +static int w1_ds2780_do_io(struct device *dev, char *buf, int addr, | |
33 | + size_t count, int io) | |
34 | { | |
35 | struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | |
36 | ||
37 | - if (!dev) | |
38 | - return -ENODEV; | |
39 | - | |
40 | - mutex_lock(&sl->master->mutex); | |
41 | + if (addr > DS2780_DATA_SIZE || addr < 0) | |
42 | + return 0; | |
43 | ||
44 | - if (addr > DS2780_DATA_SIZE || addr < 0) { | |
45 | - count = 0; | |
46 | - goto out; | |
47 | - } | |
48 | count = min_t(int, count, DS2780_DATA_SIZE - addr); | |
49 | ||
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 */ | |
56 | } else { | |
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 | |
60 | } | |
61 | } | |
62 | ||
63 | -out: | |
64 | + return count; | |
65 | +} | |
66 | + | |
67 | +int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | |
68 | + int io) | |
69 | +{ | |
70 | + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | |
71 | + int ret; | |
72 | + | |
73 | + if (!dev) | |
74 | + return -ENODEV; | |
75 | + | |
76 | + mutex_lock(&sl->master->mutex); | |
77 | + | |
78 | + ret = w1_ds2780_do_io(dev, buf, addr, count, io); | |
79 | + | |
80 | mutex_unlock(&sl->master->mutex); | |
81 | ||
82 | - return count; | |
83 | + return ret; | |
84 | } | |
85 | EXPORT_SYMBOL(w1_ds2780_io); | |
86 | ||
87 | +int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr, size_t count, | |
88 | + int io) | |
89 | +{ | |
90 | + int ret; | |
91 | + | |
92 | + if (!dev) | |
93 | + return -ENODEV; | |
94 | + | |
95 | + ret = w1_ds2780_do_io(dev, buf, addr, count, io); | |
96 | + | |
97 | + return ret; | |
98 | +} | |
99 | +EXPORT_SYMBOL(w1_ds2780_io_nolock); | |
100 | + | |
101 | int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd) | |
102 | { | |
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 | |
106 | @@ -124,6 +124,8 @@ | |
107 | ||
108 | extern int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | |
109 | int io); | |
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); | |
113 | ||
114 | #endif /* !_W1_DS2780_H */ |