-
Notifications
You must be signed in to change notification settings - Fork 53.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hwmon: (w83791d) new sysfs beep/alarm methodology
Add new sysfs alarm methodology to w83791d driver Signed-off-by: Charles Spirakis <[email protected]> Acked-by: Jean Delvare <[email protected]> Signed-off-by: Mark M. Hoffman <[email protected]>
- Loading branch information
Showing
3 changed files
with
176 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4106,7 +4106,7 @@ W83791D HARDWARE MONITORING DRIVER | |
P: Charles Spirakis | ||
M: [email protected] | ||
L: [email protected] | ||
S: Maintained | ||
S: Odd Fixes | ||
|
||
W83793 HARDWARE MONITORING DRIVER | ||
P: Rudolf Marek | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
w83791d.c - Part of lm_sensors, Linux kernel modules for hardware | ||
monitoring | ||
Copyright (C) 2006 Charles Spirakis <[email protected]> | ||
Copyright (C) 2006-2007 Charles Spirakis <[email protected]> | ||
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 | ||
|
@@ -384,6 +384,85 @@ static struct sensor_device_attribute sda_in_max[] = { | |
SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9), | ||
}; | ||
|
||
|
||
static ssize_t show_beep(struct device *dev, struct device_attribute *attr, | ||
char *buf) | ||
{ | ||
struct sensor_device_attribute *sensor_attr = | ||
to_sensor_dev_attr(attr); | ||
struct w83791d_data *data = w83791d_update_device(dev); | ||
int bitnr = sensor_attr->index; | ||
|
||
return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1); | ||
} | ||
|
||
static ssize_t store_beep(struct device *dev, struct device_attribute *attr, | ||
const char *buf, size_t count) | ||
{ | ||
struct sensor_device_attribute *sensor_attr = | ||
to_sensor_dev_attr(attr); | ||
struct i2c_client *client = to_i2c_client(dev); | ||
struct w83791d_data *data = i2c_get_clientdata(client); | ||
int bitnr = sensor_attr->index; | ||
int bytenr = bitnr / 8; | ||
long val = simple_strtol(buf, NULL, 10) ? 1 : 0; | ||
|
||
mutex_lock(&data->update_lock); | ||
|
||
data->beep_mask &= ~(0xff << (bytenr * 8)); | ||
data->beep_mask |= w83791d_read(client, W83791D_REG_BEEP_CTRL[bytenr]) | ||
<< (bytenr * 8); | ||
|
||
data->beep_mask &= ~(1 << bitnr); | ||
data->beep_mask |= val << bitnr; | ||
|
||
w83791d_write(client, W83791D_REG_BEEP_CTRL[bytenr], | ||
(data->beep_mask >> (bytenr * 8)) & 0xff); | ||
|
||
mutex_unlock(&data->update_lock); | ||
|
||
return count; | ||
} | ||
|
||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, | ||
char *buf) | ||
{ | ||
struct sensor_device_attribute *sensor_attr = | ||
to_sensor_dev_attr(attr); | ||
struct w83791d_data *data = w83791d_update_device(dev); | ||
int bitnr = sensor_attr->index; | ||
|
||
return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1); | ||
} | ||
|
||
/* Note: The bitmask for the beep enable/disable is different than | ||
the bitmask for the alarm. */ | ||
static struct sensor_device_attribute sda_in_beep[] = { | ||
SENSOR_ATTR(in0_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 0), | ||
SENSOR_ATTR(in1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 13), | ||
SENSOR_ATTR(in2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 2), | ||
SENSOR_ATTR(in3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 3), | ||
SENSOR_ATTR(in4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 8), | ||
SENSOR_ATTR(in5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 9), | ||
SENSOR_ATTR(in6_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 10), | ||
SENSOR_ATTR(in7_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 16), | ||
SENSOR_ATTR(in8_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 17), | ||
SENSOR_ATTR(in9_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 14), | ||
}; | ||
|
||
static struct sensor_device_attribute sda_in_alarm[] = { | ||
SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0), | ||
SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1), | ||
SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2), | ||
SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3), | ||
SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8), | ||
SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9), | ||
SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10), | ||
SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19), | ||
SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20), | ||
SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 14), | ||
}; | ||
|
||
#define show_fan_reg(reg) \ | ||
static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \ | ||
char *buf) \ | ||
|
@@ -536,6 +615,22 @@ static struct sensor_device_attribute sda_fan_div[] = { | |
show_fan_div, store_fan_div, 4), | ||
}; | ||
|
||
static struct sensor_device_attribute sda_fan_beep[] = { | ||
SENSOR_ATTR(fan1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 6), | ||
SENSOR_ATTR(fan2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 7), | ||
SENSOR_ATTR(fan3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 11), | ||
SENSOR_ATTR(fan4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 21), | ||
SENSOR_ATTR(fan5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 22), | ||
}; | ||
|
||
static struct sensor_device_attribute sda_fan_alarm[] = { | ||
SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6), | ||
SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7), | ||
SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11), | ||
SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21), | ||
SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22), | ||
}; | ||
|
||
/* read/write the temperature1, includes measured value and limits */ | ||
static ssize_t show_temp1(struct device *dev, struct device_attribute *devattr, | ||
char *buf) | ||
|
@@ -618,6 +713,19 @@ static struct sensor_device_attribute_2 sda_temp_max_hyst[] = { | |
show_temp23, store_temp23, 1, 2), | ||
}; | ||
|
||
/* Note: The bitmask for the beep enable/disable is different than | ||
the bitmask for the alarm. */ | ||
static struct sensor_device_attribute sda_temp_beep[] = { | ||
SENSOR_ATTR(temp1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 4), | ||
SENSOR_ATTR(temp2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 5), | ||
SENSOR_ATTR(temp3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 1), | ||
}; | ||
|
||
static struct sensor_device_attribute sda_temp_alarm[] = { | ||
SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4), | ||
SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5), | ||
SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13), | ||
}; | ||
|
||
/* get reatime status of all sensors items: voltage, temp, fan */ | ||
static ssize_t show_alarms_reg(struct device *dev, | ||
|
@@ -749,17 +857,23 @@ static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg); | |
#define IN_UNIT_ATTRS(X) \ | ||
&sda_in_input[X].dev_attr.attr, \ | ||
&sda_in_min[X].dev_attr.attr, \ | ||
&sda_in_max[X].dev_attr.attr | ||
&sda_in_max[X].dev_attr.attr, \ | ||
&sda_in_beep[X].dev_attr.attr, \ | ||
&sda_in_alarm[X].dev_attr.attr | ||
|
||
#define FAN_UNIT_ATTRS(X) \ | ||
&sda_fan_input[X].dev_attr.attr, \ | ||
&sda_fan_min[X].dev_attr.attr, \ | ||
&sda_fan_div[X].dev_attr.attr | ||
&sda_fan_div[X].dev_attr.attr, \ | ||
&sda_fan_beep[X].dev_attr.attr, \ | ||
&sda_fan_alarm[X].dev_attr.attr | ||
|
||
#define TEMP_UNIT_ATTRS(X) \ | ||
&sda_temp_input[X].dev_attr.attr, \ | ||
&sda_temp_max[X].dev_attr.attr, \ | ||
&sda_temp_max_hyst[X].dev_attr.attr | ||
&sda_temp_max_hyst[X].dev_attr.attr, \ | ||
&sda_temp_beep[X].dev_attr.attr, \ | ||
&sda_temp_alarm[X].dev_attr.attr | ||
|
||
static struct attribute *w83791d_attributes[] = { | ||
IN_UNIT_ATTRS(0), | ||
|