Commit 174a86df authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging

* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  hwmon: (dme1737) Minor cleanups
  hwmon: (dme1737) Add support for in7 for SCH5127
  hwmon: (emc1403) Add EMC1423 support
  hwmon: (w83627hf) Document W83627THF voltage pin mapping
  hwmon: (w83793) Drop useless mutex
  hwmon: (fschmd) Drop useless mutex
  hwmon: (w83781d) Use pr_fmt and pr_<level>
  hwmon: (pc87427) Use pr_fmt and pr_<level>
  hwmon: (pc87360) Use pr_fmt and pr_<level>
  hwmon: (lm78) Use pr_fmt and pr_<level>
  hwmon: (it87) Use pr_fmt and pr_<level>
  hwmon: Schedule the removal of the old intrusion detection interfaces
  hwmon: (w83793) Implement the standard intrusion detection interface
  hwmon: (w83792d) Implement the standard intrusion detection interface
  hwmon: (adm9240) Implement the standard intrusion detection interface
  hwmon: (via686a) Initialize fan_div values
  hwmon: (w83795) Silent false warning from gcc
  hwmon: (ads7828) Update email contact details
parents 1896a134 06f3d9fb
...@@ -590,3 +590,13 @@ Why: The functions have been superceded by cancel_delayed_work_sync() ...@@ -590,3 +590,13 @@ Why: The functions have been superceded by cancel_delayed_work_sync()
Who: Tejun Heo <tj@kernel.org> Who: Tejun Heo <tj@kernel.org>
---------------------------- ----------------------------
What: Legacy, non-standard chassis intrusion detection interface.
When: June 2011
Why: The adm9240, w83792d and w83793 hardware monitoring drivers have
legacy interfaces for chassis intrusion detection. A standard
interface has been added to each driver, so the legacy interface
can be removed.
Who: Jean Delvare <khali@linux-fr.org>
----------------------------
...@@ -155,7 +155,7 @@ connected to a normally open switch. ...@@ -155,7 +155,7 @@ connected to a normally open switch.
The ADM9240 provides an internal open drain on this line, and may output The ADM9240 provides an internal open drain on this line, and may output
a 20 ms active low pulse to reset an external Chassis Intrusion latch. a 20 ms active low pulse to reset an external Chassis Intrusion latch.
Clear the CI latch by writing value 1 to the sysfs chassis_clear file. Clear the CI latch by writing value 0 to the sysfs intrusion0_alarm file.
Alarm flags reported as 16-bit word Alarm flags reported as 16-bit word
......
...@@ -9,7 +9,7 @@ Supported chips: ...@@ -9,7 +9,7 @@ Supported chips:
http://focus.ti.com/lit/ds/symlink/ads7828.pdf http://focus.ti.com/lit/ds/symlink/ads7828.pdf
Authors: Authors:
Steve Hardy <steve@linuxrealtime.co.uk> Steve Hardy <shardy@redhat.com>
Module Parameters Module Parameters
----------------- -----------------
......
...@@ -42,7 +42,7 @@ Description ...@@ -42,7 +42,7 @@ Description
This driver implements support for the hardware monitoring capabilities of the This driver implements support for the hardware monitoring capabilities of the
SMSC DME1737 and Asus A8000 (which are the same), SMSC SCH5027, SCH311x, SMSC DME1737 and Asus A8000 (which are the same), SMSC SCH5027, SCH311x,
and SCH5127 Super-I/O chips. These chips feature monitoring of 3 temp sensors and SCH5127 Super-I/O chips. These chips feature monitoring of 3 temp sensors
temp[1-3] (2 remote diodes and 1 internal), 7 voltages in[0-6] (6 external and temp[1-3] (2 remote diodes and 1 internal), 8 voltages in[0-7] (7 external and
1 internal) and up to 6 fan speeds fan[1-6]. Additionally, the chips implement 1 internal) and up to 6 fan speeds fan[1-6]. Additionally, the chips implement
up to 5 PWM outputs pwm[1-3,5-6] for controlling fan speeds both manually and up to 5 PWM outputs pwm[1-3,5-6] for controlling fan speeds both manually and
automatically. automatically.
...@@ -105,6 +105,7 @@ SCH5127: ...@@ -105,6 +105,7 @@ SCH5127:
in4: V1_IN 0V - 1.5V in4: V1_IN 0V - 1.5V
in5: VTR (+3.3V standby) 0V - 4.38V in5: VTR (+3.3V standby) 0V - 4.38V
in6: Vbat (+3.0V) 0V - 4.38V in6: Vbat (+3.0V) 0V - 4.38V
in7: Vtrip (+1.5V) 0V - 1.99V
Each voltage input has associated min and max limits which trigger an alarm Each voltage input has associated min and max limits which trigger an alarm
when crossed. when crossed.
...@@ -217,10 +218,10 @@ cpu0_vid RO CPU core reference voltage in ...@@ -217,10 +218,10 @@ cpu0_vid RO CPU core reference voltage in
vrm RW Voltage regulator module version vrm RW Voltage regulator module version
number. number.
in[0-6]_input RO Measured voltage in millivolts. in[0-7]_input RO Measured voltage in millivolts.
in[0-6]_min RW Low limit for voltage input. in[0-7]_min RW Low limit for voltage input.
in[0-6]_max RW High limit for voltage input. in[0-7]_max RW High limit for voltage input.
in[0-6]_alarm RO Voltage input alarm. Returns 1 if in[0-7]_alarm RO Voltage input alarm. Returns 1 if
voltage input is or went outside the voltage input is or went outside the
associated min-max range, 0 otherwise. associated min-max range, 0 otherwise.
...@@ -324,3 +325,4 @@ fan5 opt opt ...@@ -324,3 +325,4 @@ fan5 opt opt
pwm5 opt opt pwm5 opt opt
fan6 opt opt fan6 opt opt
pwm6 opt opt pwm6 opt opt
in7 yes
...@@ -91,3 +91,25 @@ isaset -y -f 0x2e 0xaa ...@@ -91,3 +91,25 @@ isaset -y -f 0x2e 0xaa
The above sequence assumes a Super-I/O config space at 0x2e/0x2f, but The above sequence assumes a Super-I/O config space at 0x2e/0x2f, but
0x4e/0x4f is also possible. 0x4e/0x4f is also possible.
Voltage pin mapping
-------------------
Here is a summary of the voltage pin mapping for the W83627THF. This
can be useful to convert data provided by board manufacturers into
working libsensors configuration statements.
W83627THF |
Pin | Name | Register | Sysfs attribute
-----------------------------------------------------
100 | CPUVCORE | 20h | in0
99 | VIN0 | 21h | in1
98 | VIN1 | 22h | in2
97 | VIN2 | 24h | in4
114 | AVCC | 23h | in3
61 | 5VSB | 50h (bank 5) | in7
74 | VBAT | 51h (bank 5) | in8
For other supported devices, you'll have to take the hard path and
look up the information in the datasheet yourself (and then add it
to this document please.)
...@@ -92,7 +92,7 @@ This driver implements support for Winbond W83793G/W83793R chips. ...@@ -92,7 +92,7 @@ This driver implements support for Winbond W83793G/W83793R chips.
* Chassis * Chassis
If the case open alarm triggers, it will stay in this state unless cleared If the case open alarm triggers, it will stay in this state unless cleared
by any write to the sysfs file "chassis". by writing 0 to the sysfs file "intrusion0_alarm".
* VID and VRM * VID and VRM
The VRM version is detected automatically, don't modify the it unless you The VRM version is detected automatically, don't modify the it unless you
......
...@@ -809,10 +809,10 @@ config SENSORS_DME1737 ...@@ -809,10 +809,10 @@ config SENSORS_DME1737
will be called dme1737. will be called dme1737.
config SENSORS_EMC1403 config SENSORS_EMC1403
tristate "SMSC EMC1403 thermal sensor" tristate "SMSC EMC1403/23 thermal sensor"
depends on I2C depends on I2C
help help
If you say yes here you get support for the SMSC EMC1403 If you say yes here you get support for the SMSC EMC1403/23
temperature monitoring chip. temperature monitoring chip.
Threshold values can be configured using sysfs. Threshold values can be configured using sysfs.
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
* Alarms 16-bit map of active alarms * Alarms 16-bit map of active alarms
* Analog Out 0..1250 mV output * Analog Out 0..1250 mV output
* *
* Chassis Intrusion: clear CI latch with 'echo 1 > chassis_clear' * Chassis Intrusion: clear CI latch with 'echo 0 > intrusion0_alarm'
* *
* Test hardware: Intel SE440BX-2 desktop motherboard --Grant * Test hardware: Intel SE440BX-2 desktop motherboard --Grant
* *
...@@ -476,13 +476,16 @@ static ssize_t set_aout(struct device *dev, ...@@ -476,13 +476,16 @@ static ssize_t set_aout(struct device *dev,
static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout); static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);
/* chassis_clear */ /* chassis_clear */
static ssize_t chassis_clear(struct device *dev, static ssize_t chassis_clear_legacy(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
unsigned long val = simple_strtol(buf, NULL, 10); unsigned long val = simple_strtol(buf, NULL, 10);
dev_warn(dev, "Attribute chassis_clear is deprecated, "
"use intrusion0_alarm instead\n");
if (val == 1) { if (val == 1) {
i2c_smbus_write_byte_data(client, i2c_smbus_write_byte_data(client,
ADM9240_REG_CHASSIS_CLEAR, 0x80); ADM9240_REG_CHASSIS_CLEAR, 0x80);
...@@ -490,7 +493,29 @@ static ssize_t chassis_clear(struct device *dev, ...@@ -490,7 +493,29 @@ static ssize_t chassis_clear(struct device *dev,
} }
return count; return count;
} }
static DEVICE_ATTR(chassis_clear, S_IWUSR, NULL, chassis_clear); static DEVICE_ATTR(chassis_clear, S_IWUSR, NULL, chassis_clear_legacy);
static ssize_t chassis_clear(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct i2c_client *client = to_i2c_client(dev);
struct adm9240_data *data = i2c_get_clientdata(client);
unsigned long val;
if (strict_strtoul(buf, 10, &val) || val != 0)
return -EINVAL;
mutex_lock(&data->update_lock);
i2c_smbus_write_byte_data(client, ADM9240_REG_CHASSIS_CLEAR, 0x80);
data->valid = 0; /* Force cache refresh */
mutex_unlock(&data->update_lock);
dev_dbg(&client->dev, "chassis intrusion latch cleared\n");
return count;
}
static SENSOR_DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR, show_alarm,
chassis_clear, 12);
static struct attribute *adm9240_attributes[] = { static struct attribute *adm9240_attributes[] = {
&sensor_dev_attr_in0_input.dev_attr.attr, &sensor_dev_attr_in0_input.dev_attr.attr,
...@@ -532,6 +557,7 @@ static struct attribute *adm9240_attributes[] = { ...@@ -532,6 +557,7 @@ static struct attribute *adm9240_attributes[] = {
&dev_attr_alarms.attr, &dev_attr_alarms.attr,
&dev_attr_aout_output.attr, &dev_attr_aout_output.attr,
&dev_attr_chassis_clear.attr, &dev_attr_chassis_clear.attr,
&sensor_dev_attr_intrusion0_alarm.dev_attr.attr,
&dev_attr_cpu0_vid.attr, &dev_attr_cpu0_vid.attr,
NULL NULL
}; };
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
This driver is based on the lm75 and other lm_sensors/hwmon drivers This driver is based on the lm75 and other lm_sensors/hwmon drivers
Written by Steve Hardy <steve@linuxrealtime.co.uk> Written by Steve Hardy <shardy@redhat.com>
Datasheet available at: http://focus.ti.com/lit/ds/symlink/ads7828.pdf Datasheet available at: http://focus.ti.com/lit/ds/symlink/ads7828.pdf
...@@ -271,7 +271,7 @@ static void __exit sensors_ads7828_exit(void) ...@@ -271,7 +271,7 @@ static void __exit sensors_ads7828_exit(void)
i2c_del_driver(&ads7828_driver); i2c_del_driver(&ads7828_driver);
} }
MODULE_AUTHOR("Steve Hardy <steve@linuxrealtime.co.uk>"); MODULE_AUTHOR("Steve Hardy <shardy@redhat.com>");
MODULE_DESCRIPTION("ADS7828 driver"); MODULE_DESCRIPTION("ADS7828 driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
This diff is collapsed.
...@@ -269,23 +269,30 @@ static int emc1403_detect(struct i2c_client *client, ...@@ -269,23 +269,30 @@ static int emc1403_detect(struct i2c_client *client,
struct i2c_board_info *info) struct i2c_board_info *info)
{ {
int id; int id;
/* Check if thermal chip is SMSC and EMC1403 */ /* Check if thermal chip is SMSC and EMC1403 or EMC1423 */
id = i2c_smbus_read_byte_data(client, THERMAL_SMSC_ID_REG); id = i2c_smbus_read_byte_data(client, THERMAL_SMSC_ID_REG);
if (id != 0x5d) if (id != 0x5d)
return -ENODEV; return -ENODEV;
id = i2c_smbus_read_byte_data(client, THERMAL_PID_REG);
switch (id) {
case 0x21:
strlcpy(info->type, "emc1403", I2C_NAME_SIZE);
break;
case 0x23:
strlcpy(info->type, "emc1423", I2C_NAME_SIZE);
break;
/* Note: 0x25 is the 1404 which is very similar and this /* Note: 0x25 is the 1404 which is very similar and this
driver could be extended */ driver could be extended */
id = i2c_smbus_read_byte_data(client, THERMAL_PID_REG); default:
if (id != 0x21)
return -ENODEV; return -ENODEV;
}
id = i2c_smbus_read_byte_data(client, THERMAL_REVISION_REG); id = i2c_smbus_read_byte_data(client, THERMAL_REVISION_REG);
if (id != 0x01) if (id != 0x01)
return -ENODEV; return -ENODEV;
strlcpy(info->type, "emc1403", I2C_NAME_SIZE);
return 0; return 0;
} }
...@@ -342,6 +349,7 @@ static const unsigned short emc1403_address_list[] = { ...@@ -342,6 +349,7 @@ static const unsigned short emc1403_address_list[] = {
static const struct i2c_device_id emc1403_idtable[] = { static const struct i2c_device_id emc1403_idtable[] = {
{ "emc1403", 0 }, { "emc1403", 0 },
{ "emc1423", 0 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, emc1403_idtable); MODULE_DEVICE_TABLE(i2c, emc1403_idtable);
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#include <linux/kref.h> #include <linux/kref.h>
/* Addresses to scan */ /* Addresses to scan */
static DEFINE_MUTEX(watchdog_mutex);
static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END }; static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END };
/* Insmod parameters */ /* Insmod parameters */
...@@ -850,7 +849,7 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf, ...@@ -850,7 +849,7 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf,
static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{ {
static struct watchdog_info ident = { struct watchdog_info ident = {
.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
WDIOF_CARDRESET, WDIOF_CARDRESET,
.identity = "FSC watchdog" .identity = "FSC watchdog"
...@@ -858,7 +857,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long ar ...@@ -858,7 +857,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long ar
int i, ret = 0; int i, ret = 0;
struct fschmd_data *data = filp->private_data; struct fschmd_data *data = filp->private_data;
mutex_lock(&watchdog_mutex);
switch (cmd) { switch (cmd) {
case WDIOC_GETSUPPORT: case WDIOC_GETSUPPORT:
ident.firmware_version = data->revision; ident.firmware_version = data->revision;
...@@ -915,7 +913,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long ar ...@@ -915,7 +913,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long ar
default: default:
ret = -ENOTTY; ret = -ENOTTY;
} }
mutex_unlock(&watchdog_mutex);
return ret; return ret;
} }
......
...@@ -38,6 +38,8 @@ ...@@ -38,6 +38,8 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -1570,26 +1572,25 @@ static int __init it87_find(unsigned short *address, ...@@ -1570,26 +1572,25 @@ static int __init it87_find(unsigned short *address,
case 0xffff: /* No device at all */ case 0xffff: /* No device at all */
goto exit; goto exit;
default: default:
pr_debug(DRVNAME ": Unsupported chip (DEVID=0x%x)\n", pr_debug("Unsupported chip (DEVID=0x%x)\n", chip_type);
chip_type);
goto exit; goto exit;
} }
superio_select(PME); superio_select(PME);
if (!(superio_inb(IT87_ACT_REG) & 0x01)) { if (!(superio_inb(IT87_ACT_REG) & 0x01)) {
pr_info("it87: Device not activated, skipping\n"); pr_info("Device not activated, skipping\n");
goto exit; goto exit;
} }
*address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1); *address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1);
if (*address == 0) { if (*address == 0) {
pr_info("it87: Base address not set, skipping\n"); pr_info("Base address not set, skipping\n");
goto exit; goto exit;
} }
err = 0; err = 0;
sio_data->revision = superio_inb(DEVREV) & 0x0f; sio_data->revision = superio_inb(DEVREV) & 0x0f;
pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n", pr_info("Found IT%04xF chip at 0x%x, revision %d\n",
chip_type, *address, sio_data->revision); chip_type, *address, sio_data->revision);
/* in8 (Vbat) is always internal */ /* in8 (Vbat) is always internal */
...@@ -1615,7 +1616,7 @@ static int __init it87_find(unsigned short *address, ...@@ -1615,7 +1616,7 @@ static int __init it87_find(unsigned short *address,
} else { } else {
/* We need at least 4 VID pins */ /* We need at least 4 VID pins */
if (reg & 0x0f) { if (reg & 0x0f) {
pr_info("it87: VID is disabled (pins used for GPIO)\n"); pr_info("VID is disabled (pins used for GPIO)\n");
sio_data->skip_vid = 1; sio_data->skip_vid = 1;
} }
} }
...@@ -1651,7 +1652,7 @@ static int __init it87_find(unsigned short *address, ...@@ -1651,7 +1652,7 @@ static int __init it87_find(unsigned short *address,
if (sio_data->type == it8720 && !(reg & (1 << 1))) { if (sio_data->type == it8720 && !(reg & (1 << 1))) {
reg |= (1 << 1); reg |= (1 << 1);
superio_outb(IT87_SIO_PINX2_REG, reg); superio_outb(IT87_SIO_PINX2_REG, reg);
pr_notice("it87: Routing internal VCCH to in7\n"); pr_notice("Routing internal VCCH to in7\n");
} }
if (reg & (1 << 0)) if (reg & (1 << 0))
sio_data->internal |= (1 << 0); sio_data->internal |= (1 << 0);
...@@ -1661,7 +1662,7 @@ static int __init it87_find(unsigned short *address, ...@@ -1661,7 +1662,7 @@ static int __init it87_find(unsigned short *address,
sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f; sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
} }
if (sio_data->beep_pin) if (sio_data->beep_pin)
pr_info("it87: Beeping is supported\n"); pr_info("Beeping is supported\n");
/* Disable specific features based on DMI strings */ /* Disable specific features based on DMI strings */
board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
...@@ -1675,8 +1676,7 @@ static int __init it87_find(unsigned short *address, ...@@ -1675,8 +1676,7 @@ static int __init it87_find(unsigned short *address,
the PWM2 duty cycle, so we disable it. the PWM2 duty cycle, so we disable it.
I use the board name string as the trigger in case I use the board name string as the trigger in case
the same board is ever used in other systems. */ the same board is ever used in other systems. */
pr_info("it87: Disabling pwm2 due to " pr_info("Disabling pwm2 due to hardware constraints\n");
"hardware constraints\n");
sio_data->skip_pwm = (1 << 1); sio_data->skip_pwm = (1 << 1);
} }
} }
...@@ -2189,28 +2189,26 @@ static int __init it87_device_add(unsigned short address, ...@@ -2189,28 +2189,26 @@ static int __init it87_device_add(unsigned short address,
pdev = platform_device_alloc(DRVNAME, address); pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
printk(KERN_ERR DRVNAME ": Device allocation failed\n"); pr_err("Device allocation failed\n");
goto exit; goto exit;
} }
err = platform_device_add_resources(pdev, &res, 1); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device resource addition failed " pr_err("Device resource addition failed (%d)\n", err);
"(%d)\n", err);
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add_data(pdev, sio_data, err = platform_device_add_data(pdev, sio_data,
sizeof(struct it87_sio_data)); sizeof(struct it87_sio_data));
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Platform data allocation failed\n"); pr_err("Platform data allocation failed\n");
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add(pdev); err = platform_device_add(pdev);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n", pr_err("Device addition failed (%d)\n", err);
err);
goto exit_device_put; goto exit_device_put;
} }
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -858,7 +860,7 @@ static int __init lm78_isa_found(unsigned short address) ...@@ -858,7 +860,7 @@ static int __init lm78_isa_found(unsigned short address)
* individually for the probing phase. */ * individually for the probing phase. */
for (port = address; port < address + LM78_EXTENT; port++) { for (port = address; port < address + LM78_EXTENT; port++) {
if (!request_region(port, 1, "lm78")) { if (!request_region(port, 1, "lm78")) {
pr_debug("lm78: Failed to request port 0x%x\n", port); pr_debug("Failed to request port 0x%x\n", port);
goto release; goto release;
} }
} }
...@@ -920,7 +922,7 @@ static int __init lm78_isa_found(unsigned short address) ...@@ -920,7 +922,7 @@ static int __init lm78_isa_found(unsigned short address)
found = 1; found = 1;
if (found) if (found)
pr_info("lm78: Found an %s chip at %#x\n", pr_info("Found an %s chip at %#x\n",
val & 0x80 ? "LM79" : "LM78", (int)address); val & 0x80 ? "LM79" : "LM78", (int)address);
release: release:
...@@ -942,21 +944,19 @@ static int __init lm78_isa_device_add(unsigned short address) ...@@ -942,21 +944,19 @@ static int __init lm78_isa_device_add(unsigned short address)
pdev = platform_device_alloc("lm78", address); pdev = platform_device_alloc("lm78", address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
printk(KERN_ERR "lm78: Device allocation failed\n"); pr_err("Device allocation failed\n");
goto exit; goto exit;
} }
err = platform_device_add_resources(pdev, &res, 1); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR "lm78: Device resource addition failed " pr_err("Device resource addition failed (%d)\n", err);
"(%d)\n", err);
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add(pdev); err = platform_device_add(pdev);
if (err) { if (err) {
printk(KERN_ERR "lm78: Device addition failed (%d)\n", pr_err("Device addition failed (%d)\n", err);
err);
goto exit_device_put; goto exit_device_put;
} }
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
* the standard Super-I/O addresses is used (0x2E/0x2F or 0x4E/0x4F). * the standard Super-I/O addresses is used (0x2E/0x2F or 0x4E/0x4F).
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -1031,16 +1033,15 @@ static int __init pc87360_find(int sioaddr, u8 *devid, unsigned short *addresses ...@@ -1031,16 +1033,15 @@ static int __init pc87360_find(int sioaddr, u8 *devid, unsigned short *addresses
val = superio_inb(sioaddr, ACT); val = superio_inb(sioaddr, ACT);
if (!(val & 0x01)) { if (!(val & 0x01)) {
printk(KERN_INFO "pc87360: Device 0x%02x not " pr_info("Device 0x%02x not activated\n", logdev[i]);
"activated\n", logdev[i]);
continue; continue;
} }
val = (superio_inb(sioaddr, BASE) << 8) val = (superio_inb(sioaddr, BASE) << 8)
| superio_inb(sioaddr, BASE + 1); | superio_inb(sioaddr, BASE + 1);
if (!val) { if (!val) {
printk(KERN_INFO "pc87360: Base address not set for " pr_info("Base address not set for device 0x%02x\n",
"device 0x%02x\n", logdev[i]); logdev[i]);
continue; continue;
} }
...@@ -1050,17 +1051,15 @@ static int __init pc87360_find(int sioaddr, u8 *devid, unsigned short *addresses ...@@ -1050,17 +1051,15 @@ static int __init pc87360_find(int sioaddr, u8 *devid, unsigned short *addresses
confreg[0] = superio_inb(sioaddr, 0xF0); confreg[0] = superio_inb(sioaddr, 0xF0);
confreg[1] = superio_inb(sioaddr, 0xF1); confreg[1] = superio_inb(sioaddr, 0xF1);
#ifdef DEBUG pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 1,
printk(KERN_DEBUG "pc87360: Fan 1: mon=%d " (confreg[0] >> 2) & 1, (confreg[0] >> 3) & 1,
"ctrl=%d inv=%d\n", (confreg[0]>>2)&1, (confreg[0] >> 4) & 1);
(confreg[0]>>3)&1, (confreg[0]>>4)&1); pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 2,
printk(KERN_DEBUG "pc87360: Fan 2: mon=%d " (confreg[0] >> 5) & 1, (confreg[0] >> 6) & 1,
"ctrl=%d inv=%d\n", (confreg[0]>>5)&1, (confreg[0] >> 7) & 1);
(confreg[0]>>6)&1, (confreg[0]>>7)&1); pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 3,
printk(KERN_DEBUG "pc87360: Fan 3: mon=%d " confreg[1] & 1, (confreg[1] >> 1) & 1,
"ctrl=%d inv=%d\n", confreg[1]&1, (confreg[1] >> 2) & 1);
(confreg[1]>>1)&1, (confreg[1]>>2)&1);
#endif
} else if (i==1) { /* Voltages */ } else if (i==1) { /* Voltages */
/* Are we using thermistors? */ /* Are we using thermistors? */
if (*devid == 0xE9) { /* PC87366 */ if (*devid == 0xE9) { /* PC87366 */
...@@ -1071,13 +1070,11 @@ static int __init pc87360_find(int sioaddr, u8 *devid, unsigned short *addresses ...@@ -1071,13 +1070,11 @@ static int __init pc87360_find(int sioaddr, u8 *devid, unsigned short *addresses
confreg[3] = superio_inb(sioaddr, 0x25); confreg[3] = superio_inb(sioaddr, 0x25);
if (confreg[2] & 0x40) { if (confreg[2] & 0x40) {
printk(KERN_INFO "pc87360: Using " pr_info("Using thermistors for "
"thermistors for temperature " "temperature monitoring\n");
"monitoring\n");
} }
if (confreg[3] & 0xE0) { if (confreg[3] & 0xE0) {
printk(KERN_INFO "pc87360: VID " pr_info("VID inputs routed (mode %u)\n",
"inputs routed (mode %u)\n",
confreg[3] >> 5); confreg[3] >> 5);
} }
} }
...@@ -1616,7 +1613,7 @@ static int __init pc87360_device_add(unsigned short address) ...@@ -1616,7 +1613,7 @@ static int __init pc87360_device_add(unsigned short address)
pdev = platform_device_alloc("pc87360", address); pdev = platform_device_alloc("pc87360", address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
printk(KERN_ERR "pc87360: Device allocation failed\n"); pr_err("Device allocation failed\n");
goto exit; goto exit;
} }
...@@ -1639,15 +1636,13 @@ static int __init pc87360_device_add(unsigned short address) ...@@ -1639,15 +1636,13 @@ static int __init pc87360_device_add(unsigned short address)
err = platform_device_add_resources(pdev, res, res_count); err = platform_device_add_resources(pdev, res, res_count);
if (err) { if (err) {
printk(KERN_ERR "pc87360: Device resources addition failed " pr_err("Device resources addition failed (%d)\n", err);
"(%d)\n", err);
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add(pdev); err = platform_device_add(pdev);
if (err) { if (err) {
printk(KERN_ERR "pc87360: Device addition failed (%d)\n", pr_err("Device addition failed (%d)\n", err);
err);
goto exit_device_put; goto exit_device_put;
} }
...@@ -1666,8 +1661,7 @@ static int __init pc87360_init(void) ...@@ -1666,8 +1661,7 @@ static int __init pc87360_init(void)
if (pc87360_find(0x2e, &devid, extra_isa) if (pc87360_find(0x2e, &devid, extra_isa)
&& pc87360_find(0x4e, &devid, extra_isa)) { && pc87360_find(0x4e, &devid, extra_isa)) {
printk(KERN_WARNING "pc87360: PC8736x not detected, " pr_warn("PC8736x not detected, module not inserted\n");
"module not inserted.\n");
return -ENODEV; return -ENODEV;
} }
...@@ -1680,8 +1674,7 @@ static int __init pc87360_init(void) ...@@ -1680,8 +1674,7 @@ static int __init pc87360_init(void)
} }
if (address == 0x0000) { if (address == 0x0000) {
printk(KERN_WARNING "pc87360: No active logical device, " pr_warn("No active logical device, module not inserted\n");
"module not inserted.\n");
return -ENODEV; return -ENODEV;
} }
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
* mode, and voltages aren't supported at all. * mode, and voltages aren't supported at all.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -1077,7 +1079,7 @@ static int __devinit pc87427_probe(struct platform_device *pdev) ...@@ -1077,7 +1079,7 @@ static int __devinit pc87427_probe(struct platform_device *pdev)
data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL); data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL);
if (!data) { if (!data) {
err = -ENOMEM; err = -ENOMEM;
printk(KERN_ERR DRVNAME ": Out of memory\n"); pr_err("Out of memory\n");
goto exit; goto exit;
} }
...@@ -1196,28 +1198,26 @@ static int __init pc87427_device_add(const struct pc87427_sio_data *sio_data) ...@@ -1196,28 +1198,26 @@ static int __init pc87427_device_add(const struct pc87427_sio_data *sio_data)
pdev = platform_device_alloc(DRVNAME, res[0].start); pdev = platform_device_alloc(DRVNAME, res[0].start);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
printk(KERN_ERR DRVNAME ": Device allocation failed\n"); pr_err("Device allocation failed\n");
goto exit; goto exit;
} }
err = platform_device_add_resources(pdev, res, res_count); err = platform_device_add_resources(pdev, res, res_count);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device resource addition failed " pr_err("Device resource addition failed (%d)\n", err);
"(%d)\n", err);
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add_data(pdev, sio_data, err = platform_device_add_data(pdev, sio_data,
sizeof(struct pc87427_sio_data)); sizeof(struct pc87427_sio_data));
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Platform data allocation failed\n"); pr_err("Platform data allocation failed\n");
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add(pdev); err = platform_device_add(pdev);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n", pr_err("Device addition failed (%d)\n", err);
err);
goto exit_device_put; goto exit_device_put;
} }
...@@ -1249,23 +1249,23 @@ static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data) ...@@ -1249,23 +1249,23 @@ static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data)
val = superio_inb(sioaddr, SIOREG_ACT); val = superio_inb(sioaddr, SIOREG_ACT);
if (!(val & 0x01)) { if (!(val & 0x01)) {
printk(KERN_INFO DRVNAME ": Logical device 0x%02x " pr_info("Logical device 0x%02x not activated\n",
"not activated\n", logdev[i]); logdev[i]);
continue; continue;
} }
val = superio_inb(sioaddr, SIOREG_MAP); val = superio_inb(sioaddr, SIOREG_MAP);
if (val & 0x01) { if (val & 0x01) {
printk(KERN_WARNING DRVNAME ": Logical device 0x%02x " pr_warn("Logical device 0x%02x is memory-mapped, "
"is memory-mapped, can't use\n", logdev[i]); "can't use\n", logdev[i]);
continue; continue;
} }
val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8) val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
| superio_inb(sioaddr, SIOREG_IOBASE + 1); | superio_inb(sioaddr, SIOREG_IOBASE + 1);
if (!val) { if (!val) {
printk(KERN_INFO DRVNAME ": I/O base address not set " pr_info("I/O base address not set for logical device "
"for logical device 0x%02x\n", logdev[i]); "0x%02x\n", logdev[i]);
continue; continue;
} }
sio_data->address[i] = val; sio_data->address[i] = val;
......
...@@ -689,6 +689,13 @@ static int __devexit via686a_remove(struct platform_device *pdev) ...@@ -689,6 +689,13 @@ static int __devexit via686a_remove(struct platform_device *pdev)
return 0; return 0;
} }
static void via686a_update_fan_div(struct via686a_data *data)
{
int reg = via686a_read_value(data, VIA686A_REG_FANDIV);
data->fan_div[0] = (reg >> 4) & 0x03;
data->fan_div[1] = reg >> 6;
}
static void __devinit via686a_init_device(struct via686a_data *data) static void __devinit via686a_init_device(struct via686a_data *data)
{ {
u8 reg; u8 reg;
...@@ -702,6 +709,9 @@ static void __devinit via686a_init_device(struct via686a_data *data) ...@@ -702,6 +709,9 @@ static void __devinit via686a_init_device(struct via686a_data *data)
via686a_write_value(data, VIA686A_REG_TEMP_MODE, via686a_write_value(data, VIA686A_REG_TEMP_MODE,
(reg & ~VIA686A_TEMP_MODE_MASK) (reg & ~VIA686A_TEMP_MODE_MASK)
| VIA686A_TEMP_MODE_CONTINUOUS); | VIA686A_TEMP_MODE_CONTINUOUS);
/* Pre-read fan clock divisor values */
via686a_update_fan_div(data);
} }
static struct via686a_data *via686a_update_device(struct device *dev) static struct via686a_data *via686a_update_device(struct device *dev)
...@@ -753,9 +763,7 @@ static struct via686a_data *via686a_update_device(struct device *dev) ...@@ -753,9 +763,7 @@ static struct via686a_data *via686a_update_device(struct device *dev)
(via686a_read_value(data, VIA686A_REG_TEMP_LOW23) & (via686a_read_value(data, VIA686A_REG_TEMP_LOW23) &
0xc0) >> 6; 0xc0) >> 6;
i = via686a_read_value(data, VIA686A_REG_FANDIV); via686a_update_fan_div(data);
data->fan_div[0] = (i >> 4) & 0x03;
data->fan_div[1] = i >> 6;
data->alarms = data->alarms =
via686a_read_value(data, via686a_read_value(data,
VIA686A_REG_ALARM1) | VIA686A_REG_ALARM1) |
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -1798,8 +1800,7 @@ w83781d_isa_found(unsigned short address) ...@@ -1798,8 +1800,7 @@ w83781d_isa_found(unsigned short address)
* 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("w83781d: Failed to request port 0x%x\n", pr_debug("Failed to request port 0x%x\n", port);
port);
goto release; goto release;
} }
} }
...@@ -1811,7 +1812,7 @@ w83781d_isa_found(unsigned short address) ...@@ -1811,7 +1812,7 @@ w83781d_isa_found(unsigned short address)
if (inb_p(address + 2) != val if (inb_p(address + 2) != val
|| inb_p(address + 3) != val || inb_p(address + 3) != val
|| inb_p(address + 7) != val) { || inb_p(address + 7) != val) {
pr_debug("w83781d: Detection failed at step 1\n"); pr_debug("Detection failed at step %d\n", 1);
goto release; goto release;
} }
#undef REALLY_SLOW_IO #undef REALLY_SLOW_IO
...@@ -1820,14 +1821,14 @@ w83781d_isa_found(unsigned short address) ...@@ -1820,14 +1821,14 @@ w83781d_isa_found(unsigned short address)
MSB (busy flag) should be clear initially, set after the write. */ 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("w83781d: Detection failed at step 2\n"); pr_debug("Detection failed at step %d\n", 2);
goto release; goto release;
} }
val = ~save & 0x7f; val = ~save & 0x7f;
outb_p(val, address + W83781D_ADDR_REG_OFFSET); outb_p(val, address + W83781D_ADDR_REG_OFFSET);
if (inb_p(address + W83781D_ADDR_REG_OFFSET) != (val | 0x80)) { if (inb_p(address + W83781D_ADDR_REG_OFFSET) != (val | 0x80)) {
outb_p(save, address + W83781D_ADDR_REG_OFFSET); outb_p(save, address + W83781D_ADDR_REG_OFFSET);
pr_debug("w83781d: Detection failed at step 3\n"); pr_debug("Detection failed at step %d\n", 3);
goto release; goto release;
} }
...@@ -1835,7 +1836,7 @@ w83781d_isa_found(unsigned short address) ...@@ -1835,7 +1836,7 @@ w83781d_isa_found(unsigned short address)
outb_p(W83781D_REG_CONFIG, address + W83781D_ADDR_REG_OFFSET); outb_p(W83781D_REG_CONFIG, address + W83781D_ADDR_REG_OFFSET);
val = inb_p(address + W83781D_DATA_REG_OFFSET); val = inb_p(address + W83781D_DATA_REG_OFFSET);
if (val & 0x80) { if (val & 0x80) {
pr_debug("w83781d: Detection failed at step 4\n"); pr_debug("Detection failed at step %d\n", 4);
goto release; goto release;
} }
outb_p(W83781D_REG_BANK, address + W83781D_ADDR_REG_OFFSET); outb_p(W83781D_REG_BANK, address + W83781D_ADDR_REG_OFFSET);
...@@ -1844,19 +1845,19 @@ w83781d_isa_found(unsigned short address) ...@@ -1844,19 +1845,19 @@ w83781d_isa_found(unsigned short address)
val = inb_p(address + W83781D_DATA_REG_OFFSET); val = inb_p(address + W83781D_DATA_REG_OFFSET);
if ((!(save & 0x80) && (val != 0xa3)) if ((!(save & 0x80) && (val != 0xa3))
|| ((save & 0x80) && (val != 0x5c))) { || ((save & 0x80) && (val != 0x5c))) {
pr_debug("w83781d: Detection failed at step 5\n"); pr_debug("Detection failed at step %d\n", 5);
goto release; goto release;
} }
outb_p(W83781D_REG_I2C_ADDR, address + W83781D_ADDR_REG_OFFSET); outb_p(W83781D_REG_I2C_ADDR, address + W83781D_ADDR_REG_OFFSET);
val = inb_p(address + W83781D_DATA_REG_OFFSET); val = inb_p(address + W83781D_DATA_REG_OFFSET);
if (val < 0x03 || val > 0x77) { /* Not a valid I2C address */ if (val < 0x03 || val > 0x77) { /* Not a valid I2C address */
pr_debug("w83781d: Detection failed at step 6\n"); pr_debug("Detection failed at step %d\n", 6);
goto release; goto release;
} }
/* The busy flag should be clear again */ /* The busy flag should be clear again */
if (inb_p(address + W83781D_ADDR_REG_OFFSET) & 0x80) { if (inb_p(address + W83781D_ADDR_REG_OFFSET) & 0x80) {
pr_debug("w83781d: Detection failed at step 7\n"); pr_debug("Detection failed at step %d\n", 7);
goto release; goto release;
} }
...@@ -1871,7 +1872,7 @@ w83781d_isa_found(unsigned short address) ...@@ -1871,7 +1872,7 @@ w83781d_isa_found(unsigned short address)
found = 1; found = 1;
if (found) if (found)
pr_info("w83781d: Found a %s chip at %#x\n", pr_info("Found a %s chip at %#x\n",
val == 0x30 ? "W83782D" : "W83781D", (int)address); val == 0x30 ? "W83782D" : "W83781D", (int)address);
release: release:
...@@ -1894,21 +1895,19 @@ w83781d_isa_device_add(unsigned short address) ...@@ -1894,21 +1895,19 @@ w83781d_isa_device_add(unsigned short address)
pdev = platform_device_alloc("w83781d", address); pdev = platform_device_alloc("w83781d", address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
printk(KERN_ERR "w83781d: Device allocation failed\n"); pr_err("Device allocation failed\n");
goto exit; goto exit;
} }
err = platform_device_add_resources(pdev, &res, 1); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR "w83781d: Device resource addition failed " pr_err("Device resource addition failed (%d)\n", err);
"(%d)\n", err);
goto exit_device_put; goto exit_device_put;
} }
err = platform_device_add(pdev); err = platform_device_add(pdev);
if (err) { if (err) {
printk(KERN_ERR "w83781d: Device addition failed (%d)\n", pr_err("Device addition failed (%d)\n", err);
err);
goto exit_device_put; goto exit_device_put;
} }
......
...@@ -691,13 +691,23 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr, ...@@ -691,13 +691,23 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr,
} }
static ssize_t static ssize_t
show_regs_chassis(struct device *dev, struct device_attribute *attr, show_chassis(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct w83792d_data *data = w83792d_update_device(dev); struct w83792d_data *data = w83792d_update_device(dev);
return sprintf(buf, "%d\n", data->chassis); return sprintf(buf, "%d\n", data->chassis);
} }
static ssize_t
show_regs_chassis(struct device *dev, struct device_attribute *attr,
char *buf)
{
dev_warn(dev,
"Attribute %s is deprecated, use intrusion0_alarm instead\n",
"chassis");
return show_chassis(dev, attr, buf);
}
static ssize_t static ssize_t
show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf) show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf)
{ {
...@@ -706,7 +716,7 @@ show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf) ...@@ -706,7 +716,7 @@ show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf)
} }
static ssize_t static ssize_t
store_chassis_clear(struct device *dev, struct device_attribute *attr, store_chassis_clear_legacy(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
...@@ -714,6 +724,10 @@ store_chassis_clear(struct device *dev, struct device_attribute *attr, ...@@ -714,6 +724,10 @@ store_chassis_clear(struct device *dev, struct device_attribute *attr,
u32 val; u32 val;
u8 temp1 = 0, temp2 = 0; u8 temp1 = 0, temp2 = 0;
dev_warn(dev,
"Attribute %s is deprecated, use intrusion0_alarm instead\n",
"chassis_clear");
val = simple_strtoul(buf, NULL, 10); val = simple_strtoul(buf, NULL, 10);
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->chassis_clear = SENSORS_LIMIT(val, 0 ,1); data->chassis_clear = SENSORS_LIMIT(val, 0 ,1);
...@@ -726,6 +740,27 @@ store_chassis_clear(struct device *dev, struct device_attribute *attr, ...@@ -726,6 +740,27 @@ store_chassis_clear(struct device *dev, struct device_attribute *attr,
return count; return count;
} }
static ssize_t
store_chassis_clear(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct i2c_client *client = to_i2c_client(dev);
struct w83792d_data *data = i2c_get_clientdata(client);
unsigned long val;
u8 reg;
if (strict_strtoul(buf, 10, &val) || val != 0)
return -EINVAL;
mutex_lock(&data->update_lock);
reg = w83792d_read_value(client, W83792D_REG_CHASSIS_CLR);
w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, reg | 0x80);
data->valid = 0; /* Force cache refresh */
mutex_unlock(&data->update_lock);
return count;
}
/* For Smart Fan I / Thermal Cruise */ /* For Smart Fan I / Thermal Cruise */
static ssize_t static ssize_t
show_thermal_cruise(struct device *dev, struct device_attribute *attr, show_thermal_cruise(struct device *dev, struct device_attribute *attr,
...@@ -1012,7 +1047,9 @@ static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22); ...@@ -1012,7 +1047,9 @@ static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22);
static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 23); static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 23);
static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL); static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL);
static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR, static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR,
show_chassis_clear, store_chassis_clear); show_chassis_clear, store_chassis_clear_legacy);
static DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR,
show_chassis, store_chassis_clear);
static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0); static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0);
static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1); static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1);
static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2); static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2);
...@@ -1214,6 +1251,7 @@ static struct attribute *w83792d_attributes[] = { ...@@ -1214,6 +1251,7 @@ static struct attribute *w83792d_attributes[] = {
&dev_attr_alarms.attr, &dev_attr_alarms.attr,
&dev_attr_chassis.attr, &dev_attr_chassis.attr,
&dev_attr_chassis_clear.attr, &dev_attr_chassis_clear.attr,
&dev_attr_intrusion0_alarm.attr,
&sensor_dev_attr_tolerance1.dev_attr.attr, &sensor_dev_attr_tolerance1.dev_attr.attr,
&sensor_dev_attr_thermal_cruise1.dev_attr.attr, &sensor_dev_attr_thermal_cruise1.dev_attr.attr,
&sensor_dev_attr_tolerance2.dev_attr.attr, &sensor_dev_attr_tolerance2.dev_attr.attr,
......
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#define WATCHDOG_TIMEOUT 2 /* 2 minute default timeout */ #define WATCHDOG_TIMEOUT 2 /* 2 minute default timeout */
/* Addresses to scan */ /* Addresses to scan */
static DEFINE_MUTEX(watchdog_mutex);
static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
I2C_CLIENT_END }; I2C_CLIENT_END };
...@@ -421,7 +420,7 @@ store_beep_enable(struct device *dev, struct device_attribute *attr, ...@@ -421,7 +420,7 @@ store_beep_enable(struct device *dev, struct device_attribute *attr,
/* Write any value to clear chassis alarm */ /* Write any value to clear chassis alarm */
static ssize_t static ssize_t
store_chassis_clear(struct device *dev, store_chassis_clear_legacy(struct device *dev,
struct device_attribute *attr, const char *buf, struct device_attribute *attr, const char *buf,
size_t count) size_t count)
{ {
...@@ -429,6 +428,9 @@ store_chassis_clear(struct device *dev, ...@@ -429,6 +428,9 @@ store_chassis_clear(struct device *dev,
struct w83793_data *data = i2c_get_clientdata(client); struct w83793_data *data = i2c_get_clientdata(client);
u8 val; u8 val;
dev_warn(dev, "Attribute chassis is deprecated, "
"use intrusion0_alarm instead\n");
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
val = w83793_read_value(client, W83793_REG_CLR_CHASSIS); val = w83793_read_value(client, W83793_REG_CLR_CHASSIS);
val |= 0x80; val |= 0x80;
...@@ -437,6 +439,28 @@ store_chassis_clear(struct device *dev, ...@@ -437,6 +439,28 @@ store_chassis_clear(struct device *dev,
return count; return count;
} }
/* Write 0 to clear chassis alarm */
static ssize_t
store_chassis_clear(struct device *dev,
struct device_attribute *attr, const char *buf,
size_t count)
{
struct i2c_client *client = to_i2c_client(dev);
struct w83793_data *data = i2c_get_clientdata(client);
unsigned long val;
u8 reg;
if (strict_strtoul(buf, 10, &val) || val != 0)
return -EINVAL;
mutex_lock(&data->update_lock);
reg = w83793_read_value(client, W83793_REG_CLR_CHASSIS);
w83793_write_value(client, W83793_REG_CLR_CHASSIS, reg | 0x80);
data->valid = 0; /* Force cache refresh */
mutex_unlock(&data->update_lock);
return count;
}
#define FAN_INPUT 0 #define FAN_INPUT 0
#define FAN_MIN 1 #define FAN_MIN 1
static ssize_t static ssize_t
...@@ -1102,6 +1126,8 @@ static DEVICE_ATTR(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm); ...@@ -1102,6 +1126,8 @@ static DEVICE_ATTR(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm);
static struct sensor_device_attribute_2 sda_single_files[] = { static struct sensor_device_attribute_2 sda_single_files[] = {
SENSOR_ATTR_2(chassis, S_IWUSR | S_IRUGO, show_alarm_beep, SENSOR_ATTR_2(chassis, S_IWUSR | S_IRUGO, show_alarm_beep,
store_chassis_clear_legacy, ALARM_STATUS, 30),
SENSOR_ATTR_2(intrusion0_alarm, S_IWUSR | S_IRUGO, show_alarm_beep,
store_chassis_clear, ALARM_STATUS, 30), store_chassis_clear, ALARM_STATUS, 30),
SENSOR_ATTR_2(beep_enable, S_IWUSR | S_IRUGO, show_beep_enable, SENSOR_ATTR_2(beep_enable, S_IWUSR | S_IRUGO, show_beep_enable,
store_beep_enable, NOT_USED, NOT_USED), store_beep_enable, NOT_USED, NOT_USED),
...@@ -1323,7 +1349,7 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf, ...@@ -1323,7 +1349,7 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf,
static long watchdog_ioctl(struct file *filp, unsigned int cmd, static long watchdog_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
static struct watchdog_info ident = { struct watchdog_info ident = {
.options = WDIOF_KEEPALIVEPING | .options = WDIOF_KEEPALIVEPING |
WDIOF_SETTIMEOUT | WDIOF_SETTIMEOUT |
WDIOF_CARDRESET, WDIOF_CARDRESET,
...@@ -1333,7 +1359,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, ...@@ -1333,7 +1359,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd,
int val, ret = 0; int val, ret = 0;
struct w83793_data *data = filp->private_data; struct w83793_data *data = filp->private_data;
mutex_lock(&watchdog_mutex);
switch (cmd) { switch (cmd) {
case WDIOC_GETSUPPORT: case WDIOC_GETSUPPORT:
if (!nowayout) if (!nowayout)
...@@ -1387,7 +1412,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, ...@@ -1387,7 +1412,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd,
default: default:
ret = -ENOTTY; ret = -ENOTTY;
} }
mutex_unlock(&watchdog_mutex);
return ret; return ret;
} }
......
...@@ -458,6 +458,7 @@ static void w83795_update_limits(struct i2c_client *client) ...@@ -458,6 +458,7 @@ static void w83795_update_limits(struct i2c_client *client)
{ {
struct w83795_data *data = i2c_get_clientdata(client); struct w83795_data *data = i2c_get_clientdata(client);
int i, limit; int i, limit;
u8 lsb;
/* Read the voltage limits */ /* Read the voltage limits */
for (i = 0; i < ARRAY_SIZE(data->in); i++) { for (i = 0; i < ARRAY_SIZE(data->in); i++) {
...@@ -479,9 +480,8 @@ static void w83795_update_limits(struct i2c_client *client) ...@@ -479,9 +480,8 @@ static void w83795_update_limits(struct i2c_client *client)
} }
/* Read the fan limits */ /* Read the fan limits */
lsb = 0; /* Silent false gcc warning */
for (i = 0; i < ARRAY_SIZE(data->fan); i++) { for (i = 0; i < ARRAY_SIZE(data->fan); i++) {
u8 lsb;
/* Each register contains LSB for 2 fans, but we want to /* Each register contains LSB for 2 fans, but we want to
* read it only once to save time */ * read it only once to save time */
if ((i & 1) == 0 && (data->has_fan & (3 << i))) if ((i & 1) == 0 && (data->has_fan & (3 << i)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment