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");