Commit be57ce26 authored by Evgeniy Polyakov's avatar Evgeniy Polyakov Committed by Greg Kroah-Hartman

[PATCH] w1: Cleans up usage of touch_bit/w1_read_bit/w1_write_bit.

Cleans up usage of touch_bit/w1_read_bit/w1_write_bit.
Signed-off-by: default avatarBen Gardner <bgardner@wabtec.com>
Signed-off-by: default avatarEvgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 4e470aa9
...@@ -121,6 +121,14 @@ int w1_add_master_device(struct w1_bus_master *master) ...@@ -121,6 +121,14 @@ int w1_add_master_device(struct w1_bus_master *master)
int retval = 0; int retval = 0;
struct w1_netlink_msg msg; struct w1_netlink_msg msg;
/* validate minimum functionality */
if (!(master->touch_bit && master->reset_bus) &&
!(master->write_bit && master->read_bit))
{
printk(KERN_ERR "w1_add_master_device: invalid function set\n");
return(-EINVAL);
}
dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, w1_max_slave_ttl, &w1_driver, &w1_device); dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, w1_max_slave_ttl, &w1_driver, &w1_device);
if (!dev) if (!dev)
return -ENOMEM; return -ENOMEM;
......
...@@ -55,15 +55,29 @@ void w1_delay(unsigned long tm) ...@@ -55,15 +55,29 @@ void w1_delay(unsigned long tm)
udelay(tm * w1_delay_parm); udelay(tm * w1_delay_parm);
} }
static void w1_write_bit(struct w1_master *dev, int bit);
static u8 w1_read_bit(struct w1_master *dev);
/**
* Generates a write-0 or write-1 cycle and samples the level.
*/
u8 w1_touch_bit(struct w1_master *dev, int bit) u8 w1_touch_bit(struct w1_master *dev, int bit)
{ {
if (dev->bus_master->touch_bit) if (dev->bus_master->touch_bit)
return dev->bus_master->touch_bit(dev->bus_master->data, bit); return dev->bus_master->touch_bit(dev->bus_master->data, bit);
else else if (bit)
return w1_read_bit(dev); return w1_read_bit(dev);
else {
w1_write_bit(dev, 0);
return(0);
}
} }
void w1_write_bit(struct w1_master *dev, int bit) /**
* Generates a write-0 or write-1 cycle.
* Only call if dev->bus_master->touch_bit is NULL
*/
static void w1_write_bit(struct w1_master *dev, int bit)
{ {
if (bit) { if (bit) {
dev->bus_master->write_bit(dev->bus_master->data, 0); dev->bus_master->write_bit(dev->bus_master->data, 0);
...@@ -78,6 +92,12 @@ void w1_write_bit(struct w1_master *dev, int bit) ...@@ -78,6 +92,12 @@ void w1_write_bit(struct w1_master *dev, int bit)
} }
} }
/**
* Writes 8 bits.
*
* @param dev the master device
* @param byte the byte to write
*/
void w1_write_8(struct w1_master *dev, u8 byte) void w1_write_8(struct w1_master *dev, u8 byte)
{ {
int i; int i;
...@@ -86,10 +106,15 @@ void w1_write_8(struct w1_master *dev, u8 byte) ...@@ -86,10 +106,15 @@ void w1_write_8(struct w1_master *dev, u8 byte)
dev->bus_master->write_byte(dev->bus_master->data, byte); dev->bus_master->write_byte(dev->bus_master->data, byte);
else else
for (i = 0; i < 8; ++i) for (i = 0; i < 8; ++i)
w1_write_bit(dev, (byte >> i) & 0x1); w1_touch_bit(dev, (byte >> i) & 0x1);
} }
u8 w1_read_bit(struct w1_master *dev)
/**
* Generates a write-1 cycle and samples the level.
* Only call if dev->bus_master->touch_bit is NULL
*/
static u8 w1_read_bit(struct w1_master *dev)
{ {
int result; int result;
...@@ -104,6 +129,12 @@ u8 w1_read_bit(struct w1_master *dev) ...@@ -104,6 +129,12 @@ u8 w1_read_bit(struct w1_master *dev)
return result & 0x1; return result & 0x1;
} }
/**
* Reads 8 bits.
*
* @param dev the master device
* @return the byte read
*/
u8 w1_read_8(struct w1_master * dev) u8 w1_read_8(struct w1_master * dev)
{ {
int i; int i;
...@@ -113,12 +144,20 @@ u8 w1_read_8(struct w1_master * dev) ...@@ -113,12 +144,20 @@ u8 w1_read_8(struct w1_master * dev)
res = dev->bus_master->read_byte(dev->bus_master->data); res = dev->bus_master->read_byte(dev->bus_master->data);
else else
for (i = 0; i < 8; ++i) for (i = 0; i < 8; ++i)
res |= (w1_read_bit(dev) << i); res |= (w1_touch_bit(dev,1) << i);
return res; return res;
} }
void w1_write_block(struct w1_master *dev, u8 *buf, int len) /**
* Writes a series of bytes.
*
* @param dev the master device
* @param buf pointer to the data to write
* @param len the number of bytes to write
* @return the byte read
*/
void w1_write_block(struct w1_master *dev, const u8 *buf, int len)
{ {
int i; int i;
...@@ -129,6 +168,14 @@ void w1_write_block(struct w1_master *dev, u8 *buf, int len) ...@@ -129,6 +168,14 @@ void w1_write_block(struct w1_master *dev, u8 *buf, int len)
w1_write_8(dev, buf[i]); w1_write_8(dev, buf[i]);
} }
/**
* Reads a series of bytes.
*
* @param dev the master device
* @param buf pointer to the buffer to fill
* @param len the number of bytes to read
* @return the number of bytes read
*/
u8 w1_read_block(struct w1_master *dev, u8 *buf, int len) u8 w1_read_block(struct w1_master *dev, u8 *buf, int len)
{ {
int i; int i;
...@@ -145,9 +192,15 @@ u8 w1_read_block(struct w1_master *dev, u8 *buf, int len) ...@@ -145,9 +192,15 @@ u8 w1_read_block(struct w1_master *dev, u8 *buf, int len)
return ret; return ret;
} }
/**
* Issues a reset bus sequence.
*
* @param dev The bus master pointer
* @return 0=Device present, 1=No device present or error
*/
int w1_reset_bus(struct w1_master *dev) int w1_reset_bus(struct w1_master *dev)
{ {
int result = 0; int result;
if (dev->bus_master->reset_bus) if (dev->bus_master->reset_bus)
result = dev->bus_master->reset_bus(dev->bus_master->data) & 0x1; result = dev->bus_master->reset_bus(dev->bus_master->data) & 0x1;
...@@ -183,9 +236,8 @@ void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb) ...@@ -183,9 +236,8 @@ void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb)
w1_search(dev); w1_search(dev);
} }
EXPORT_SYMBOL(w1_write_bit); EXPORT_SYMBOL(w1_touch_bit);
EXPORT_SYMBOL(w1_write_8); EXPORT_SYMBOL(w1_write_8);
EXPORT_SYMBOL(w1_read_bit);
EXPORT_SYMBOL(w1_read_8); EXPORT_SYMBOL(w1_read_8);
EXPORT_SYMBOL(w1_reset_bus); EXPORT_SYMBOL(w1_reset_bus);
EXPORT_SYMBOL(w1_calc_crc8); EXPORT_SYMBOL(w1_calc_crc8);
......
...@@ -26,13 +26,11 @@ ...@@ -26,13 +26,11 @@
void w1_delay(unsigned long); void w1_delay(unsigned long);
u8 w1_touch_bit(struct w1_master *, int); u8 w1_touch_bit(struct w1_master *, int);
void w1_write_bit(struct w1_master *, int);
void w1_write_8(struct w1_master *, u8); void w1_write_8(struct w1_master *, u8);
u8 w1_read_bit(struct w1_master *);
u8 w1_read_8(struct w1_master *); u8 w1_read_8(struct w1_master *);
int w1_reset_bus(struct w1_master *); int w1_reset_bus(struct w1_master *);
u8 w1_calc_crc8(u8 *, int); u8 w1_calc_crc8(u8 *, int);
void w1_write_block(struct w1_master *, u8 *, int); void w1_write_block(struct w1_master *, const u8 *, int);
u8 w1_read_block(struct w1_master *, u8 *, int); u8 w1_read_block(struct w1_master *, u8 *, int);
void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb); void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment