hwmon/pc87360 separate alarm files: define some constants

Bring hwmon/pc87360 into agreement with
Documentation/hwmon/sysfs-interface.

Patchset adds separate limit alarms for voltages and temps, it also adds
temp[123]_fault files.  On my Soekris, temps 1,2 are unused/unconnected,
so temp[123]_fault = 1,1,0 respectively.  This agrees with
/usr/bin/sensors, which has always shown them as OPEN.  Temps 4,5,6 are
thermistor based, and dont have a fault bit in their status register.

This patch:

2 different kinds of constants added:
- CHAN_ALM_* constants for (later) vin, temp alarm callbacks.
- CHAN_* conversion constants, used in _init_device, partly for RW1C bits

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: "Mark M. Hoffman" <mhoffman@lightlink.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jim Cromie 2008-10-18 20:27:30 -07:00 committed by Linus Torvalds
parent 4d235ba6c2
commit 28f74e7177
1 changed files with 22 additions and 11 deletions

View File

@ -489,6 +489,11 @@ static struct sensor_device_attribute in_max[] = {
SENSOR_ATTR(in10_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 10), SENSOR_ATTR(in10_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 10),
}; };
/* (temp & vin) channel status register alarm bits (pdf sec.11.5.12) */
#define CHAN_ALM_MIN 0x02 /* min limit crossed */
#define CHAN_ALM_MAX 0x04 /* max limit exceeded */
#define TEMP_ALM_CRIT 0x08 /* temp crit exceeded (temp only) */
#define VIN_UNIT_ATTRS(X) \ #define VIN_UNIT_ATTRS(X) \
&in_input[X].dev_attr.attr, \ &in_input[X].dev_attr.attr, \
&in_status[X].dev_attr.attr, \ &in_status[X].dev_attr.attr, \
@ -1131,6 +1136,12 @@ static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank,
mutex_unlock(&(data->lock)); mutex_unlock(&(data->lock));
} }
/* (temp & vin) channel conversion status register flags (pdf sec.11.5.12) */
#define CHAN_CNVRTD 0x80 /* new data ready */
#define CHAN_ENA 0x01 /* enabled channel (temp or vin) */
#define CHAN_ALM_ENA 0x10 /* propagate to alarms-reg ?? (chk val!) */
#define CHAN_READY (CHAN_ENA|CHAN_CNVRTD) /* sample ready mask */
static void pc87360_init_device(struct platform_device *pdev, static void pc87360_init_device(struct platform_device *pdev,
int use_thermistors) int use_thermistors)
{ {
@ -1156,7 +1167,7 @@ static void pc87360_init_device(struct platform_device *pdev,
/* Forcibly enable voltage channel */ /* Forcibly enable voltage channel */
reg = pc87360_read_value(data, LD_IN, i, reg = pc87360_read_value(data, LD_IN, i,
PC87365_REG_IN_STATUS); PC87365_REG_IN_STATUS);
if (!(reg & 0x01)) { if (!(reg & CHAN_ENA)) {
dev_dbg(&pdev->dev, "Forcibly " dev_dbg(&pdev->dev, "Forcibly "
"enabling in%d\n", i); "enabling in%d\n", i);
pc87360_write_value(data, LD_IN, i, pc87360_write_value(data, LD_IN, i,
@ -1171,7 +1182,7 @@ static void pc87360_init_device(struct platform_device *pdev,
for (i = 11; i < data->innr; i++) { for (i = 11; i < data->innr; i++) {
reg = pc87360_read_value(data, LD_IN, i, reg = pc87360_read_value(data, LD_IN, i,
PC87365_REG_TEMP_STATUS); PC87365_REG_TEMP_STATUS);
use_thermistors = use_thermistors || (reg & 0x01); use_thermistors = use_thermistors || (reg & CHAN_ENA);
} }
i = use_thermistors ? 2 : 0; i = use_thermistors ? 2 : 0;
@ -1180,7 +1191,7 @@ static void pc87360_init_device(struct platform_device *pdev,
/* Forcibly enable temperature channel */ /* Forcibly enable temperature channel */
reg = pc87360_read_value(data, LD_TEMP, i, reg = pc87360_read_value(data, LD_TEMP, i,
PC87365_REG_TEMP_STATUS); PC87365_REG_TEMP_STATUS);
if (!(reg & 0x01)) { if (!(reg & CHAN_ENA)) {
dev_dbg(&pdev->dev, "Forcibly " dev_dbg(&pdev->dev, "Forcibly "
"enabling temp%d\n", i+1); "enabling temp%d\n", i+1);
pc87360_write_value(data, LD_TEMP, i, pc87360_write_value(data, LD_TEMP, i,
@ -1197,7 +1208,7 @@ static void pc87360_init_device(struct platform_device *pdev,
diodes */ diodes */
reg = pc87360_read_value(data, LD_TEMP, reg = pc87360_read_value(data, LD_TEMP,
(i-11)/2, PC87365_REG_TEMP_STATUS); (i-11)/2, PC87365_REG_TEMP_STATUS);
if (reg & 0x01) { if (reg & CHAN_ENA) {
dev_dbg(&pdev->dev, "Skipping " dev_dbg(&pdev->dev, "Skipping "
"temp%d, pin already in use " "temp%d, pin already in use "
"by temp%d\n", i-7, (i-11)/2); "by temp%d\n", i-7, (i-11)/2);
@ -1207,7 +1218,7 @@ static void pc87360_init_device(struct platform_device *pdev,
/* Forcibly enable thermistor channel */ /* Forcibly enable thermistor channel */
reg = pc87360_read_value(data, LD_IN, i, reg = pc87360_read_value(data, LD_IN, i,
PC87365_REG_IN_STATUS); PC87365_REG_IN_STATUS);
if (!(reg & 0x01)) { if (!(reg & CHAN_ENA)) {
dev_dbg(&pdev->dev, "Forcibly " dev_dbg(&pdev->dev, "Forcibly "
"enabling temp%d\n", i-7); "enabling temp%d\n", i-7);
pc87360_write_value(data, LD_IN, i, pc87360_write_value(data, LD_IN, i,
@ -1221,7 +1232,7 @@ static void pc87360_init_device(struct platform_device *pdev,
if (data->innr) { if (data->innr) {
reg = pc87360_read_value(data, LD_IN, NO_BANK, reg = pc87360_read_value(data, LD_IN, NO_BANK,
PC87365_REG_IN_CONFIG); PC87365_REG_IN_CONFIG);
if (reg & 0x01) { if (reg & CHAN_ENA) {
dev_dbg(&pdev->dev, "Forcibly " dev_dbg(&pdev->dev, "Forcibly "
"enabling monitoring (VLM)\n"); "enabling monitoring (VLM)\n");
pc87360_write_value(data, LD_IN, NO_BANK, pc87360_write_value(data, LD_IN, NO_BANK,
@ -1233,7 +1244,7 @@ static void pc87360_init_device(struct platform_device *pdev,
if (data->tempnr) { if (data->tempnr) {
reg = pc87360_read_value(data, LD_TEMP, NO_BANK, reg = pc87360_read_value(data, LD_TEMP, NO_BANK,
PC87365_REG_TEMP_CONFIG); PC87365_REG_TEMP_CONFIG);
if (reg & 0x01) { if (reg & CHAN_ENA) {
dev_dbg(&pdev->dev, "Forcibly enabling " dev_dbg(&pdev->dev, "Forcibly enabling "
"monitoring (TMS)\n"); "monitoring (TMS)\n");
pc87360_write_value(data, LD_TEMP, NO_BANK, pc87360_write_value(data, LD_TEMP, NO_BANK,
@ -1336,11 +1347,11 @@ static struct pc87360_data *pc87360_update_device(struct device *dev)
pc87360_write_value(data, LD_IN, i, pc87360_write_value(data, LD_IN, i,
PC87365_REG_IN_STATUS, PC87365_REG_IN_STATUS,
data->in_status[i]); data->in_status[i]);
if ((data->in_status[i] & 0x81) == 0x81) { if ((data->in_status[i] & CHAN_READY) == CHAN_READY) {
data->in[i] = pc87360_read_value(data, LD_IN, data->in[i] = pc87360_read_value(data, LD_IN,
i, PC87365_REG_IN); i, PC87365_REG_IN);
} }
if (data->in_status[i] & 0x01) { if (data->in_status[i] & CHAN_ENA) {
data->in_min[i] = pc87360_read_value(data, data->in_min[i] = pc87360_read_value(data,
LD_IN, i, LD_IN, i,
PC87365_REG_IN_MIN); PC87365_REG_IN_MIN);
@ -1373,12 +1384,12 @@ static struct pc87360_data *pc87360_update_device(struct device *dev)
pc87360_write_value(data, LD_TEMP, i, pc87360_write_value(data, LD_TEMP, i,
PC87365_REG_TEMP_STATUS, PC87365_REG_TEMP_STATUS,
data->temp_status[i]); data->temp_status[i]);
if ((data->temp_status[i] & 0x81) == 0x81) { if ((data->temp_status[i] & CHAN_READY) == CHAN_READY) {
data->temp[i] = pc87360_read_value(data, data->temp[i] = pc87360_read_value(data,
LD_TEMP, i, LD_TEMP, i,
PC87365_REG_TEMP); PC87365_REG_TEMP);
} }
if (data->temp_status[i] & 0x01) { if (data->temp_status[i] & CHAN_ENA) {
data->temp_min[i] = pc87360_read_value(data, data->temp_min[i] = pc87360_read_value(data,
LD_TEMP, i, LD_TEMP, i,
PC87365_REG_TEMP_MIN); PC87365_REG_TEMP_MIN);