]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.1.1/drivers-power-ds2780_battery.c-add-a-nolock-function-to-w1-interface.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.1.1 / drivers-power-ds2780_battery.c-add-a-nolock-function-to-w1-interface.patch
CommitLineData
f1755e8a
GKH
1From 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 Mon Sep 17 00:00:00 2001
2From: Clifton Barnes <cabarnes@indesign-llc.com>
3Date: Wed, 2 Nov 2011 13:39:52 -0700
4Subject: drivers/power/ds2780_battery.c: add a nolock function to w1 interface
5
6From: Clifton Barnes <cabarnes@indesign-llc.com>
7
8commit 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 upstream.
9
10Adds a nolock function to the w1 interface to avoid locking the
11mutex if needed.
12
13Signed-off-by: Clifton Barnes <cabarnes@indesign-llc.com>
14Cc: Evgeniy Polyakov <zbr@ioremap.net>
15Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
16Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
17Signed-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 */