lkml.org 
[lkml]   [2011]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[166/264] drivers/power/ds2780_battery.c: add a nolock function to w1 interface
    3.1-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    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 */



    \
     
     \ /
      Last update: 2011-11-10 05:15    [W:5.146 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site