diff options
| author | Evgeniy Polyakov <zbr@ioremap.net> | 2009-01-07 18:09:01 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-08 08:31:13 -0800 | 
| commit | 9be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43db (patch) | |
| tree | 86d39cd9790a83275380d5f37495d76888c3153b | |
| parent | 610705e780395ef30a1b8e53de150c37381ca31f (diff) | |
| download | olio-linux-3.10-9be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43db.tar.xz olio-linux-3.10-9be62e0b2fadaf5ffeb32fd1b910ef1fe6bd43db.zip  | |
w1: add touch block command
Writes and returns sampled data back to userspace.
Signed-off-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/w1/w1.h | 1 | ||||
| -rw-r--r-- | drivers/w1/w1_io.c | 26 | ||||
| -rw-r--r-- | drivers/w1/w1_netlink.c | 11 | ||||
| -rw-r--r-- | drivers/w1/w1_netlink.h | 1 | 
4 files changed, 35 insertions, 4 deletions
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index 97304bd83ec..d8a9709f344 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h @@ -210,6 +210,7 @@ u8 w1_read_8(struct w1_master *);  int w1_reset_bus(struct w1_master *);  u8 w1_calc_crc8(u8 *, int);  void w1_write_block(struct w1_master *, const u8 *, int); +void w1_touch_block(struct w1_master *, u8 *, int);  u8 w1_read_block(struct w1_master *, u8 *, int);  int w1_reset_select_slave(struct w1_slave *sl);  void w1_next_pullup(struct w1_master *, int); diff --git a/drivers/w1/w1_io.c b/drivers/w1/w1_io.c index 5139c25ca96..442bd8bbd4a 100644 --- a/drivers/w1/w1_io.c +++ b/drivers/w1/w1_io.c @@ -238,7 +238,6 @@ EXPORT_SYMBOL_GPL(w1_read_8);   * @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)  { @@ -256,6 +255,31 @@ void w1_write_block(struct w1_master *dev, const u8 *buf, int len)  EXPORT_SYMBOL_GPL(w1_write_block);  /** + * Touches 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 + */ +void w1_touch_block(struct w1_master *dev, u8 *buf, int len) +{ +	int i, j; +	u8 tmp; + +	for (i = 0; i < len; ++i) { +		tmp = 0; +		for (j = 0; j < 8; ++j) { +			if (j == 7) +				w1_pre_write(dev); +			tmp |= w1_touch_bit(dev, (buf[i] >> j) & 0x1) << j; +		} + +		buf[i] = tmp; +	} +} +EXPORT_SYMBOL_GPL(w1_touch_block); + +/**   * Reads a series of bytes.   *   * @param dev     the master device diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c index 2e07b59b985..cae556c8577 100644 --- a/drivers/w1/w1_netlink.c +++ b/drivers/w1/w1_netlink.c @@ -108,6 +108,10 @@ static int w1_process_command_slave(struct w1_slave *sl, struct cn_msg *msg,  		cmd->cmd, cmd->len);  	switch (cmd->cmd) { +		case W1_CMD_TOUCH: +			w1_touch_block(sl->master, cmd->data, cmd->len); +			w1_send_read_reply(sl, msg, hdr, cmd); +			break;  		case W1_CMD_READ:  			w1_read_block(sl->master, cmd->data, cmd->len);  			w1_send_read_reply(sl, msg, hdr, cmd); @@ -208,9 +212,6 @@ static void w1_cn_callback(void *data)  			break;  		} -		if (!mlen) -			goto out_cont; -  		if (m->type == W1_MASTER_CMD) {  			dev = w1_search_master_id(m->id.mst.id);  		} else if (m->type == W1_SLAVE_CMD) { @@ -227,6 +228,10 @@ static void w1_cn_callback(void *data)  			goto out_cont;  		} +		err = 0; +		if (!mlen) +			goto out_cont; +  		mutex_lock(&dev->mutex);  		if (sl && w1_reset_select_slave(sl)) { diff --git a/drivers/w1/w1_netlink.h b/drivers/w1/w1_netlink.h index 21913dfc0f3..99dd21ba14c 100644 --- a/drivers/w1/w1_netlink.h +++ b/drivers/w1/w1_netlink.h @@ -56,6 +56,7 @@ struct w1_netlink_msg  #define W1_CMD_WRITE		0x1  #define W1_CMD_SEARCH		0x2  #define W1_CMD_ALARM_SEARCH	0x3 +#define W1_CMD_TOUCH		0x4  struct w1_netlink_cmd  {  |