| From 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 Mon Sep 17 00:00:00 2001 |
| From: Clifton Barnes <cabarnes@indesign-llc.com> |
| Date: Wed, 2 Nov 2011 13:39:52 -0700 |
| Subject: drivers/power/ds2780_battery.c: add a nolock function to w1 interface |
| |
| From: Clifton Barnes <cabarnes@indesign-llc.com> |
| |
| commit 9fe678fa2feb4aaac0b4220de63e1b7f8ccebae6 upstream. |
| |
| Adds a nolock function to the w1 interface to avoid locking the |
| mutex if needed. |
| |
| Signed-off-by: Clifton Barnes <cabarnes@indesign-llc.com> |
| Cc: Evgeniy Polyakov <zbr@ioremap.net> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/w1/slaves/w1_ds2780.c | 48 ++++++++++++++++++++++++++++++------------ |
| drivers/w1/slaves/w1_ds2780.h | 2 + |
| 2 files changed, 37 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/w1/slaves/w1_ds2780.c |
| +++ b/drivers/w1/slaves/w1_ds2780.c |
| @@ -26,20 +26,14 @@ |
| #include "../w1_family.h" |
| #include "w1_ds2780.h" |
| |
| -int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, |
| - int io) |
| +static int w1_ds2780_do_io(struct device *dev, char *buf, int addr, |
| + size_t count, int io) |
| { |
| struct w1_slave *sl = container_of(dev, struct w1_slave, dev); |
| |
| - if (!dev) |
| - return -ENODEV; |
| - |
| - mutex_lock(&sl->master->mutex); |
| + if (addr > DS2780_DATA_SIZE || addr < 0) |
| + return 0; |
| |
| - if (addr > DS2780_DATA_SIZE || addr < 0) { |
| - count = 0; |
| - goto out; |
| - } |
| count = min_t(int, count, DS2780_DATA_SIZE - addr); |
| |
| if (w1_reset_select_slave(sl) == 0) { |
| @@ -47,7 +41,6 @@ int w1_ds2780_io(struct device *dev, cha |
| w1_write_8(sl->master, W1_DS2780_WRITE_DATA); |
| w1_write_8(sl->master, addr); |
| w1_write_block(sl->master, buf, count); |
| - /* XXX w1_write_block returns void, not n_written */ |
| } else { |
| w1_write_8(sl->master, W1_DS2780_READ_DATA); |
| w1_write_8(sl->master, addr); |
| @@ -55,13 +48,42 @@ int w1_ds2780_io(struct device *dev, cha |
| } |
| } |
| |
| -out: |
| + return count; |
| +} |
| + |
| +int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, |
| + int io) |
| +{ |
| + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); |
| + int ret; |
| + |
| + if (!dev) |
| + return -ENODEV; |
| + |
| + mutex_lock(&sl->master->mutex); |
| + |
| + ret = w1_ds2780_do_io(dev, buf, addr, count, io); |
| + |
| mutex_unlock(&sl->master->mutex); |
| |
| - return count; |
| + return ret; |
| } |
| EXPORT_SYMBOL(w1_ds2780_io); |
| |
| +int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr, size_t count, |
| + int io) |
| +{ |
| + int ret; |
| + |
| + if (!dev) |
| + return -ENODEV; |
| + |
| + ret = w1_ds2780_do_io(dev, buf, addr, count, io); |
| + |
| + return ret; |
| +} |
| +EXPORT_SYMBOL(w1_ds2780_io_nolock); |
| + |
| int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd) |
| { |
| struct w1_slave *sl = container_of(dev, struct w1_slave, dev); |
| --- a/drivers/w1/slaves/w1_ds2780.h |
| +++ b/drivers/w1/slaves/w1_ds2780.h |
| @@ -124,6 +124,8 @@ |
| |
| extern int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, |
| int io); |
| +extern int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr, |
| + size_t count, int io); |
| extern int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd); |
| |
| #endif /* !_W1_DS2780_H */ |