ACPI: ibm-acpi: clean up fan_read
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Fri, 24 Nov 2006 13:47:10 +0000 (11:47 -0200)
committerLen Brown <len.brown@intel.com>
Thu, 7 Dec 2006 06:38:39 +0000 (01:38 -0500)
This patch cleans up fan_read so that it is much easier to read and
extend.

The patch fixes the userspace ABI to return "status: not supported" (like
all other ibm-acpi functions) when neither fan status or fan control are
possible.

It also fixes the userspace ABI to return EIO if ACPI access to the EC
fails, instead of returning "status: unreadable" or "speed: unreadable".

Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
drivers/acpi/ibm_acpi.c

index 7d0bd61eebc70458b3f032093376b816b7e5fccd..e8de5e349d214e1fedc522aee812f04d52557250 100644 (file)
@@ -1741,40 +1741,48 @@ static int fan_init(void)
 static int fan_read(char *p)
 {
        int len = 0;
-       int s;
        u8 lo, hi, status;
 
-       if (gfan_handle) {
+       switch (fan_status_access_mode) {
+       case IBMACPI_FAN_RD_ACPI_GFAN:
                /* 570, 600e/x, 770e, 770x */
-               if (!acpi_evalf(gfan_handle, &s, NULL, "d"))
+               if (unlikely(!acpi_evalf(gfan_handle, &status, NULL, "d")))
                        return -EIO;
 
-               len += sprintf(p + len, "level:\t\t%d\n", s);
-       } else {
+               len += sprintf(p + len, "level:\t\t%d\n", status);
+
+               break;
+
+       case IBMACPI_FAN_RD_TPEC:
                /* all except 570, 600e/x, 770e, 770x */
-               if (!acpi_ec_read(fan_status_offset, &status))
-                       len += sprintf(p + len, "status:\t\tunreadable\n");
+               if (unlikely(!acpi_ec_read(fan_status_offset, &status)))
+                       return -EIO;
                else
                        len += sprintf(p + len, "status:\t\t%s\n",
                                       enabled(status, 7));
 
-               if (!acpi_ec_read(fan_rpm_offset, &lo) ||
-                   !acpi_ec_read(fan_rpm_offset + 1, &hi))
-                       len += sprintf(p + len, "speed:\t\tunreadable\n");
+               if (unlikely(!acpi_ec_read(fan_rpm_offset, &lo) ||
+                            !acpi_ec_read(fan_rpm_offset + 1, &hi)))
+                       return -EIO;
                else
                        len += sprintf(p + len, "speed:\t\t%d\n",
                                       (hi << 8) + lo);
+
+               break;
+
+       case IBMACPI_FAN_NONE:
+       default:
+               len += sprintf(p + len, "status:\t\tnot supported\n");
        }
 
-       if (sfan_handle)
-               /* 570, 770x-JL */
+       if (fan_control_commands & IBMACPI_FAN_CMD_LEVEL)
                len += sprintf(p + len, "commands:\tlevel <level>"
                               " (<level> is 0-7)\n");
-       if (!gfan_handle)
-               /* all except 570, 600e/x, 770e, 770x */
+
+       if (fan_control_commands & IBMACPI_FAN_CMD_ENABLE)
                len += sprintf(p + len, "commands:\tenable, disable\n");
-       if (fans_handle)
-               /* X31, X40 */
+
+       if (fan_control_commands & IBMACPI_FAN_CMD_SPEED)
                len += sprintf(p + len, "commands:\tspeed <speed>"
                               " (<speed> is 0-65535)\n");