瀏覽代碼

w1: ds2408: make value read-back check a Kconfig option

De-activating this reading back will effectively half the time required
for a write to the output register.

Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jean-Francois Dagenais 12 年之前
父節點
當前提交
aceca28544
共有 2 個文件被更改,包括 22 次插入6 次删除
  1. 10 0
      drivers/w1/slaves/Kconfig
  2. 12 6
      drivers/w1/slaves/w1_ds2408.c

+ 10 - 0
drivers/w1/slaves/Kconfig

@@ -22,6 +22,16 @@ config W1_SLAVE_DS2408
 	  Say Y here if you want to use a 1-wire
 	  Say Y here if you want to use a 1-wire
 	  DS2408 8-Channel Addressable Switch device support
 	  DS2408 8-Channel Addressable Switch device support
 
 
+config W1_SLAVE_DS2408_READBACK
+	bool "Read-back values written to DS2408's output register"
+	depends on W1_SLAVE_DS2408
+	default y
+	help
+	  Enabling this will cause the driver to read back the values written
+	  to the chip's output register in order to detect errors.
+
+	  This is slower but useful when debugging chips and/or busses.
+
 config W1_SLAVE_DS2413
 config W1_SLAVE_DS2413
 	tristate "Dual Channel Addressable Switch 0x3a family support (DS2413)"
 	tristate "Dual Channel Addressable Switch 0x3a family support (DS2413)"
 	help
 	help

+ 12 - 6
drivers/w1/slaves/w1_ds2408.c

@@ -178,6 +178,15 @@ static ssize_t w1_f29_write_output(
 		w1_write_block(sl->master, w1_buf, 3);
 		w1_write_block(sl->master, w1_buf, 3);
 
 
 		readBack = w1_read_8(sl->master);
 		readBack = w1_read_8(sl->master);
+
+		if (readBack != W1_F29_SUCCESS_CONFIRM_BYTE) {
+			if (w1_reset_resume_command(sl->master))
+				goto error;
+			/* try again, the slave is ready for a command */
+			continue;
+		}
+
+#ifdef CONFIG_W1_SLAVE_DS2408_READBACK
 		/* here the master could read another byte which
 		/* here the master could read another byte which
 		   would be the PIO reg (the actual pin logic state)
 		   would be the PIO reg (the actual pin logic state)
 		   since in this driver we don't know which pins are
 		   since in this driver we don't know which pins are
@@ -186,11 +195,6 @@ static ssize_t w1_f29_write_output(
 		if (w1_reset_resume_command(sl->master))
 		if (w1_reset_resume_command(sl->master))
 			goto error;
 			goto error;
 
 
-		if (readBack != 0xAA) {
-			/* try again, the slave is ready for a command */
-			continue;
-		}
-
 		/* go read back the output latches */
 		/* go read back the output latches */
 		/* (the direct effect of the write above) */
 		/* (the direct effect of the write above) */
 		w1_buf[0] = W1_F29_FUNC_READ_PIO_REGS;
 		w1_buf[0] = W1_F29_FUNC_READ_PIO_REGS;
@@ -198,7 +202,9 @@ static ssize_t w1_f29_write_output(
 		w1_buf[2] = 0;
 		w1_buf[2] = 0;
 		w1_write_block(sl->master, w1_buf, 3);
 		w1_write_block(sl->master, w1_buf, 3);
 		/* read the result of the READ_PIO_REGS command */
 		/* read the result of the READ_PIO_REGS command */
-		if (w1_read_8(sl->master) == *buf) {
+		if (w1_read_8(sl->master) == *buf)
+#endif
+		{
 			/* success! */
 			/* success! */
 			mutex_unlock(&sl->master->bus_mutex);
 			mutex_unlock(&sl->master->bus_mutex);
 			dev_dbg(&sl->dev,
 			dev_dbg(&sl->dev,