hwmon updates for v4.11
- new driver for stts751 - it87: Added support for IT8622E and IT8792E; improved support for other chips - lm70: Added support for TMP122/124 - use permission-specific DEVICE_ATTR variants where possible - fixed overflows in various drivers - minor improvements in various drivers -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJYqmJwAAoJEMsfJm/On5mBeGoP/0eUxc3crX3vcJrbPwLnvnZ0 n90QIoe0Dk/699lHUu8K098Ihsj3mxOXqDgx7YTPHi3MdekoL0KkYZn/yyvE+wX/ dcB+gz02/WLUBoUoA6rhbztqLFC59Iv4TwxGFMSU//ySGRzmy/0AZ/sG5h8C+Fli 05+b4BdOZGSqff3EBHKJSzLrzYmbMq4+f0JlpUCNIve8gfgomenwfbrghEJw6VAj xp9EKM5KBLLj4e76Muk42FEvD7TxdbLeXoj/g+Tz6w8seWmQAyRinu6Udn7FqPOQ an/2QrtQfGgWEuZ/QbsZN9mneou4EJq4SvvUUtHLgDj6zF5mnHla/nSc62l//uac QVeTKCxh5/A7y+QzeQFZ/zI/5/oVQICrx5K+VCPnkH33c2DcsElBtsQaA+Jk8RNy S9C3UN+bAfR/SWpOiKjSu/VE3OgHzQm+TZKXyfMOGSmX+hJZcuROTNuvAso6fvVQ mmKtfbA+POG9DNvrHpu2ohzc42HXfAExrnclF3AxuIMHb6Qt5cwpQMgGt4Yk/CFa aOWX2oQPnSbx2qzhlAZdo34fflGYMf4DvsMBYc6e/6vY0WHLnL3IyfWOlw3Yrdpu /rjgheQb5vjoRvPadBJphFSRF4xzZCIkP+ue9o0EEqPhsJjnWmwuHhr97CaO4ror dJDtXi+i67uuti/NsqYP =QLmt -----END PGP SIGNATURE----- Merge tag 'hwmon-for-linus-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging Pull hwmon updates from Guenter Roeck: - new driver for stts751 - it87: Added support for IT8622E and IT8792E; improved support for other chips - lm70: Added support for TMP122/124 - use permission-specific DEVICE_ATTR variants where possible - fixed overflows in various drivers - minor improvements in various drivers * tag 'hwmon-for-linus-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: (95 commits) hwmon: (sht15) Add device tree support devicetree: add lm90 thermal_zone sensor support hwmon: (it87) Add support for IT8792E hwmon: (it87) Do not overwrite bit 2..6 of pwm control registers hwmon: (it87) Fix pwm4 detection for IT8620 and IT8628 hwmon: (it87) Ensure that pwm control cache is current before updating values hwmon: (it87) Improve IT8622 support hwmon: (it87) Add support for IT8622E hwmon: (it87) Add feature flag indicating that VIN3 is connected to 5V DT: add binding documentation for STTS751 hwmon: new driver for ST stts751 thermal sensor hwmon: Register thermal zone only if 'dev' parameter was provided hwmon: Relax name attribute validation for new APIs hwmon: Update documentation to clarify rules for the 'name' attribute hwmon: Make name attribute mandatory for new APIs hwmon: (lm70) Add support for TI TMP122/124 hwmon: (lm70) Utilize dev_warn instead of pr_warn hwmon: (ltc4151) Export OF device ID table as module aliases hwmon: (adc128d818) Preserve operation mode hwmon: (adc128d818) Support operation modes 1-3 ...
This commit is contained in:
commit
507b500726
38
Documentation/devicetree/bindings/hwmon/adc128d818.txt
Normal file
38
Documentation/devicetree/bindings/hwmon/adc128d818.txt
Normal file
@ -0,0 +1,38 @@
|
||||
TI ADC128D818 ADC System Monitor With Temperature Sensor
|
||||
--------------------------------------------------------
|
||||
|
||||
Operation modes:
|
||||
|
||||
- Mode 0: 7 single-ended voltage readings (IN0-IN6),
|
||||
1 temperature reading (internal)
|
||||
- Mode 1: 8 single-ended voltage readings (IN0-IN7),
|
||||
no temperature
|
||||
- Mode 2: 4 pseudo-differential voltage readings
|
||||
(IN0-IN1, IN3-IN2, IN4-IN5, IN7-IN6),
|
||||
1 temperature reading (internal)
|
||||
- Mode 3: 4 single-ended voltage readings (IN0-IN3),
|
||||
2 pseudo-differential voltage readings
|
||||
(IN4-IN5, IN7-IN6),
|
||||
1 temperature reading (internal)
|
||||
|
||||
If no operation mode is configured via device tree, the driver keeps the
|
||||
currently active chip operation mode (default is mode 0).
|
||||
|
||||
|
||||
Required node properties:
|
||||
|
||||
- compatible: must be set to "ti,adc128d818"
|
||||
- reg: I2C address of the device
|
||||
|
||||
Optional node properties:
|
||||
|
||||
- ti,mode: Operation mode (see above).
|
||||
|
||||
|
||||
Example (operation mode 2):
|
||||
|
||||
adc128d818@1d {
|
||||
compatible = "ti,adc128d818";
|
||||
reg = <0x1d>;
|
||||
ti,mode = <2>;
|
||||
};
|
@ -4,6 +4,7 @@ Required properties:
|
||||
- compatible: one of
|
||||
"ti,lm70"
|
||||
"ti,tmp121"
|
||||
"ti,tmp122"
|
||||
"ti,lm71"
|
||||
"ti,lm74"
|
||||
|
||||
|
@ -33,6 +33,11 @@ Optional properties:
|
||||
LM90 "-ALERT" pin output.
|
||||
See interrupt-controller/interrupts.txt for the format.
|
||||
|
||||
- #thermal-sensor-cells: should be set to 1. See thermal/thermal.txt for
|
||||
details. See <include/dt-bindings/thermal/lm90.h> for the
|
||||
definition of the local, remote and 2nd remote sensor index
|
||||
constants.
|
||||
|
||||
Example LM90 node:
|
||||
|
||||
temp-sensor {
|
||||
@ -41,4 +46,5 @@ temp-sensor {
|
||||
vcc-supply = <&palmas_ldo6_reg>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <TEGRA_GPIO(O, 4) IRQ_TYPE_LEVEL_LOW>;
|
||||
#thermal-sensor-cells = <1>;
|
||||
}
|
||||
|
19
Documentation/devicetree/bindings/hwmon/sht15.txt
Normal file
19
Documentation/devicetree/bindings/hwmon/sht15.txt
Normal file
@ -0,0 +1,19 @@
|
||||
Sensirion SHT15 Humidity and Temperature Sensor
|
||||
|
||||
Required properties:
|
||||
|
||||
- "compatible": must be "sensirion,sht15".
|
||||
- "data-gpios": GPIO connected to the data line.
|
||||
- "clk-gpios": GPIO connected to the clock line.
|
||||
- "vcc-supply": regulator that drives the VCC pin.
|
||||
|
||||
Example:
|
||||
|
||||
sensor {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sensor>;
|
||||
compatible = "sensirion,sht15";
|
||||
clk-gpios = <&gpio4 12 0>;
|
||||
data-gpios = <&gpio4 13 0>;
|
||||
vcc-supply = <®_sht15>;
|
||||
};
|
15
Documentation/devicetree/bindings/hwmon/stts751.txt
Normal file
15
Documentation/devicetree/bindings/hwmon/stts751.txt
Normal file
@ -0,0 +1,15 @@
|
||||
* STTS751 thermometer.
|
||||
|
||||
Required node properties:
|
||||
- compatible: "stts751"
|
||||
- reg: I2C bus address of the device
|
||||
|
||||
Optional properties:
|
||||
- smbus-timeout-disable: when set, the smbus timeout function will be disabled
|
||||
|
||||
Example stts751 node:
|
||||
|
||||
temp-sensor {
|
||||
compatible = "stts751";
|
||||
reg = <0x48>;
|
||||
}
|
@ -89,6 +89,10 @@ the call to devm_hwmon_device_register_with_groups or
|
||||
hwmon_device_register_with_info and if the automatic (device managed)
|
||||
removal would be too late.
|
||||
|
||||
All supported hwmon device registration functions only accept valid device
|
||||
names. Device names including invalid characters (whitespace, '*', or '-')
|
||||
will be rejected. The 'name' parameter is mandatory.
|
||||
|
||||
Using devm_hwmon_device_register_with_info()
|
||||
--------------------------------------------
|
||||
|
||||
|
@ -6,6 +6,8 @@ Supported chips:
|
||||
Datasheet: http://www.national.com/pf/LM/LM70.html
|
||||
* Texas Instruments TMP121/TMP123
|
||||
Information: http://focus.ti.com/docs/prod/folders/print/tmp121.html
|
||||
* Texas Instruments TMP122/TMP124
|
||||
Information: http://www.ti.com/product/tmp122
|
||||
* National Semiconductor LM71
|
||||
Datasheet: http://www.ti.com/product/LM71
|
||||
* National Semiconductor LM74
|
||||
@ -35,8 +37,10 @@ As a real (in-tree) example of this "SPI protocol driver" interfacing
|
||||
with a "SPI master controller driver", see drivers/spi/spi_lm70llp.c
|
||||
and its associated documentation.
|
||||
|
||||
The LM74 and TMP121/TMP123 are very similar; main difference is 13-bit
|
||||
temperature data (0.0625 degrees celsius resolution).
|
||||
The LM74 and TMP121/TMP122/TMP123/TMP124 are very similar; main difference is
|
||||
13-bit temperature data (0.0625 degrees celsius resolution).
|
||||
|
||||
The TMP122/TMP124 also feature configurable temperature thresholds.
|
||||
|
||||
The LM71 is also very similar; main difference is 14-bit temperature
|
||||
data (0.03125 degrees celsius resolution).
|
||||
|
@ -35,6 +35,7 @@ sysfs-Interface
|
||||
|
||||
temp1_input - temperature input
|
||||
humidity1_input - humidity input
|
||||
eic - Electronic Identification Code
|
||||
|
||||
Notes
|
||||
-----
|
||||
@ -45,5 +46,5 @@ humidity and 66 ms for temperature. To keep self heating below 0.1 degree
|
||||
Celsius, the device should not be active for more than 10% of the time,
|
||||
e.g. maximum two measurements per second at the given resolution.
|
||||
|
||||
Different resolutions, the on-chip heater, using the CRC checksum and reading
|
||||
the serial number are not supported yet.
|
||||
Different resolutions, the on-chip heater, and using the CRC checksum
|
||||
are not supported yet.
|
||||
|
@ -86,8 +86,9 @@ given driver if the chip has the feature.
|
||||
|
||||
name The chip name.
|
||||
This should be a short, lowercase string, not containing
|
||||
spaces nor dashes, representing the chip name. This is
|
||||
the only mandatory attribute.
|
||||
whitespace, dashes, or the wildcard character '*'.
|
||||
This attribute represents the chip name. It is the only
|
||||
mandatory attribute.
|
||||
I2C devices get this attribute created automatically.
|
||||
RO
|
||||
|
||||
|
@ -7534,6 +7534,7 @@ S: Maintained
|
||||
F: Documentation/hwmon/lm90
|
||||
F: Documentation/devicetree/bindings/hwmon/lm90.txt
|
||||
F: drivers/hwmon/lm90.c
|
||||
F: include/dt-bindings/thermal/lm90.h
|
||||
|
||||
LM95234 HARDWARE MONITOR DRIVER
|
||||
M: Guenter Roeck <linux@roeck-us.net>
|
||||
|
@ -1459,6 +1459,16 @@ config SENSORS_SCH5636
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called sch5636.
|
||||
|
||||
config SENSORS_STTS751
|
||||
tristate "ST Microelectronics STTS751"
|
||||
depends on I2C
|
||||
help
|
||||
If you say yes here you get support for STTS751
|
||||
temperature sensor chips.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called stts751.
|
||||
|
||||
config SENSORS_SMM665
|
||||
tristate "Summit Microelectronics SMM665"
|
||||
depends on I2C
|
||||
|
@ -148,6 +148,7 @@ obj-$(CONFIG_SENSORS_SMM665) += smm665.o
|
||||
obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o
|
||||
obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o
|
||||
obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o
|
||||
obj-$(CONFIG_SENSORS_STTS751) += stts751.o
|
||||
obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o
|
||||
obj-$(CONFIG_SENSORS_TC74) += tc74.o
|
||||
obj-$(CONFIG_SENSORS_THMC50) += thmc50.o
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
/* Addresses to scan
|
||||
* The chip also supports addresses 0x35..0x37. Don't scan those addresses
|
||||
@ -58,15 +59,22 @@ static const unsigned short normal_i2c[] = {
|
||||
#define ADC128_REG_MAN_ID 0x3e
|
||||
#define ADC128_REG_DEV_ID 0x3f
|
||||
|
||||
/* No. of voltage entries in adc128_attrs */
|
||||
#define ADC128_ATTR_NUM_VOLT (8 * 4)
|
||||
|
||||
/* Voltage inputs visible per operation mode */
|
||||
static const u8 num_inputs[] = { 7, 8, 4, 6 };
|
||||
|
||||
struct adc128_data {
|
||||
struct i2c_client *client;
|
||||
struct regulator *regulator;
|
||||
int vref; /* Reference voltage in mV */
|
||||
struct mutex update_lock;
|
||||
u8 mode; /* Operation mode */
|
||||
bool valid; /* true if following fields are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
|
||||
u16 in[3][7]; /* Register value, normalized to 12 bit
|
||||
u16 in[3][8]; /* Register value, normalized to 12 bit
|
||||
* 0: input voltage
|
||||
* 1: min limit
|
||||
* 2: max limit
|
||||
@ -87,7 +95,7 @@ static struct adc128_data *adc128_update_device(struct device *dev)
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
|
||||
for (i = 0; i < 7; i++) {
|
||||
for (i = 0; i < num_inputs[data->mode]; i++) {
|
||||
rv = i2c_smbus_read_word_swapped(client,
|
||||
ADC128_REG_IN(i));
|
||||
if (rv < 0)
|
||||
@ -107,20 +115,25 @@ static struct adc128_data *adc128_update_device(struct device *dev)
|
||||
data->in[2][i] = rv << 4;
|
||||
}
|
||||
|
||||
rv = i2c_smbus_read_word_swapped(client, ADC128_REG_TEMP);
|
||||
if (rv < 0)
|
||||
goto abort;
|
||||
data->temp[0] = rv >> 7;
|
||||
if (data->mode != 1) {
|
||||
rv = i2c_smbus_read_word_swapped(client,
|
||||
ADC128_REG_TEMP);
|
||||
if (rv < 0)
|
||||
goto abort;
|
||||
data->temp[0] = rv >> 7;
|
||||
|
||||
rv = i2c_smbus_read_byte_data(client, ADC128_REG_TEMP_MAX);
|
||||
if (rv < 0)
|
||||
goto abort;
|
||||
data->temp[1] = rv << 1;
|
||||
rv = i2c_smbus_read_byte_data(client,
|
||||
ADC128_REG_TEMP_MAX);
|
||||
if (rv < 0)
|
||||
goto abort;
|
||||
data->temp[1] = rv << 1;
|
||||
|
||||
rv = i2c_smbus_read_byte_data(client, ADC128_REG_TEMP_HYST);
|
||||
if (rv < 0)
|
||||
goto abort;
|
||||
data->temp[2] = rv << 1;
|
||||
rv = i2c_smbus_read_byte_data(client,
|
||||
ADC128_REG_TEMP_HYST);
|
||||
if (rv < 0)
|
||||
goto abort;
|
||||
data->temp[2] = rv << 1;
|
||||
}
|
||||
|
||||
rv = i2c_smbus_read_byte_data(client, ADC128_REG_ALARM);
|
||||
if (rv < 0)
|
||||
@ -240,6 +253,25 @@ static ssize_t adc128_show_alarm(struct device *dev,
|
||||
return sprintf(buf, "%u\n", !!(alarms & mask));
|
||||
}
|
||||
|
||||
static umode_t adc128_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int index)
|
||||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
struct adc128_data *data = dev_get_drvdata(dev);
|
||||
|
||||
if (index < ADC128_ATTR_NUM_VOLT) {
|
||||
/* Voltage, visible according to num_inputs[] */
|
||||
if (index >= num_inputs[data->mode] * 4)
|
||||
return 0;
|
||||
} else {
|
||||
/* Temperature, visible if not in mode 1 */
|
||||
if (data->mode == 1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO,
|
||||
adc128_show_in, NULL, 0, 0);
|
||||
static SENSOR_DEVICE_ATTR_2(in0_min, S_IWUSR | S_IRUGO,
|
||||
@ -289,6 +321,13 @@ static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO,
|
||||
static SENSOR_DEVICE_ATTR_2(in6_max, S_IWUSR | S_IRUGO,
|
||||
adc128_show_in, adc128_set_in, 6, 2);
|
||||
|
||||
static SENSOR_DEVICE_ATTR_2(in7_input, S_IRUGO,
|
||||
adc128_show_in, NULL, 7, 0);
|
||||
static SENSOR_DEVICE_ATTR_2(in7_min, S_IWUSR | S_IRUGO,
|
||||
adc128_show_in, adc128_set_in, 7, 1);
|
||||
static SENSOR_DEVICE_ATTR_2(in7_max, S_IWUSR | S_IRUGO,
|
||||
adc128_show_in, adc128_set_in, 7, 2);
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, adc128_show_temp, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
|
||||
adc128_show_temp, adc128_set_temp, 1);
|
||||
@ -302,44 +341,54 @@ static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, adc128_show_alarm, NULL, 3);
|
||||
static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, adc128_show_alarm, NULL, 4);
|
||||
static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, adc128_show_alarm, NULL, 5);
|
||||
static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, adc128_show_alarm, NULL, 6);
|
||||
static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, adc128_show_alarm, NULL, 7);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, adc128_show_alarm, NULL, 7);
|
||||
|
||||
static struct attribute *adc128_attrs[] = {
|
||||
&sensor_dev_attr_in0_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in0_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in0_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in0_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in0_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in0_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in7_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in7_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in7_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in7_min.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_in0_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in3_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in4_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in5_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in6_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
ATTRIBUTE_GROUPS(adc128);
|
||||
|
||||
static struct attribute_group adc128_group = {
|
||||
.attrs = adc128_attrs,
|
||||
.is_visible = adc128_is_visible,
|
||||
};
|
||||
__ATTRIBUTE_GROUPS(adc128);
|
||||
|
||||
static int adc128_detect(struct i2c_client *client, struct i2c_board_info *info)
|
||||
{
|
||||
@ -387,6 +436,15 @@ static int adc128_init_client(struct adc128_data *data)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Set operation mode, if non-default */
|
||||
if (data->mode != 0) {
|
||||
err = i2c_smbus_write_byte_data(client,
|
||||
ADC128_REG_CONFIG_ADV,
|
||||
data->mode << 1);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Start monitoring */
|
||||
err = i2c_smbus_write_byte_data(client, ADC128_REG_CONFIG, 0x01);
|
||||
if (err)
|
||||
@ -433,6 +491,21 @@ static int adc128_probe(struct i2c_client *client,
|
||||
data->vref = 2560; /* 2.56V, in mV */
|
||||
}
|
||||
|
||||
/* Operation mode is optional. If unspecified, keep current mode */
|
||||
if (of_property_read_u8(dev->of_node, "ti,mode", &data->mode) == 0) {
|
||||
if (data->mode > 3) {
|
||||
dev_err(dev, "invalid operation mode %d\n",
|
||||
data->mode);
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
err = i2c_smbus_read_byte_data(client, ADC128_REG_CONFIG_ADV);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
data->mode = (err >> 1) & ADC128_REG_MASK;
|
||||
}
|
||||
|
||||
data->client = client;
|
||||
i2c_set_clientdata(client, data);
|
||||
mutex_init(&data->update_lock);
|
||||
|
@ -191,7 +191,7 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%u\n", (data->alarms >> index) & 1);
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev,
|
||||
static ssize_t alarms_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
@ -251,16 +251,16 @@ static ssize_t set_temp_min(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_low_power(struct device *dev,
|
||||
static ssize_t low_power_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct adm1021_data *data = adm1021_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->low_power);
|
||||
}
|
||||
|
||||
static ssize_t set_low_power(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t low_power_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1021_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -303,8 +303,8 @@ static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4);
|
||||
static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3);
|
||||
static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2);
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR(low_power, S_IWUSR | S_IRUGO, show_low_power, set_low_power);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static DEVICE_ATTR_RW(low_power);
|
||||
|
||||
static struct attribute *adm1021_attributes[] = {
|
||||
&sensor_dev_attr_temp1_max.dev_attr.attr,
|
||||
|
@ -333,12 +333,12 @@ set_temp(1);
|
||||
set_temp(2);
|
||||
|
||||
static ssize_t
|
||||
show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
alarms_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1025_data *data = adm1025_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t
|
||||
show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@ -358,21 +358,21 @@ static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 4);
|
||||
static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_alarm, NULL, 14);
|
||||
|
||||
static ssize_t
|
||||
show_vid(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1025_data *data = adm1025_update_device(dev);
|
||||
return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t
|
||||
show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
vrm_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1025_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%u\n", data->vrm);
|
||||
}
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1025_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -388,7 +388,7 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
data->vrm = val;
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
/*
|
||||
* Real code
|
||||
|
@ -1034,15 +1034,15 @@ temp_crit_reg(1);
|
||||
temp_crit_reg(2);
|
||||
temp_crit_reg(3);
|
||||
|
||||
static ssize_t show_analog_out_reg(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t analog_out_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%d\n", DAC_FROM_REG(data->analog_out));
|
||||
}
|
||||
static ssize_t set_analog_out_reg(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t analog_out_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1060,11 +1060,10 @@ static ssize_t set_analog_out_reg(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(analog_out, S_IRUGO | S_IWUSR, show_analog_out_reg,
|
||||
set_analog_out_reg);
|
||||
static DEVICE_ATTR_RW(analog_out);
|
||||
|
||||
static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
int vid = (data->gpio >> 11) & 0x1f;
|
||||
@ -1073,17 +1072,17 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%d\n", vid_from_reg(vid, data->vrm));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -1100,16 +1099,16 @@ static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t show_alarms_reg(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", data->alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -1148,14 +1147,15 @@ static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 24);
|
||||
static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 25);
|
||||
static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 26);
|
||||
|
||||
static ssize_t show_alarm_mask(struct device *dev,
|
||||
static ssize_t alarm_mask_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", data->alarm_mask);
|
||||
}
|
||||
static ssize_t set_alarm_mask(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t alarm_mask_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1186,18 +1186,17 @@ static ssize_t set_alarm_mask(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarm_mask, S_IRUGO | S_IWUSR, show_alarm_mask,
|
||||
set_alarm_mask);
|
||||
static DEVICE_ATTR_RW(alarm_mask);
|
||||
|
||||
|
||||
static ssize_t show_gpio(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t gpio_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", data->gpio);
|
||||
}
|
||||
static ssize_t set_gpio(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t gpio_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1221,16 +1220,18 @@ static ssize_t set_gpio(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(gpio, S_IRUGO | S_IWUSR, show_gpio, set_gpio);
|
||||
static DEVICE_ATTR_RW(gpio);
|
||||
|
||||
static ssize_t show_gpio_mask(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t gpio_mask_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", data->gpio_mask);
|
||||
}
|
||||
static ssize_t set_gpio_mask(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t gpio_mask_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1254,17 +1255,17 @@ static ssize_t set_gpio_mask(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(gpio_mask, S_IRUGO | S_IWUSR, show_gpio_mask, set_gpio_mask);
|
||||
static DEVICE_ATTR_RW(gpio_mask);
|
||||
|
||||
static ssize_t show_pwm_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t pwm1_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm1.pwm));
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_reg(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1285,16 +1286,17 @@ static ssize_t set_pwm_reg(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_auto_pwm_min(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_auto_point1_pwm_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->pwm1.auto_pwm_min);
|
||||
}
|
||||
|
||||
static ssize_t set_auto_pwm_min(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t temp1_auto_point1_pwm_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1316,21 +1318,23 @@ static ssize_t set_auto_pwm_min(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_auto_pwm_max(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_auto_point2_pwm_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", ADM1026_PWM_MAX);
|
||||
}
|
||||
|
||||
static ssize_t show_pwm_enable(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t pwm1_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->pwm1.enable);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1026_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1366,25 +1370,25 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
/* enable PWM fan control */
|
||||
static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm_reg, set_pwm_reg);
|
||||
static DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm_reg, set_pwm_reg);
|
||||
static DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm_reg, set_pwm_reg);
|
||||
static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, show_pwm_enable,
|
||||
set_pwm_enable);
|
||||
static DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, show_pwm_enable,
|
||||
set_pwm_enable);
|
||||
static DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, show_pwm_enable,
|
||||
set_pwm_enable);
|
||||
static DEVICE_ATTR(temp1_auto_point1_pwm, S_IRUGO | S_IWUSR,
|
||||
show_auto_pwm_min, set_auto_pwm_min);
|
||||
static DEVICE_ATTR_RW(pwm1);
|
||||
static DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, pwm1_show, pwm1_store);
|
||||
static DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, pwm1_show, pwm1_store);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
static DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, pwm1_enable_show,
|
||||
pwm1_enable_store);
|
||||
static DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, pwm1_enable_show,
|
||||
pwm1_enable_store);
|
||||
static DEVICE_ATTR_RW(temp1_auto_point1_pwm);
|
||||
static DEVICE_ATTR(temp2_auto_point1_pwm, S_IRUGO | S_IWUSR,
|
||||
show_auto_pwm_min, set_auto_pwm_min);
|
||||
temp1_auto_point1_pwm_show, temp1_auto_point1_pwm_store);
|
||||
static DEVICE_ATTR(temp3_auto_point1_pwm, S_IRUGO | S_IWUSR,
|
||||
show_auto_pwm_min, set_auto_pwm_min);
|
||||
temp1_auto_point1_pwm_show, temp1_auto_point1_pwm_store);
|
||||
|
||||
static DEVICE_ATTR(temp1_auto_point2_pwm, S_IRUGO, show_auto_pwm_max, NULL);
|
||||
static DEVICE_ATTR(temp2_auto_point2_pwm, S_IRUGO, show_auto_pwm_max, NULL);
|
||||
static DEVICE_ATTR(temp3_auto_point2_pwm, S_IRUGO, show_auto_pwm_max, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_auto_point2_pwm);
|
||||
static DEVICE_ATTR(temp2_auto_point2_pwm, S_IRUGO, temp1_auto_point2_pwm_show,
|
||||
NULL);
|
||||
static DEVICE_ATTR(temp3_auto_point2_pwm, S_IRUGO, temp1_auto_point2_pwm_show,
|
||||
NULL);
|
||||
|
||||
static struct attribute *adm1026_attributes[] = {
|
||||
&sensor_dev_attr_in0_input.dev_attr.attr,
|
||||
|
@ -829,14 +829,14 @@ temp_reg(2);
|
||||
temp_reg(3);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct adm1031_data *data = adm1031_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->alarm);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
@ -867,7 +867,7 @@ static const unsigned int update_intervals[] = {
|
||||
16000, 8000, 4000, 2000, 1000, 500, 250, 125,
|
||||
};
|
||||
|
||||
static ssize_t show_update_interval(struct device *dev,
|
||||
static ssize_t update_interval_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm1031_data *data = dev_get_drvdata(dev);
|
||||
@ -875,9 +875,9 @@ static ssize_t show_update_interval(struct device *dev,
|
||||
return sprintf(buf, "%u\n", data->update_interval);
|
||||
}
|
||||
|
||||
static ssize_t set_update_interval(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t update_interval_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm1031_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -912,8 +912,7 @@ static ssize_t set_update_interval(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval,
|
||||
set_update_interval);
|
||||
static DEVICE_ATTR_RW(update_interval);
|
||||
|
||||
static struct attribute *adm1031_attributes[] = {
|
||||
&sensor_dev_attr_fan1_input.dev_attr.attr,
|
||||
|
@ -262,8 +262,8 @@ static struct adm9240_data *adm9240_update_device(struct device *dev)
|
||||
/*** sysfs accessors ***/
|
||||
|
||||
/* temperature */
|
||||
static ssize_t show_temp(struct device *dev, struct device_attribute *dummy,
|
||||
char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *dummy, char *buf)
|
||||
{
|
||||
struct adm9240_data *data = adm9240_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->temp / 128 * 500); /* 9-bit value */
|
||||
@ -298,7 +298,7 @@ static ssize_t set_max(struct device *dev, struct device_attribute *devattr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
|
||||
show_max, set_max, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
|
||||
@ -501,13 +501,13 @@ fan(1);
|
||||
fan(2);
|
||||
|
||||
/* alarms */
|
||||
static ssize_t show_alarms(struct device *dev,
|
||||
static ssize_t alarms_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm9240_data *data = adm9240_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
@ -527,25 +527,25 @@ static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
|
||||
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
|
||||
|
||||
/* vid */
|
||||
static ssize_t show_vid(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm9240_data *data = adm9240_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
/* analog output */
|
||||
static ssize_t show_aout(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t aout_output_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct adm9240_data *data = adm9240_update_device(dev);
|
||||
return sprintf(buf, "%d\n", AOUT_FROM_REG(data->aout));
|
||||
}
|
||||
|
||||
static ssize_t set_aout(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t aout_output_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adm9240_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -562,7 +562,7 @@ static ssize_t set_aout(struct device *dev,
|
||||
mutex_unlock(&data->update_lock);
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);
|
||||
static DEVICE_ATTR_RW(aout_output);
|
||||
|
||||
static ssize_t chassis_clear(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
|
@ -21,6 +21,21 @@
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define ADT7411_REG_STAT_1 0x00
|
||||
#define ADT7411_STAT_1_INT_TEMP_HIGH BIT(0)
|
||||
#define ADT7411_STAT_1_INT_TEMP_LOW BIT(1)
|
||||
#define ADT7411_STAT_1_EXT_TEMP_HIGH_AIN1 BIT(2)
|
||||
#define ADT7411_STAT_1_EXT_TEMP_LOW BIT(3)
|
||||
#define ADT7411_STAT_1_EXT_TEMP_FAULT BIT(4)
|
||||
#define ADT7411_STAT_1_AIN2 BIT(5)
|
||||
#define ADT7411_STAT_1_AIN3 BIT(6)
|
||||
#define ADT7411_STAT_1_AIN4 BIT(7)
|
||||
#define ADT7411_REG_STAT_2 0x01
|
||||
#define ADT7411_STAT_2_AIN5 BIT(0)
|
||||
#define ADT7411_STAT_2_AIN6 BIT(1)
|
||||
#define ADT7411_STAT_2_AIN7 BIT(2)
|
||||
#define ADT7411_STAT_2_AIN8 BIT(3)
|
||||
#define ADT7411_STAT_2_VDD BIT(4)
|
||||
#define ADT7411_REG_INT_TEMP_VDD_LSB 0x03
|
||||
#define ADT7411_REG_EXT_TEMP_AIN14_LSB 0x04
|
||||
#define ADT7411_REG_VDD_MSB 0x06
|
||||
@ -28,20 +43,31 @@
|
||||
#define ADT7411_REG_EXT_TEMP_AIN1_MSB 0x08
|
||||
|
||||
#define ADT7411_REG_CFG1 0x18
|
||||
#define ADT7411_CFG1_START_MONITOR (1 << 0)
|
||||
#define ADT7411_CFG1_RESERVED_BIT1 (1 << 1)
|
||||
#define ADT7411_CFG1_EXT_TDM (1 << 2)
|
||||
#define ADT7411_CFG1_RESERVED_BIT3 (1 << 3)
|
||||
#define ADT7411_CFG1_START_MONITOR BIT(0)
|
||||
#define ADT7411_CFG1_RESERVED_BIT1 BIT(1)
|
||||
#define ADT7411_CFG1_EXT_TDM BIT(2)
|
||||
#define ADT7411_CFG1_RESERVED_BIT3 BIT(3)
|
||||
|
||||
#define ADT7411_REG_CFG2 0x19
|
||||
#define ADT7411_CFG2_DISABLE_AVG (1 << 5)
|
||||
#define ADT7411_CFG2_DISABLE_AVG BIT(5)
|
||||
|
||||
#define ADT7411_REG_CFG3 0x1a
|
||||
#define ADT7411_CFG3_ADC_CLK_225 (1 << 0)
|
||||
#define ADT7411_CFG3_RESERVED_BIT1 (1 << 1)
|
||||
#define ADT7411_CFG3_RESERVED_BIT2 (1 << 2)
|
||||
#define ADT7411_CFG3_RESERVED_BIT3 (1 << 3)
|
||||
#define ADT7411_CFG3_REF_VDD (1 << 4)
|
||||
#define ADT7411_CFG3_ADC_CLK_225 BIT(0)
|
||||
#define ADT7411_CFG3_RESERVED_BIT1 BIT(1)
|
||||
#define ADT7411_CFG3_RESERVED_BIT2 BIT(2)
|
||||
#define ADT7411_CFG3_RESERVED_BIT3 BIT(3)
|
||||
#define ADT7411_CFG3_REF_VDD BIT(4)
|
||||
|
||||
#define ADT7411_REG_VDD_HIGH 0x23
|
||||
#define ADT7411_REG_VDD_LOW 0x24
|
||||
#define ADT7411_REG_TEMP_HIGH(nr) (0x25 + 2 * (nr))
|
||||
#define ADT7411_REG_TEMP_LOW(nr) (0x26 + 2 * (nr))
|
||||
#define ADT7411_REG_IN_HIGH(nr) ((nr) > 1 \
|
||||
? 0x2b + 2 * ((nr)-2) \
|
||||
: 0x27)
|
||||
#define ADT7411_REG_IN_LOW(nr) ((nr) > 1 \
|
||||
? 0x2c + 2 * ((nr)-2) \
|
||||
: 0x28)
|
||||
|
||||
#define ADT7411_REG_DEVICE_ID 0x4d
|
||||
#define ADT7411_REG_MANUFACTURER_ID 0x4e
|
||||
@ -51,6 +77,30 @@
|
||||
|
||||
static const unsigned short normal_i2c[] = { 0x48, 0x4a, 0x4b, I2C_CLIENT_END };
|
||||
|
||||
static const u8 adt7411_in_alarm_reg[] = {
|
||||
ADT7411_REG_STAT_2,
|
||||
ADT7411_REG_STAT_1,
|
||||
ADT7411_REG_STAT_1,
|
||||
ADT7411_REG_STAT_1,
|
||||
ADT7411_REG_STAT_1,
|
||||
ADT7411_REG_STAT_2,
|
||||
ADT7411_REG_STAT_2,
|
||||
ADT7411_REG_STAT_2,
|
||||
ADT7411_REG_STAT_2,
|
||||
};
|
||||
|
||||
static const u8 adt7411_in_alarm_bits[] = {
|
||||
ADT7411_STAT_2_VDD,
|
||||
ADT7411_STAT_1_EXT_TEMP_HIGH_AIN1,
|
||||
ADT7411_STAT_1_AIN2,
|
||||
ADT7411_STAT_1_AIN3,
|
||||
ADT7411_STAT_1_AIN4,
|
||||
ADT7411_STAT_2_AIN5,
|
||||
ADT7411_STAT_2_AIN6,
|
||||
ADT7411_STAT_2_AIN7,
|
||||
ADT7411_STAT_2_AIN8,
|
||||
};
|
||||
|
||||
struct adt7411_data {
|
||||
struct mutex device_lock; /* for "atomic" device accesses */
|
||||
struct mutex update_lock;
|
||||
@ -165,6 +215,19 @@ static struct attribute *adt7411_attrs[] = {
|
||||
};
|
||||
ATTRIBUTE_GROUPS(adt7411);
|
||||
|
||||
static int adt7411_read_in_alarm(struct device *dev, int channel, long *val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int ret;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(client, adt7411_in_alarm_reg[channel]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = !!(ret & adt7411_in_alarm_bits[channel]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adt7411_read_in_vdd(struct device *dev, u32 attr, long *val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
@ -179,11 +242,51 @@ static int adt7411_read_in_vdd(struct device *dev, u32 attr, long *val)
|
||||
return ret;
|
||||
*val = ret * 7000 / 1024;
|
||||
return 0;
|
||||
case hwmon_in_min:
|
||||
ret = i2c_smbus_read_byte_data(client, ADT7411_REG_VDD_LOW);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = ret * 7000 / 256;
|
||||
return 0;
|
||||
case hwmon_in_max:
|
||||
ret = i2c_smbus_read_byte_data(client, ADT7411_REG_VDD_HIGH);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = ret * 7000 / 256;
|
||||
return 0;
|
||||
case hwmon_in_alarm:
|
||||
return adt7411_read_in_alarm(dev, 0, val);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int adt7411_update_vref(struct device *dev)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int val;
|
||||
|
||||
if (time_after_eq(jiffies, data->next_update)) {
|
||||
val = i2c_smbus_read_byte_data(client, ADT7411_REG_CFG3);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
if (val & ADT7411_CFG3_REF_VDD) {
|
||||
val = adt7411_read_in_vdd(dev, hwmon_in_input,
|
||||
&data->vref_cached);
|
||||
if (val < 0)
|
||||
return val;
|
||||
} else {
|
||||
data->vref_cached = 2250;
|
||||
}
|
||||
|
||||
data->next_update = jiffies + HZ;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
|
||||
long *val)
|
||||
{
|
||||
@ -191,26 +294,13 @@ static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
|
||||
struct i2c_client *client = data->client;
|
||||
|
||||
int ret;
|
||||
int lsb_reg, lsb_shift;
|
||||
int reg, lsb_reg, lsb_shift;
|
||||
int nr = channel - 1;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
if (time_after_eq(jiffies, data->next_update)) {
|
||||
ret = i2c_smbus_read_byte_data(client, ADT7411_REG_CFG3);
|
||||
if (ret < 0)
|
||||
goto exit_unlock;
|
||||
|
||||
if (ret & ADT7411_CFG3_REF_VDD) {
|
||||
ret = adt7411_read_in_vdd(dev, hwmon_in_input,
|
||||
&data->vref_cached);
|
||||
if (ret < 0)
|
||||
goto exit_unlock;
|
||||
} else {
|
||||
data->vref_cached = 2250;
|
||||
}
|
||||
|
||||
data->next_update = jiffies + HZ;
|
||||
}
|
||||
ret = adt7411_update_vref(dev);
|
||||
if (ret < 0)
|
||||
goto exit_unlock;
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_in_input:
|
||||
@ -224,6 +314,20 @@ static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
|
||||
*val = ret * data->vref_cached / 1024;
|
||||
ret = 0;
|
||||
break;
|
||||
case hwmon_in_min:
|
||||
case hwmon_in_max:
|
||||
reg = (attr == hwmon_in_min)
|
||||
? ADT7411_REG_IN_LOW(channel)
|
||||
: ADT7411_REG_IN_HIGH(channel);
|
||||
ret = i2c_smbus_read_byte_data(client, reg);
|
||||
if (ret < 0)
|
||||
goto exit_unlock;
|
||||
*val = ret * data->vref_cached / 256;
|
||||
ret = 0;
|
||||
break;
|
||||
case hwmon_in_alarm:
|
||||
ret = adt7411_read_in_alarm(dev, channel, val);
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
@ -242,12 +346,44 @@ static int adt7411_read_in(struct device *dev, u32 attr, int channel,
|
||||
return adt7411_read_in_chan(dev, attr, channel, val);
|
||||
}
|
||||
|
||||
|
||||
static int adt7411_read_temp_alarm(struct device *dev, u32 attr, int channel,
|
||||
long *val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int ret, bit;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(client, ADT7411_REG_STAT_1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_temp_min_alarm:
|
||||
bit = channel ? ADT7411_STAT_1_EXT_TEMP_LOW
|
||||
: ADT7411_STAT_1_INT_TEMP_LOW;
|
||||
break;
|
||||
case hwmon_temp_max_alarm:
|
||||
bit = channel ? ADT7411_STAT_1_EXT_TEMP_HIGH_AIN1
|
||||
: ADT7411_STAT_1_INT_TEMP_HIGH;
|
||||
break;
|
||||
case hwmon_temp_fault:
|
||||
bit = ADT7411_STAT_1_EXT_TEMP_FAULT;
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
*val = !!(ret & bit);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adt7411_read_temp(struct device *dev, u32 attr, int channel,
|
||||
long *val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int ret, regl, regh;
|
||||
int ret, reg, regl, regh;
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_temp_input:
|
||||
@ -261,6 +397,21 @@ static int adt7411_read_temp(struct device *dev, u32 attr, int channel,
|
||||
ret = ret & 0x200 ? ret - 0x400 : ret; /* 10 bit signed */
|
||||
*val = ret * 250;
|
||||
return 0;
|
||||
case hwmon_temp_min:
|
||||
case hwmon_temp_max:
|
||||
reg = (attr == hwmon_temp_min)
|
||||
? ADT7411_REG_TEMP_LOW(channel)
|
||||
: ADT7411_REG_TEMP_HIGH(channel);
|
||||
ret = i2c_smbus_read_byte_data(client, reg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = ret & 0x80 ? ret - 0x100 : ret; /* 8 bit signed */
|
||||
*val = ret * 1000;
|
||||
return 0;
|
||||
case hwmon_temp_min_alarm:
|
||||
case hwmon_temp_max_alarm:
|
||||
case hwmon_temp_fault:
|
||||
return adt7411_read_temp_alarm(dev, attr, channel, val);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@ -279,26 +430,143 @@ static int adt7411_read(struct device *dev, enum hwmon_sensor_types type,
|
||||
}
|
||||
}
|
||||
|
||||
static int adt7411_write_in_vdd(struct device *dev, u32 attr, long val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int reg;
|
||||
|
||||
val = clamp_val(val, 0, 255 * 7000 / 256);
|
||||
val = DIV_ROUND_CLOSEST(val * 256, 7000);
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_in_min:
|
||||
reg = ADT7411_REG_VDD_LOW;
|
||||
break;
|
||||
case hwmon_in_max:
|
||||
reg = ADT7411_REG_VDD_HIGH;
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return i2c_smbus_write_byte_data(client, reg, val);
|
||||
}
|
||||
|
||||
static int adt7411_write_in_chan(struct device *dev, u32 attr, int channel,
|
||||
long val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int ret, reg;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
ret = adt7411_update_vref(dev);
|
||||
if (ret < 0)
|
||||
goto exit_unlock;
|
||||
val = clamp_val(val, 0, 255 * data->vref_cached / 256);
|
||||
val = DIV_ROUND_CLOSEST(val * 256, data->vref_cached);
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_in_min:
|
||||
reg = ADT7411_REG_IN_LOW(channel);
|
||||
break;
|
||||
case hwmon_in_max:
|
||||
reg = ADT7411_REG_IN_HIGH(channel);
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
goto exit_unlock;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_write_byte_data(client, reg, val);
|
||||
exit_unlock:
|
||||
mutex_unlock(&data->update_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int adt7411_write_in(struct device *dev, u32 attr, int channel,
|
||||
long val)
|
||||
{
|
||||
if (channel == 0)
|
||||
return adt7411_write_in_vdd(dev, attr, val);
|
||||
else
|
||||
return adt7411_write_in_chan(dev, attr, channel, val);
|
||||
}
|
||||
|
||||
static int adt7411_write_temp(struct device *dev, u32 attr, int channel,
|
||||
long val)
|
||||
{
|
||||
struct adt7411_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int reg;
|
||||
|
||||
val = clamp_val(val, -128000, 127000);
|
||||
val = DIV_ROUND_CLOSEST(val, 1000);
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_temp_min:
|
||||
reg = ADT7411_REG_TEMP_LOW(channel);
|
||||
break;
|
||||
case hwmon_temp_max:
|
||||
reg = ADT7411_REG_TEMP_HIGH(channel);
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return i2c_smbus_write_byte_data(client, reg, val);
|
||||
}
|
||||
|
||||
static int adt7411_write(struct device *dev, enum hwmon_sensor_types type,
|
||||
u32 attr, int channel, long val)
|
||||
{
|
||||
switch (type) {
|
||||
case hwmon_in:
|
||||
return adt7411_write_in(dev, attr, channel, val);
|
||||
case hwmon_temp:
|
||||
return adt7411_write_temp(dev, attr, channel, val);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static umode_t adt7411_is_visible(const void *_data,
|
||||
enum hwmon_sensor_types type,
|
||||
u32 attr, int channel)
|
||||
{
|
||||
const struct adt7411_data *data = _data;
|
||||
bool visible;
|
||||
|
||||
switch (type) {
|
||||
case hwmon_in:
|
||||
if (channel > 0 && channel < 3)
|
||||
return data->use_ext_temp ? 0 : S_IRUGO;
|
||||
else
|
||||
return S_IRUGO;
|
||||
visible = channel == 0 || channel >= 3 || !data->use_ext_temp;
|
||||
switch (attr) {
|
||||
case hwmon_in_input:
|
||||
case hwmon_in_alarm:
|
||||
return visible ? S_IRUGO : 0;
|
||||
case hwmon_in_min:
|
||||
case hwmon_in_max:
|
||||
return visible ? S_IRUGO | S_IWUSR : 0;
|
||||
}
|
||||
break;
|
||||
case hwmon_temp:
|
||||
if (channel == 1)
|
||||
return data->use_ext_temp ? S_IRUGO : 0;
|
||||
else
|
||||
return S_IRUGO;
|
||||
visible = channel == 0 || data->use_ext_temp;
|
||||
switch (attr) {
|
||||
case hwmon_temp_input:
|
||||
case hwmon_temp_min_alarm:
|
||||
case hwmon_temp_max_alarm:
|
||||
case hwmon_temp_fault:
|
||||
return visible ? S_IRUGO : 0;
|
||||
case hwmon_temp_min:
|
||||
case hwmon_temp_max:
|
||||
return visible ? S_IRUGO | S_IWUSR : 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adt7411_detect(struct i2c_client *client,
|
||||
@ -372,15 +640,15 @@ static int adt7411_init_device(struct adt7411_data *data)
|
||||
}
|
||||
|
||||
static const u32 adt7411_in_config[] = {
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
|
||||
0
|
||||
};
|
||||
|
||||
@ -390,8 +658,10 @@ static const struct hwmon_channel_info adt7411_in = {
|
||||
};
|
||||
|
||||
static const u32 adt7411_temp_config[] = {
|
||||
HWMON_T_INPUT,
|
||||
HWMON_T_INPUT,
|
||||
HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MIN_ALARM |
|
||||
HWMON_T_MAX | HWMON_T_MAX_ALARM,
|
||||
HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MIN_ALARM |
|
||||
HWMON_T_MAX | HWMON_T_MAX_ALARM | HWMON_T_FAULT,
|
||||
0
|
||||
};
|
||||
|
||||
@ -409,6 +679,7 @@ static const struct hwmon_channel_info *adt7411_info[] = {
|
||||
static const struct hwmon_ops adt7411_hwmon_ops = {
|
||||
.is_visible = adt7411_is_visible,
|
||||
.read = adt7411_read,
|
||||
.write = adt7411_write,
|
||||
};
|
||||
|
||||
static const struct hwmon_chip_info adt7411_chip_info = {
|
||||
|
@ -403,7 +403,7 @@ static struct adt7470_data *adt7470_update_device(struct device *dev)
|
||||
return data;
|
||||
}
|
||||
|
||||
static ssize_t show_auto_update_interval(struct device *dev,
|
||||
static ssize_t auto_update_interval_show(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
@ -411,10 +411,9 @@ static ssize_t show_auto_update_interval(struct device *dev,
|
||||
return sprintf(buf, "%d\n", data->auto_update_interval);
|
||||
}
|
||||
|
||||
static ssize_t set_auto_update_interval(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
static ssize_t auto_update_interval_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adt7470_data *data = dev_get_drvdata(dev);
|
||||
long temp;
|
||||
@ -431,7 +430,7 @@ static ssize_t set_auto_update_interval(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_num_temp_sensors(struct device *dev,
|
||||
static ssize_t num_temp_sensors_show(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
@ -439,10 +438,9 @@ static ssize_t show_num_temp_sensors(struct device *dev,
|
||||
return sprintf(buf, "%d\n", data->num_temp_sensors);
|
||||
}
|
||||
|
||||
static ssize_t set_num_temp_sensors(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
static ssize_t num_temp_sensors_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adt7470_data *data = dev_get_drvdata(dev);
|
||||
long temp;
|
||||
@ -537,7 +535,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
|
||||
return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]);
|
||||
}
|
||||
|
||||
static ssize_t show_alarm_mask(struct device *dev,
|
||||
static ssize_t alarm_mask_show(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
@ -546,10 +544,9 @@ static ssize_t show_alarm_mask(struct device *dev,
|
||||
return sprintf(buf, "%x\n", data->alarms_mask);
|
||||
}
|
||||
|
||||
static ssize_t set_alarm_mask(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
static ssize_t alarm_mask_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adt7470_data *data = dev_get_drvdata(dev);
|
||||
long mask;
|
||||
@ -723,8 +720,8 @@ static const int adt7470_freq_map[] = {
|
||||
11, 15, 22, 29, 35, 44, 59, 88, 1400, 22500
|
||||
};
|
||||
|
||||
static ssize_t show_pwm_freq(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
static ssize_t pwm1_freq_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct adt7470_data *data = adt7470_update_device(dev);
|
||||
unsigned char cfg_reg_1;
|
||||
@ -745,9 +742,9 @@ static ssize_t show_pwm_freq(struct device *dev,
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", adt7470_freq_map[index]);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_freq(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_freq_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adt7470_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -1012,12 +1009,9 @@ static ssize_t show_alarm(struct device *dev,
|
||||
return sprintf(buf, "0\n");
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarm_mask, S_IWUSR | S_IRUGO, show_alarm_mask,
|
||||
set_alarm_mask);
|
||||
static DEVICE_ATTR(num_temp_sensors, S_IWUSR | S_IRUGO, show_num_temp_sensors,
|
||||
set_num_temp_sensors);
|
||||
static DEVICE_ATTR(auto_update_interval, S_IWUSR | S_IRUGO,
|
||||
show_auto_update_interval, set_auto_update_interval);
|
||||
static DEVICE_ATTR_RW(alarm_mask);
|
||||
static DEVICE_ATTR_RW(num_temp_sensors);
|
||||
static DEVICE_ATTR_RW(auto_update_interval);
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max,
|
||||
set_temp_max, 0);
|
||||
@ -1133,7 +1127,7 @@ static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
|
||||
static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
|
||||
static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
|
||||
|
||||
static DEVICE_ATTR(pwm1_freq, S_IWUSR | S_IRUGO, show_pwm_freq, set_pwm_freq);
|
||||
static DEVICE_ATTR_RW(pwm1_freq);
|
||||
|
||||
static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO,
|
||||
show_pwm_min, set_pwm_min, 0);
|
||||
|
@ -856,16 +856,17 @@ static ssize_t set_pwmfreq(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_pwm_at_crit(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
static ssize_t pwm_use_point2_pwm_at_crit_show(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
struct adt7475_data *data = adt7475_update_device(dev);
|
||||
return sprintf(buf, "%d\n", !!(data->config4 & CONFIG4_MAXDUTY));
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_at_crit(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm_use_point2_pwm_at_crit_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct adt7475_data *data = i2c_get_clientdata(client);
|
||||
@ -888,15 +889,15 @@ static ssize_t set_pwm_at_crit(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *devattr,
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
struct adt7475_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", (int)data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct adt7475_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -910,8 +911,8 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *devattr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct adt7475_data *data = adt7475_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
@ -1057,11 +1058,10 @@ static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO | S_IWUSR, show_pwm,
|
||||
set_pwm, MAX, 2);
|
||||
|
||||
/* Non-standard name, might need revisiting */
|
||||
static DEVICE_ATTR(pwm_use_point2_pwm_at_crit, S_IWUSR | S_IRUGO,
|
||||
show_pwm_at_crit, set_pwm_at_crit);
|
||||
static DEVICE_ATTR_RW(pwm_use_point2_pwm_at_crit);
|
||||
|
||||
static DEVICE_ATTR(vrm, S_IWUSR | S_IRUGO, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static struct attribute *adt7475_attrs[] = {
|
||||
&sensor_dev_attr_in1_input.dev_attr.attr,
|
||||
|
@ -331,9 +331,8 @@ static ssize_t adt7x10_show_alarm(struct device *dev,
|
||||
return sprintf(buf, "%d\n", !!(ret & attr->index));
|
||||
}
|
||||
|
||||
static ssize_t adt7x10_show_name(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct adt7x10_data *data = dev_get_drvdata(dev);
|
||||
|
||||
@ -359,7 +358,7 @@ static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, adt7x10_show_alarm,
|
||||
NULL, ADT7X10_STAT_T_HIGH);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, adt7x10_show_alarm,
|
||||
NULL, ADT7X10_STAT_T_CRIT);
|
||||
static DEVICE_ATTR(name, S_IRUGO, adt7x10_show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *adt7x10_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
|
@ -483,25 +483,25 @@ sysfs_temp(3);
|
||||
sysfs_temp(4);
|
||||
|
||||
/* VID */
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct asb100_data *data = asb100_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
/* VRM */
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asb100_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asb100_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -519,16 +519,16 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
/* Alarms */
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asb100_data *data = asb100_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -550,15 +550,15 @@ static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5);
|
||||
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
|
||||
|
||||
/* 1 PWM */
|
||||
static ssize_t show_pwm1(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t pwm1_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asb100_data *data = asb100_update_device(dev);
|
||||
return sprintf(buf, "%d\n", ASB100_PWM_FROM_REG(data->pwm & 0x0f));
|
||||
}
|
||||
|
||||
static ssize_t set_pwm1(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct asb100_data *data = i2c_get_clientdata(client);
|
||||
@ -577,15 +577,16 @@ static ssize_t set_pwm1(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_pwm_enable1(struct device *dev,
|
||||
static ssize_t pwm1_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct asb100_data *data = asb100_update_device(dev);
|
||||
return sprintf(buf, "%d\n", (data->pwm & 0x80) ? 1 : 0);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable1(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct asb100_data *data = i2c_get_clientdata(client);
|
||||
@ -604,9 +605,8 @@ static ssize_t set_pwm_enable1(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm1, set_pwm1);
|
||||
static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
|
||||
show_pwm_enable1, set_pwm_enable1);
|
||||
static DEVICE_ATTR_RW(pwm1);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
|
||||
static struct attribute *asb100_attributes[] = {
|
||||
&sensor_dev_attr_in0_input.dev_attr.attr,
|
||||
|
@ -81,8 +81,8 @@ static struct atxp1_data *atxp1_update_device(struct device *dev)
|
||||
}
|
||||
|
||||
/* sys file functions for cpu0_vid */
|
||||
static ssize_t atxp1_showvcore(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
int size;
|
||||
struct atxp1_data *data;
|
||||
@ -95,9 +95,9 @@ static ssize_t atxp1_showvcore(struct device *dev,
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t atxp1_storevcore(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t cpu0_vid_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct atxp1_data *data = atxp1_update_device(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -154,12 +154,11 @@ static ssize_t atxp1_storevcore(struct device *dev,
|
||||
* CPU core reference voltage
|
||||
* unit: millivolt
|
||||
*/
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO | S_IWUSR, atxp1_showvcore,
|
||||
atxp1_storevcore);
|
||||
static DEVICE_ATTR_RW(cpu0_vid);
|
||||
|
||||
/* sys file functions for GPIO1 */
|
||||
static ssize_t atxp1_showgpio1(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t gpio1_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
int size;
|
||||
struct atxp1_data *data;
|
||||
@ -171,9 +170,8 @@ static ssize_t atxp1_showgpio1(struct device *dev,
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t atxp1_storegpio1(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t gpio1_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct atxp1_data *data = atxp1_update_device(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -201,11 +199,11 @@ static ssize_t atxp1_storegpio1(struct device *dev,
|
||||
* GPIO1 data register
|
||||
* unit: Four bit as hex (e.g. 0x0f)
|
||||
*/
|
||||
static DEVICE_ATTR(gpio1, S_IRUGO | S_IWUSR, atxp1_showgpio1, atxp1_storegpio1);
|
||||
static DEVICE_ATTR_RW(gpio1);
|
||||
|
||||
/* sys file functions for GPIO2 */
|
||||
static ssize_t atxp1_showgpio2(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t gpio2_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
int size;
|
||||
struct atxp1_data *data;
|
||||
@ -217,9 +215,8 @@ static ssize_t atxp1_showgpio2(struct device *dev,
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t atxp1_storegpio2(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t gpio2_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct atxp1_data *data = atxp1_update_device(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -246,7 +243,7 @@ static ssize_t atxp1_storegpio2(struct device *dev,
|
||||
* GPIO2 data register
|
||||
* unit: Eight bit as hex (e.g. 0xff)
|
||||
*/
|
||||
static DEVICE_ATTR(gpio2, S_IRUGO | S_IWUSR, atxp1_showgpio2, atxp1_storegpio2);
|
||||
static DEVICE_ATTR_RW(gpio2);
|
||||
|
||||
static struct attribute *atxp1_attrs[] = {
|
||||
&dev_attr_gpio1.attr,
|
||||
|
@ -279,7 +279,8 @@ static inline int IN_FROM_REG(int reg, int nominal, int res)
|
||||
|
||||
static inline int IN_TO_REG(long val, int nominal)
|
||||
{
|
||||
return clamp_val((val * 192 + nominal / 2) / nominal, 0, 255);
|
||||
val = clamp_val(val, 0, 255 * nominal / 192);
|
||||
return DIV_ROUND_CLOSEST(val * 192, nominal);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -295,7 +296,8 @@ static inline int TEMP_FROM_REG(int reg, int res)
|
||||
|
||||
static inline int TEMP_TO_REG(long val)
|
||||
{
|
||||
return clamp_val((val < 0 ? val - 500 : val + 500) / 1000, -128, 127);
|
||||
val = clamp_val(val, -128000, 127000);
|
||||
return DIV_ROUND_CLOSEST(val, 1000);
|
||||
}
|
||||
|
||||
/* Temperature range */
|
||||
@ -331,9 +333,10 @@ static inline int TEMP_HYST_FROM_REG(int reg, int ix)
|
||||
return (((ix == 1) ? reg : reg >> 4) & 0x0f) * 1000;
|
||||
}
|
||||
|
||||
static inline int TEMP_HYST_TO_REG(long val, int ix, int reg)
|
||||
static inline int TEMP_HYST_TO_REG(int temp, long hyst, int ix, int reg)
|
||||
{
|
||||
int hyst = clamp_val((val + 500) / 1000, 0, 15);
|
||||
hyst = clamp_val(hyst, temp - 15000, temp);
|
||||
hyst = DIV_ROUND_CLOSEST(temp - hyst, 1000);
|
||||
|
||||
return (ix == 1) ? (reg & 0xf0) | hyst : (reg & 0x0f) | (hyst << 4);
|
||||
}
|
||||
@ -1022,7 +1025,9 @@ static ssize_t set_zone(struct device *dev, struct device_attribute *attr,
|
||||
int ix = sensor_attr_2->index;
|
||||
int fn = sensor_attr_2->nr;
|
||||
long val;
|
||||
int temp;
|
||||
int err;
|
||||
u8 reg;
|
||||
|
||||
err = kstrtol(buf, 10, &val);
|
||||
if (err)
|
||||
@ -1035,10 +1040,9 @@ static ssize_t set_zone(struct device *dev, struct device_attribute *attr,
|
||||
data->zone_low[ix] = dme1737_read(data,
|
||||
DME1737_REG_ZONE_LOW(ix));
|
||||
/* Modify the temp hyst value */
|
||||
data->zone_hyst[ix == 2] = TEMP_HYST_TO_REG(
|
||||
TEMP_FROM_REG(data->zone_low[ix], 8) -
|
||||
val, ix, dme1737_read(data,
|
||||
DME1737_REG_ZONE_HYST(ix == 2)));
|
||||
temp = TEMP_FROM_REG(data->zone_low[ix], 8);
|
||||
reg = dme1737_read(data, DME1737_REG_ZONE_HYST(ix == 2));
|
||||
data->zone_hyst[ix == 2] = TEMP_HYST_TO_REG(temp, val, ix, reg);
|
||||
dme1737_write(data, DME1737_REG_ZONE_HYST(ix == 2),
|
||||
data->zone_hyst[ix == 2]);
|
||||
break;
|
||||
@ -1055,10 +1059,10 @@ static ssize_t set_zone(struct device *dev, struct device_attribute *attr,
|
||||
* Modify the temp range value (which is stored in the upper
|
||||
* nibble of the pwm_freq register)
|
||||
*/
|
||||
data->pwm_freq[ix] = TEMP_RANGE_TO_REG(val -
|
||||
TEMP_FROM_REG(data->zone_low[ix], 8),
|
||||
dme1737_read(data,
|
||||
DME1737_REG_PWM_FREQ(ix)));
|
||||
temp = TEMP_FROM_REG(data->zone_low[ix], 8);
|
||||
val = clamp_val(val, temp, temp + 80000);
|
||||
reg = dme1737_read(data, DME1737_REG_PWM_FREQ(ix));
|
||||
data->pwm_freq[ix] = TEMP_RANGE_TO_REG(val - temp, reg);
|
||||
dme1737_write(data, DME1737_REG_PWM_FREQ(ix),
|
||||
data->pwm_freq[ix]);
|
||||
break;
|
||||
@ -1468,7 +1472,7 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
|
||||
* Miscellaneous sysfs attributes
|
||||
* --------------------------------------------------------------------- */
|
||||
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
@ -1477,8 +1481,8 @@ static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct dme1737_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -1495,15 +1499,15 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct dme1737_data *data = dme1737_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct dme1737_data *data = dev_get_drvdata(dev);
|
||||
@ -1645,9 +1649,9 @@ SENSOR_DEVICE_ATTR_PWM_5TO6(6);
|
||||
|
||||
/* Misc */
|
||||
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); /* for ISA devices */
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
static DEVICE_ATTR_RO(name); /* for ISA devices */
|
||||
|
||||
/*
|
||||
* This struct holds all the attributes that are always present and need to be
|
||||
|
@ -263,7 +263,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct ds1621_data *data = ds1621_update_client(dev);
|
||||
@ -278,15 +278,16 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%d\n", !!(data->conf & attr->index));
|
||||
}
|
||||
|
||||
static ssize_t show_convrate(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t update_interval_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct ds1621_data *data = dev_get_drvdata(dev);
|
||||
return scnprintf(buf, PAGE_SIZE, "%hu\n", data->update_interval);
|
||||
}
|
||||
|
||||
static ssize_t set_convrate(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t update_interval_store(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct ds1621_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -315,9 +316,8 @@ static ssize_t set_convrate(struct device *dev, struct device_attribute *da,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_convrate,
|
||||
set_convrate);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static DEVICE_ATTR_RW(update_interval);
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp, set_temp, 1);
|
||||
|
@ -284,7 +284,7 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *da,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_fan(struct device *dev, struct device_attribute *da, char *buf)
|
||||
fan1_input_show(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
int rpm = 0;
|
||||
@ -294,7 +294,7 @@ show_fan(struct device *dev, struct device_attribute *da, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_fan_div(struct device *dev, struct device_attribute *da, char *buf)
|
||||
fan1_div_show(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
int fan_div = 8 / data->fan_multiplier;
|
||||
@ -307,8 +307,8 @@ show_fan_div(struct device *dev, struct device_attribute *da, char *buf)
|
||||
* of least surprise; the user doesn't expect the fan target to change just
|
||||
* because the divider changed.
|
||||
*/
|
||||
static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_div_store(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -369,7 +369,7 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_fan_target(struct device *dev, struct device_attribute *da, char *buf)
|
||||
fan1_target_show(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
int rpm = 0;
|
||||
@ -382,8 +382,9 @@ show_fan_target(struct device *dev, struct device_attribute *da, char *buf)
|
||||
return sprintf(buf, "%d\n", rpm);
|
||||
}
|
||||
|
||||
static ssize_t set_fan_target(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_target_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -412,7 +413,7 @@ static ssize_t set_fan_target(struct device *dev, struct device_attribute *da,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_fan_fault(struct device *dev, struct device_attribute *da, char *buf)
|
||||
fan1_fault_show(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
bool fault = ((data->fan_tach & 0x1fe0) == 0x1fe0);
|
||||
@ -420,14 +421,15 @@ show_fan_fault(struct device *dev, struct device_attribute *da, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_pwm_enable(struct device *dev, struct device_attribute *da, char *buf)
|
||||
pwm1_enable_show(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct emc2103_data *data = emc2103_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->fan_rpm_control ? 3 : 0);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct emc2103_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -512,14 +514,12 @@ static SENSOR_DEVICE_ATTR(temp4_min_alarm, S_IRUGO, show_temp_min_alarm,
|
||||
static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO, show_temp_max_alarm,
|
||||
NULL, 3);
|
||||
|
||||
static DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL);
|
||||
static DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR, show_fan_div, set_fan_div);
|
||||
static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_fan_target,
|
||||
set_fan_target);
|
||||
static DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL);
|
||||
static DEVICE_ATTR_RO(fan1_input);
|
||||
static DEVICE_ATTR_RW(fan1_div);
|
||||
static DEVICE_ATTR_RW(fan1_target);
|
||||
static DEVICE_ATTR_RO(fan1_fault);
|
||||
|
||||
static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, show_pwm_enable,
|
||||
set_pwm_enable);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
|
||||
/* sensors present on all models */
|
||||
static struct attribute *emc2103_attributes[] = {
|
||||
|
@ -946,7 +946,7 @@ static ssize_t set_temp_hyst(struct device *dev, struct device_attribute
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms_in(struct device *dev, struct device_attribute
|
||||
static ssize_t alarms_in_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct f71805f_data *data = f71805f_update_device(dev);
|
||||
@ -954,7 +954,7 @@ static ssize_t show_alarms_in(struct device *dev, struct device_attribute
|
||||
return sprintf(buf, "%lu\n", data->alarms & 0x7ff);
|
||||
}
|
||||
|
||||
static ssize_t show_alarms_fan(struct device *dev, struct device_attribute
|
||||
static ssize_t alarms_fan_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct f71805f_data *data = f71805f_update_device(dev);
|
||||
@ -962,7 +962,7 @@ static ssize_t show_alarms_fan(struct device *dev, struct device_attribute
|
||||
return sprintf(buf, "%lu\n", (data->alarms >> 16) & 0x07);
|
||||
}
|
||||
|
||||
static ssize_t show_alarms_temp(struct device *dev, struct device_attribute
|
||||
static ssize_t alarms_temp_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct f71805f_data *data = f71805f_update_device(dev);
|
||||
@ -980,7 +980,7 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute
|
||||
return sprintf(buf, "%lu\n", (data->alarms >> bitnr) & 1);
|
||||
}
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct f71805f_data *data = dev_get_drvdata(dev);
|
||||
@ -1176,11 +1176,11 @@ static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
|
||||
static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16);
|
||||
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17);
|
||||
static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18);
|
||||
static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
|
||||
static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
|
||||
static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
|
||||
static DEVICE_ATTR_RO(alarms_in);
|
||||
static DEVICE_ATTR_RO(alarms_fan);
|
||||
static DEVICE_ATTR_RO(alarms_temp);
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *f71805f_attributes[] = {
|
||||
&sensor_dev_attr_in0_input.dev_attr.attr,
|
||||
|
@ -390,7 +390,7 @@ static ssize_t show_pwm_auto_point_temp(struct device *dev,
|
||||
static ssize_t store_pwm_auto_point_temp(struct device *dev,
|
||||
struct device_attribute *devattr, const char *buf, size_t count);
|
||||
/* Sysfs misc */
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf);
|
||||
|
||||
static int f71882fg_probe(struct platform_device *pdev);
|
||||
@ -404,7 +404,7 @@ static struct platform_driver f71882fg_driver = {
|
||||
.remove = f71882fg_remove,
|
||||
};
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
/*
|
||||
* Temp attr for the f71858fg, the f71858fg is special as it has its
|
||||
@ -2212,7 +2212,7 @@ static ssize_t store_pwm_auto_point_temp(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
struct f71882fg_data *data = dev_get_drvdata(dev);
|
||||
|
@ -83,8 +83,8 @@ static bool is_carrizo_or_later(void)
|
||||
return boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model >= 0x60;
|
||||
}
|
||||
|
||||
static ssize_t show_power(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t power1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
u32 val, tdp_limit, running_avg_range;
|
||||
s32 running_avg_capture;
|
||||
@ -136,16 +136,16 @@ static ssize_t show_power(struct device *dev,
|
||||
curr_pwr_watts = (curr_pwr_watts * 15625) >> (10 + running_avg_range);
|
||||
return sprintf(buf, "%u\n", (unsigned int) curr_pwr_watts);
|
||||
}
|
||||
static DEVICE_ATTR(power1_input, S_IRUGO, show_power, NULL);
|
||||
static DEVICE_ATTR_RO(power1_input);
|
||||
|
||||
static ssize_t show_power_crit(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t power1_crit_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct fam15h_power_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%u\n", data->processor_pwr_watts);
|
||||
}
|
||||
static DEVICE_ATTR(power1_crit, S_IRUGO, show_power_crit, NULL);
|
||||
static DEVICE_ATTR_RO(power1_crit);
|
||||
|
||||
static void do_read_registers_on_cu(void *_data)
|
||||
{
|
||||
@ -212,9 +212,8 @@ static int read_registers(struct fam15h_power_data *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t acc_show_power(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t power1_average_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct fam15h_power_data *data = dev_get_drvdata(dev);
|
||||
u64 prev_cu_acc_power[MAX_CUS], prev_ptsc[MAX_CUS],
|
||||
@ -267,20 +266,20 @@ static ssize_t acc_show_power(struct device *dev,
|
||||
|
||||
return sprintf(buf, "%llu\n", (unsigned long long)avg_acc);
|
||||
}
|
||||
static DEVICE_ATTR(power1_average, S_IRUGO, acc_show_power, NULL);
|
||||
static DEVICE_ATTR_RO(power1_average);
|
||||
|
||||
static ssize_t acc_show_power_period(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t power1_average_interval_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct fam15h_power_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%lu\n", data->power_period);
|
||||
}
|
||||
|
||||
static ssize_t acc_set_power_period(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t power1_average_interval_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct fam15h_power_data *data = dev_get_drvdata(dev);
|
||||
unsigned long temp;
|
||||
@ -301,8 +300,7 @@ static ssize_t acc_set_power_period(struct device *dev,
|
||||
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(power1_average_interval, S_IRUGO | S_IWUSR,
|
||||
acc_show_power_period, acc_set_power_period);
|
||||
static DEVICE_ATTR_RW(power1_average_interval);
|
||||
|
||||
static int fam15h_power_init_attrs(struct pci_dev *pdev,
|
||||
struct fam15h_power_data *data)
|
||||
|
@ -561,7 +561,7 @@ static ssize_t store_pwm_auto_point1_pwm(struct device *dev,
|
||||
* The FSC hwmon family has the ability to force an attached alert led to flash
|
||||
* from software, we export this as an alert_led sysfs attr
|
||||
*/
|
||||
static ssize_t show_alert_led(struct device *dev,
|
||||
static ssize_t alert_led_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct fschmd_data *data = fschmd_update_device(dev);
|
||||
@ -572,7 +572,7 @@ static ssize_t show_alert_led(struct device *dev,
|
||||
return sprintf(buf, "0\n");
|
||||
}
|
||||
|
||||
static ssize_t store_alert_led(struct device *dev,
|
||||
static ssize_t alert_led_store(struct device *dev,
|
||||
struct device_attribute *devattr, const char *buf, size_t count)
|
||||
{
|
||||
u8 reg;
|
||||
@ -602,7 +602,7 @@ static ssize_t store_alert_led(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alert_led, 0644, show_alert_led, store_alert_led);
|
||||
static DEVICE_ATTR_RW(alert_led);
|
||||
|
||||
static struct sensor_device_attribute fschmd_attr[] = {
|
||||
SENSOR_ATTR(in0_input, 0444, show_in_value, NULL, 0),
|
||||
|
@ -107,8 +107,8 @@ static struct g760a_data *g760a_update_client(struct device *dev)
|
||||
return data;
|
||||
}
|
||||
|
||||
static ssize_t show_fan(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t fan1_input_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g760a_data *data = g760a_update_client(dev);
|
||||
unsigned int rpm = 0;
|
||||
@ -121,8 +121,8 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%d\n", rpm);
|
||||
}
|
||||
|
||||
static ssize_t show_fan_alarm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t fan1_alarm_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g760a_data *data = g760a_update_client(dev);
|
||||
|
||||
@ -131,16 +131,16 @@ static ssize_t show_fan_alarm(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%d\n", fan_alarm);
|
||||
}
|
||||
|
||||
static ssize_t get_pwm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t pwm1_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct g760a_data *data = g760a_update_client(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", PWM_FROM_CNT(data->set_cnt));
|
||||
}
|
||||
|
||||
static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_store(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct g760a_data *data = g760a_update_client(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -157,9 +157,9 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm);
|
||||
static DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL);
|
||||
static DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL);
|
||||
static DEVICE_ATTR_RW(pwm1);
|
||||
static DEVICE_ATTR_RO(fan1_input);
|
||||
static DEVICE_ATTR_RO(fan1_alarm);
|
||||
|
||||
static struct attribute *g760a_attrs[] = {
|
||||
&dev_attr_pwm1.attr,
|
||||
|
@ -738,8 +738,8 @@ static int g762_pdata_prop_import(struct i2c_client *client)
|
||||
* Read function for fan1_input sysfs file. Return current fan RPM value, or
|
||||
* 0 if fan is out of control.
|
||||
*/
|
||||
static ssize_t get_fan_rpm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t fan1_input_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
unsigned int rpm = 0;
|
||||
@ -764,8 +764,8 @@ static ssize_t get_fan_rpm(struct device *dev, struct device_attribute *da,
|
||||
* Read and write functions for pwm1_mode sysfs file. Get and set fan speed
|
||||
* control mode i.e. PWM (1) or DC (0).
|
||||
*/
|
||||
static ssize_t get_pwm_mode(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t pwm1_mode_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
|
||||
@ -776,8 +776,9 @@ static ssize_t get_pwm_mode(struct device *dev, struct device_attribute *da,
|
||||
!!(data->fan_cmd1 & G762_REG_FAN_CMD1_OUT_MODE));
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_mode_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
@ -796,8 +797,8 @@ static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *da,
|
||||
* Read and write functions for fan1_div sysfs file. Get and set fan
|
||||
* controller prescaler value
|
||||
*/
|
||||
static ssize_t get_fan_div(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
static ssize_t fan1_div_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
|
||||
@ -807,9 +808,8 @@ static ssize_t get_fan_div(struct device *dev,
|
||||
return sprintf(buf, "%d\n", G762_CLKDIV_FROM_REG(data->fan_cmd1));
|
||||
}
|
||||
|
||||
static ssize_t set_fan_div(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_div_store(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
@ -828,8 +828,8 @@ static ssize_t set_fan_div(struct device *dev,
|
||||
* Read and write functions for fan1_pulses sysfs file. Get and set number
|
||||
* of tachometer pulses per fan revolution.
|
||||
*/
|
||||
static ssize_t get_fan_pulses(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
static ssize_t fan1_pulses_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
|
||||
@ -839,9 +839,9 @@ static ssize_t get_fan_pulses(struct device *dev,
|
||||
return sprintf(buf, "%d\n", G762_PULSE_FROM_REG(data->fan_cmd1));
|
||||
}
|
||||
|
||||
static ssize_t set_fan_pulses(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_pulses_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
@ -870,8 +870,8 @@ static ssize_t set_fan_pulses(struct device *dev,
|
||||
* but we do not accept 0 as this mode is not natively supported by the chip
|
||||
* and it is not emulated by g762 driver. -EINVAL is returned in this case.
|
||||
*/
|
||||
static ssize_t get_pwm_enable(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
static ssize_t pwm1_enable_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
|
||||
@ -882,9 +882,9 @@ static ssize_t get_pwm_enable(struct device *dev,
|
||||
(!!(data->fan_cmd1 & G762_REG_FAN_CMD1_FAN_MODE)) + 1);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
@ -904,8 +904,8 @@ static ssize_t set_pwm_enable(struct device *dev,
|
||||
* (which affects fan speed) in open-loop mode. 0 stops the fan and 255
|
||||
* makes it run at full speed.
|
||||
*/
|
||||
static ssize_t get_pwm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t pwm1_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
|
||||
@ -915,8 +915,8 @@ static ssize_t get_pwm(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%d\n", data->set_out);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_store(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
@ -942,8 +942,8 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
|
||||
* Also note that due to rounding errors it is possible that you don't read
|
||||
* back exactly the value you have set.
|
||||
*/
|
||||
static ssize_t get_fan_target(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t fan1_target_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
unsigned int rpm;
|
||||
@ -961,8 +961,9 @@ static ssize_t get_fan_target(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%u\n", rpm);
|
||||
}
|
||||
|
||||
static ssize_t set_fan_target(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_target_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
@ -978,7 +979,7 @@ static ssize_t set_fan_target(struct device *dev, struct device_attribute *da,
|
||||
}
|
||||
|
||||
/* read function for fan1_fault sysfs file. */
|
||||
static ssize_t get_fan_failure(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t fan1_fault_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
@ -993,8 +994,8 @@ static ssize_t get_fan_failure(struct device *dev, struct device_attribute *da,
|
||||
* read function for fan1_alarm sysfs file. Note that OOC condition is
|
||||
* enabled low
|
||||
*/
|
||||
static ssize_t get_fan_ooc(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t fan1_alarm_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct g762_data *data = g762_update_client(dev);
|
||||
|
||||
@ -1004,18 +1005,15 @@ static ssize_t get_fan_ooc(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%u\n", !(data->fan_sta & G762_REG_FAN_STA_OOC));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm);
|
||||
static DEVICE_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, get_pwm_mode, set_pwm_mode);
|
||||
static DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
|
||||
get_pwm_enable, set_pwm_enable);
|
||||
static DEVICE_ATTR(fan1_input, S_IRUGO, get_fan_rpm, NULL);
|
||||
static DEVICE_ATTR(fan1_alarm, S_IRUGO, get_fan_ooc, NULL);
|
||||
static DEVICE_ATTR(fan1_fault, S_IRUGO, get_fan_failure, NULL);
|
||||
static DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO,
|
||||
get_fan_target, set_fan_target);
|
||||
static DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_fan_div, set_fan_div);
|
||||
static DEVICE_ATTR(fan1_pulses, S_IWUSR | S_IRUGO,
|
||||
get_fan_pulses, set_fan_pulses);
|
||||
static DEVICE_ATTR_RW(pwm1);
|
||||
static DEVICE_ATTR_RW(pwm1_mode);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
static DEVICE_ATTR_RO(fan1_input);
|
||||
static DEVICE_ATTR_RO(fan1_alarm);
|
||||
static DEVICE_ATTR_RO(fan1_fault);
|
||||
static DEVICE_ATTR_RW(fan1_target);
|
||||
static DEVICE_ATTR_RW(fan1_div);
|
||||
static DEVICE_ATTR_RW(fan1_pulses);
|
||||
|
||||
/* Driver data */
|
||||
static struct attribute *g762_attrs[] = {
|
||||
|
@ -86,9 +86,8 @@ enum chips { gl518sm_r00, gl518sm_r80 };
|
||||
#define BOOL_FROM_REG(val) ((val) ? 0 : 1)
|
||||
#define BOOL_TO_REG(val) ((val) ? 0 : 1)
|
||||
|
||||
#define TEMP_TO_REG(val) clamp_val(((((val) < 0 ? \
|
||||
(val) - 500 : \
|
||||
(val) + 500) / 1000) + 119), 0, 255)
|
||||
#define TEMP_CLAMP(val) clamp_val(val, -119000, 136000)
|
||||
#define TEMP_TO_REG(val) (DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 119)
|
||||
#define TEMP_FROM_REG(val) (((val) - 119) * 1000)
|
||||
|
||||
static inline u8 FAN_TO_REG(long rpm, int div)
|
||||
@ -101,11 +100,13 @@ static inline u8 FAN_TO_REG(long rpm, int div)
|
||||
}
|
||||
#define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) * (div))))
|
||||
|
||||
#define IN_TO_REG(val) clamp_val((((val) + 9) / 19), 0, 255)
|
||||
#define IN_CLAMP(val) clamp_val(val, 0, 255 * 19)
|
||||
#define IN_TO_REG(val) DIV_ROUND_CLOSEST(IN_CLAMP(val), 19)
|
||||
#define IN_FROM_REG(val) ((val) * 19)
|
||||
|
||||
#define VDD_TO_REG(val) clamp_val((((val) * 4 + 47) / 95), 0, 255)
|
||||
#define VDD_FROM_REG(val) (((val) * 95 + 2) / 4)
|
||||
#define VDD_CLAMP(val) clamp_val(val, 0, 255 * 95 / 4)
|
||||
#define VDD_TO_REG(val) DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95)
|
||||
#define VDD_FROM_REG(val) DIV_ROUND_CLOSEST((val) * 95, 4)
|
||||
|
||||
#define DIV_FROM_REG(val) (1 << (val))
|
||||
|
||||
|
@ -200,19 +200,21 @@ static struct gl520_data *gl520_update_device(struct device *dev)
|
||||
* Sysfs stuff
|
||||
*/
|
||||
|
||||
static ssize_t get_cpu_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gl520_data *data = gl520_update_device(dev);
|
||||
return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, get_cpu_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
#define VDD_FROM_REG(val) (((val) * 95 + 2) / 4)
|
||||
#define VDD_TO_REG(val) clamp_val((((val) * 4 + 47) / 95), 0, 255)
|
||||
#define VDD_FROM_REG(val) DIV_ROUND_CLOSEST((val) * 95, 4)
|
||||
#define VDD_CLAMP(val) clamp_val(val, 0, 255 * 95 / 4)
|
||||
#define VDD_TO_REG(val) DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95)
|
||||
|
||||
#define IN_FROM_REG(val) ((val) * 19)
|
||||
#define IN_TO_REG(val) clamp_val((((val) + 9) / 19), 0, 255)
|
||||
#define IN_FROM_REG(val) ((val) * 19)
|
||||
#define IN_CLAMP(val) clamp_val(val, 0, 255 * 19)
|
||||
#define IN_TO_REG(val) DIV_ROUND_CLOSEST(IN_CLAMP(val), 19)
|
||||
|
||||
static ssize_t get_in_input(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -349,8 +351,13 @@ static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
|
||||
|
||||
#define DIV_FROM_REG(val) (1 << (val))
|
||||
#define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) << (div))))
|
||||
#define FAN_TO_REG(val, div) ((val) <= 0 ? 0 : \
|
||||
clamp_val((480000 + ((val) << ((div)-1))) / ((val) << (div)), 1, 255))
|
||||
|
||||
#define FAN_BASE(div) (480000 >> (div))
|
||||
#define FAN_CLAMP(val, div) clamp_val(val, FAN_BASE(div) / 255, \
|
||||
FAN_BASE(div))
|
||||
#define FAN_TO_REG(val, div) ((val) == 0 ? 0 : \
|
||||
DIV_ROUND_CLOSEST(480000, \
|
||||
FAN_CLAMP(val, div) << (div)))
|
||||
|
||||
static ssize_t get_fan_input(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -381,8 +388,8 @@ static ssize_t get_fan_div(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[n]));
|
||||
}
|
||||
|
||||
static ssize_t get_fan_off(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t fan1_off_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gl520_data *data = gl520_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->fan_off);
|
||||
@ -476,8 +483,9 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t set_fan_off(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_off_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct gl520_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -510,12 +518,11 @@ static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
|
||||
get_fan_div, set_fan_div, 0);
|
||||
static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
|
||||
get_fan_div, set_fan_div, 1);
|
||||
static DEVICE_ATTR(fan1_off, S_IRUGO | S_IWUSR,
|
||||
get_fan_off, set_fan_off);
|
||||
static DEVICE_ATTR_RW(fan1_off);
|
||||
|
||||
#define TEMP_FROM_REG(val) (((val) - 130) * 1000)
|
||||
#define TEMP_TO_REG(val) clamp_val(((((val) < 0 ? \
|
||||
(val) - 500 : (val) + 500) / 1000) + 130), 0, 255)
|
||||
#define TEMP_FROM_REG(val) (((val) - 130) * 1000)
|
||||
#define TEMP_CLAMP(val) clamp_val(val, -130000, 125000)
|
||||
#define TEMP_TO_REG(val) (DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 130)
|
||||
|
||||
static ssize_t get_temp_input(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -596,29 +603,30 @@ static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
|
||||
static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
|
||||
get_temp_max_hyst, set_temp_max_hyst, 1);
|
||||
|
||||
static ssize_t get_alarms(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct gl520_data *data = gl520_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->alarms);
|
||||
}
|
||||
|
||||
static ssize_t get_beep_enable(struct device *dev, struct device_attribute
|
||||
*attr, char *buf)
|
||||
static ssize_t beep_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gl520_data *data = gl520_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->beep_enable);
|
||||
}
|
||||
|
||||
static ssize_t get_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t beep_mask_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gl520_data *data = gl520_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->beep_mask);
|
||||
}
|
||||
|
||||
static ssize_t set_beep_enable(struct device *dev, struct device_attribute
|
||||
*attr, const char *buf, size_t count)
|
||||
static ssize_t beep_enable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct gl520_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -641,8 +649,9 @@ static ssize_t set_beep_enable(struct device *dev, struct device_attribute
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t set_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t beep_mask_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct gl520_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -661,11 +670,9 @@ static ssize_t set_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
|
||||
static DEVICE_ATTR(beep_enable, S_IRUGO | S_IWUSR,
|
||||
get_beep_enable, set_beep_enable);
|
||||
static DEVICE_ATTR(beep_mask, S_IRUGO | S_IWUSR,
|
||||
get_beep_mask, set_beep_mask);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static DEVICE_ATTR_RW(beep_enable);
|
||||
static DEVICE_ATTR_RW(beep_mask);
|
||||
|
||||
static ssize_t get_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -77,8 +77,8 @@ static irqreturn_t fan_alarm_irq_handler(int irq, void *dev_id)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
static ssize_t show_fan_alarm(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t fan1_alarm_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
struct gpio_fan_alarm *alarm = fan_data->alarm;
|
||||
@ -90,7 +90,7 @@ static ssize_t show_fan_alarm(struct device *dev,
|
||||
return sprintf(buf, "%d\n", value);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL);
|
||||
static DEVICE_ATTR_RO(fan1_alarm);
|
||||
|
||||
static int fan_alarm_init(struct gpio_fan_data *fan_data,
|
||||
struct gpio_fan_alarm *alarm)
|
||||
@ -188,8 +188,8 @@ static int rpm_to_speed_index(struct gpio_fan_data *fan_data, unsigned long rpm)
|
||||
return fan_data->num_speed - 1;
|
||||
}
|
||||
|
||||
static ssize_t show_pwm(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t pwm1_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
u8 pwm = fan_data->speed_index * 255 / (fan_data->num_speed - 1);
|
||||
@ -197,8 +197,8 @@ static ssize_t show_pwm(struct device *dev,
|
||||
return sprintf(buf, "%d\n", pwm);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
unsigned long pwm;
|
||||
@ -224,16 +224,17 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t show_pwm_enable(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t pwm1_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", fan_data->pwm_enable);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -257,22 +258,22 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_pwm_mode(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t pwm1_mode_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "0\n");
|
||||
}
|
||||
|
||||
static ssize_t show_rpm_min(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t fan1_min_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", fan_data->speed[0].rpm);
|
||||
}
|
||||
|
||||
static ssize_t show_rpm_max(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t fan1_max_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
|
||||
@ -280,8 +281,8 @@ static ssize_t show_rpm_max(struct device *dev,
|
||||
fan_data->speed[fan_data->num_speed - 1].rpm);
|
||||
}
|
||||
|
||||
static ssize_t show_rpm(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t fan1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
|
||||
@ -313,14 +314,13 @@ static ssize_t set_rpm(struct device *dev, struct device_attribute *attr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm);
|
||||
static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
|
||||
show_pwm_enable, set_pwm_enable);
|
||||
static DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL);
|
||||
static DEVICE_ATTR(fan1_min, S_IRUGO, show_rpm_min, NULL);
|
||||
static DEVICE_ATTR(fan1_max, S_IRUGO, show_rpm_max, NULL);
|
||||
static DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, NULL);
|
||||
static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_rpm, set_rpm);
|
||||
static DEVICE_ATTR_RW(pwm1);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
static DEVICE_ATTR_RO(pwm1_mode);
|
||||
static DEVICE_ATTR_RO(fan1_min);
|
||||
static DEVICE_ATTR_RO(fan1_max);
|
||||
static DEVICE_ATTR_RO(fan1_input);
|
||||
static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, fan1_input_show, set_rpm);
|
||||
|
||||
static umode_t gpio_fan_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int index)
|
||||
|
@ -63,11 +63,11 @@ struct hwmon_thermal_data {
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
show_name(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
name_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%s\n", to_hwmon_device(dev)->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *hwmon_dev_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
@ -544,9 +544,11 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
|
||||
struct device *hdev;
|
||||
int i, j, err, id;
|
||||
|
||||
/* Do not accept invalid characters in hwmon name attribute */
|
||||
/* Complain about invalid characters in hwmon name attribute */
|
||||
if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
|
||||
return ERR_PTR(-EINVAL);
|
||||
dev_warn(dev,
|
||||
"hwmon: '%s' is not a valid name attribute, please fix\n",
|
||||
name);
|
||||
|
||||
id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
|
||||
if (id < 0)
|
||||
@ -606,7 +608,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
|
||||
if (err)
|
||||
goto free_hwmon;
|
||||
|
||||
if (chip && chip->ops->read &&
|
||||
if (dev && chip && chip->ops->read &&
|
||||
chip->info[0]->type == hwmon_chip &&
|
||||
(chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
|
||||
const struct hwmon_channel_info **info = chip->info;
|
||||
@ -651,6 +653,9 @@ hwmon_device_register_with_groups(struct device *dev, const char *name,
|
||||
void *drvdata,
|
||||
const struct attribute_group **groups)
|
||||
{
|
||||
if (!name)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return __hwmon_device_register(dev, name, drvdata, NULL, groups);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hwmon_device_register_with_groups);
|
||||
@ -674,6 +679,9 @@ hwmon_device_register_with_info(struct device *dev, const char *name,
|
||||
const struct hwmon_chip_info *chip,
|
||||
const struct attribute_group **extra_groups)
|
||||
{
|
||||
if (!name)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (chip && (!chip->ops || !chip->ops->is_visible || !chip->info))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@ -695,7 +703,7 @@ struct device *hwmon_device_register(struct device *dev)
|
||||
dev_warn(dev,
|
||||
"hwmon_device_register() is deprecated. Please convert the driver to use hwmon_device_register_with_info().\n");
|
||||
|
||||
return hwmon_device_register_with_groups(dev, NULL, NULL, NULL);
|
||||
return __hwmon_device_register(dev, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hwmon_device_register);
|
||||
|
||||
|
@ -43,8 +43,8 @@
|
||||
*/
|
||||
|
||||
/* Sensor resolution : 0.5 degree C */
|
||||
static ssize_t show_temp(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev->parent);
|
||||
long temp;
|
||||
@ -83,7 +83,7 @@ static ssize_t show_alarm(struct device *dev,
|
||||
return sprintf(buf, "%u\n", (unsigned int)ctsts & (1 << nr));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_thresh, NULL, 0xE2);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_thresh, NULL, 0xEC);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_thresh, NULL, 0xEE);
|
||||
|
@ -114,14 +114,14 @@ struct i5k_amb_data {
|
||||
unsigned int num_attrs;
|
||||
};
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%s\n", DRVNAME);
|
||||
}
|
||||
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct platform_device *amb_pdev;
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
*
|
||||
* Supports: IT8603E Super I/O chip w/LPC interface
|
||||
* IT8620E Super I/O chip w/LPC interface
|
||||
* IT8622E Super I/O chip w/LPC interface
|
||||
* IT8623E Super I/O chip w/LPC interface
|
||||
* IT8628E Super I/O chip w/LPC interface
|
||||
* IT8705F Super I/O chip w/LPC interface
|
||||
@ -31,6 +32,7 @@
|
||||
* IT8783E/F Super I/O chip w/LPC interface
|
||||
* IT8786E Super I/O chip w/LPC interface
|
||||
* IT8790E Super I/O chip w/LPC interface
|
||||
* IT8792E Super I/O chip w/LPC interface
|
||||
* Sis950 A clone of the IT8705F
|
||||
*
|
||||
* Copyright (C) 2001 Chris Gauthron
|
||||
@ -69,8 +71,8 @@
|
||||
#define DRVNAME "it87"
|
||||
|
||||
enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8732,
|
||||
it8771, it8772, it8781, it8782, it8783, it8786, it8790, it8603,
|
||||
it8620, it8628 };
|
||||
it8771, it8772, it8781, it8782, it8783, it8786, it8790,
|
||||
it8792, it8603, it8620, it8622, it8628 };
|
||||
|
||||
static unsigned short force_id;
|
||||
module_param(force_id, ushort, 0);
|
||||
@ -151,6 +153,7 @@ static inline void superio_exit(int ioreg)
|
||||
#define IT8726F_DEVID 0x8726
|
||||
#define IT8728F_DEVID 0x8728
|
||||
#define IT8732F_DEVID 0x8732
|
||||
#define IT8792E_DEVID 0x8733
|
||||
#define IT8771E_DEVID 0x8771
|
||||
#define IT8772E_DEVID 0x8772
|
||||
#define IT8781F_DEVID 0x8781
|
||||
@ -160,6 +163,7 @@ static inline void superio_exit(int ioreg)
|
||||
#define IT8790E_DEVID 0x8790
|
||||
#define IT8603E_DEVID 0x8603
|
||||
#define IT8620E_DEVID 0x8620
|
||||
#define IT8622E_DEVID 0x8622
|
||||
#define IT8623E_DEVID 0x8623
|
||||
#define IT8628E_DEVID 0x8628
|
||||
#define IT87_ACT_REG 0x30
|
||||
@ -293,9 +297,11 @@ struct it87_devices {
|
||||
#define FEAT_SIX_FANS BIT(11) /* Supports six fans */
|
||||
#define FEAT_10_9MV_ADC BIT(12)
|
||||
#define FEAT_AVCC3 BIT(13) /* Chip supports in9/AVCC3 */
|
||||
#define FEAT_SIX_PWM BIT(14) /* Chip supports 6 pwm chn */
|
||||
#define FEAT_PWM_FREQ2 BIT(15) /* Separate pwm freq 2 */
|
||||
#define FEAT_SIX_TEMP BIT(16) /* Up to 6 temp sensors */
|
||||
#define FEAT_FIVE_PWM BIT(14) /* Chip supports 5 pwm chn */
|
||||
#define FEAT_SIX_PWM BIT(15) /* Chip supports 6 pwm chn */
|
||||
#define FEAT_PWM_FREQ2 BIT(16) /* Separate pwm freq 2 */
|
||||
#define FEAT_SIX_TEMP BIT(17) /* Up to 6 temp sensors */
|
||||
#define FEAT_VIN3_5V BIT(18) /* VIN3 connected to +5V */
|
||||
|
||||
static const struct it87_devices it87_devices[] = {
|
||||
[it87] = {
|
||||
@ -419,6 +425,15 @@ static const struct it87_devices it87_devices[] = {
|
||||
| FEAT_PWM_FREQ2,
|
||||
.peci_mask = 0x07,
|
||||
},
|
||||
[it8792] = {
|
||||
.name = "it8792",
|
||||
.suffix = "E",
|
||||
.features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
|
||||
| FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
|
||||
| FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL,
|
||||
.peci_mask = 0x07,
|
||||
.old_peci_mask = 0x02, /* Actually reports PCH */
|
||||
},
|
||||
[it8603] = {
|
||||
.name = "it8603",
|
||||
.suffix = "E",
|
||||
@ -433,7 +448,16 @@ static const struct it87_devices it87_devices[] = {
|
||||
.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
|
||||
| FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS
|
||||
| FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
|
||||
| FEAT_SIX_TEMP,
|
||||
| FEAT_SIX_TEMP | FEAT_VIN3_5V,
|
||||
.peci_mask = 0x07,
|
||||
},
|
||||
[it8622] = {
|
||||
.name = "it8622",
|
||||
.suffix = "E",
|
||||
.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
|
||||
| FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
|
||||
| FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2
|
||||
| FEAT_AVCC3 | FEAT_VIN3_5V,
|
||||
.peci_mask = 0x07,
|
||||
},
|
||||
[it8628] = {
|
||||
@ -442,7 +466,7 @@ static const struct it87_devices it87_devices[] = {
|
||||
.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
|
||||
| FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS
|
||||
| FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
|
||||
| FEAT_SIX_TEMP,
|
||||
| FEAT_SIX_TEMP | FEAT_VIN3_5V,
|
||||
.peci_mask = 0x07,
|
||||
},
|
||||
};
|
||||
@ -465,9 +489,12 @@ static const struct it87_devices it87_devices[] = {
|
||||
#define has_in7_internal(data) ((data)->features & FEAT_IN7_INTERNAL)
|
||||
#define has_six_fans(data) ((data)->features & FEAT_SIX_FANS)
|
||||
#define has_avcc3(data) ((data)->features & FEAT_AVCC3)
|
||||
#define has_five_pwm(data) ((data)->features & (FEAT_FIVE_PWM \
|
||||
| FEAT_SIX_PWM))
|
||||
#define has_six_pwm(data) ((data)->features & FEAT_SIX_PWM)
|
||||
#define has_pwm_freq2(data) ((data)->features & FEAT_PWM_FREQ2)
|
||||
#define has_six_temp(data) ((data)->features & FEAT_SIX_TEMP)
|
||||
#define has_vin3_5v(data) ((data)->features & FEAT_VIN3_5V)
|
||||
|
||||
struct it87_sio_data {
|
||||
enum chips type;
|
||||
@ -1300,25 +1327,35 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,
|
||||
data->fan_main_ctrl);
|
||||
} else {
|
||||
u8 ctrl;
|
||||
|
||||
/* No on/off mode, set maximum pwm value */
|
||||
data->pwm_duty[nr] = pwm_to_reg(data, 0xff);
|
||||
it87_write_value(data, IT87_REG_PWM_DUTY[nr],
|
||||
data->pwm_duty[nr]);
|
||||
/* and set manual mode */
|
||||
data->pwm_ctrl[nr] = has_newer_autopwm(data) ?
|
||||
data->pwm_temp_map[nr] :
|
||||
data->pwm_duty[nr];
|
||||
it87_write_value(data, IT87_REG_PWM[nr],
|
||||
data->pwm_ctrl[nr]);
|
||||
if (has_newer_autopwm(data)) {
|
||||
ctrl = (data->pwm_ctrl[nr] & 0x7c) |
|
||||
data->pwm_temp_map[nr];
|
||||
} else {
|
||||
ctrl = data->pwm_duty[nr];
|
||||
}
|
||||
data->pwm_ctrl[nr] = ctrl;
|
||||
it87_write_value(data, IT87_REG_PWM[nr], ctrl);
|
||||
}
|
||||
} else {
|
||||
if (val == 1) /* Manual mode */
|
||||
data->pwm_ctrl[nr] = has_newer_autopwm(data) ?
|
||||
data->pwm_temp_map[nr] :
|
||||
data->pwm_duty[nr];
|
||||
else /* Automatic mode */
|
||||
data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
|
||||
it87_write_value(data, IT87_REG_PWM[nr], data->pwm_ctrl[nr]);
|
||||
u8 ctrl;
|
||||
|
||||
if (has_newer_autopwm(data)) {
|
||||
ctrl = (data->pwm_ctrl[nr] & 0x7c) |
|
||||
data->pwm_temp_map[nr];
|
||||
if (val != 1)
|
||||
ctrl |= 0x80;
|
||||
} else {
|
||||
ctrl = (val == 1 ? data->pwm_duty[nr] : 0x80);
|
||||
}
|
||||
data->pwm_ctrl[nr] = ctrl;
|
||||
it87_write_value(data, IT87_REG_PWM[nr], ctrl);
|
||||
|
||||
if (data->type != it8603 && nr < 3) {
|
||||
/* set SmartGuardian mode */
|
||||
@ -1344,6 +1381,7 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
it87_update_pwm_ctrl(data, nr);
|
||||
if (has_newer_autopwm(data)) {
|
||||
/*
|
||||
* If we are in automatic mode, the PWM duty cycle register
|
||||
@ -1456,13 +1494,15 @@ static ssize_t set_pwm_temp_map(struct device *dev,
|
||||
}
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
it87_update_pwm_ctrl(data, nr);
|
||||
data->pwm_temp_map[nr] = reg;
|
||||
/*
|
||||
* If we are in automatic mode, write the temp mapping immediately;
|
||||
* otherwise, just store it for later use.
|
||||
*/
|
||||
if (data->pwm_ctrl[nr] & 0x80) {
|
||||
data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
|
||||
data->pwm_ctrl[nr] = (data->pwm_ctrl[nr] & 0xfc) |
|
||||
data->pwm_temp_map[nr];
|
||||
it87_write_value(data, IT87_REG_PWM[nr], data->pwm_ctrl[nr]);
|
||||
}
|
||||
mutex_unlock(&data->update_lock);
|
||||
@ -1762,14 +1802,14 @@ static SENSOR_DEVICE_ATTR(pwm6_auto_slope, S_IRUGO | S_IWUSR,
|
||||
show_auto_pwm_slope, set_auto_pwm_slope, 5);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct it87_data *data = it87_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -1877,16 +1917,16 @@ static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR,
|
||||
static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO, show_beep, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO, show_beep, NULL, 2);
|
||||
|
||||
static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct it87_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%u\n", data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct it87_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -1898,16 +1938,16 @@ static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct it87_data *data = it87_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%ld\n", (long)vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_label(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -1916,17 +1956,21 @@ static ssize_t show_label(struct device *dev, struct device_attribute *attr,
|
||||
"+5V",
|
||||
"5VSB",
|
||||
"Vbat",
|
||||
"AVCC",
|
||||
};
|
||||
static const char * const labels_it8721[] = {
|
||||
"+3.3V",
|
||||
"3VSB",
|
||||
"Vbat",
|
||||
"+3.3V",
|
||||
};
|
||||
struct it87_data *data = dev_get_drvdata(dev);
|
||||
int nr = to_sensor_dev_attr(attr)->index;
|
||||
const char *label;
|
||||
|
||||
if (has_12mv_adc(data) || has_10_9mv_adc(data))
|
||||
if (has_vin3_5v(data) && nr == 0)
|
||||
label = labels[0];
|
||||
else if (has_12mv_adc(data) || has_10_9mv_adc(data))
|
||||
label = labels_it8721[nr];
|
||||
else
|
||||
label = labels[nr];
|
||||
@ -1937,7 +1981,7 @@ static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2);
|
||||
/* AVCC3 */
|
||||
static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 3);
|
||||
|
||||
static umode_t it87_in_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int index)
|
||||
@ -2386,6 +2430,9 @@ static int __init it87_find(int sioaddr, unsigned short *address,
|
||||
case IT8732F_DEVID:
|
||||
sio_data->type = it8732;
|
||||
break;
|
||||
case IT8792E_DEVID:
|
||||
sio_data->type = it8792;
|
||||
break;
|
||||
case IT8771E_DEVID:
|
||||
sio_data->type = it8771;
|
||||
break;
|
||||
@ -2414,6 +2461,9 @@ static int __init it87_find(int sioaddr, unsigned short *address,
|
||||
case IT8620E_DEVID:
|
||||
sio_data->type = it8620;
|
||||
break;
|
||||
case IT8622E_DEVID:
|
||||
sio_data->type = it8622;
|
||||
break;
|
||||
case IT8628E_DEVID:
|
||||
sio_data->type = it8628;
|
||||
break;
|
||||
@ -2457,8 +2507,10 @@ static int __init it87_find(int sioaddr, unsigned short *address,
|
||||
else
|
||||
sio_data->skip_in |= BIT(9);
|
||||
|
||||
if (!has_six_pwm(config))
|
||||
if (!has_five_pwm(config))
|
||||
sio_data->skip_pwm |= BIT(3) | BIT(4) | BIT(5);
|
||||
else if (!has_six_pwm(config))
|
||||
sio_data->skip_pwm |= BIT(5);
|
||||
|
||||
if (!has_vid(config))
|
||||
sio_data->skip_vid = 1;
|
||||
@ -2587,7 +2639,7 @@ static int __init it87_find(int sioaddr, unsigned short *address,
|
||||
|
||||
/* Check for pwm4 */
|
||||
reg = superio_inb(sioaddr, IT87_SIO_GPIO4_REG);
|
||||
if (!(reg & BIT(2)))
|
||||
if (reg & BIT(2))
|
||||
sio_data->skip_pwm |= BIT(3);
|
||||
|
||||
/* Check for pwm2, fan2 */
|
||||
@ -2602,6 +2654,50 @@ static int __init it87_find(int sioaddr, unsigned short *address,
|
||||
sio_data->skip_fan |= BIT(5);
|
||||
}
|
||||
|
||||
/* Check if AVCC is on VIN3 */
|
||||
reg = superio_inb(sioaddr, IT87_SIO_PINX2_REG);
|
||||
if (reg & BIT(0))
|
||||
sio_data->internal |= BIT(0);
|
||||
else
|
||||
sio_data->skip_in |= BIT(9);
|
||||
|
||||
sio_data->beep_pin = superio_inb(sioaddr,
|
||||
IT87_SIO_BEEP_PIN_REG) & 0x3f;
|
||||
} else if (sio_data->type == it8622) {
|
||||
int reg;
|
||||
|
||||
superio_select(sioaddr, GPIO);
|
||||
|
||||
/* Check for pwm4, fan4 */
|
||||
reg = superio_inb(sioaddr, IT87_SIO_GPIO1_REG);
|
||||
if (reg & BIT(6))
|
||||
sio_data->skip_fan |= BIT(3);
|
||||
if (reg & BIT(5))
|
||||
sio_data->skip_pwm |= BIT(3);
|
||||
|
||||
/* Check for pwm3, fan3, pwm5, fan5 */
|
||||
reg = superio_inb(sioaddr, IT87_SIO_GPIO3_REG);
|
||||
if (reg & BIT(6))
|
||||
sio_data->skip_pwm |= BIT(2);
|
||||
if (reg & BIT(7))
|
||||
sio_data->skip_fan |= BIT(2);
|
||||
if (reg & BIT(3))
|
||||
sio_data->skip_pwm |= BIT(4);
|
||||
if (reg & BIT(1))
|
||||
sio_data->skip_fan |= BIT(4);
|
||||
|
||||
/* Check for pwm2, fan2 */
|
||||
reg = superio_inb(sioaddr, IT87_SIO_GPIO5_REG);
|
||||
if (reg & BIT(1))
|
||||
sio_data->skip_pwm |= BIT(1);
|
||||
if (reg & BIT(2))
|
||||
sio_data->skip_fan |= BIT(1);
|
||||
|
||||
/* Check for AVCC */
|
||||
reg = superio_inb(sioaddr, IT87_SIO_PINX2_REG);
|
||||
if (!(reg & BIT(0)))
|
||||
sio_data->skip_in |= BIT(9);
|
||||
|
||||
sio_data->beep_pin = superio_inb(sioaddr,
|
||||
IT87_SIO_BEEP_PIN_REG) & 0x3f;
|
||||
} else {
|
||||
|
@ -44,8 +44,8 @@ static irqreturn_t jz4740_hwmon_irq(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static ssize_t jz4740_hwmon_read_adcin(struct device *dev,
|
||||
struct device_attribute *dev_attr, char *buf)
|
||||
static ssize_t in0_input_show(struct device *dev,
|
||||
struct device_attribute *dev_attr, char *buf)
|
||||
{
|
||||
struct jz4740_hwmon *hwmon = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev = hwmon->pdev;
|
||||
@ -79,7 +79,7 @@ static ssize_t jz4740_hwmon_read_adcin(struct device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(in0_input, S_IRUGO, jz4740_hwmon_read_adcin, NULL);
|
||||
static DEVICE_ATTR_RO(in0_input);
|
||||
|
||||
static struct attribute *jz4740_attrs[] = {
|
||||
&dev_attr_in0_input.attr,
|
||||
|
@ -72,8 +72,8 @@ static void amd_nb_smu_index_read(struct pci_dev *pdev, unsigned int devfn,
|
||||
mutex_unlock(&nb_smu_ind_mutex);
|
||||
}
|
||||
|
||||
static ssize_t show_temp(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
u32 regval;
|
||||
struct pci_dev *pdev = dev_get_drvdata(dev);
|
||||
@ -88,8 +88,8 @@ static ssize_t show_temp(struct device *dev,
|
||||
return sprintf(buf, "%u\n", (regval >> 21) * 125);
|
||||
}
|
||||
|
||||
static ssize_t show_temp_max(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_max_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", 70 * 1000);
|
||||
}
|
||||
@ -110,8 +110,8 @@ static ssize_t show_temp_crit(struct device *dev,
|
||||
return sprintf(buf, "%d\n", value);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
|
||||
static DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_max, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static DEVICE_ATTR_RO(temp1_max);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, show_temp_crit, NULL, 1);
|
||||
|
||||
|
@ -100,7 +100,7 @@ static struct k8temp_data *k8temp_update_device(struct device *dev)
|
||||
* Sysfs stuff
|
||||
*/
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct k8temp_data *data = dev_get_drvdata(dev);
|
||||
@ -133,7 +133,7 @@ static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0);
|
||||
static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1);
|
||||
static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 1, 0);
|
||||
static SENSOR_DEVICE_ATTR_2(temp4_input, S_IRUGO, show_temp, NULL, 1, 1);
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static const struct pci_device_id k8temp_ids[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_MISC) },
|
||||
|
@ -417,16 +417,16 @@ static ssize_t set_pwm1(struct device *dev, struct device_attribute *devattr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_pwm1_enable(struct device *dev,
|
||||
static ssize_t pwm1_enable_show(struct device *dev,
|
||||
struct device_attribute *dummy, char *buf)
|
||||
{
|
||||
struct lm63_data *data = lm63_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->config_fan & 0x20 ? 1 : 2);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm1_enable(struct device *dev,
|
||||
struct device_attribute *dummy,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *dummy,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm63_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -600,7 +600,7 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
|
||||
* Hysteresis register holds a relative value, while we want to present
|
||||
* an absolute to user-space
|
||||
*/
|
||||
static ssize_t show_temp2_crit_hyst(struct device *dev,
|
||||
static ssize_t temp2_crit_hyst_show(struct device *dev,
|
||||
struct device_attribute *dummy, char *buf)
|
||||
{
|
||||
struct lm63_data *data = lm63_update_device(dev);
|
||||
@ -624,9 +624,9 @@ static ssize_t show_lut_temp_hyst(struct device *dev,
|
||||
* And now the other way around, user-space provides an absolute
|
||||
* hysteresis value and we have to store a relative one
|
||||
*/
|
||||
static ssize_t set_temp2_crit_hyst(struct device *dev,
|
||||
struct device_attribute *dummy,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp2_crit_hyst_store(struct device *dev,
|
||||
struct device_attribute *dummy,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm63_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -670,7 +670,7 @@ static void lm63_set_convrate(struct lm63_data *data, unsigned int interval)
|
||||
data->update_interval = UPDATE_INTERVAL(data->max_convrate_hz, i);
|
||||
}
|
||||
|
||||
static ssize_t show_update_interval(struct device *dev,
|
||||
static ssize_t update_interval_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm63_data *data = dev_get_drvdata(dev);
|
||||
@ -678,9 +678,9 @@ static ssize_t show_update_interval(struct device *dev,
|
||||
return sprintf(buf, "%u\n", data->update_interval);
|
||||
}
|
||||
|
||||
static ssize_t set_update_interval(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t update_interval_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm63_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -697,16 +697,17 @@ static ssize_t set_update_interval(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_type(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t temp2_type_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm63_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, data->trutherm ? "1\n" : "2\n");
|
||||
}
|
||||
|
||||
static ssize_t set_type(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp2_type_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm63_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -731,7 +732,7 @@ static ssize_t set_type(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *dummy,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *dummy,
|
||||
char *buf)
|
||||
{
|
||||
struct lm63_data *data = lm63_update_device(dev);
|
||||
@ -753,8 +754,7 @@ static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan,
|
||||
set_fan, 1);
|
||||
|
||||
static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm1, set_pwm1, 0);
|
||||
static DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
|
||||
show_pwm1_enable, set_pwm1_enable);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO,
|
||||
show_pwm1, set_pwm1, 1);
|
||||
static SENSOR_DEVICE_ATTR(pwm1_auto_point1_temp, S_IWUSR | S_IRUGO,
|
||||
@ -841,10 +841,9 @@ static SENSOR_DEVICE_ATTR(temp2_offset, S_IWUSR | S_IRUGO, show_temp11,
|
||||
set_temp11, 3);
|
||||
static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO, show_remote_temp8,
|
||||
set_temp8, 2);
|
||||
static DEVICE_ATTR(temp2_crit_hyst, S_IWUSR | S_IRUGO, show_temp2_crit_hyst,
|
||||
set_temp2_crit_hyst);
|
||||
static DEVICE_ATTR_RW(temp2_crit_hyst);
|
||||
|
||||
static DEVICE_ATTR(temp2_type, S_IWUSR | S_IRUGO, show_type, set_type);
|
||||
static DEVICE_ATTR_RW(temp2_type);
|
||||
|
||||
/* Individual alarm files */
|
||||
static SENSOR_DEVICE_ATTR(fan1_min_alarm, S_IRUGO, show_alarm, NULL, 0);
|
||||
@ -854,10 +853,9 @@ static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3);
|
||||
static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6);
|
||||
/* Raw alarm file for compatibility */
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval,
|
||||
set_update_interval);
|
||||
static DEVICE_ATTR_RW(update_interval);
|
||||
|
||||
static struct attribute *lm63_attributes[] = {
|
||||
&sensor_dev_attr_pwm1.dev_attr.attr,
|
||||
|
@ -46,6 +46,7 @@
|
||||
#define LM70_CHIP_TMP121 1 /* TI TMP121/TMP123 */
|
||||
#define LM70_CHIP_LM71 2 /* NS LM71 */
|
||||
#define LM70_CHIP_LM74 3 /* NS LM74 */
|
||||
#define LM70_CHIP_TMP122 4 /* TI TMP122/TMP124 */
|
||||
|
||||
struct lm70 {
|
||||
struct spi_device *spi;
|
||||
@ -54,8 +55,8 @@ struct lm70 {
|
||||
};
|
||||
|
||||
/* sysfs hook function */
|
||||
static ssize_t lm70_sense_temp(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm70 *p_lm70 = dev_get_drvdata(dev);
|
||||
struct spi_device *spi = p_lm70->spi;
|
||||
@ -72,7 +73,8 @@ static ssize_t lm70_sense_temp(struct device *dev,
|
||||
*/
|
||||
status = spi_write_then_read(spi, NULL, 0, &rxbuf[0], 2);
|
||||
if (status < 0) {
|
||||
pr_warn("spi_write_then_read failed with status %d\n", status);
|
||||
dev_warn(dev, "spi_write_then_read failed with status %d\n",
|
||||
status);
|
||||
goto out;
|
||||
}
|
||||
raw = (rxbuf[0] << 8) + rxbuf[1];
|
||||
@ -91,7 +93,7 @@ static ssize_t lm70_sense_temp(struct device *dev,
|
||||
* Celsius.
|
||||
* So it's equivalent to multiplying by 0.25 * 1000 = 250.
|
||||
*
|
||||
* LM74 and TMP121/TMP123:
|
||||
* LM74 and TMP121/TMP122/TMP123/TMP124:
|
||||
* 13 bits of 2's complement data, discard LSB 3 bits,
|
||||
* resolution 0.0625 degrees celsius.
|
||||
*
|
||||
@ -105,6 +107,7 @@ static ssize_t lm70_sense_temp(struct device *dev,
|
||||
break;
|
||||
|
||||
case LM70_CHIP_TMP121:
|
||||
case LM70_CHIP_TMP122:
|
||||
case LM70_CHIP_LM74:
|
||||
val = ((int)raw / 8) * 625 / 10;
|
||||
break;
|
||||
@ -120,7 +123,7 @@ static ssize_t lm70_sense_temp(struct device *dev,
|
||||
return status;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, lm70_sense_temp, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
|
||||
static struct attribute *lm70_attrs[] = {
|
||||
&dev_attr_temp1_input.attr,
|
||||
@ -141,6 +144,10 @@ static const struct of_device_id lm70_of_ids[] = {
|
||||
.compatible = "ti,tmp121",
|
||||
.data = (void *) LM70_CHIP_TMP121,
|
||||
},
|
||||
{
|
||||
.compatible = "ti,tmp122",
|
||||
.data = (void *) LM70_CHIP_TMP122,
|
||||
},
|
||||
{
|
||||
.compatible = "ti,lm71",
|
||||
.data = (void *) LM70_CHIP_LM71,
|
||||
@ -190,6 +197,7 @@ static int lm70_probe(struct spi_device *spi)
|
||||
static const struct spi_device_id lm70_ids[] = {
|
||||
{ "lm70", LM70_CHIP_LM70 },
|
||||
{ "tmp121", LM70_CHIP_TMP121 },
|
||||
{ "tmp122", LM70_CHIP_TMP122 },
|
||||
{ "lm71", LM70_CHIP_LM71 },
|
||||
{ "lm74", LM70_CHIP_LM74 },
|
||||
{ },
|
||||
|
@ -236,22 +236,23 @@ show_in_offset(5);
|
||||
show_in_offset(6);
|
||||
|
||||
/* Temperature */
|
||||
static ssize_t show_temp(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct lm78_data *data = lm78_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
|
||||
}
|
||||
|
||||
static ssize_t show_temp_over(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t temp1_max_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct lm78_data *data = lm78_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
|
||||
}
|
||||
|
||||
static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp1_max_store(struct device *dev,
|
||||
struct device_attribute *da, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct lm78_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -268,15 +269,16 @@ static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t temp1_max_hyst_show(struct device *dev,
|
||||
struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct lm78_data *data = lm78_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
|
||||
}
|
||||
|
||||
static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp1_max_hyst_store(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm78_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -293,11 +295,9 @@ static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
|
||||
static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
|
||||
show_temp_over, set_temp_over);
|
||||
static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
|
||||
show_temp_hyst, set_temp_hyst);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static DEVICE_ATTR_RW(temp1_max);
|
||||
static DEVICE_ATTR_RW(temp1_max_hyst);
|
||||
|
||||
/* 3 Fans */
|
||||
static ssize_t show_fan(struct device *dev, struct device_attribute *da,
|
||||
@ -431,22 +431,22 @@ static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
|
||||
static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2);
|
||||
|
||||
/* VID */
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct lm78_data *data = lm78_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct lm78_data *data = lm78_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
|
@ -432,7 +432,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm80_data *data = lm80_update_device(dev);
|
||||
@ -505,7 +505,7 @@ static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp,
|
||||
set_temp, t_os_max);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temp,
|
||||
set_temp, t_os_hyst);
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
|
||||
|
@ -188,7 +188,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *dummy,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *dummy,
|
||||
char *buf)
|
||||
{
|
||||
struct lm83_data *data = lm83_update_device(dev);
|
||||
@ -236,7 +236,7 @@ static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO, show_alarm, NULL, 12);
|
||||
static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 13);
|
||||
static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 15);
|
||||
/* Raw alarm file for compatibility */
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static struct attribute *lm83_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
|
@ -604,8 +604,8 @@ show_fan_offset(4);
|
||||
|
||||
/* vid, vrm, alarms */
|
||||
|
||||
static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm85_data *data = lm85_update_device(dev);
|
||||
int vid;
|
||||
@ -621,17 +621,17 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%d\n", vid);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm85_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%ld\n", (long) data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm85_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -648,16 +648,16 @@ static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t show_alarms_reg(struct device *dev, struct device_attribute
|
||||
*attr, char *buf)
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm85_data *data = lm85_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -445,23 +445,23 @@ set_temp(1);
|
||||
set_temp(2);
|
||||
set_temp(3);
|
||||
|
||||
static ssize_t show_temp_crit_int(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_crit_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm87_data *data = lm87_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit_int));
|
||||
}
|
||||
|
||||
static ssize_t show_temp_crit_ext(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp2_crit_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm87_data *data = lm87_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit_ext));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit_int, NULL);
|
||||
static DEVICE_ATTR(temp2_crit, S_IRUGO, show_temp_crit_ext, NULL);
|
||||
static DEVICE_ATTR(temp3_crit, S_IRUGO, show_temp_crit_ext, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_crit);
|
||||
static DEVICE_ATTR_RO(temp2_crit);
|
||||
static DEVICE_ATTR(temp3_crit, S_IRUGO, temp2_crit_show, NULL);
|
||||
|
||||
static ssize_t show_fan_input(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
@ -586,30 +586,30 @@ static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
|
||||
set_fan(1);
|
||||
set_fan(2);
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm87_data *data = lm87_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm87_data *data = lm87_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm87_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
}
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm87_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -625,16 +625,17 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
data->vrm = val;
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t show_aout(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t aout_output_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm87_data *data = lm87_update_device(dev);
|
||||
return sprintf(buf, "%d\n", AOUT_FROM_REG(data->aout));
|
||||
}
|
||||
static ssize_t set_aout(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t aout_output_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = dev_get_drvdata(dev);
|
||||
struct lm87_data *data = i2c_get_clientdata(client);
|
||||
@ -651,7 +652,7 @@ static ssize_t set_aout(struct device *dev, struct device_attribute *attr,
|
||||
mutex_unlock(&data->update_lock);
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);
|
||||
static DEVICE_ATTR_RW(aout_output);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -830,7 +830,7 @@ static u16 temp_to_u16_adt7461(struct lm90_data *data, long val)
|
||||
}
|
||||
|
||||
/* pec used for ADM1032 only */
|
||||
static ssize_t show_pec(struct device *dev, struct device_attribute *dummy,
|
||||
static ssize_t pec_show(struct device *dev, struct device_attribute *dummy,
|
||||
char *buf)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
@ -838,8 +838,8 @@ static ssize_t show_pec(struct device *dev, struct device_attribute *dummy,
|
||||
return sprintf(buf, "%d\n", !!(client->flags & I2C_CLIENT_PEC));
|
||||
}
|
||||
|
||||
static ssize_t set_pec(struct device *dev, struct device_attribute *dummy,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pec_store(struct device *dev, struct device_attribute *dummy,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
long val;
|
||||
@ -863,7 +863,7 @@ static ssize_t set_pec(struct device *dev, struct device_attribute *dummy,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pec, S_IWUSR | S_IRUGO, show_pec, set_pec);
|
||||
static DEVICE_ATTR_RW(pec);
|
||||
|
||||
static int lm90_get_temp11(struct lm90_data *data, int index)
|
||||
{
|
||||
|
@ -181,8 +181,8 @@ static ssize_t show_temp_hyst(struct device *dev,
|
||||
- TEMP_FROM_REG(data->temp[t_hyst]));
|
||||
}
|
||||
|
||||
static ssize_t show_temp_min_hyst(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t temp1_min_hyst_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm92_data *data = lm92_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[t_min])
|
||||
@ -213,7 +213,7 @@ static ssize_t set_temp_hyst(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm92_data *data = lm92_update_device(dev);
|
||||
@ -235,11 +235,11 @@ static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temp_hyst,
|
||||
set_temp_hyst, t_crit);
|
||||
static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp, set_temp,
|
||||
t_min);
|
||||
static DEVICE_ATTR(temp1_min_hyst, S_IRUGO, show_temp_min_hyst, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_min_hyst);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp, set_temp,
|
||||
t_max);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_temp_hyst, NULL, t_max);
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 1);
|
||||
|
@ -2156,7 +2156,7 @@ static SENSOR_DEVICE_ATTR(pwm2_auto_spinup_time, S_IWUSR | S_IRUGO,
|
||||
show_pwm_auto_spinup_time,
|
||||
store_pwm_auto_spinup_time, 1);
|
||||
|
||||
static ssize_t show_pwm_auto_prochot_ramp(struct device *dev,
|
||||
static ssize_t pwm_auto_prochot_ramp_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm93_data *data = lm93_update_device(dev);
|
||||
@ -2164,7 +2164,7 @@ static ssize_t show_pwm_auto_prochot_ramp(struct device *dev,
|
||||
LM93_RAMP_FROM_REG(data->pwm_ramp_ctl >> 4 & 0x0f));
|
||||
}
|
||||
|
||||
static ssize_t store_pwm_auto_prochot_ramp(struct device *dev,
|
||||
static ssize_t pwm_auto_prochot_ramp_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
@ -2186,11 +2186,9 @@ static ssize_t store_pwm_auto_prochot_ramp(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pwm_auto_prochot_ramp, S_IRUGO | S_IWUSR,
|
||||
show_pwm_auto_prochot_ramp,
|
||||
store_pwm_auto_prochot_ramp);
|
||||
static DEVICE_ATTR_RW(pwm_auto_prochot_ramp);
|
||||
|
||||
static ssize_t show_pwm_auto_vrdhot_ramp(struct device *dev,
|
||||
static ssize_t pwm_auto_vrdhot_ramp_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm93_data *data = lm93_update_device(dev);
|
||||
@ -2198,7 +2196,7 @@ static ssize_t show_pwm_auto_vrdhot_ramp(struct device *dev,
|
||||
LM93_RAMP_FROM_REG(data->pwm_ramp_ctl & 0x0f));
|
||||
}
|
||||
|
||||
static ssize_t store_pwm_auto_vrdhot_ramp(struct device *dev,
|
||||
static ssize_t pwm_auto_vrdhot_ramp_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
@ -2220,9 +2218,7 @@ static ssize_t store_pwm_auto_vrdhot_ramp(struct device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pwm_auto_vrdhot_ramp, S_IRUGO | S_IWUSR,
|
||||
show_pwm_auto_vrdhot_ramp,
|
||||
store_pwm_auto_vrdhot_ramp);
|
||||
static DEVICE_ATTR_RW(pwm_auto_vrdhot_ramp);
|
||||
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -2378,7 +2374,7 @@ static SENSOR_DEVICE_ATTR(prochot1_interval, S_IWUSR | S_IRUGO,
|
||||
static SENSOR_DEVICE_ATTR(prochot2_interval, S_IWUSR | S_IRUGO,
|
||||
show_prochot_interval, store_prochot_interval, 1);
|
||||
|
||||
static ssize_t show_prochot_override_duty_cycle(struct device *dev,
|
||||
static ssize_t prochot_override_duty_cycle_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
@ -2386,7 +2382,7 @@ static ssize_t show_prochot_override_duty_cycle(struct device *dev,
|
||||
return sprintf(buf, "%d\n", data->prochot_override & 0x0f);
|
||||
}
|
||||
|
||||
static ssize_t store_prochot_override_duty_cycle(struct device *dev,
|
||||
static ssize_t prochot_override_duty_cycle_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
@ -2408,18 +2404,16 @@ static ssize_t store_prochot_override_duty_cycle(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(prochot_override_duty_cycle, S_IRUGO | S_IWUSR,
|
||||
show_prochot_override_duty_cycle,
|
||||
store_prochot_override_duty_cycle);
|
||||
static DEVICE_ATTR_RW(prochot_override_duty_cycle);
|
||||
|
||||
static ssize_t show_prochot_short(struct device *dev,
|
||||
static ssize_t prochot_short_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm93_data *data = lm93_update_device(dev);
|
||||
return sprintf(buf, "%d\n", (data->config & 0x10) ? 1 : 0);
|
||||
}
|
||||
|
||||
static ssize_t store_prochot_short(struct device *dev,
|
||||
static ssize_t prochot_short_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
@ -2442,8 +2436,7 @@ static ssize_t store_prochot_short(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(prochot_short, S_IRUGO | S_IWUSR,
|
||||
show_prochot_short, store_prochot_short);
|
||||
static DEVICE_ATTR_RW(prochot_short);
|
||||
|
||||
static ssize_t show_vrdhot(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -2457,23 +2450,23 @@ static ssize_t show_vrdhot(struct device *dev, struct device_attribute *attr,
|
||||
static SENSOR_DEVICE_ATTR(vrdhot1, S_IRUGO, show_vrdhot, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(vrdhot2, S_IRUGO, show_vrdhot, NULL, 1);
|
||||
|
||||
static ssize_t show_gpio(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t gpio_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm93_data *data = lm93_update_device(dev);
|
||||
return sprintf(buf, "%d\n", LM93_GPI_FROM_REG(data->gpi));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(gpio, S_IRUGO, show_gpio, NULL);
|
||||
static DEVICE_ATTR_RO(gpio);
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct lm93_data *data = lm93_update_device(dev);
|
||||
return sprintf(buf, "%d\n", LM93_ALARMS_FROM_REG(data->block1));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static struct attribute *lm93_attrs[] = {
|
||||
&sensor_dev_attr_in1_input.dev_attr.attr,
|
||||
|
@ -450,8 +450,8 @@ static ssize_t set_offset(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_interval(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t update_interval_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct lm95234_data *data = dev_get_drvdata(dev);
|
||||
int ret = lm95234_update_device(data);
|
||||
@ -463,8 +463,9 @@ static ssize_t show_interval(struct device *dev, struct device_attribute *attr,
|
||||
DIV_ROUND_CLOSEST(data->interval * 1000, HZ));
|
||||
}
|
||||
|
||||
static ssize_t set_interval(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t update_interval_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lm95234_data *data = dev_get_drvdata(dev);
|
||||
int ret = lm95234_update_device(data);
|
||||
@ -566,8 +567,7 @@ static SENSOR_DEVICE_ATTR(temp4_offset, S_IWUSR | S_IRUGO, show_offset,
|
||||
static SENSOR_DEVICE_ATTR(temp5_offset, S_IWUSR | S_IRUGO, show_offset,
|
||||
set_offset, 3);
|
||||
|
||||
static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_interval,
|
||||
set_interval);
|
||||
static DEVICE_ATTR_RW(update_interval);
|
||||
|
||||
static struct attribute *lm95234_common_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
|
@ -215,6 +215,7 @@ static const struct of_device_id ltc4151_match[] = {
|
||||
{ .compatible = "lltc,ltc4151" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ltc4151_match);
|
||||
|
||||
/* This is the driver that will be inserted */
|
||||
static struct i2c_driver ltc4151_driver = {
|
||||
|
@ -98,7 +98,7 @@ EXPORT_SYMBOL(max1111_read_channel);
|
||||
* likely to be used by hwmon applications to distinguish between
|
||||
* different devices, explicitly add a name attribute here.
|
||||
*/
|
||||
static ssize_t show_name(struct device *dev,
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%s\n", to_spi_device(dev)->modalias);
|
||||
@ -125,7 +125,7 @@ static ssize_t show_adc(struct device *dev,
|
||||
#define MAX1111_ADC_ATTR(_id) \
|
||||
SENSOR_DEVICE_ATTR(in##_id##_input, S_IRUGO, show_adc, NULL, _id)
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
static MAX1111_ADC_ATTR(0);
|
||||
static MAX1111_ADC_ATTR(1);
|
||||
static MAX1111_ADC_ATTR(2);
|
||||
|
@ -173,7 +173,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct max1619_data *data = max1619_update_device(dev);
|
||||
@ -199,7 +199,7 @@ static SENSOR_DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp, set_temp,
|
||||
static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IWUSR | S_IRUGO, show_temp,
|
||||
set_temp, t_hyst2);
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO, show_alarm, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3);
|
||||
|
@ -207,8 +207,8 @@ static ssize_t max197_show_input(struct device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t max197_show_name(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
return sprintf(buf, "%s\n", pdev->name);
|
||||
@ -231,7 +231,7 @@ static ssize_t max197_show_name(struct device *dev,
|
||||
&sensor_dev_attr_in##chan##_max.dev_attr.attr, \
|
||||
&sensor_dev_attr_in##chan##_min.dev_attr.attr
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, max197_show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
MAX197_SENSOR_DEVICE_ATTR_CH(0);
|
||||
MAX197_SENSOR_DEVICE_ATTR_CH(1);
|
||||
|
@ -270,8 +270,8 @@ static ssize_t get_fan(struct device *dev, struct device_attribute *devattr,
|
||||
* controlled.
|
||||
*/
|
||||
|
||||
static ssize_t get_target(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
static ssize_t fan1_target_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct max6650_data *data = max6650_update_device(dev);
|
||||
int kscale, ktach, rpm;
|
||||
@ -318,8 +318,9 @@ static int max6650_set_target(struct max6650_data *data, unsigned long rpm)
|
||||
data->speed);
|
||||
}
|
||||
|
||||
static ssize_t set_target(struct device *dev, struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_target_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct max6650_data *data = dev_get_drvdata(dev);
|
||||
unsigned long rpm;
|
||||
@ -350,8 +351,8 @@ static ssize_t set_target(struct device *dev, struct device_attribute *devattr,
|
||||
* back exactly the value you have set.
|
||||
*/
|
||||
|
||||
static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
static ssize_t pwm1_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
int pwm;
|
||||
struct max6650_data *data = max6650_update_device(dev);
|
||||
@ -371,8 +372,9 @@ static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr,
|
||||
return sprintf(buf, "%d\n", pwm);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_store(struct device *dev,
|
||||
struct device_attribute *devattr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct max6650_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -406,8 +408,8 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
|
||||
* 2 = Closed loop, RPM for all fans regulated by fan1 tachometer
|
||||
* 3 = Fan off
|
||||
*/
|
||||
static ssize_t get_enable(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
static ssize_t pwm1_enable_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct max6650_data *data = max6650_update_device(dev);
|
||||
int mode = (data->config & MAX6650_CFG_MODE_MASK) >> 4;
|
||||
@ -416,8 +418,9 @@ static ssize_t get_enable(struct device *dev, struct device_attribute *devattr,
|
||||
return sprintf(buf, "%d\n", sysfs_modes[mode]);
|
||||
}
|
||||
|
||||
static ssize_t set_enable(struct device *dev, struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t pwm1_enable_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct max6650_data *data = dev_get_drvdata(dev);
|
||||
unsigned long mode;
|
||||
@ -458,16 +461,17 @@ static ssize_t set_enable(struct device *dev, struct device_attribute *devattr,
|
||||
* defined for that. See the data sheet for details.
|
||||
*/
|
||||
|
||||
static ssize_t get_div(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
static ssize_t fan1_div_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct max6650_data *data = max6650_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", DIV_FROM_REG(data->count));
|
||||
}
|
||||
|
||||
static ssize_t set_div(struct device *dev, struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t fan1_div_store(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct max6650_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -534,10 +538,10 @@ static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, get_fan, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, get_fan, NULL, 3);
|
||||
static DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, get_target, set_target);
|
||||
static DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_div, set_div);
|
||||
static DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, get_enable, set_enable);
|
||||
static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm);
|
||||
static DEVICE_ATTR_RW(fan1_target);
|
||||
static DEVICE_ATTR_RW(fan1_div);
|
||||
static DEVICE_ATTR_RW(pwm1_enable);
|
||||
static DEVICE_ATTR_RW(pwm1);
|
||||
static SENSOR_DEVICE_ATTR(fan1_max_alarm, S_IRUGO, get_alarm, NULL,
|
||||
MAX6650_ALRM_MAX);
|
||||
static SENSOR_DEVICE_ATTR(fan1_min_alarm, S_IRUGO, get_alarm, NULL,
|
||||
|
@ -40,8 +40,8 @@ struct mc13783_adc_priv {
|
||||
char name[PLATFORM_NAME_SIZE];
|
||||
};
|
||||
|
||||
static ssize_t mc13783_adc_show_name(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
struct mc13783_adc_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
@ -111,7 +111,7 @@ static ssize_t mc13783_adc_read_gp(struct device *dev,
|
||||
return sprintf(buf, "%u\n", val);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, mc13783_adc_show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, mc13783_adc_read_bp, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, mc13783_adc_read_gp, NULL, 5);
|
||||
static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, mc13783_adc_read_gp, NULL, 6);
|
||||
|
@ -86,8 +86,8 @@ static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
|
||||
return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
|
||||
}
|
||||
|
||||
static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t in0_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct mcp3021_data *data = i2c_get_clientdata(client);
|
||||
@ -102,7 +102,7 @@ static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%d\n", in_input);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(in0_input, 0444, show_in_input, NULL);
|
||||
static DEVICE_ATTR_RO(in0_input);
|
||||
|
||||
static int mcp3021_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
|
@ -979,7 +979,7 @@ static const struct sensor_template_group nct6683_pwm_template_group = {
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
show_global_beep(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
beep_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
@ -1004,7 +1004,7 @@ show_global_beep(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_global_beep(struct device *dev, struct device_attribute *attr,
|
||||
beep_enable_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||
@ -1039,7 +1039,8 @@ store_global_beep(struct device *dev, struct device_attribute *attr,
|
||||
/* Case open detection */
|
||||
|
||||
static ssize_t
|
||||
show_caseopen(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
intrusion0_alarm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
@ -1064,8 +1065,8 @@ show_caseopen(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
clear_caseopen(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
intrusion0_alarm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -1102,10 +1103,8 @@ clear_caseopen(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(intrusion0_alarm, S_IWUSR | S_IRUGO, show_caseopen,
|
||||
clear_caseopen);
|
||||
static DEVICE_ATTR(beep_enable, S_IWUSR | S_IRUGO, show_global_beep,
|
||||
store_global_beep);
|
||||
static DEVICE_ATTR_RW(intrusion0_alarm);
|
||||
static DEVICE_ATTR_RW(beep_enable);
|
||||
|
||||
static struct attribute *nct6683_attributes_other[] = {
|
||||
&dev_attr_intrusion0_alarm.attr,
|
||||
|
@ -3127,14 +3127,14 @@ static const struct sensor_template_group nct6775_pwm_template_group = {
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
show_vid(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct nct6775_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
/* Case open detection */
|
||||
|
||||
|
@ -122,8 +122,8 @@ static ssize_t show_label(struct device *dev,
|
||||
return sprintf(buf, "%s\n", nsa320_input_names[channel]);
|
||||
}
|
||||
|
||||
static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
s32 mcu_data = nsa320_hwmon_update(dev);
|
||||
|
||||
@ -133,8 +133,8 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
|
||||
return sprintf(buf, "%d\n", (mcu_data & 0xffff) * 100);
|
||||
}
|
||||
|
||||
static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t fan1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
s32 mcu_data = nsa320_hwmon_update(dev);
|
||||
|
||||
@ -145,9 +145,9 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_label, NULL, NSA320_TEMP);
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, show_label, NULL, NSA320_FAN);
|
||||
static DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL);
|
||||
static DEVICE_ATTR_RO(fan1_input);
|
||||
|
||||
static struct attribute *nsa320_attrs[] = {
|
||||
&sensor_dev_attr_temp1_label.dev_attr.attr,
|
||||
|
@ -589,22 +589,22 @@ static struct sensor_device_attribute in_max_alarm[] = {
|
||||
&in_min_alarm[X].dev_attr.attr, \
|
||||
&in_max_alarm[X].dev_attr.attr
|
||||
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pc87360_data *data = pc87360_update_device(dev);
|
||||
return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct pc87360_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%u\n", data->vrm);
|
||||
}
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct pc87360_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -620,15 +620,15 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
data->vrm = val;
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t show_in_alarms(struct device *dev,
|
||||
static ssize_t alarms_in_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pc87360_data *data = pc87360_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->in_alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms_in, S_IRUGO, show_in_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms_in);
|
||||
|
||||
static struct attribute *pc8736x_vin_attr_array[] = {
|
||||
VIN_UNIT_ATTRS(0),
|
||||
@ -1006,14 +1006,14 @@ static struct sensor_device_attribute temp_crit[] = {
|
||||
show_temp_crit, set_temp_crit, 2),
|
||||
};
|
||||
|
||||
static ssize_t show_temp_alarms(struct device *dev,
|
||||
static ssize_t alarms_temp_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pc87360_data *data = pc87360_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->temp_alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms_temp, S_IRUGO, show_temp_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms_temp);
|
||||
|
||||
/*
|
||||
* show_temp_min/max_alarm() reads data from the per-channel status
|
||||
@ -1106,14 +1106,14 @@ static const struct attribute_group pc8736x_temp_attr_group[] = {
|
||||
{ .attrs = pc8736x_temp_attr[2] }
|
||||
};
|
||||
|
||||
static ssize_t show_name(struct device *dev,
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct pc87360_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
/*
|
||||
* Device detection, registration and update
|
||||
|
@ -943,14 +943,14 @@ static const struct attribute_group pc87427_group_temp[6] = {
|
||||
{ .attrs = pc87427_attributes_temp[5] },
|
||||
};
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct pc87427_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -103,16 +103,16 @@ show_in_channel(1);
|
||||
show_in_channel(2);
|
||||
show_in_channel(3);
|
||||
|
||||
static ssize_t show_out0_ouput(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t out0_output_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pcf8591_data *data = i2c_get_clientdata(to_i2c_client(dev));
|
||||
return sprintf(buf, "%d\n", data->aout * 10);
|
||||
}
|
||||
|
||||
static ssize_t set_out0_output(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t out0_output_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
@ -132,19 +132,18 @@ static ssize_t set_out0_output(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(out0_output, S_IWUSR | S_IRUGO,
|
||||
show_out0_ouput, set_out0_output);
|
||||
static DEVICE_ATTR_RW(out0_output);
|
||||
|
||||
static ssize_t show_out0_enable(struct device *dev,
|
||||
static ssize_t out0_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pcf8591_data *data = i2c_get_clientdata(to_i2c_client(dev));
|
||||
return sprintf(buf, "%u\n", !(!(data->control & PCF8591_CONTROL_AOEF)));
|
||||
}
|
||||
|
||||
static ssize_t set_out0_enable(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t out0_enable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct pcf8591_data *data = i2c_get_clientdata(client);
|
||||
@ -165,8 +164,7 @@ static ssize_t set_out0_enable(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(out0_enable, S_IWUSR | S_IRUGO,
|
||||
show_out0_enable, set_out0_enable);
|
||||
static DEVICE_ATTR_RW(out0_enable);
|
||||
|
||||
static struct attribute *pcf8591_attributes[] = {
|
||||
&dev_attr_out0_enable.attr,
|
||||
|
@ -205,7 +205,7 @@ static int reg_to_rpm(u16 reg)
|
||||
return 5400540 / reg;
|
||||
}
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", DEVNAME);
|
||||
@ -326,7 +326,7 @@ static ssize_t show_in_label(struct device *dev, struct device_attribute
|
||||
SCH5627_IN_LABELS[attr->index]);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/watchdog.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/slab.h>
|
||||
#include "sch56xx-common.h"
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitrev.h>
|
||||
#include <linux/of_gpio.h>
|
||||
|
||||
/* Commands */
|
||||
#define SHT15_MEASURE_TEMP 0x03
|
||||
@ -769,7 +770,7 @@ static ssize_t sht15_show_humidity(struct device *dev,
|
||||
return ret ? ret : sprintf(buf, "%d\n", sht15_calc_humid(data));
|
||||
}
|
||||
|
||||
static ssize_t show_name(struct device *dev,
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
@ -787,7 +788,7 @@ static SENSOR_DEVICE_ATTR(humidity1_fault, S_IRUGO, sht15_show_status, NULL,
|
||||
SHT15_STATUS_LOW_BATTERY);
|
||||
static SENSOR_DEVICE_ATTR(heater_enable, S_IRUGO | S_IWUSR, sht15_show_status,
|
||||
sht15_store_heater, SHT15_STATUS_HEATER);
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
static struct attribute *sht15_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_humidity1_input.dev_attr.attr,
|
||||
@ -911,6 +912,54 @@ static int sht15_invalidate_voltage(struct notifier_block *nb,
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id sht15_dt_match[] = {
|
||||
{ .compatible = "sensirion,sht15" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sht15_dt_match);
|
||||
|
||||
/*
|
||||
* This function returns NULL if pdev isn't a device instatiated by dt,
|
||||
* a pointer to pdata if it could successfully get all information
|
||||
* from dt or a negative ERR_PTR() on error.
|
||||
*/
|
||||
static struct sht15_platform_data *sht15_probe_dt(struct device *dev)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
struct sht15_platform_data *pdata;
|
||||
|
||||
/* no device tree device */
|
||||
if (!np)
|
||||
return NULL;
|
||||
|
||||
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
pdata->gpio_data = of_get_named_gpio(np, "data-gpios", 0);
|
||||
if (pdata->gpio_data < 0) {
|
||||
if (pdata->gpio_data != -EPROBE_DEFER)
|
||||
dev_err(dev, "data-gpios not found\n");
|
||||
return ERR_PTR(pdata->gpio_data);
|
||||
}
|
||||
|
||||
pdata->gpio_sck = of_get_named_gpio(np, "clk-gpios", 0);
|
||||
if (pdata->gpio_sck < 0) {
|
||||
if (pdata->gpio_sck != -EPROBE_DEFER)
|
||||
dev_err(dev, "clk-gpios not found\n");
|
||||
return ERR_PTR(pdata->gpio_sck);
|
||||
}
|
||||
|
||||
return pdata;
|
||||
}
|
||||
#else
|
||||
static inline struct sht15_platform_data *sht15_probe_dt(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int sht15_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
@ -928,11 +977,17 @@ static int sht15_probe(struct platform_device *pdev)
|
||||
data->dev = &pdev->dev;
|
||||
init_waitqueue_head(&data->wait_queue);
|
||||
|
||||
if (dev_get_platdata(&pdev->dev) == NULL) {
|
||||
dev_err(&pdev->dev, "no platform data supplied\n");
|
||||
return -EINVAL;
|
||||
data->pdata = sht15_probe_dt(&pdev->dev);
|
||||
if (IS_ERR(data->pdata))
|
||||
return PTR_ERR(data->pdata);
|
||||
if (data->pdata == NULL) {
|
||||
data->pdata = dev_get_platdata(&pdev->dev);
|
||||
if (data->pdata == NULL) {
|
||||
dev_err(&pdev->dev, "no platform data supplied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
data->pdata = dev_get_platdata(&pdev->dev);
|
||||
|
||||
data->supply_uv = data->pdata->supply_mv * 1000;
|
||||
if (data->pdata->checksum)
|
||||
data->checksumming = true;
|
||||
@ -1075,6 +1130,7 @@ MODULE_DEVICE_TABLE(platform, sht15_device_ids);
|
||||
static struct platform_driver sht15_driver = {
|
||||
.driver = {
|
||||
.name = "sht15",
|
||||
.of_match_table = of_match_ptr(sht15_dt_match),
|
||||
},
|
||||
.probe = sht15_probe,
|
||||
.remove = sht15_remove,
|
||||
|
@ -34,23 +34,29 @@
|
||||
/* I2C command bytes */
|
||||
#define SHT21_TRIG_T_MEASUREMENT_HM 0xe3
|
||||
#define SHT21_TRIG_RH_MEASUREMENT_HM 0xe5
|
||||
#define SHT21_READ_SNB_CMD1 0xFA
|
||||
#define SHT21_READ_SNB_CMD2 0x0F
|
||||
#define SHT21_READ_SNAC_CMD1 0xFC
|
||||
#define SHT21_READ_SNAC_CMD2 0xC9
|
||||
|
||||
/**
|
||||
* struct sht21 - SHT21 device specific data
|
||||
* @hwmon_dev: device registered with hwmon
|
||||
* @lock: mutex to protect measurement values
|
||||
* @valid: only 0 before first measurement is taken
|
||||
* @last_update: time of last update (jiffies)
|
||||
* @temperature: cached temperature measurement value
|
||||
* @humidity: cached humidity measurement value
|
||||
* @valid: only 0 before first measurement is taken
|
||||
* @eic: cached electronic identification code text
|
||||
*/
|
||||
struct sht21 {
|
||||
struct i2c_client *client;
|
||||
struct mutex lock;
|
||||
char valid;
|
||||
unsigned long last_update;
|
||||
int temperature;
|
||||
int humidity;
|
||||
char valid;
|
||||
char eic[18];
|
||||
};
|
||||
|
||||
/**
|
||||
@ -165,15 +171,97 @@ static ssize_t sht21_show_humidity(struct device *dev,
|
||||
return sprintf(buf, "%d\n", sht21->humidity);
|
||||
}
|
||||
|
||||
static ssize_t eic_read(struct sht21 *sht21)
|
||||
{
|
||||
struct i2c_client *client = sht21->client;
|
||||
u8 tx[2];
|
||||
u8 rx[8];
|
||||
u8 eic[8];
|
||||
struct i2c_msg msgs[2] = {
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = 0,
|
||||
.len = 2,
|
||||
.buf = tx,
|
||||
},
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_RD,
|
||||
.len = 8,
|
||||
.buf = rx,
|
||||
},
|
||||
};
|
||||
int ret;
|
||||
|
||||
tx[0] = SHT21_READ_SNB_CMD1;
|
||||
tx[1] = SHT21_READ_SNB_CMD2;
|
||||
ret = i2c_transfer(client->adapter, msgs, 2);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
eic[2] = rx[0];
|
||||
eic[3] = rx[2];
|
||||
eic[4] = rx[4];
|
||||
eic[5] = rx[6];
|
||||
|
||||
tx[0] = SHT21_READ_SNAC_CMD1;
|
||||
tx[1] = SHT21_READ_SNAC_CMD2;
|
||||
msgs[1].len = 6;
|
||||
ret = i2c_transfer(client->adapter, msgs, 2);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
eic[0] = rx[3];
|
||||
eic[1] = rx[4];
|
||||
eic[6] = rx[0];
|
||||
eic[7] = rx[1];
|
||||
|
||||
ret = snprintf(sht21->eic, sizeof(sht21->eic),
|
||||
"%02x%02x%02x%02x%02x%02x%02x%02x\n",
|
||||
eic[0], eic[1], eic[2], eic[3],
|
||||
eic[4], eic[5], eic[6], eic[7]);
|
||||
out:
|
||||
if (ret < 0)
|
||||
sht21->eic[0] = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* eic_show() - show Electronic Identification Code in sysfs
|
||||
* @dev: device
|
||||
* @attr: device attribute
|
||||
* @buf: sysfs buffer (PAGE_SIZE) where EIC is written
|
||||
*
|
||||
* Will be called on read access to eic sysfs attribute.
|
||||
* Returns number of bytes written into buffer, negative errno on error.
|
||||
*/
|
||||
static ssize_t eic_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct sht21 *sht21 = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = sizeof(sht21->eic) - 1;
|
||||
mutex_lock(&sht21->lock);
|
||||
if (!sht21->eic[0])
|
||||
ret = eic_read(sht21);
|
||||
if (ret > 0)
|
||||
memcpy(buf, sht21->eic, ret);
|
||||
mutex_unlock(&sht21->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* sysfs attributes */
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, sht21_show_temperature,
|
||||
NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO, sht21_show_humidity,
|
||||
NULL, 0);
|
||||
static DEVICE_ATTR_RO(eic);
|
||||
|
||||
static struct attribute *sht21_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_humidity1_input.dev_attr.attr,
|
||||
&dev_attr_eic.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -304,22 +304,23 @@ show_in_offset(3);
|
||||
show_in_offset(4);
|
||||
|
||||
/* Temperature */
|
||||
static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct sis5595_data *data = sis5595_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
|
||||
}
|
||||
|
||||
static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t temp1_max_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct sis5595_data *data = sis5595_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
|
||||
}
|
||||
|
||||
static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp1_max_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct sis5595_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -336,15 +337,16 @@ static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t temp1_max_hyst_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct sis5595_data *data = sis5595_update_device(dev);
|
||||
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
|
||||
}
|
||||
|
||||
static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp1_max_hyst_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct sis5595_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -361,11 +363,9 @@ static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
|
||||
static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
|
||||
show_temp_over, set_temp_over);
|
||||
static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
|
||||
show_temp_hyst, set_temp_hyst);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static DEVICE_ATTR_RW(temp1_max);
|
||||
static DEVICE_ATTR_RW(temp1_max_hyst);
|
||||
|
||||
/* 2 Fans */
|
||||
static ssize_t show_fan(struct device *dev, struct device_attribute *da,
|
||||
@ -492,13 +492,13 @@ show_fan_offset(1);
|
||||
show_fan_offset(2);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct sis5595_data *data = sis5595_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
@ -516,13 +516,13 @@ static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
|
||||
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
|
||||
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 15);
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct sis5595_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *sis5595_attributes[] = {
|
||||
&sensor_dev_attr_in0_input.dev_attr.attr,
|
||||
|
@ -264,8 +264,8 @@ static ssize_t get_pwm_en(struct device *dev, struct device_attribute
|
||||
return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index]));
|
||||
}
|
||||
|
||||
static ssize_t get_alarms(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
static ssize_t alarms_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
|
||||
return sprintf(buf, "%d\n", data->alarms);
|
||||
@ -440,16 +440,16 @@ fan_present(1);
|
||||
fan_present(2);
|
||||
fan_present(3);
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct smsc47m1_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *smsc47m1_attributes_fan1[] = {
|
||||
&sensor_dev_attr_fan1_input.dev_attr.attr,
|
||||
|
@ -400,23 +400,23 @@ show_temp_index(2)
|
||||
show_temp_index(3)
|
||||
|
||||
/* VID */
|
||||
static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct smsc47m192_data *data = smsc47m192_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct smsc47m192_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct smsc47m192_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -431,7 +431,7 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
|
||||
data->vrm = val;
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
|
834
drivers/hwmon/stts751.c
Normal file
834
drivers/hwmon/stts751.c
Normal file
@ -0,0 +1,834 @@
|
||||
/*
|
||||
* STTS751 sensor driver
|
||||
*
|
||||
* Copyright (C) 2016-2017 Istituto Italiano di Tecnologia - RBCS - EDL
|
||||
* Robotics, Brain and Cognitive Sciences department
|
||||
* Electronic Design Laboratory
|
||||
*
|
||||
* Written by Andrea Merello <andrea.merello@gmail.com>
|
||||
*
|
||||
* Based on LM95241 driver and LM90 driver
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/util_macros.h>
|
||||
|
||||
#define DEVNAME "stts751"
|
||||
|
||||
static const unsigned short normal_i2c[] = {
|
||||
0x48, 0x49, 0x38, 0x39, /* STTS751-0 */
|
||||
0x4A, 0x4B, 0x3A, 0x3B, /* STTS751-1 */
|
||||
I2C_CLIENT_END };
|
||||
|
||||
#define STTS751_REG_TEMP_H 0x00
|
||||
#define STTS751_REG_STATUS 0x01
|
||||
#define STTS751_STATUS_TRIPT BIT(0)
|
||||
#define STTS751_STATUS_TRIPL BIT(5)
|
||||
#define STTS751_STATUS_TRIPH BIT(6)
|
||||
#define STTS751_REG_TEMP_L 0x02
|
||||
#define STTS751_REG_CONF 0x03
|
||||
#define STTS751_CONF_RES_MASK 0x0C
|
||||
#define STTS751_CONF_RES_SHIFT 2
|
||||
#define STTS751_CONF_EVENT_DIS BIT(7)
|
||||
#define STTS751_CONF_STOP BIT(6)
|
||||
#define STTS751_REG_RATE 0x04
|
||||
#define STTS751_REG_HLIM_H 0x05
|
||||
#define STTS751_REG_HLIM_L 0x06
|
||||
#define STTS751_REG_LLIM_H 0x07
|
||||
#define STTS751_REG_LLIM_L 0x08
|
||||
#define STTS751_REG_TLIM 0x20
|
||||
#define STTS751_REG_HYST 0x21
|
||||
#define STTS751_REG_SMBUS_TO 0x22
|
||||
|
||||
#define STTS751_REG_PROD_ID 0xFD
|
||||
#define STTS751_REG_MAN_ID 0xFE
|
||||
#define STTS751_REG_REV_ID 0xFF
|
||||
|
||||
#define STTS751_0_PROD_ID 0x00
|
||||
#define STTS751_1_PROD_ID 0x01
|
||||
#define ST_MAN_ID 0x53
|
||||
|
||||
/*
|
||||
* Possible update intervals are (in mS):
|
||||
* 16000, 8000, 4000, 2000, 1000, 500, 250, 125, 62.5, 31.25
|
||||
* However we are not going to complicate things too much and we stick to the
|
||||
* approx value in mS.
|
||||
*/
|
||||
static const int stts751_intervals[] = {
|
||||
16000, 8000, 4000, 2000, 1000, 500, 250, 125, 63, 31
|
||||
};
|
||||
|
||||
static const struct i2c_device_id stts751_id[] = {
|
||||
{ "stts751", 0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
struct stts751_priv {
|
||||
struct device *dev;
|
||||
struct i2c_client *client;
|
||||
struct mutex access_lock;
|
||||
u8 interval;
|
||||
int res;
|
||||
int event_max, event_min;
|
||||
int therm;
|
||||
int hyst;
|
||||
bool smbus_timeout;
|
||||
int temp;
|
||||
unsigned long last_update, last_alert_update;
|
||||
u8 config;
|
||||
bool min_alert, max_alert, therm_trip;
|
||||
bool data_valid, alert_valid;
|
||||
bool notify_max, notify_min;
|
||||
};
|
||||
|
||||
/*
|
||||
* These functions converts temperature from HW format to integer format and
|
||||
* vice-vers. They are (mostly) taken from lm90 driver. Unit is in mC.
|
||||
*/
|
||||
static int stts751_to_deg(s16 hw_val)
|
||||
{
|
||||
return hw_val * 125 / 32;
|
||||
}
|
||||
|
||||
static s32 stts751_to_hw(int val)
|
||||
{
|
||||
return DIV_ROUND_CLOSEST(val, 125) * 32;
|
||||
}
|
||||
|
||||
static int stts751_adjust_resolution(struct stts751_priv *priv)
|
||||
{
|
||||
u8 res;
|
||||
|
||||
switch (priv->interval) {
|
||||
case 9:
|
||||
/* 10 bits */
|
||||
res = 0;
|
||||
break;
|
||||
case 8:
|
||||
/* 11 bits */
|
||||
res = 1;
|
||||
break;
|
||||
default:
|
||||
/* 12 bits */
|
||||
res = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
if (priv->res == res)
|
||||
return 0;
|
||||
|
||||
priv->config &= ~STTS751_CONF_RES_MASK;
|
||||
priv->config |= res << STTS751_CONF_RES_SHIFT;
|
||||
dev_dbg(&priv->client->dev, "setting res %d. config %x",
|
||||
res, priv->config);
|
||||
priv->res = res;
|
||||
|
||||
return i2c_smbus_write_byte_data(priv->client,
|
||||
STTS751_REG_CONF, priv->config);
|
||||
}
|
||||
|
||||
static int stts751_update_temp(struct stts751_priv *priv)
|
||||
{
|
||||
s32 integer1, integer2, frac;
|
||||
|
||||
/*
|
||||
* There is a trick here, like in the lm90 driver. We have to read two
|
||||
* registers to get the sensor temperature, but we have to beware a
|
||||
* conversion could occur between the readings. We could use the
|
||||
* one-shot conversion register, but we don't want to do this (disables
|
||||
* hardware monitoring). So the solution used here is to read the high
|
||||
* byte once, then the low byte, then the high byte again. If the new
|
||||
* high byte matches the old one, then we have a valid reading. Else we
|
||||
* have to read the low byte again, and now we believe we have a correct
|
||||
* reading.
|
||||
*/
|
||||
integer1 = i2c_smbus_read_byte_data(priv->client, STTS751_REG_TEMP_H);
|
||||
if (integer1 < 0) {
|
||||
dev_dbg(&priv->client->dev,
|
||||
"I2C read failed (temp H). ret: %x\n", integer1);
|
||||
return integer1;
|
||||
}
|
||||
|
||||
frac = i2c_smbus_read_byte_data(priv->client, STTS751_REG_TEMP_L);
|
||||
if (frac < 0) {
|
||||
dev_dbg(&priv->client->dev,
|
||||
"I2C read failed (temp L). ret: %x\n", frac);
|
||||
return frac;
|
||||
}
|
||||
|
||||
integer2 = i2c_smbus_read_byte_data(priv->client, STTS751_REG_TEMP_H);
|
||||
if (integer2 < 0) {
|
||||
dev_dbg(&priv->client->dev,
|
||||
"I2C 2nd read failed (temp H). ret: %x\n", integer2);
|
||||
return integer2;
|
||||
}
|
||||
|
||||
if (integer1 != integer2) {
|
||||
frac = i2c_smbus_read_byte_data(priv->client,
|
||||
STTS751_REG_TEMP_L);
|
||||
if (frac < 0) {
|
||||
dev_dbg(&priv->client->dev,
|
||||
"I2C 2nd read failed (temp L). ret: %x\n",
|
||||
frac);
|
||||
return frac;
|
||||
}
|
||||
}
|
||||
|
||||
priv->temp = stts751_to_deg((integer1 << 8) | frac);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stts751_set_temp_reg16(struct stts751_priv *priv, int temp,
|
||||
u8 hreg, u8 lreg)
|
||||
{
|
||||
s32 hwval;
|
||||
int ret;
|
||||
|
||||
hwval = stts751_to_hw(temp);
|
||||
|
||||
ret = i2c_smbus_write_byte_data(priv->client, hreg, hwval >> 8);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return i2c_smbus_write_byte_data(priv->client, lreg, hwval & 0xff);
|
||||
}
|
||||
|
||||
static int stts751_set_temp_reg8(struct stts751_priv *priv, int temp, u8 reg)
|
||||
{
|
||||
s32 hwval;
|
||||
|
||||
hwval = stts751_to_hw(temp);
|
||||
return i2c_smbus_write_byte_data(priv->client, reg, hwval >> 8);
|
||||
}
|
||||
|
||||
static int stts751_read_reg16(struct stts751_priv *priv, int *temp,
|
||||
u8 hreg, u8 lreg)
|
||||
{
|
||||
int integer, frac;
|
||||
|
||||
integer = i2c_smbus_read_byte_data(priv->client, hreg);
|
||||
if (integer < 0)
|
||||
return integer;
|
||||
|
||||
frac = i2c_smbus_read_byte_data(priv->client, lreg);
|
||||
if (frac < 0)
|
||||
return frac;
|
||||
|
||||
*temp = stts751_to_deg((integer << 8) | frac);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stts751_read_reg8(struct stts751_priv *priv, int *temp, u8 reg)
|
||||
{
|
||||
int integer;
|
||||
|
||||
integer = i2c_smbus_read_byte_data(priv->client, reg);
|
||||
if (integer < 0)
|
||||
return integer;
|
||||
|
||||
*temp = stts751_to_deg(integer << 8);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update alert flags without waiting for cache to expire. We detects alerts
|
||||
* immediately for the sake of the alert handler; we still need to deal with
|
||||
* caching to workaround the fact that alarm flags int the status register,
|
||||
* despite what the datasheet claims, gets always cleared on read.
|
||||
*/
|
||||
static int stts751_update_alert(struct stts751_priv *priv)
|
||||
{
|
||||
int ret;
|
||||
bool conv_done;
|
||||
int cache_time = msecs_to_jiffies(stts751_intervals[priv->interval]);
|
||||
|
||||
/*
|
||||
* Add another 10% because if we run faster than the HW conversion
|
||||
* rate we will end up in reporting incorrectly alarms.
|
||||
*/
|
||||
cache_time += cache_time / 10;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(priv->client, STTS751_REG_STATUS);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
dev_dbg(&priv->client->dev, "status reg %x\n", ret);
|
||||
conv_done = ret & (STTS751_STATUS_TRIPH | STTS751_STATUS_TRIPL);
|
||||
/*
|
||||
* Reset the cache if the cache time expired, or if we are sure
|
||||
* we have valid data from a device conversion, or if we know
|
||||
* our cache has been never written.
|
||||
*
|
||||
* Note that when the cache has been never written the point is
|
||||
* to correctly initialize the timestamp, rather than clearing
|
||||
* the cache values.
|
||||
*
|
||||
* Note that updating the cache timestamp when we get an alarm flag
|
||||
* is required, otherwise we could incorrectly report alarms to be zero.
|
||||
*/
|
||||
if (time_after(jiffies, priv->last_alert_update + cache_time) ||
|
||||
conv_done || !priv->alert_valid) {
|
||||
priv->max_alert = false;
|
||||
priv->min_alert = false;
|
||||
priv->alert_valid = true;
|
||||
priv->last_alert_update = jiffies;
|
||||
dev_dbg(&priv->client->dev, "invalidating alert cache\n");
|
||||
}
|
||||
|
||||
priv->max_alert |= !!(ret & STTS751_STATUS_TRIPH);
|
||||
priv->min_alert |= !!(ret & STTS751_STATUS_TRIPL);
|
||||
priv->therm_trip = !!(ret & STTS751_STATUS_TRIPT);
|
||||
|
||||
dev_dbg(&priv->client->dev, "max_alert: %d, min_alert: %d, therm_trip: %d\n",
|
||||
priv->max_alert, priv->min_alert, priv->therm_trip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stts751_alert(struct i2c_client *client,
|
||||
enum i2c_alert_protocol type, unsigned int data)
|
||||
{
|
||||
int ret;
|
||||
struct stts751_priv *priv = i2c_get_clientdata(client);
|
||||
|
||||
if (type != I2C_PROTOCOL_SMBUS_ALERT)
|
||||
return;
|
||||
|
||||
dev_dbg(&client->dev, "alert!");
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
ret = stts751_update_alert(priv);
|
||||
if (ret < 0) {
|
||||
/* default to worst case */
|
||||
priv->max_alert = true;
|
||||
priv->min_alert = true;
|
||||
|
||||
dev_warn(priv->dev,
|
||||
"Alert received, but can't communicate to the device. Triggering all alarms!");
|
||||
}
|
||||
|
||||
if (priv->max_alert) {
|
||||
if (priv->notify_max)
|
||||
dev_notice(priv->dev, "got alert for HIGH temperature");
|
||||
priv->notify_max = false;
|
||||
|
||||
/* unblock alert poll */
|
||||
sysfs_notify(&priv->dev->kobj, NULL, "temp1_max_alarm");
|
||||
}
|
||||
|
||||
if (priv->min_alert) {
|
||||
if (priv->notify_min)
|
||||
dev_notice(priv->dev, "got alert for LOW temperature");
|
||||
priv->notify_min = false;
|
||||
|
||||
/* unblock alert poll */
|
||||
sysfs_notify(&priv->dev->kobj, NULL, "temp1_min_alarm");
|
||||
}
|
||||
|
||||
if (priv->min_alert || priv->max_alert)
|
||||
kobject_uevent(&priv->dev->kobj, KOBJ_CHANGE);
|
||||
|
||||
mutex_unlock(&priv->access_lock);
|
||||
}
|
||||
|
||||
static int stts751_update(struct stts751_priv *priv)
|
||||
{
|
||||
int ret;
|
||||
int cache_time = msecs_to_jiffies(stts751_intervals[priv->interval]);
|
||||
|
||||
if (time_after(jiffies, priv->last_update + cache_time) ||
|
||||
!priv->data_valid) {
|
||||
ret = stts751_update_temp(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = stts751_update_alert(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
priv->data_valid = true;
|
||||
priv->last_update = jiffies;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_max_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
ret = stts751_update(priv);
|
||||
if (!ret)
|
||||
priv->notify_max = true;
|
||||
mutex_unlock(&priv->access_lock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->max_alert);
|
||||
}
|
||||
|
||||
static ssize_t show_min_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
ret = stts751_update(priv);
|
||||
if (!ret)
|
||||
priv->notify_min = true;
|
||||
mutex_unlock(&priv->access_lock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->min_alert);
|
||||
}
|
||||
|
||||
static ssize_t show_input(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
ret = stts751_update(priv);
|
||||
mutex_unlock(&priv->access_lock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->temp);
|
||||
}
|
||||
|
||||
static ssize_t show_therm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->therm);
|
||||
}
|
||||
|
||||
static ssize_t set_therm(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int ret;
|
||||
long temp;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
if (kstrtol(buf, 10, &temp) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* HW works in range -64C to +127.937C */
|
||||
temp = clamp_val(temp, -64000, 127937);
|
||||
mutex_lock(&priv->access_lock);
|
||||
ret = stts751_set_temp_reg8(priv, temp, STTS751_REG_TLIM);
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
dev_dbg(&priv->client->dev, "setting therm %ld", temp);
|
||||
|
||||
/*
|
||||
* hysteresis reg is relative to therm, so the HW does not need to be
|
||||
* adjusted, we need to update our local copy only.
|
||||
*/
|
||||
priv->hyst = temp - (priv->therm - priv->hyst);
|
||||
priv->therm = temp;
|
||||
|
||||
exit:
|
||||
mutex_unlock(&priv->access_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_hyst(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->hyst);
|
||||
}
|
||||
|
||||
static ssize_t set_hyst(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int ret;
|
||||
long temp;
|
||||
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
if (kstrtol(buf, 10, &temp) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
/* HW works in range -64C to +127.937C */
|
||||
temp = clamp_val(temp, -64000, priv->therm);
|
||||
priv->hyst = temp;
|
||||
dev_dbg(&priv->client->dev, "setting hyst %ld", temp);
|
||||
temp = priv->therm - temp;
|
||||
ret = stts751_set_temp_reg8(priv, temp, STTS751_REG_HYST);
|
||||
mutex_unlock(&priv->access_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_therm_trip(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
ret = stts751_update(priv);
|
||||
mutex_unlock(&priv->access_lock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->therm_trip);
|
||||
}
|
||||
|
||||
static ssize_t show_max(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->event_max);
|
||||
}
|
||||
|
||||
static ssize_t set_max(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int ret;
|
||||
long temp;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
if (kstrtol(buf, 10, &temp) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
/* HW works in range -64C to +127.937C */
|
||||
temp = clamp_val(temp, priv->event_min, 127937);
|
||||
ret = stts751_set_temp_reg16(priv, temp,
|
||||
STTS751_REG_HLIM_H, STTS751_REG_HLIM_L);
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
dev_dbg(&priv->client->dev, "setting event max %ld", temp);
|
||||
priv->event_max = temp;
|
||||
ret = count;
|
||||
exit:
|
||||
mutex_unlock(&priv->access_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t show_min(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n", priv->event_min);
|
||||
}
|
||||
|
||||
static ssize_t set_min(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int ret;
|
||||
long temp;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
if (kstrtol(buf, 10, &temp) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
/* HW works in range -64C to +127.937C */
|
||||
temp = clamp_val(temp, -64000, priv->event_max);
|
||||
ret = stts751_set_temp_reg16(priv, temp,
|
||||
STTS751_REG_LLIM_H, STTS751_REG_LLIM_L);
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
dev_dbg(&priv->client->dev, "setting event min %ld", temp);
|
||||
priv->event_min = temp;
|
||||
ret = count;
|
||||
exit:
|
||||
mutex_unlock(&priv->access_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t show_interval(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE - 1, "%d\n",
|
||||
stts751_intervals[priv->interval]);
|
||||
}
|
||||
|
||||
static ssize_t set_interval(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned long val;
|
||||
int idx;
|
||||
int ret = count;
|
||||
struct stts751_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
if (kstrtoul(buf, 10, &val) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
idx = find_closest_descending(val, stts751_intervals,
|
||||
ARRAY_SIZE(stts751_intervals));
|
||||
|
||||
dev_dbg(&priv->client->dev, "setting interval. req:%lu, idx: %d, val: %d",
|
||||
val, idx, stts751_intervals[idx]);
|
||||
|
||||
mutex_lock(&priv->access_lock);
|
||||
if (priv->interval == idx)
|
||||
goto exit;
|
||||
|
||||
/*
|
||||
* In early development stages I've become suspicious about the chip
|
||||
* starting to misbehave if I ever set, even briefly, an invalid
|
||||
* configuration. While I'm not sure this is really needed, be
|
||||
* conservative and set rate/resolution in such an order that avoids
|
||||
* passing through an invalid configuration.
|
||||
*/
|
||||
|
||||
/* speed up: lower the resolution, then modify convrate */
|
||||
if (priv->interval < idx) {
|
||||
dev_dbg(&priv->client->dev, "lower resolution, then modify convrate");
|
||||
priv->interval = idx;
|
||||
ret = stts751_adjust_resolution(priv);
|
||||
if (ret)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_write_byte_data(priv->client, STTS751_REG_RATE, idx);
|
||||
if (ret)
|
||||
goto exit;
|
||||
/* slow down: modify convrate, then raise resolution */
|
||||
if (priv->interval != idx) {
|
||||
dev_dbg(&priv->client->dev, "modify convrate, then raise resolution");
|
||||
priv->interval = idx;
|
||||
ret = stts751_adjust_resolution(priv);
|
||||
if (ret)
|
||||
goto exit;
|
||||
}
|
||||
ret = count;
|
||||
exit:
|
||||
mutex_unlock(&priv->access_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int stts751_detect(struct i2c_client *new_client,
|
||||
struct i2c_board_info *info)
|
||||
{
|
||||
struct i2c_adapter *adapter = new_client->adapter;
|
||||
const char *name;
|
||||
int tmp;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -ENODEV;
|
||||
|
||||
tmp = i2c_smbus_read_byte_data(new_client, STTS751_REG_MAN_ID);
|
||||
if (tmp != ST_MAN_ID)
|
||||
return -ENODEV;
|
||||
|
||||
/* lower temperaure registers always have bits 0-3 set to zero */
|
||||
tmp = i2c_smbus_read_byte_data(new_client, STTS751_REG_TEMP_L);
|
||||
if (tmp & 0xf)
|
||||
return -ENODEV;
|
||||
|
||||
tmp = i2c_smbus_read_byte_data(new_client, STTS751_REG_HLIM_L);
|
||||
if (tmp & 0xf)
|
||||
return -ENODEV;
|
||||
|
||||
tmp = i2c_smbus_read_byte_data(new_client, STTS751_REG_LLIM_L);
|
||||
if (tmp & 0xf)
|
||||
return -ENODEV;
|
||||
|
||||
/* smbus timeout register always have bits 0-7 set to zero */
|
||||
tmp = i2c_smbus_read_byte_data(new_client, STTS751_REG_SMBUS_TO);
|
||||
if (tmp & 0x7f)
|
||||
return -ENODEV;
|
||||
|
||||
tmp = i2c_smbus_read_byte_data(new_client, STTS751_REG_PROD_ID);
|
||||
|
||||
switch (tmp) {
|
||||
case STTS751_0_PROD_ID:
|
||||
name = "STTS751-0";
|
||||
break;
|
||||
case STTS751_1_PROD_ID:
|
||||
name = "STTS751-1";
|
||||
break;
|
||||
default:
|
||||
return -ENODEV;
|
||||
}
|
||||
dev_dbg(&new_client->dev, "Chip %s detected", name);
|
||||
|
||||
strlcpy(info->type, stts751_id[0].name, I2C_NAME_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stts751_read_chip_config(struct stts751_priv *priv)
|
||||
{
|
||||
int ret;
|
||||
int tmp;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(priv->client, STTS751_REG_CONF);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
priv->config = ret;
|
||||
priv->res = (ret & STTS751_CONF_RES_MASK) >> STTS751_CONF_RES_SHIFT;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(priv->client, STTS751_REG_RATE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
priv->interval = ret;
|
||||
|
||||
ret = stts751_read_reg16(priv, &priv->event_max,
|
||||
STTS751_REG_HLIM_H, STTS751_REG_HLIM_L);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = stts751_read_reg16(priv, &priv->event_min,
|
||||
STTS751_REG_LLIM_H, STTS751_REG_LLIM_L);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = stts751_read_reg8(priv, &priv->therm, STTS751_REG_TLIM);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = stts751_read_reg8(priv, &tmp, STTS751_REG_HYST);
|
||||
if (ret)
|
||||
return ret;
|
||||
priv->hyst = priv->therm - tmp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, 0444, show_input, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_min, 0644, show_min, set_min, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max, 0644, show_max, set_max, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_min_alarm, 0444, show_min_alarm, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_alarm, 0444, show_max_alarm, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit, 0644, show_therm, set_therm, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, 0644, show_hyst, set_hyst, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_alarm, 0444, show_therm_trip, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(update_interval, 0644,
|
||||
show_interval, set_interval, 0);
|
||||
|
||||
static struct attribute *stts751_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_min.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_update_interval.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
ATTRIBUTE_GROUPS(stts751);
|
||||
|
||||
static int stts751_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct stts751_priv *priv;
|
||||
int ret;
|
||||
bool smbus_nto;
|
||||
int rev_id;
|
||||
|
||||
priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
priv->client = client;
|
||||
priv->notify_max = true;
|
||||
priv->notify_min = true;
|
||||
i2c_set_clientdata(client, priv);
|
||||
mutex_init(&priv->access_lock);
|
||||
|
||||
if (device_property_present(&client->dev,
|
||||
"smbus-timeout-disable")) {
|
||||
smbus_nto = device_property_read_bool(&client->dev,
|
||||
"smbus-timeout-disable");
|
||||
|
||||
ret = i2c_smbus_write_byte_data(client, STTS751_REG_SMBUS_TO,
|
||||
smbus_nto ? 0 : 0x80);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rev_id = i2c_smbus_read_byte_data(client, STTS751_REG_REV_ID);
|
||||
if (rev_id < 0)
|
||||
return -ENODEV;
|
||||
if (rev_id != 0x1) {
|
||||
dev_dbg(&client->dev, "Chip revision 0x%x is untested\n",
|
||||
rev_id);
|
||||
}
|
||||
|
||||
ret = stts751_read_chip_config(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->config &= ~(STTS751_CONF_STOP | STTS751_CONF_EVENT_DIS);
|
||||
ret = i2c_smbus_write_byte_data(client, STTS751_REG_CONF, priv->config);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->dev = devm_hwmon_device_register_with_groups(&client->dev,
|
||||
client->name, priv,
|
||||
stts751_groups);
|
||||
return PTR_ERR_OR_ZERO(priv->dev);
|
||||
}
|
||||
|
||||
MODULE_DEVICE_TABLE(i2c, stts751_id);
|
||||
|
||||
static struct i2c_driver stts751_driver = {
|
||||
.class = I2C_CLASS_HWMON,
|
||||
.driver = {
|
||||
.name = DEVNAME,
|
||||
},
|
||||
.probe = stts751_probe,
|
||||
.id_table = stts751_id,
|
||||
.detect = stts751_detect,
|
||||
.alert = stts751_alert,
|
||||
.address_list = normal_i2c,
|
||||
};
|
||||
|
||||
module_i2c_driver(stts751_driver);
|
||||
|
||||
MODULE_AUTHOR("Andrea Merello <andrea.merello@gmail.com>");
|
||||
MODULE_DESCRIPTION("STTS751 sensor driver");
|
||||
MODULE_LICENSE("GPL");
|
@ -82,16 +82,6 @@ static const u8 TMP401_TEMP_MSB_WRITE[7][2] = {
|
||||
{ 0, 0x11 }, /* offset */
|
||||
};
|
||||
|
||||
static const u8 TMP401_TEMP_LSB[7][2] = {
|
||||
{ 0x15, 0x10 }, /* temp */
|
||||
{ 0x17, 0x14 }, /* low limit */
|
||||
{ 0x16, 0x13 }, /* high limit */
|
||||
{ 0, 0 }, /* therm (crit) limit (unused) */
|
||||
{ 0x31, 0x35 }, /* lowest */
|
||||
{ 0x33, 0x37 }, /* highest */
|
||||
{ 0, 0x12 }, /* offset */
|
||||
};
|
||||
|
||||
static const u8 TMP432_TEMP_MSB_READ[4][3] = {
|
||||
{ 0x00, 0x01, 0x23 }, /* temp */
|
||||
{ 0x06, 0x08, 0x16 }, /* low limit */
|
||||
@ -106,12 +96,6 @@ static const u8 TMP432_TEMP_MSB_WRITE[4][3] = {
|
||||
{ 0x20, 0x19, 0x1A }, /* therm (crit) limit */
|
||||
};
|
||||
|
||||
static const u8 TMP432_TEMP_LSB[3][3] = {
|
||||
{ 0x29, 0x10, 0x24 }, /* temp */
|
||||
{ 0x3E, 0x14, 0x18 }, /* low limit */
|
||||
{ 0x3D, 0x13, 0x17 }, /* high limit */
|
||||
};
|
||||
|
||||
/* [0] = fault, [1] = low, [2] = high, [3] = therm/crit */
|
||||
static const u8 TMP432_STATUS_REG[] = {
|
||||
0x1b, 0x36, 0x35, 0x37 };
|
||||
@ -213,25 +197,20 @@ static int tmp401_update_device_reg16(struct i2c_client *client,
|
||||
for (i = 0; i < num_sensors; i++) { /* local / r1 / r2 */
|
||||
for (j = 0; j < num_regs; j++) { /* temp / low / ... */
|
||||
u8 regaddr;
|
||||
/*
|
||||
* High byte must be read first immediately followed
|
||||
* by the low byte
|
||||
*/
|
||||
|
||||
regaddr = data->kind == tmp432 ?
|
||||
TMP432_TEMP_MSB_READ[j][i] :
|
||||
TMP401_TEMP_MSB_READ[j][i];
|
||||
val = i2c_smbus_read_byte_data(client, regaddr);
|
||||
if (j == 3) { /* crit is msb only */
|
||||
val = i2c_smbus_read_byte_data(client, regaddr);
|
||||
} else {
|
||||
val = i2c_smbus_read_word_swapped(client,
|
||||
regaddr);
|
||||
}
|
||||
if (val < 0)
|
||||
return val;
|
||||
data->temp[j][i] = val << 8;
|
||||
if (j == 3) /* crit is msb only */
|
||||
continue;
|
||||
regaddr = data->kind == tmp432 ? TMP432_TEMP_LSB[j][i]
|
||||
: TMP401_TEMP_LSB[j][i];
|
||||
val = i2c_smbus_read_byte_data(client, regaddr);
|
||||
if (val < 0)
|
||||
return val;
|
||||
data->temp[j][i] |= val;
|
||||
|
||||
data->temp[j][i] = j == 3 ? val << 8 : val;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -373,11 +352,11 @@ static ssize_t store_temp(struct device *dev, struct device_attribute *devattr,
|
||||
|
||||
regaddr = data->kind == tmp432 ? TMP432_TEMP_MSB_WRITE[nr][index]
|
||||
: TMP401_TEMP_MSB_WRITE[nr][index];
|
||||
i2c_smbus_write_byte_data(client, regaddr, reg >> 8);
|
||||
if (nr != 3) {
|
||||
regaddr = data->kind == tmp432 ? TMP432_TEMP_LSB[nr][index]
|
||||
: TMP401_TEMP_LSB[nr][index];
|
||||
i2c_smbus_write_byte_data(client, regaddr, reg & 0xFF);
|
||||
if (nr == 3) { /* crit is msb only */
|
||||
i2c_smbus_write_byte_data(client, regaddr, reg >> 8);
|
||||
} else {
|
||||
/* Hardware expects big endian data --> use _swapped */
|
||||
i2c_smbus_write_word_swapped(client, regaddr, reg);
|
||||
}
|
||||
data->temp[nr][index] = reg;
|
||||
|
||||
@ -449,7 +428,7 @@ static ssize_t reset_temp_history(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t show_update_interval(struct device *dev,
|
||||
static ssize_t update_interval_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct tmp401_data *data = dev_get_drvdata(dev);
|
||||
@ -457,9 +436,9 @@ static ssize_t show_update_interval(struct device *dev,
|
||||
return sprintf(buf, "%u\n", data->update_interval);
|
||||
}
|
||||
|
||||
static ssize_t set_update_interval(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t update_interval_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct tmp401_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
@ -521,8 +500,7 @@ static SENSOR_DEVICE_ATTR_2(temp2_max_alarm, S_IRUGO, show_status, NULL,
|
||||
static SENSOR_DEVICE_ATTR_2(temp2_crit_alarm, S_IRUGO, show_status, NULL,
|
||||
3, TMP432_STATUS_REMOTE1);
|
||||
|
||||
static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval,
|
||||
set_update_interval);
|
||||
static DEVICE_ATTR_RW(update_interval);
|
||||
|
||||
static struct attribute *tmp401_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
|
@ -88,8 +88,8 @@ static ssize_t show_temp(struct device *dev,
|
||||
return sprintf(buf, "%lu\n", ((unsigned long)eax & 0xffffff) * 1000);
|
||||
}
|
||||
|
||||
static ssize_t show_cpu_vid(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct via_cputemp_data *data = dev_get_drvdata(dev);
|
||||
u32 eax, edx;
|
||||
@ -119,7 +119,7 @@ static const struct attribute_group via_cputemp_group = {
|
||||
};
|
||||
|
||||
/* Optional attributes */
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_cpu_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static int via_cputemp_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -580,14 +580,14 @@ show_fan_offset(1);
|
||||
show_fan_offset(2);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct via686a_data *data = via686a_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -607,13 +607,13 @@ static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 15);
|
||||
static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
|
||||
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct via686a_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *via686a_attributes[] = {
|
||||
&sensor_dev_attr_in0_input.dev_attr.attr,
|
||||
|
@ -263,8 +263,8 @@ static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
/* Special case for input 5 as this has 3.3V scaling built into the chip */
|
||||
static ssize_t show_in5(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t in5_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
|
||||
@ -272,7 +272,7 @@ static ssize_t show_in5(struct device *dev, struct device_attribute *attr,
|
||||
(((data->in[5] - 3) * 10000 * 54) / (958 * 34)));
|
||||
}
|
||||
|
||||
static ssize_t show_in5_min(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t in5_min_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
@ -281,7 +281,7 @@ static ssize_t show_in5_min(struct device *dev, struct device_attribute *attr,
|
||||
(((data->in_min[5] - 3) * 10000 * 54) / (958 * 34)));
|
||||
}
|
||||
|
||||
static ssize_t show_in5_max(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t in5_max_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
@ -290,8 +290,9 @@ static ssize_t show_in5_max(struct device *dev, struct device_attribute *attr,
|
||||
(((data->in_max[5] - 3) * 10000 * 54) / (958 * 34)));
|
||||
}
|
||||
|
||||
static ssize_t set_in5_min(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t in5_min_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct vt8231_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -309,8 +310,9 @@ static ssize_t set_in5_min(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t set_in5_max(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t in5_max_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct vt8231_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -342,34 +344,35 @@ define_voltage_sysfs(2);
|
||||
define_voltage_sysfs(3);
|
||||
define_voltage_sysfs(4);
|
||||
|
||||
static DEVICE_ATTR(in5_input, S_IRUGO, show_in5, NULL);
|
||||
static DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR, show_in5_min, set_in5_min);
|
||||
static DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR, show_in5_max, set_in5_max);
|
||||
static DEVICE_ATTR_RO(in5_input);
|
||||
static DEVICE_ATTR_RW(in5_min);
|
||||
static DEVICE_ATTR_RW(in5_max);
|
||||
|
||||
/* Temperatures */
|
||||
static ssize_t show_temp0(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->temp[0] * 250);
|
||||
}
|
||||
|
||||
static ssize_t show_temp0_max(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t temp1_max_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->temp_max[0] * 1000);
|
||||
}
|
||||
|
||||
static ssize_t show_temp0_min(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t temp1_max_hyst_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->temp_min[0] * 1000);
|
||||
}
|
||||
|
||||
static ssize_t set_temp0_max(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp1_max_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct vt8231_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -385,8 +388,9 @@ static ssize_t set_temp0_max(struct device *dev, struct device_attribute *attr,
|
||||
mutex_unlock(&data->update_lock);
|
||||
return count;
|
||||
}
|
||||
static ssize_t set_temp0_min(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t temp1_max_hyst_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct vt8231_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
@ -481,10 +485,9 @@ static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
|
||||
static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \
|
||||
show_temp_min, set_temp_min, offset - 1)
|
||||
|
||||
static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp0, NULL);
|
||||
static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp0_max, set_temp0_max);
|
||||
static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp0_min,
|
||||
set_temp0_min);
|
||||
static DEVICE_ATTR_RO(temp1_input);
|
||||
static DEVICE_ATTR_RW(temp1_max);
|
||||
static DEVICE_ATTR_RW(temp1_max_hyst);
|
||||
|
||||
define_temperature_sysfs(2);
|
||||
define_temperature_sysfs(3);
|
||||
@ -603,13 +606,13 @@ define_fan_sysfs(1);
|
||||
define_fan_sysfs(2);
|
||||
|
||||
/* Alarms */
|
||||
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct vt8231_data *data = vt8231_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -633,13 +636,13 @@ static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
|
||||
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute
|
||||
*devattr, char *buf)
|
||||
{
|
||||
struct vt8231_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *vt8231_attributes_temps[6][5] = {
|
||||
{
|
||||
|
@ -1687,14 +1687,14 @@ store_##reg(struct device *dev, struct device_attribute *attr, \
|
||||
|
||||
fan_time_functions(fan_stop_time, FAN_STOP_TIME)
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct w83627ehf_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct sensor_device_attribute sda_sf3_arrays_fan4[] = {
|
||||
SENSOR_ATTR(pwm4_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
|
||||
@ -1754,12 +1754,12 @@ static struct sensor_device_attribute sda_sf3_max_step_arrays[] = {
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
show_vid(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83627ehf_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
|
||||
/* Case open detection */
|
||||
|
@ -575,26 +575,30 @@ static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg)
|
||||
return sprintf(buf,"%ld\n", in0);
|
||||
}
|
||||
|
||||
static ssize_t show_regs_in_0(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t in0_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = w83627hf_update_device(dev);
|
||||
return show_in_0(data, buf, data->in[0]);
|
||||
}
|
||||
|
||||
static ssize_t show_regs_in_min0(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t in0_min_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = w83627hf_update_device(dev);
|
||||
return show_in_0(data, buf, data->in_min[0]);
|
||||
}
|
||||
|
||||
static ssize_t show_regs_in_max0(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t in0_max_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = w83627hf_update_device(dev);
|
||||
return show_in_0(data, buf, data->in_max[0]);
|
||||
}
|
||||
|
||||
static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t in0_min_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct w83627hf_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -622,8 +626,9 @@ static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *a
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t in0_max_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct w83627hf_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -651,11 +656,9 @@ static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *a
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(in0_input, S_IRUGO, show_regs_in_0, NULL);
|
||||
static DEVICE_ATTR(in0_min, S_IRUGO | S_IWUSR,
|
||||
show_regs_in_min0, store_regs_in_min0);
|
||||
static DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR,
|
||||
show_regs_in_max0, store_regs_in_max0);
|
||||
static DEVICE_ATTR_RO(in0_input);
|
||||
static DEVICE_ATTR_RW(in0_min);
|
||||
static DEVICE_ATTR_RW(in0_max);
|
||||
|
||||
static ssize_t
|
||||
show_fan_input(struct device *dev, struct device_attribute *devattr, char *buf)
|
||||
@ -796,21 +799,22 @@ sysfs_temp_decl(2);
|
||||
sysfs_temp_decl(3);
|
||||
|
||||
static ssize_t
|
||||
show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = w83627hf_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t
|
||||
show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
vrm_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%ld\n", (long) data->vrm);
|
||||
}
|
||||
static ssize_t
|
||||
store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
vrm_store(struct device *dev, struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct w83627hf_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -826,15 +830,15 @@ store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf
|
||||
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t
|
||||
show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
alarms_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = w83627hf_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", (long) data->alarms);
|
||||
}
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t
|
||||
show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@ -860,7 +864,7 @@ static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5);
|
||||
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
|
||||
|
||||
static ssize_t
|
||||
show_beep_mask(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
beep_mask_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = w83627hf_update_device(dev);
|
||||
return sprintf(buf, "%ld\n",
|
||||
@ -868,7 +872,7 @@ show_beep_mask(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
beep_mask_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct w83627hf_data *data = dev_get_drvdata(dev);
|
||||
@ -895,8 +899,7 @@ store_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(beep_mask, S_IRUGO | S_IWUSR,
|
||||
show_beep_mask, store_beep_mask);
|
||||
static DEVICE_ATTR_RW(beep_mask);
|
||||
|
||||
static ssize_t
|
||||
show_beep(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@ -1264,13 +1267,13 @@ sysfs_temp_type(2);
|
||||
sysfs_temp_type(3);
|
||||
|
||||
static ssize_t
|
||||
show_name(struct device *dev, struct device_attribute *devattr, char *buf)
|
||||
name_show(struct device *dev, struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct w83627hf_data *data = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static int __init w83627hf_find(int sioaddr, unsigned short *addr,
|
||||
struct w83627hf_sio_data *sio_data)
|
||||
|
@ -416,24 +416,24 @@ sysfs_temp_offsets(2);
|
||||
sysfs_temp_offsets(3);
|
||||
|
||||
static ssize_t
|
||||
show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83781d_data *data = w83781d_update_device(dev);
|
||||
return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t
|
||||
show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
vrm_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83781d_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%ld\n", (long) data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
vrm_store(struct device *dev, struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct w83781d_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -447,16 +447,16 @@ store_vrm_reg(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static ssize_t
|
||||
show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
alarms_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83781d_data *data = w83781d_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -491,7 +491,7 @@ static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
|
||||
static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5);
|
||||
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_temp3_alarm, NULL, 0);
|
||||
|
||||
static ssize_t show_beep_mask(struct device *dev,
|
||||
static ssize_t beep_mask_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83781d_data *data = w83781d_update_device(dev);
|
||||
@ -500,7 +500,7 @@ static ssize_t show_beep_mask(struct device *dev,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
beep_mask_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct w83781d_data *data = dev_get_drvdata(dev);
|
||||
@ -527,8 +527,7 @@ store_beep_mask(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(beep_mask, S_IRUGO | S_IWUSR,
|
||||
show_beep_mask, store_beep_mask);
|
||||
static DEVICE_ATTR_RW(beep_mask);
|
||||
|
||||
static ssize_t show_beep(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -708,7 +707,7 @@ show_pwm(struct device *dev, struct device_attribute *da, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_pwm2_enable(struct device *dev, struct device_attribute *da, char *buf)
|
||||
pwm2_enable_show(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct w83781d_data *data = w83781d_update_device(dev);
|
||||
return sprintf(buf, "%d\n", (int)data->pwm2_enable);
|
||||
@ -736,7 +735,7 @@ store_pwm(struct device *dev, struct device_attribute *da, const char *buf,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_pwm2_enable(struct device *dev, struct device_attribute *da,
|
||||
pwm2_enable_store(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct w83781d_data *data = dev_get_drvdata(dev);
|
||||
@ -778,8 +777,7 @@ static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 1);
|
||||
static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 2);
|
||||
static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 3);
|
||||
/* only PWM2 can be enabled/disabled */
|
||||
static DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
|
||||
show_pwm2_enable, store_pwm2_enable);
|
||||
static DEVICE_ATTR_RW(pwm2_enable);
|
||||
|
||||
static ssize_t
|
||||
show_sensor(struct device *dev, struct device_attribute *da, char *buf)
|
||||
@ -1616,12 +1614,12 @@ static unsigned short isa_address = 0x290;
|
||||
* we must create it by ourselves.
|
||||
*/
|
||||
static ssize_t
|
||||
show_name(struct device *dev, struct device_attribute *devattr, char *buf)
|
||||
name_show(struct device *dev, struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct w83781d_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", data->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct w83781d_data *w83781d_data_if_isa(void)
|
||||
{
|
||||
|
@ -1041,14 +1041,14 @@ static struct sensor_device_attribute sda_temp_alarm[] = {
|
||||
};
|
||||
|
||||
/* get realtime status of all sensors items: voltage, temp, fan */
|
||||
static ssize_t show_alarms_reg(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct w83791d_data *data = w83791d_update_device(dev);
|
||||
return sprintf(buf, "%u\n", data->alarms);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
|
||||
/* Beep control */
|
||||
|
||||
@ -1147,25 +1147,24 @@ static struct sensor_device_attribute sda_beep_ctrl[] = {
|
||||
};
|
||||
|
||||
/* cpu voltage regulation information */
|
||||
static ssize_t show_vid_reg(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t cpu0_vid_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83791d_data *data = w83791d_update_device(dev);
|
||||
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR_RO(cpu0_vid);
|
||||
|
||||
static ssize_t show_vrm_reg(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct w83791d_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
}
|
||||
|
||||
static ssize_t store_vrm_reg(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct w83791d_data *data = dev_get_drvdata(dev);
|
||||
unsigned long val;
|
||||
@ -1188,7 +1187,7 @@ static ssize_t store_vrm_reg(struct device *dev,
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
#define IN_UNIT_ATTRS(X) \
|
||||
&sda_in_input[X].dev_attr.attr, \
|
||||
|
@ -578,7 +578,7 @@ static ssize_t store_temp23(struct device *dev, struct device_attribute *attr,
|
||||
|
||||
/* get realtime status of all sensors items: voltage, temp, fan */
|
||||
static ssize_t
|
||||
show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
alarms_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83792d_data *data = w83792d_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->alarms);
|
||||
@ -735,16 +735,16 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
show_chassis_clear(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
intrusion0_alarm_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct w83792d_data *data = w83792d_update_device(dev);
|
||||
return sprintf(buf, "%d\n", data->chassis);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_chassis_clear(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
intrusion0_alarm_store(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);
|
||||
@ -1047,7 +1047,7 @@ static SENSOR_DEVICE_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
|
||||
show_temp23, store_temp23, 0, 4);
|
||||
static SENSOR_DEVICE_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
|
||||
show_temp23, store_temp23, 1, 4);
|
||||
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
|
||||
static DEVICE_ATTR_RO(alarms);
|
||||
static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 2);
|
||||
@ -1067,8 +1067,7 @@ static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20);
|
||||
static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21);
|
||||
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 DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR,
|
||||
show_chassis_clear, store_chassis_clear);
|
||||
static DEVICE_ATTR_RW(intrusion0_alarm);
|
||||
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(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2);
|
||||
|
@ -324,7 +324,7 @@ static struct i2c_driver w83793_driver = {
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
vrm_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct w83793_data *data = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", data->vrm);
|
||||
@ -342,7 +342,7 @@ show_vid(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
store_vrm(struct device *dev, struct device_attribute *attr,
|
||||
vrm_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct w83793_data *data = dev_get_drvdata(dev);
|
||||
@ -1169,7 +1169,7 @@ static struct sensor_device_attribute_2 w83793_vid[] = {
|
||||
SENSOR_ATTR_2(cpu0_vid, S_IRUGO, show_vid, NULL, NOT_USED, 0),
|
||||
SENSOR_ATTR_2(cpu1_vid, S_IRUGO, show_vid, NULL, NOT_USED, 1),
|
||||
};
|
||||
static DEVICE_ATTR(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm);
|
||||
static DEVICE_ATTR_RW(vrm);
|
||||
|
||||
static struct sensor_device_attribute_2 sda_single_files[] = {
|
||||
SENSOR_ATTR_2(intrusion0_alarm, S_IWUSR | S_IRUGO, show_alarm_beep,
|
||||
|
12
include/dt-bindings/thermal/lm90.h
Normal file
12
include/dt-bindings/thermal/lm90.h
Normal file
@ -0,0 +1,12 @@
|
||||
/*
|
||||
* This header provides constants for the LM90 thermal bindings.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_THERMAL_LM90_H_
|
||||
#define _DT_BINDINGS_THERMAL_LM90_H_
|
||||
|
||||
#define LM90_LOCAL_TEMPERATURE 0
|
||||
#define LM90_REMOTE_TEMPERATURE 1
|
||||
#define LM90_REMOTE2_TEMPERATURE 2
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user