w1: ds2780, add a nolock function to w1 interface
PATCH v2 2/3 w1: ds2780, add a nolock function to w1 interface
Adds a nolock function to the w1 interface to avoid locking the mutex if needed.
Signed-off-by Clifton Barnes <[email protected]>
--- drivers/w1/slaves/w1_ds2780.c | 48 +++++++++++++++++++++++++++++----------- drivers/w1/slaves/w1_ds2780.h | 2 + 2 files changed, 37 insertions(+), 13 deletions(-)
drivers/w1/slaves/w1_ds2780.c +35 -13
@@ -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 ; +if (addr >DS2780_DATA_SIZE || addr <0 ) +return 0 ; -mutex_lock (&sl->master->mutex); - -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, char *buf, int addr, size_t count,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, char *buf, int addr, size_t count, } } -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);
drivers/w1/slaves/w1_ds2780.h +2 -0
@@ -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 */
Signature · 1 line
1.7.6