[lm-sensors] [PATCH 2/2] hwmon: (ltc4245) read only one GPIO pin

Ira W. Snyder iws at ovro.caltech.edu
Wed Apr 14 00:55:23 CEST 2010


Read only one of the GPIO pins as an analog voltage. The ADC can be
switched to a different GPIO pin at runtime, but this is not supported.

Signed-off-by: Ira W. Snyder <iws at ovro.caltech.edu>
---
 Documentation/hwmon/ltc4245 |    4 +--
 drivers/hwmon/ltc4245.c     |   71 ++++---------------------------------------
 2 files changed, 7 insertions(+), 68 deletions(-)

diff --git a/Documentation/hwmon/ltc4245 b/Documentation/hwmon/ltc4245
index 02838a4..86b5880 100644
--- a/Documentation/hwmon/ltc4245
+++ b/Documentation/hwmon/ltc4245
@@ -72,9 +72,7 @@ in6_min_alarm		5v  output undervoltage alarm
 in7_min_alarm		3v  output undervoltage alarm
 in8_min_alarm		Vee (-12v) output undervoltage alarm
 
-in9_input		GPIO #1 voltage data
-in10_input		GPIO #2 voltage data
-in11_input		GPIO #3 voltage data
+in9_input		GPIO voltage data
 
 power1_input		12v power usage (mW)
 power2_input		5v  power usage (mW)
diff --git a/drivers/hwmon/ltc4245.c b/drivers/hwmon/ltc4245.c
index 1efa554..4926f3f 100644
--- a/drivers/hwmon/ltc4245.c
+++ b/drivers/hwmon/ltc4245.c
@@ -45,9 +45,7 @@ enum ltc4245_cmd {
 	LTC4245_VEEIN			= 0x19,
 	LTC4245_VEESENSE		= 0x1a,
 	LTC4245_VEEOUT			= 0x1b,
-	LTC4245_GPIOADC1		= 0x1c,
-	LTC4245_GPIOADC2		= 0x1d,
-	LTC4245_GPIOADC3		= 0x1e,
+	LTC4245_GPIOADC			= 0x1c,
 };
 
 struct ltc4245_data {
@@ -61,7 +59,7 @@ struct ltc4245_data {
 	u8 cregs[0x08];
 
 	/* Voltage registers */
-	u8 vregs[0x0f];
+	u8 vregs[0x0d];
 };
 
 static struct ltc4245_data *ltc4245_update_device(struct device *dev)
@@ -87,8 +85,8 @@ static struct ltc4245_data *ltc4245_update_device(struct device *dev)
 				data->cregs[i] = val;
 		}
 
-		/* Read non-GPIO voltage registers -- 0x10 to 0x1b */
-		for (i = 0; i < ARRAY_SIZE(data->vregs) - 3; i++) {
+		/* Read voltage registers -- 0x10 to 0x1c */
+		for (i = 0; i < ARRAY_SIZE(data->vregs); i++) {
 			val = i2c_smbus_read_byte_data(client, i + 0x10);
 			if (unlikely(val < 0))
 				data->vregs[i] = 0;
@@ -96,59 +94,6 @@ static struct ltc4245_data *ltc4245_update_device(struct device *dev)
 				data->vregs[i] = val;
 		}
 
-		/*
-		 * On the LTC4245, the GPIO registers act stupidly. Changing
-		 * the MUX to read from any GPIO puts the value into all three
-		 * GPIO registers. To avoid this, we cache a copy of the
-		 * current GPIO state, and advance the MUX to the next state.
-		 *
-		 * This will mean that readings can be up to 3 cycles old,
-		 * which shouldn't be a problem. The hwmon interface is not
-		 * expected to be fast.
-		 */
-		gpio = data->cregs[LTC4245_GPIO] & 0xC0;
-		switch (gpio) {
-		default:
-			/*
-			 * this is just to keep the compiler happy, we
-			 * handle every possible state of the top two
-			 * bits in this register
-			 */
-		case 0x00:
-		case 0x40:
-			addr = LTC4245_GPIOADC1;
-			nextgpio = (data->cregs[LTC4245_GPIO] & 0x3f) | 0x80;
-			break;
-		case 0x80:
-			addr = LTC4245_GPIOADC2;
-			nextgpio = (data->cregs[LTC4245_GPIO] & 0x3f) | 0xc0;
-			break;
-		case 0xc0:
-			addr = LTC4245_GPIOADC3;
-			nextgpio = (data->cregs[LTC4245_GPIO] & 0x3f) | 0x40;
-			break;
-		}
-
-		/* Read the current GPIO state, cache the value */
-		val = i2c_smbus_read_byte_data(client, addr);
-		if (unlikely(val < 0))
-			data->vregs[addr - 0x10] = 0;
-		else
-			data->vregs[addr - 0x10] = val;
-
-		/*
-		 * Set the GPIO MUX register to read the next GPIO
-		 *
-		 * According to the datasheet, the ADC must be stopped before
-		 * writing to the control register, so we disable it, and then
-		 * put it back to its earlier state
-		 */
-		ctl = data->cregs[LTC4245_CONTROL];
-		i2c_smbus_write_byte_data(client, LTC4245_CONTROL, ctl | 0x80);
-		i2c_smbus_write_byte_data(client, LTC4245_GPIO, nextgpio);
-		i2c_smbus_write_byte_data(client, LTC4245_CONTROL, ctl);
-		data->cregs[LTC4245_GPIO] = nextgpio;
-
 		data->last_updated = jiffies;
 		data->valid = 1;
 	}
@@ -182,9 +127,7 @@ static int ltc4245_get_voltage(struct device *dev, u8 reg)
 	case LTC4245_VEEOUT:
 		voltage = regval * -55;
 		break;
-	case LTC4245_GPIOADC1:
-	case LTC4245_GPIOADC2:
-	case LTC4245_GPIOADC3:
+	case LTC4245_GPIOADC:
 		voltage = regval * 10;
 		break;
 	default:
@@ -351,9 +294,7 @@ LTC4245_ALARM(in7_min_alarm,	(1 << 2),	LTC4245_FAULT2);
 LTC4245_ALARM(in8_min_alarm,	(1 << 3),	LTC4245_FAULT2);
 
 /* GPIO voltages */
-LTC4245_VOLTAGE(in9_input,			LTC4245_GPIOADC1);
-LTC4245_VOLTAGE(in10_input,			LTC4245_GPIOADC2);
-LTC4245_VOLTAGE(in11_input,			LTC4245_GPIOADC3);
+LTC4245_VOLTAGE(in9_input,			LTC4245_GPIOADC);
 
 /* Power Consumption (virtual) */
 LTC4245_POWER(power1_input,			LTC4245_12VSENSE);
-- 
1.5.4.3





More information about the lm-sensors mailing list