]> Pileus Git - ~andy/linux/blobdiff - drivers/hwmon/abituguru3.c
Merge remote branch 'wireless-next/master' into ath6kl-next
[~andy/linux] / drivers / hwmon / abituguru3.c
index 34a14a77e008c95b010060791c7f7b417eca0ed4..a5bc4287daa65d6897981da97791f96faeedf839 100644 (file)
@@ -1,28 +1,28 @@
 /*
   abituguru3.c
-
   Copyright (c) 2006-2008 Hans de Goede <hdegoede@redhat.com>
   Copyright (c) 2008 Alistair John Strachan <alistair@devzero.co.uk>
-
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
-
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
-
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
* abituguru3.c
+ *
* Copyright (c) 2006-2008 Hans de Goede <hdegoede@redhat.com>
* Copyright (c) 2008 Alistair John Strachan <alistair@devzero.co.uk>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 /*
   This driver supports the sensor part of revision 3 of the custom Abit uGuru
   chip found on newer Abit uGuru motherboards. Note: because of lack of specs
   only reading the sensors and their settings is supported.
-*/
* This driver supports the sensor part of revision 3 of the custom Abit uGuru
* chip found on newer Abit uGuru motherboards. Note: because of lack of specs
* only reading the sensors and their settings is supported.
+ */
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #define ABIT_UGURU3_TEMP_SENSOR                        1
 #define ABIT_UGURU3_FAN_SENSOR                 2
 
-/* Timeouts / Retries, if these turn out to need a lot of fiddling we could
-   convert them to params. Determined by trial and error. I assume this is
-   cpu-speed independent, since the ISA-bus and not the CPU should be the
-   bottleneck. */
+/*
+ * Timeouts / Retries, if these turn out to need a lot of fiddling we could
+ * convert them to params. Determined by trial and error. I assume this is
+ * cpu-speed independent, since the ISA-bus and not the CPU should be the
+ * bottleneck.
+ */
 #define ABIT_UGURU3_WAIT_TIMEOUT               250
-/* Normally the 0xAC at the end of synchronize() is reported after the
-   first read, but sometimes not and we need to poll */
+/*
+ * Normally the 0xAC at the end of synchronize() is reported after the
+ * first read, but sometimes not and we need to poll
+ */
 #define ABIT_UGURU3_SYNCHRONIZE_TIMEOUT                5
 /* utility macros */
 #define ABIT_UGURU3_NAME                       "abituguru3"
 
 /* Macros to help calculate the sysfs_names array length */
 #define ABIT_UGURU3_MAX_NO_SENSORS 26
-/* sum of strlen +1 of: in??_input\0, in??_{min,max}\0, in??_{min,max}_alarm\0,
-   in??_{min,max}_alarm_enable\0, in??_beep\0, in??_shutdown\0, in??_label\0 */
-#define ABIT_UGURU3_IN_NAMES_LENGTH (11 + 2 * 9 + 2 * 15 + 2 * 22 + 10 + 14 + 11)
-/* sum of strlen +1 of: temp??_input\0, temp??_max\0, temp??_crit\0,
-   temp??_alarm\0, temp??_alarm_enable\0, temp??_beep\0, temp??_shutdown\0,
-   temp??_label\0 */
+/*
+ * sum of strlen +1 of: in??_input\0, in??_{min,max}\0, in??_{min,max}_alarm\0,
+ * in??_{min,max}_alarm_enable\0, in??_beep\0, in??_shutdown\0, in??_label\0
+ */
+#define ABIT_UGURU3_IN_NAMES_LENGTH \
+                               (11 + 2 * 9 + 2 * 15 + 2 * 22 + 10 + 14 + 11)
+/*
+ * sum of strlen +1 of: temp??_input\0, temp??_max\0, temp??_crit\0,
+ * temp??_alarm\0, temp??_alarm_enable\0, temp??_beep\0, temp??_shutdown\0,
+ * temp??_label\0
+ */
 #define ABIT_UGURU3_TEMP_NAMES_LENGTH (13 + 11 + 12 + 13 + 20 + 12 + 16 + 13)
-/* sum of strlen +1 of: fan??_input\0, fan??_min\0, fan??_alarm\0,
-   fan??_alarm_enable\0, fan??_beep\0, fan??_shutdown\0, fan??_label\0 */
+/*
+ * sum of strlen +1 of: fan??_input\0, fan??_min\0, fan??_alarm\0,
+ * fan??_alarm_enable\0, fan??_beep\0, fan??_shutdown\0, fan??_label\0
+ */
 #define ABIT_UGURU3_FAN_NAMES_LENGTH (12 + 10 + 12 + 19 + 11 + 15 + 12)
-/* Worst case scenario 16 in sensors (longest names_length) and the rest
-   temp sensors (second longest names_length). */
+/*
+ * Worst case scenario 16 in sensors (longest names_length) and the rest
+ * temp sensors (second longest names_length).
+ */
 #define ABIT_UGURU3_SYSFS_NAMES_LENGTH (16 * ABIT_UGURU3_IN_NAMES_LENGTH + \
        (ABIT_UGURU3_MAX_NO_SENSORS - 16) * ABIT_UGURU3_TEMP_NAMES_LENGTH)
 
-/* All the macros below are named identical to the openguru2 program
-   reverse engineered by Louis Kruger, hence the names might not be 100%
-   logical. I could come up with better names, but I prefer keeping the names
-   identical so that this driver can be compared with his work more easily. */
+/*
+ * All the macros below are named identical to the openguru2 program
+ * reverse engineered by Louis Kruger, hence the names might not be 100%
+ * logical. I could come up with better names, but I prefer keeping the names
+ * identical so that this driver can be compared with his work more easily.
+ */
 /* Two i/o-ports are used by uGuru */
 #define ABIT_UGURU3_BASE                       0x00E0
 #define ABIT_UGURU3_CMD                                0x00
 #define ABIT_UGURU3_DATA                       0x04
 #define ABIT_UGURU3_REGION_LENGTH              5
-/* The wait_xxx functions return this on success and the last contents
-   of the DATA register (0-255) on failure. */
+/*
+ * The wait_xxx functions return this on success and the last contents
+ * of the DATA register (0-255) on failure.
+ */
 #define ABIT_UGURU3_SUCCESS                    -1
 /* uGuru status flags */
 #define ABIT_UGURU3_STATUS_READY_FOR_READ      0x01
 
 /* Structures */
 struct abituguru3_sensor_info {
-       const charname;
+       const char *name;
        int port;
        int type;
        int multiplier;
@@ -130,9 +147,11 @@ struct abituguru3_motherboard_info {
        struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1];
 };
 
-/* For the Abit uGuru, we need to keep some data in memory.
-   The structure is dynamically allocated, at the same time when a new
-   abituguru3 device is allocated. */
+/*
+ * For the Abit uGuru, we need to keep some data in memory.
+ * The structure is dynamically allocated, at the same time when a new
+ * abituguru3 device is allocated.
+ */
 struct abituguru3_data {
        struct device *hwmon_dev;       /* hwmon registered device */
        struct mutex update_lock;       /* protect access to data and uGuru */
@@ -140,8 +159,10 @@ struct abituguru3_data {
        char valid;                     /* !=0 if following fields are valid */
        unsigned long last_updated;     /* In jiffies */
 
-       /* For convenience the sysfs attr and their names are generated
-          automatically. We have max 10 entries per sensor (for in sensors) */
+       /*
+        * For convenience the sysfs attr and their names are generated
+        * automatically. We have max 10 entries per sensor (for in sensors)
+        */
        struct sensor_device_attribute_2 sysfs_attr[ABIT_UGURU3_MAX_NO_SENSORS
                * 10];
 
@@ -151,9 +172,11 @@ struct abituguru3_data {
        /* Pointer to the sensors info for the detected motherboard */
        const struct abituguru3_sensor_info *sensors;
 
-       /* The abituguru3 supports up to 48 sensors, and thus has registers
-          sets for 48 sensors, for convienence reasons / simplicity of the
-          code we always read and store all registers for all 48 sensors */
+       /*
+        * The abituguru3 supports up to 48 sensors, and thus has registers
+        * sets for 48 sensors, for convienence reasons / simplicity of the
+        * code we always read and store all registers for all 48 sensors
+        */
 
        /* Alarms for all 48 sensors (1 bit per sensor) */
        u8 alarms[48/8];
@@ -161,9 +184,11 @@ struct abituguru3_data {
        /* Value of all 48 sensors */
        u8 value[48];
 
-       /* Settings of all 48 sensors, note in and temp sensors (the first 32
-          sensors) have 3 bytes of settings, while fans only have 2 bytes,
-          for convenience we use 3 bytes for all sensors */
+       /*
+        * Settings of all 48 sensors, note in and temp sensors (the first 32
+        * sensors) have 3 bytes of settings, while fans only have 2 bytes,
+        * for convenience we use 3 bytes for all sensors
+        */
        u8 settings[48][3];
 };
 
@@ -626,8 +651,10 @@ static int abituguru3_wait_while_busy(struct abituguru3_data *data)
                timeout--;
                if (timeout == 0)
                        return x;
-               /* sleep a bit before our last try, to give the uGuru3 one
-                  last chance to respond. */
+               /*
+                * sleep a bit before our last try, to give the uGuru3 one
+                * last chance to respond.
+                */
                if (timeout == 1)
                        msleep(1);
        }
@@ -645,48 +672,57 @@ static int abituguru3_wait_for_read(struct abituguru3_data *data)
                timeout--;
                if (timeout == 0)
                        return x;
-               /* sleep a bit before our last try, to give the uGuru3 one
-                  last chance to respond. */
+               /*
+                * sleep a bit before our last try, to give the uGuru3 one
+                * last chance to respond.
+                */
                if (timeout == 1)
                        msleep(1);
        }
        return ABIT_UGURU3_SUCCESS;
 }
 
-/* This synchronizes us with the uGuru3's protocol state machine, this
-   must be done before each command. */
+/*
+ * This synchronizes us with the uGuru3's protocol state machine, this
+ * must be done before each command.
+ */
 static int abituguru3_synchronize(struct abituguru3_data *data)
 {
        int x, timeout = ABIT_UGURU3_SYNCHRONIZE_TIMEOUT;
 
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("synchronize timeout during initial busy "
                        "wait, status: 0x%02x\n", x);
                return -EIO;
        }
 
        outb(0x20, data->addr + ABIT_UGURU3_DATA);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("synchronize timeout after sending 0x20, "
                        "status: 0x%02x\n", x);
                return -EIO;
        }
 
        outb(0x10, data->addr + ABIT_UGURU3_CMD);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("synchronize timeout after sending 0x10, "
                        "status: 0x%02x\n", x);
                return -EIO;
        }
 
        outb(0x00, data->addr + ABIT_UGURU3_CMD);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("synchronize timeout after sending 0x00, "
                        "status: 0x%02x\n", x);
                return -EIO;
        }
 
-       if ((x = abituguru3_wait_for_read(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_for_read(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("synchronize timeout waiting for read, "
                        "status: 0x%02x\n", x);
                return -EIO;
@@ -705,18 +741,22 @@ static int abituguru3_synchronize(struct abituguru3_data *data)
        return 0;
 }
 
-/* Read count bytes from sensor sensor_addr in bank bank_addr and store the
-   result in buf */
+/*
+ * Read count bytes from sensor sensor_addr in bank bank_addr and store the
+ * result in buf
+ */
 static int abituguru3_read(struct abituguru3_data *data, u8 bank, u8 offset,
        u8 count, u8 *buf)
 {
        int i, x;
 
-       if ((x = abituguru3_synchronize(data)))
+       x = abituguru3_synchronize(data);
+       if (x)
                return x;
 
        outb(0x1A, data->addr + ABIT_UGURU3_DATA);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("read from 0x%02x:0x%02x timed out after "
                        "sending 0x1A, status: 0x%02x\n", (unsigned int)bank,
                        (unsigned int)offset, x);
@@ -724,7 +764,8 @@ static int abituguru3_read(struct abituguru3_data *data, u8 bank, u8 offset,
        }
 
        outb(bank, data->addr + ABIT_UGURU3_CMD);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("read from 0x%02x:0x%02x timed out after "
                        "sending the bank, status: 0x%02x\n",
                        (unsigned int)bank, (unsigned int)offset, x);
@@ -732,7 +773,8 @@ static int abituguru3_read(struct abituguru3_data *data, u8 bank, u8 offset,
        }
 
        outb(offset, data->addr + ABIT_UGURU3_CMD);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("read from 0x%02x:0x%02x timed out after "
                        "sending the offset, status: 0x%02x\n",
                        (unsigned int)bank, (unsigned int)offset, x);
@@ -740,7 +782,8 @@ static int abituguru3_read(struct abituguru3_data *data, u8 bank, u8 offset,
        }
 
        outb(count, data->addr + ABIT_UGURU3_CMD);
-       if ((x = abituguru3_wait_while_busy(data)) != ABIT_UGURU3_SUCCESS) {
+       x = abituguru3_wait_while_busy(data);
+       if (x != ABIT_UGURU3_SUCCESS) {
                ABIT_UGURU3_DEBUG("read from 0x%02x:0x%02x timed out after "
                        "sending the count, status: 0x%02x\n",
                        (unsigned int)bank, (unsigned int)offset, x);
@@ -748,8 +791,8 @@ static int abituguru3_read(struct abituguru3_data *data, u8 bank, u8 offset,
        }
 
        for (i = 0; i < count; i++) {
-               if ((x = abituguru3_wait_for_read(data)) !=
-                               ABIT_UGURU3_SUCCESS) {
+               x = abituguru3_wait_for_read(data);
+               if (x != ABIT_UGURU3_SUCCESS) {
                        ABIT_UGURU3_DEBUG("timeout reading byte %d from "
                                "0x%02x:0x%02x, status: 0x%02x\n", i,
                                (unsigned int)bank, (unsigned int)offset, x);
@@ -760,28 +803,34 @@ static int abituguru3_read(struct abituguru3_data *data, u8 bank, u8 offset,
        return i;
 }
 
-/* Sensor settings are stored 1 byte per offset with the bytes
-   placed add consecutive offsets. */
+/*
+ * Sensor settings are stored 1 byte per offset with the bytes
+ * placed add consecutive offsets.
+ */
 static int abituguru3_read_increment_offset(struct abituguru3_data *data,
                                            u8 bank, u8 offset, u8 count,
                                            u8 *buf, int offset_count)
 {
        int i, x;
 
-       for (i = 0; i < offset_count; i++)
-               if ((x = abituguru3_read(data, bank, offset + i, count,
-                               buf + i * count)) != count) {
+       for (i = 0; i < offset_count; i++) {
+               x = abituguru3_read(data, bank, offset + i, count,
+                                   buf + i * count);
+               if (x != count) {
                        if (x < 0)
                                return x;
                        return i * count + x;
                }
+       }
 
        return i * count;
 }
 
-/* Following are the sysfs callback functions. These functions expect:
-   sensor_device_attribute_2->index:   index into the data->sensors array
-   sensor_device_attribute_2->nr:      register offset, bitmask or NA. */
+/*
+ * Following are the sysfs callback functions. These functions expect:
+ * sensor_device_attribute_2->index:   index into the data->sensors array
+ * sensor_device_attribute_2->nr:      register offset, bitmask or NA.
+ */
 static struct abituguru3_data *abituguru3_update_device(struct device *dev);
 
 static ssize_t show_value(struct device *dev,
@@ -807,8 +856,10 @@ static ssize_t show_value(struct device *dev,
        value = (value * sensor->multiplier) / sensor->divisor +
                sensor->offset;
 
-       /* alternatively we could update the sensors settings struct for this,
-          but then its contents would differ from the windows sw ini files */
+       /*
+        * alternatively we could update the sensors settings struct for this,
+        * but then its contents would differ from the windows sw ini files
+        */
        if (sensor->type == ABIT_UGURU3_TEMP_SENSOR)
                value *= 1000;
 
@@ -827,10 +878,12 @@ static ssize_t show_alarm(struct device *dev,
 
        port = data->sensors[attr->index].port;
 
-       /* See if the alarm bit for this sensor is set and if a bitmask is
-          given in attr->nr also check if the alarm matches the type of alarm
-          we're looking for (for volt it can be either low or high). The type
-          is stored in a few readonly bits in the settings of the sensor. */
+       /*
+        * See if the alarm bit for this sensor is set and if a bitmask is
+        * given in attr->nr also check if the alarm matches the type of alarm
+        * we're looking for (for volt it can be either low or high). The type
+        * is stored in a few readonly bits in the settings of the sensor.
+        */
        if ((data->alarms[port / 8] & (0x01 << (port % 8))) &&
                        (!attr->nr || (data->settings[port][0] & attr->nr)))
                return sprintf(buf, "1\n");
@@ -923,7 +976,8 @@ static int __devinit abituguru3_probe(struct platform_device *pdev)
        u8 buf[2];
        u16 id;
 
-       if (!(data = kzalloc(sizeof(struct abituguru3_data), GFP_KERNEL)))
+       data = kzalloc(sizeof(struct abituguru3_data), GFP_KERNEL);
+       if (!data)
                return -ENOMEM;
 
        data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
@@ -931,10 +985,10 @@ static int __devinit abituguru3_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, data);
 
        /* Read the motherboard ID */
-       if ((i = abituguru3_read(data, ABIT_UGURU3_MISC_BANK,
-                       ABIT_UGURU3_BOARD_ID, 2, buf)) != 2) {
+       i = abituguru3_read(data, ABIT_UGURU3_MISC_BANK, ABIT_UGURU3_BOARD_ID,
+                           2, buf);
+       if (i != 2)
                goto abituguru3_probe_error;
-       }
 
        /* Completely read the uGuru to see if one really is there */
        if (!abituguru3_update_device(&pdev->dev))
@@ -1091,8 +1145,10 @@ LEAVE_UPDATE:
 static int abituguru3_suspend(struct platform_device *pdev, pm_message_t state)
 {
        struct abituguru3_data *data = platform_get_drvdata(pdev);
-       /* make sure all communications with the uguru3 are done and no new
-          ones are started */
+       /*
+        * make sure all communications with the uguru3 are done and no new
+        * ones are started
+        */
        mutex_lock(&data->update_lock);
        return 0;
 }
@@ -1134,7 +1190,8 @@ static int __init abituguru3_dmi_detect(void)
        if (!board_name)
                return err;
 
-       /* At the moment, we don't care about the part of the vendor
+       /*
+        * At the moment, we don't care about the part of the vendor
         * DMI string contained in brackets. Truncate the string at
         * the first occurrence of a bracket. Trim any trailing space
         * from the substring.
@@ -1157,15 +1214,18 @@ static int __init abituguru3_dmi_detect(void)
        return 1;
 }
 
-/* FIXME: Manual detection should die eventually; we need to collect stable
+/*
+ * FIXME: Manual detection should die eventually; we need to collect stable
  *        DMI model names first before we can rely entirely on CONFIG_DMI.
  */
 
 static int __init abituguru3_detect(void)
 {
-       /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or
-          0x08 at DATA and 0xAC at CMD. Sometimes the uGuru3 will hold 0x05
-          or 0x55 at CMD instead, why is unknown. */
+       /*
+        * See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or
+        * 0x08 at DATA and 0xAC at CMD. Sometimes the uGuru3 will hold 0x05
+        * or 0x55 at CMD instead, why is unknown.
+        */
        u8 data_val = inb_p(ABIT_UGURU3_BASE + ABIT_UGURU3_DATA);
        u8 cmd_val = inb_p(ABIT_UGURU3_BASE + ABIT_UGURU3_CMD);
        if (((data_val == 0x00) || (data_val == 0x08)) &&
@@ -1197,7 +1257,8 @@ static int __init abituguru3_init(void)
        if (err < 0)
                return err;
 
-       /* Fall back to manual detection if there was no exact
+       /*
+        * Fall back to manual detection if there was no exact
         * board name match, or force was specified.
         */
        if (err > 0) {