dect
/
linux-2.6
Archived
13
0
Fork 0

hwmon: (w83781d) Fix multi-line comments

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Guenter Roeck 2012-01-19 11:02:27 -08:00 committed by Guenter Roeck
parent 2a52dd667d
commit aff6e00ee1
1 changed files with 117 additions and 80 deletions

View File

@ -1,37 +1,37 @@
/* /*
w83781d.c - Part of lm_sensors, Linux kernel modules for hardware * w83781d.c - Part of lm_sensors, Linux kernel modules for hardware
monitoring * monitoring
Copyright (c) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>, * Copyright (c) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
Philip Edelbrock <phil@netroedge.com>, * Philip Edelbrock <phil@netroedge.com>,
and Mark Studebaker <mdsxyz123@yahoo.com> * and Mark Studebaker <mdsxyz123@yahoo.com>
Copyright (c) 2007 - 2008 Jean Delvare <khali@linux-fr.org> * Copyright (c) 2007 - 2008 Jean Delvare <khali@linux-fr.org>
*
This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. * (at your option) any later version.
*
This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. * GNU General Public License for more details.
*
You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* /*
Supports following chips: * Supports following chips:
*
Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA * Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
as99127f 7 3 0 3 0x31 0x12c3 yes no * as99127f 7 3 0 3 0x31 0x12c3 yes no
as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no * as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no
w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes * w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes
w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes * w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes
w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no * w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no
*
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@ -145,8 +145,10 @@ static const u8 W83781D_REG_PWM[] = { 0x5B, 0x5A, 0x5E, 0x5F };
#define W83781D_REG_I2C_ADDR 0x48 #define W83781D_REG_I2C_ADDR 0x48
#define W83781D_REG_I2C_SUBADDR 0x4A #define W83781D_REG_I2C_SUBADDR 0x4A
/* The following are undocumented in the data sheets however we /*
received the information in an email from Winbond tech support */ * The following are undocumented in the data sheets however we
* received the information in an email from Winbond tech support
*/
/* Sensor selection - not on 781d */ /* Sensor selection - not on 781d */
#define W83781D_REG_SCFG1 0x5D #define W83781D_REG_SCFG1 0x5D
static const u8 BIT_SCFG1[] = { 0x02, 0x04, 0x08 }; static const u8 BIT_SCFG1[] = { 0x02, 0x04, 0x08 };
@ -238,9 +240,11 @@ struct w83781d_data {
u32 beep_mask; /* Register encoding, combined */ u32 beep_mask; /* Register encoding, combined */
u8 pwm[4]; /* Register value */ u8 pwm[4]; /* Register value */
u8 pwm2_enable; /* Boolean */ u8 pwm2_enable; /* Boolean */
u16 sens[3]; /* 782D/783S only. u16 sens[3]; /*
1 = pentium diode; 2 = 3904 diode; * 782D/783S only.
4 = thermistor */ * 1 = pentium diode; 2 = 3904 diode;
* 4 = thermistor
*/
u8 vrm; u8 vrm;
}; };
@ -636,10 +640,12 @@ show_fan_div(struct device *dev, struct device_attribute *da, char *buf)
(long) DIV_FROM_REG(data->fan_div[attr->index])); (long) DIV_FROM_REG(data->fan_div[attr->index]));
} }
/* Note: we save and restore the fan minimum here, because its value is /*
determined in part by the fan divisor. This follows the principle of * Note: we save and restore the fan minimum here, because its value is
least surprise; the user doesn't expect the fan minimum to change just * determined in part by the fan divisor. This follows the principle of
because the divisor changed. */ * least surprise; the user doesn't expect the fan minimum to change just
* because the divisor changed.
*/
static ssize_t static ssize_t
store_fan_div(struct device *dev, struct device_attribute *da, store_fan_div(struct device *dev, struct device_attribute *da,
const char *buf, size_t count) const char *buf, size_t count)
@ -847,7 +853,8 @@ static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR,
static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR,
show_sensor, store_sensor, 2); show_sensor, store_sensor, 2);
/* Assumes that adapter is of I2C, not ISA variety. /*
* Assumes that adapter is of I2C, not ISA variety.
* OTHERWISE DON'T CALL THIS * OTHERWISE DON'T CALL THIS
*/ */
static int static int
@ -1102,9 +1109,11 @@ w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -ENODEV; return -ENODEV;
/* We block updates of the ISA device to minimize the risk of /*
concurrent access to the same W83781D chip through different * We block updates of the ISA device to minimize the risk of
interfaces. */ * concurrent access to the same W83781D chip through different
* interfaces.
*/
if (isa) if (isa)
mutex_lock(&isa->update_lock); mutex_lock(&isa->update_lock);
@ -1124,8 +1133,10 @@ w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
"Detection of w83781d chip failed at step 4\n"); "Detection of w83781d chip failed at step 4\n");
goto err_nodev; goto err_nodev;
} }
/* If Winbond SMBus, check address at 0x48. /*
Asus doesn't support, except for as99127f rev.2 */ * If Winbond SMBus, check address at 0x48.
* Asus doesn't support, except for as99127f rev.2
*/
if ((!(val1 & 0x80) && val2 == 0xa3) || if ((!(val1 & 0x80) && val2 == 0xa3) ||
((val1 & 0x80) && val2 == 0x5c)) { ((val1 & 0x80) && val2 == 0x5c)) {
if (i2c_smbus_read_byte_data(client, W83781D_REG_I2C_ADDR) if (i2c_smbus_read_byte_data(client, W83781D_REG_I2C_ADDR)
@ -1346,25 +1357,33 @@ w83781d_init_device(struct device *dev)
int type = data->type; int type = data->type;
u8 tmp; u8 tmp;
if (reset && type != as99127f) { /* this resets registers we don't have if (reset && type != as99127f) { /*
documentation for on the as99127f */ * this resets registers we don't have
/* Resetting the chip has been the default for a long time, * documentation for on the as99127f
but it causes the BIOS initializations (fan clock dividers, */
thermal sensor types...) to be lost, so it is now optional. /*
It might even go away if nobody reports it as being useful, * Resetting the chip has been the default for a long time,
as I see very little reason why this would be needed at * but it causes the BIOS initializations (fan clock dividers,
all. */ * thermal sensor types...) to be lost, so it is now optional.
* It might even go away if nobody reports it as being useful,
* as I see very little reason why this would be needed at
* all.
*/
dev_info(dev, "If reset=1 solved a problem you were " dev_info(dev, "If reset=1 solved a problem you were "
"having, please report!\n"); "having, please report!\n");
/* save these registers */ /* save these registers */
i = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG); i = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG);
p = w83781d_read_value(data, W83781D_REG_PWMCLK12); p = w83781d_read_value(data, W83781D_REG_PWMCLK12);
/* Reset all except Watchdog values and last conversion values /*
This sets fan-divs to 2, among others */ * Reset all except Watchdog values and last conversion values
* This sets fan-divs to 2, among others
*/
w83781d_write_value(data, W83781D_REG_CONFIG, 0x80); w83781d_write_value(data, W83781D_REG_CONFIG, 0x80);
/* Restore the registers and disable power-on abnormal beep. /*
This saves FAN 1/2/3 input/output values set by BIOS. */ * Restore the registers and disable power-on abnormal beep.
* This saves FAN 1/2/3 input/output values set by BIOS.
*/
w83781d_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80); w83781d_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80);
w83781d_write_value(data, W83781D_REG_PWMCLK12, p); w83781d_write_value(data, W83781D_REG_PWMCLK12, p);
/* /*
@ -1375,8 +1394,10 @@ w83781d_init_device(struct device *dev)
w83781d_write_value(data, W83781D_REG_BEEP_INTS2, 0); w83781d_write_value(data, W83781D_REG_BEEP_INTS2, 0);
} }
/* Disable power-on abnormal beep, as advised by the datasheet. /*
Already done if reset=1. */ * Disable power-on abnormal beep, as advised by the datasheet.
* Already done if reset=1.
*/
if (init && !reset && type != as99127f) { if (init && !reset && type != as99127f) {
i = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG); i = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG);
w83781d_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80); w83781d_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80);
@ -1533,8 +1554,10 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
| (w83781d_read_value(data, | (w83781d_read_value(data,
W83782D_REG_ALARM2) << 8); W83782D_REG_ALARM2) << 8);
} else { } else {
/* No real-time status registers, fall back to /*
interrupt status registers */ * No real-time status registers, fall back to
* interrupt status registers
*/
data->alarms = w83781d_read_value(data, data->alarms = w83781d_read_value(data,
W83781D_REG_ALARM1) W83781D_REG_ALARM1)
| (w83781d_read_value(data, | (w83781d_read_value(data,
@ -1588,8 +1611,10 @@ static struct platform_device *pdev;
static unsigned short isa_address = 0x290; static unsigned short isa_address = 0x290;
/* I2C devices get this name attribute automatically, but for ISA devices /*
we must create it by ourselves. */ * I2C devices get this name attribute automatically, but for ISA devices
* we must create it by ourselves.
*/
static ssize_t static ssize_t
show_name(struct device *dev, struct device_attribute *devattr, char *buf) show_name(struct device *dev, struct device_attribute *devattr, char *buf)
{ {
@ -1619,8 +1644,10 @@ static int w83781d_alias_detect(struct i2c_client *client, u8 chipid)
if (w83781d_read_value(isa, W83781D_REG_WCHIPID) != chipid) if (w83781d_read_value(isa, W83781D_REG_WCHIPID) != chipid)
return 0; /* Chip type doesn't match */ return 0; /* Chip type doesn't match */
/* We compare all the limit registers, the config register and the /*
* interrupt mask registers */ * We compare all the limit registers, the config register and the
* interrupt mask registers
*/
for (i = 0x2b; i <= 0x3d; i++) { for (i = 0x2b; i <= 0x3d; i++) {
if (w83781d_read_value(isa, i) != if (w83781d_read_value(isa, i) !=
i2c_smbus_read_byte_data(client, i)) i2c_smbus_read_byte_data(client, i))
@ -1701,12 +1728,14 @@ w83781d_write_value_isa(struct w83781d_data *data, u16 reg, u16 value)
} }
} }
/* The SMBus locks itself, usually, but nothing may access the Winbond between /*
bank switches. ISA access must always be locked explicitly! * The SMBus locks itself, usually, but nothing may access the Winbond between
We ignore the W83781D BUSY flag at this moment - it could lead to deadlocks, * bank switches. ISA access must always be locked explicitly!
would slow down the W83781D access and should not be necessary. * We ignore the W83781D BUSY flag at this moment - it could lead to deadlocks,
There are some ugly typecasts here, but the good news is - they should * would slow down the W83781D access and should not be necessary.
nowhere else be necessary! */ * There are some ugly typecasts here, but the good news is - they should
* nowhere else be necessary!
*/
static int static int
w83781d_read_value(struct w83781d_data *data, u16 reg) w83781d_read_value(struct w83781d_data *data, u16 reg)
{ {
@ -1833,9 +1862,11 @@ w83781d_isa_found(unsigned short address)
int val, save, found = 0; int val, save, found = 0;
int port; int port;
/* Some boards declare base+0 to base+7 as a PNP device, some base+4 /*
* Some boards declare base+0 to base+7 as a PNP device, some base+4
* to base+7 and some base+5 to base+6. So we better request each port * to base+7 and some base+5 to base+6. So we better request each port
* individually for the probing phase. */ * individually for the probing phase.
*/
for (port = address; port < address + W83781D_EXTENT; port++) { for (port = address; port < address + W83781D_EXTENT; port++) {
if (!request_region(port, 1, "w83781d")) { if (!request_region(port, 1, "w83781d")) {
pr_debug("Failed to request port 0x%x\n", port); pr_debug("Failed to request port 0x%x\n", port);
@ -1844,8 +1875,10 @@ w83781d_isa_found(unsigned short address)
} }
#define REALLY_SLOW_IO #define REALLY_SLOW_IO
/* We need the timeouts for at least some W83781D-like /*
chips. But only if we read 'undefined' registers. */ * We need the timeouts for at least some W83781D-like
* chips. But only if we read 'undefined' registers.
*/
val = inb_p(address + 1); val = inb_p(address + 1);
if (inb_p(address + 2) != val if (inb_p(address + 2) != val
|| inb_p(address + 3) != val || inb_p(address + 3) != val
@ -1855,8 +1888,10 @@ w83781d_isa_found(unsigned short address)
} }
#undef REALLY_SLOW_IO #undef REALLY_SLOW_IO
/* We should be able to change the 7 LSB of the address port. The /*
MSB (busy flag) should be clear initially, set after the write. */ * We should be able to change the 7 LSB of the address port. The
* MSB (busy flag) should be clear initially, set after the write.
*/
save = inb_p(address + W83781D_ADDR_REG_OFFSET); save = inb_p(address + W83781D_ADDR_REG_OFFSET);
if (save & 0x80) { if (save & 0x80) {
pr_debug("Detection failed at step %d\n", 2); pr_debug("Detection failed at step %d\n", 2);
@ -2042,8 +2077,10 @@ sensors_w83781d_init(void)
{ {
int res; int res;
/* We register the ISA device first, so that we can skip the /*
* registration of an I2C interface to the same device. */ * We register the ISA device first, so that we can skip the
* registration of an I2C interface to the same device.
*/
res = w83781d_isa_register(); res = w83781d_isa_register();
if (res) if (res)
goto exit; goto exit;