public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] asus_atk0110: add support for Asus P7P55D
@ 2009-09-23 19:12 Luca Tettamanti
  2009-09-24  3:18 ` Robert Hancock
  0 siblings, 1 reply; 26+ messages in thread
From: Luca Tettamanti @ 2009-09-23 19:12 UTC (permalink / raw)
  To: lm-sensors; +Cc: linux-kernel, Jean Delvare, Robert Hancock

With P7P55D (and newer) boards Asus extended the output buffer (ASBF)
making the driver unable to read the data from the sensors.
Change the driver to use dynamic buffers (allocated by ACPI core); the
return value is cached, so the number of memory allocations is very low.

Signed-off-by: Luca Tettamanti <kronos.it@gmail.com>
Tested-by: Robert Hancock <hancockrwd@gmail.com>

---
 drivers/hwmon/asus_atk0110.c |   50 ++++++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 19 deletions(-)

diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c
index fe4fa29..aed6e90 100644
--- a/drivers/hwmon/asus_atk0110.c
+++ b/drivers/hwmon/asus_atk0110.c
@@ -129,9 +129,15 @@ struct atk_sensor_data {
 	char const *acpi_name;
 };
 
-struct atk_acpi_buffer_u64 {
-	union acpi_object buf;
-	u64 value;
+/* Return buffer format:
+ * [0-3] "value" is valid flag
+ * [4-7] value
+ * [8- ] unknown stuff on newer mobos
+ */
+struct atk_acpi_ret_buffer {
+	u32 flags;
+	u32 value;
+	u8 data[];
 };
 
 static int atk_add(struct acpi_device *device);
@@ -446,8 +452,10 @@ static int atk_read_value_new(struct atk_sensor_data *sensor, u64 *value)
 	struct acpi_object_list params;
 	struct acpi_buffer ret;
 	union acpi_object id;
-	struct atk_acpi_buffer_u64 tmp;
+	union acpi_object *obj;
+	struct atk_acpi_ret_buffer *buf;
 	acpi_status status;
+	int err = 0;
 
 	id.type = ACPI_TYPE_INTEGER;
 	id.integer.value = sensor->id;
@@ -455,11 +463,7 @@ static int atk_read_value_new(struct atk_sensor_data *sensor, u64 *value)
 	params.count = 1;
 	params.pointer = &id;
 
-	tmp.buf.type = ACPI_TYPE_BUFFER;
-	tmp.buf.buffer.pointer = (u8 *)&tmp.value;
-	tmp.buf.buffer.length = sizeof(u64);
-	ret.length = sizeof(tmp);
-	ret.pointer = &tmp;
+	ret.length = ACPI_ALLOCATE_BUFFER;
 
 	status = acpi_evaluate_object_typed(data->read_handle, NULL, &params,
 			&ret, ACPI_TYPE_BUFFER);
@@ -468,23 +472,31 @@ static int atk_read_value_new(struct atk_sensor_data *sensor, u64 *value)
 				acpi_format_exception(status));
 		return -EIO;
 	}
+	obj = ret.pointer;
 
-	/* Return buffer format:
-	 * [0-3] "value" is valid flag
-	 * [4-7] value
-	 */
-	if (!(tmp.value & 0xffffffff)) {
+	/* Sanity check */
+	if (obj->buffer.length < 8) {
+		dev_warn(dev, "Unexpected ASBF length: %u\n",
+				obj->buffer.length);
+		err = -EIO;
+		goto out;
+	}
+	buf = (struct atk_acpi_ret_buffer *)obj->buffer.pointer;
+
+	if (!buf->flags) {
 		/* The reading is not valid, possible causes:
 		 * - sensor failure
 		 * - enumeration was FUBAR (and we didn't notice)
 		 */
-		dev_info(dev, "Failure: %#llx\n", tmp.value);
-		return -EIO;
+		dev_warn(dev, "Failure: %#x\n", buf->flags);
+		err = -EIO;
+		goto out;
 	}
 
-	*value = (tmp.value & 0xffffffff00000000ULL) >> 32;
-
-	return 0;
+	*value = buf->value;
+out:
+	ACPI_FREE(ret.pointer);
+	return err;
 }
 
 static int atk_read_value(struct atk_sensor_data *sensor, u64 *value)


Luca
-- 
Al termine di un pranzo di nozze mi hanno dato un
amaro alle erbe cosi' schifoso che perfino sull'etichetta
c'era un frate che vomitava.

^ permalink raw reply related	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2009-10-06  1:45 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-23 19:12 [PATCH] asus_atk0110: add support for Asus P7P55D Luca Tettamanti
2009-09-24  3:18 ` Robert Hancock
2009-09-24  8:53   ` Luca Tettamanti
2009-09-28 13:17   ` Luca Tettamanti
2009-09-28 13:22     ` Jean Delvare
2009-09-28 13:40       ` Luca Tettamanti
2009-09-29  2:20     ` Robert Hancock
2009-09-29  4:34       ` Robert Hancock
2009-09-29 14:07         ` Luca Tettamanti
2009-09-29 14:40           ` Robert Hancock
2009-09-29 14:49             ` Thomas Backlund
2009-09-30  2:08               ` Robert Hancock
2009-09-30 23:38               ` Robert Hancock
2009-10-01  6:50                 ` Jean Delvare
2009-10-01 14:40                   ` Robert Hancock
2009-10-01 14:49                     ` Luca Tettamanti
2009-10-01 16:21                       ` Thomas Backlund
2009-10-01 19:05                         ` Luca Tettamanti
2009-10-02 12:26                           ` Luca Tettamanti
2009-10-02 20:43                             ` Thomas Backlund
2009-10-02 20:45                               ` Thomas Backlund
2009-10-05 15:27                               ` Luca Tettamanti
2009-10-05 17:26                                 ` Thomas Backlund
2009-10-06  1:44                                   ` Robert Hancock
2009-10-01 15:02                 ` Thomas Backlund
2009-09-29 14:54             ` Luca Tettamanti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox