Commit 71219b34 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'hwmon-for-linus-v4.17' of...

Merge tag 'hwmon-for-linus-v4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon updates from Guenter Roeck:

 - added chip support: new Centaur CPUs, ADM1272, NCT6796D

 - ucd9000: added debugfs attributes, gpio support

 - cleanup and minor bug fixes

* tag 'hwmon-for-linus-v4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
  hwmon: (via-cputemp) support new centaur CPUs
  hwmon: (nct6775) Fix writing pwmX_mode
  hwmon: (lm92) Add max6635 to lm92_id[]
  hwmon: (pmbus/adm1275) Add support for ADM1272
  hwmon: (lm92) Do not try to detect MAX6635
  hwmon: (ucd9000) Add debugfs attributes to provide mfr_status
  hwmon: (ucd9000) Add gpio chip interface
  hwmon: (nct6775) Add support for NCT6796D
  hwmon: (nct6775) Initialize boolean variables with declaration
  hwmon: (nct6775) Improve fan6/pwm6 support
  hwmon: (nct6775) Use NUM_FAN consistently
  hwmon: (g762) handle cleanup with devm_add_action
  hwmon: (sht3x) Update data sheet URL
  hwmon: (sht21) Update data sheet URLs
  hwmon: (pmbus/adm1275) Accept negative page register values
  hwmon: (pmbus/max8688) Accept negative page register values
parents c18bb396 e3a2d2be
...@@ -6,6 +6,10 @@ Supported chips: ...@@ -6,6 +6,10 @@ Supported chips:
Prefix: 'adm1075' Prefix: 'adm1075'
Addresses scanned: - Addresses scanned: -
Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1075.pdf Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1075.pdf
* Analog Devices ADM1272
Prefix: 'adm1272'
Addresses scanned: -
Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1272.pdf
* Analog Devices ADM1275 * Analog Devices ADM1275
Prefix: 'adm1275' Prefix: 'adm1275'
Addresses scanned: - Addresses scanned: -
...@@ -29,11 +33,11 @@ Author: Guenter Roeck <linux@roeck-us.net> ...@@ -29,11 +33,11 @@ Author: Guenter Roeck <linux@roeck-us.net>
Description Description
----------- -----------
This driver supports hardware monitoring for Analog Devices ADM1075, ADM1275, This driver supports hardware monitoring for Analog Devices ADM1075, ADM1272,
ADM1276, ADM1278, ADM1293, and ADM1294 Hot-Swap Controller and Digital ADM1275, ADM1276, ADM1278, ADM1293, and ADM1294 Hot-Swap Controller and
Power Monitors. Digital Power Monitors.
ADM1075, ADM1275, ADM1276, ADM1278, ADM1293, and ADM1294 are hot-swap ADM1075, ADM1272, ADM1275, ADM1276, ADM1278, ADM1293, and ADM1294 are hot-swap
controllers that allow a circuit board to be removed from or inserted into controllers that allow a circuit board to be removed from or inserted into
a live backplane. They also feature current and voltage readback via an a live backplane. They also feature current and voltage readback via an
integrated 12 bit analog-to-digital converter (ADC), accessed using a integrated 12 bit analog-to-digital converter (ADC), accessed using a
...@@ -100,11 +104,10 @@ power1_input_lowest Lowest observed input power. ADM1293 and ADM1294 only. ...@@ -100,11 +104,10 @@ power1_input_lowest Lowest observed input power. ADM1293 and ADM1294 only.
power1_input_highest Highest observed input power. power1_input_highest Highest observed input power.
power1_reset_history Write any value to reset history. power1_reset_history Write any value to reset history.
Power attributes are supported on ADM1075, ADM1276, Power attributes are supported on ADM1075, ADM1272,
ADM1293, and ADM1294. ADM1276, ADM1293, and ADM1294.
temp1_input Chip temperature. temp1_input Chip temperature.
Temperature attributes are only available on ADM1278.
temp1_max Maximum chip temperature. temp1_max Maximum chip temperature.
temp1_max_alarm Temperature alarm. temp1_max_alarm Temperature alarm.
temp1_crit Critical chip temperature. temp1_crit Critical chip temperature.
...@@ -112,4 +115,5 @@ temp1_crit_alarm Critical temperature high alarm. ...@@ -112,4 +115,5 @@ temp1_crit_alarm Critical temperature high alarm.
temp1_highest Highest observed temperature. temp1_highest Highest observed temperature.
temp1_reset_history Write any value to reset history. temp1_reset_history Write any value to reset history.
Temperature attributes are supported on ADM1278. Temperature attributes are supported on ADM1272 and
ADM1278.
...@@ -11,10 +11,8 @@ Supported chips: ...@@ -11,10 +11,8 @@ Supported chips:
Addresses scanned: none, force parameter needed Addresses scanned: none, force parameter needed
Datasheet: http://www.national.com/pf/LM/LM76.html Datasheet: http://www.national.com/pf/LM/LM76.html
* Maxim MAX6633/MAX6634/MAX6635 * Maxim MAX6633/MAX6634/MAX6635
Prefix: 'lm92' Prefix: 'max6635'
Addresses scanned: I2C 0x48 - 0x4b Addresses scanned: none, force parameter needed
MAX6633 with address in 0x40 - 0x47, 0x4c - 0x4f needs force parameter
and MAX6634 with address in 0x4c - 0x4f needs force parameter
Datasheet: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074 Datasheet: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074
Authors: Authors:
......
...@@ -36,6 +36,14 @@ Supported chips: ...@@ -36,6 +36,14 @@ Supported chips:
Prefix: 'nct6793' Prefix: 'nct6793'
Addresses scanned: ISA address retrieved from Super I/O registers Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: Available from Nuvoton upon request Datasheet: Available from Nuvoton upon request
* Nuvoton NCT6795D
Prefix: 'nct6795'
Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: Available from Nuvoton upon request
* Nuvoton NCT6796D
Prefix: 'nct6796'
Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: Available from Nuvoton upon request
Authors: Authors:
Guenter Roeck <linux@roeck-us.net> Guenter Roeck <linux@roeck-us.net>
...@@ -88,10 +96,10 @@ The mode works for fan1-fan5. ...@@ -88,10 +96,10 @@ The mode works for fan1-fan5.
sysfs attributes sysfs attributes
---------------- ----------------
pwm[1-5] - this file stores PWM duty cycle or DC value (fan speed) in range: pwm[1-7] - this file stores PWM duty cycle or DC value (fan speed) in range:
0 (lowest speed) to 255 (full) 0 (lowest speed) to 255 (full)
pwm[1-5]_enable - this file controls mode of fan/temperature control: pwm[1-7]_enable - this file controls mode of fan/temperature control:
* 0 Fan control disabled (fans set to maximum speed) * 0 Fan control disabled (fans set to maximum speed)
* 1 Manual mode, write to pwm[0-5] any value 0-255 * 1 Manual mode, write to pwm[0-5] any value 0-255
* 2 "Thermal Cruise" mode * 2 "Thermal Cruise" mode
...@@ -99,16 +107,16 @@ pwm[1-5]_enable - this file controls mode of fan/temperature control: ...@@ -99,16 +107,16 @@ pwm[1-5]_enable - this file controls mode of fan/temperature control:
* 4 "Smart Fan III" mode (NCT6775F only) * 4 "Smart Fan III" mode (NCT6775F only)
* 5 "Smart Fan IV" mode * 5 "Smart Fan IV" mode
pwm[1-5]_mode - controls if output is PWM or DC level pwm[1-7]_mode - controls if output is PWM or DC level
* 0 DC output * 0 DC output
* 1 PWM output * 1 PWM output
Common fan control attributes Common fan control attributes
----------------------------- -----------------------------
pwm[1-5]_temp_sel Temperature source. Value is temperature sensor index. pwm[1-7]_temp_sel Temperature source. Value is temperature sensor index.
For example, select '1' for temp1_input. For example, select '1' for temp1_input.
pwm[1-5]_weight_temp_sel pwm[1-7]_weight_temp_sel
Secondary temperature source. Value is temperature Secondary temperature source. Value is temperature
sensor index. For example, select '1' for temp1_input. sensor index. For example, select '1' for temp1_input.
Set to 0 to disable secondary temperature control. Set to 0 to disable secondary temperature control.
...@@ -116,16 +124,16 @@ pwm[1-5]_weight_temp_sel ...@@ -116,16 +124,16 @@ pwm[1-5]_weight_temp_sel
If secondary temperature functionality is enabled, it is controlled with the If secondary temperature functionality is enabled, it is controlled with the
following attributes. following attributes.
pwm[1-5]_weight_duty_step pwm[1-7]_weight_duty_step
Duty step size. Duty step size.
pwm[1-5]_weight_temp_step pwm[1-7]_weight_temp_step
Temperature step size. With each step over Temperature step size. With each step over
temp_step_base, the value of weight_duty_step is added temp_step_base, the value of weight_duty_step is added
to the current pwm value. to the current pwm value.
pwm[1-5]_weight_temp_step_base pwm[1-7]_weight_temp_step_base
Temperature at which secondary temperature control kicks Temperature at which secondary temperature control kicks
in. in.
pwm[1-5]_weight_temp_step_tol pwm[1-7]_weight_temp_step_tol
Temperature step tolerance. Temperature step tolerance.
Thermal Cruise mode (2) Thermal Cruise mode (2)
...@@ -133,9 +141,9 @@ Thermal Cruise mode (2) ...@@ -133,9 +141,9 @@ Thermal Cruise mode (2)
If the temperature is in the range defined by: If the temperature is in the range defined by:
pwm[1-5]_target_temp Target temperature, unit millidegree Celsius pwm[1-7]_target_temp Target temperature, unit millidegree Celsius
(range 0 - 127000) (range 0 - 127000)
pwm[1-5]_temp_tolerance pwm[1-7]_temp_tolerance
Target temperature tolerance, unit millidegree Celsius Target temperature tolerance, unit millidegree Celsius
there are no changes to fan speed. Once the temperature leaves the interval, fan there are no changes to fan speed. Once the temperature leaves the interval, fan
...@@ -143,14 +151,14 @@ speed increases (if temperature is higher that desired) or decreases (if ...@@ -143,14 +151,14 @@ speed increases (if temperature is higher that desired) or decreases (if
temperature is lower than desired), using the following limits and time temperature is lower than desired), using the following limits and time
intervals. intervals.
pwm[1-5]_start fan pwm start value (range 1 - 255), to start fan pwm[1-7]_start fan pwm start value (range 1 - 255), to start fan
when the temperature is above defined range. when the temperature is above defined range.
pwm[1-5]_floor lowest fan pwm (range 0 - 255) if temperature is below pwm[1-7]_floor lowest fan pwm (range 0 - 255) if temperature is below
the defined range. If set to 0, the fan is expected to the defined range. If set to 0, the fan is expected to
stop if the temperature is below the defined range. stop if the temperature is below the defined range.
pwm[1-5]_step_up_time milliseconds before fan speed is increased pwm[1-7]_step_up_time milliseconds before fan speed is increased
pwm[1-5]_step_down_time milliseconds before fan speed is decreased pwm[1-7]_step_down_time milliseconds before fan speed is decreased
pwm[1-5]_stop_time how many milliseconds must elapse to switch pwm[1-7]_stop_time how many milliseconds must elapse to switch
corresponding fan off (when the temperature was below corresponding fan off (when the temperature was below
defined range). defined range).
...@@ -159,8 +167,8 @@ Speed Cruise mode (3) ...@@ -159,8 +167,8 @@ Speed Cruise mode (3)
This modes tries to keep the fan speed constant. This modes tries to keep the fan speed constant.
fan[1-5]_target Target fan speed fan[1-7]_target Target fan speed
fan[1-5]_tolerance fan[1-7]_tolerance
Target speed tolerance Target speed tolerance
...@@ -177,19 +185,19 @@ points should be set to higher temperatures and higher pwm values to achieve ...@@ -177,19 +185,19 @@ points should be set to higher temperatures and higher pwm values to achieve
higher fan speeds with increasing temperature. The last data point reflects higher fan speeds with increasing temperature. The last data point reflects
critical temperature mode, in which the fans should run at full speed. critical temperature mode, in which the fans should run at full speed.
pwm[1-5]_auto_point[1-7]_pwm pwm[1-7]_auto_point[1-7]_pwm
pwm value to be set if temperature reaches matching pwm value to be set if temperature reaches matching
temperature range. temperature range.
pwm[1-5]_auto_point[1-7]_temp pwm[1-7]_auto_point[1-7]_temp
Temperature over which the matching pwm is enabled. Temperature over which the matching pwm is enabled.
pwm[1-5]_temp_tolerance pwm[1-7]_temp_tolerance
Temperature tolerance, unit millidegree Celsius Temperature tolerance, unit millidegree Celsius
pwm[1-5]_crit_temp_tolerance pwm[1-7]_crit_temp_tolerance
Temperature tolerance for critical temperature, Temperature tolerance for critical temperature,
unit millidegree Celsius unit millidegree Celsius
pwm[1-5]_step_up_time milliseconds before fan speed is increased pwm[1-7]_step_up_time milliseconds before fan speed is increased
pwm[1-5]_step_down_time milliseconds before fan speed is decreased pwm[1-7]_step_down_time milliseconds before fan speed is decreased
Usage Notes Usage Notes
----------- -----------
......
...@@ -6,13 +6,13 @@ Supported chips: ...@@ -6,13 +6,13 @@ Supported chips:
Prefix: 'sht21' Prefix: 'sht21'
Addresses scanned: none Addresses scanned: none
Datasheet: Publicly available at the Sensirion website Datasheet: Publicly available at the Sensirion website
http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT21.pdf http://www.sensirion.com/file/datasheet_sht21
* Sensirion SHT25 * Sensirion SHT25
Prefix: 'sht21' Prefix: 'sht25'
Addresses scanned: none Addresses scanned: none
Datasheet: Publicly available at the Sensirion website Datasheet: Publicly available at the Sensirion website
http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT25.pdf http://www.sensirion.com/file/datasheet_sht25
Author: Author:
Urs Fleisch <urs.fleisch@sensirion.com> Urs Fleisch <urs.fleisch@sensirion.com>
......
...@@ -5,7 +5,7 @@ Supported chips: ...@@ -5,7 +5,7 @@ Supported chips:
* Sensirion SHT3x-DIS * Sensirion SHT3x-DIS
Prefix: 'sht3x' Prefix: 'sht3x'
Addresses scanned: none Addresses scanned: none
Datasheet: http://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity/Sensirion_Humidity_Datasheet_SHT3x_DIS.pdf Datasheet: https://www.sensirion.com/file/datasheet_sht3x_digital
Author: Author:
David Frey <david.frey@sensirion.com> David Frey <david.frey@sensirion.com>
......
...@@ -1231,8 +1231,9 @@ config SENSORS_NCT6775 ...@@ -1231,8 +1231,9 @@ config SENSORS_NCT6775
help help
If you say yes here you get support for the hardware monitoring If you say yes here you get support for the hardware monitoring
functionality of the Nuvoton NCT6106D, NCT6775F, NCT6776F, NCT6779D, functionality of the Nuvoton NCT6106D, NCT6775F, NCT6776F, NCT6779D,
NCT6791D, NCT6792D, NCT6793D, and compatible Super-I/O chips. This NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D, and compatible
driver replaces the w83627ehf driver for NCT6775F and NCT6776F. Super-I/O chips. This driver replaces the w83627ehf driver for
NCT6775F and NCT6776F.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called nct6775. will be called nct6775.
......
...@@ -128,7 +128,6 @@ enum g762_regs { ...@@ -128,7 +128,6 @@ enum g762_regs {
G762_REG_FAN_CMD2_GEAR_MODE_1)) >> 2)) G762_REG_FAN_CMD2_GEAR_MODE_1)) >> 2))
struct g762_data { struct g762_data {
struct device *hwmon_dev;
struct i2c_client *client; struct i2c_client *client;
struct clk *clk; struct clk *clk;
...@@ -594,6 +593,14 @@ MODULE_DEVICE_TABLE(of, g762_dt_match); ...@@ -594,6 +593,14 @@ MODULE_DEVICE_TABLE(of, g762_dt_match);
* call to g762_of_clock_disable(). Note that a reference to clock is kept * call to g762_of_clock_disable(). Note that a reference to clock is kept
* in our private data structure to be used in this function. * in our private data structure to be used in this function.
*/ */
static void g762_of_clock_disable(void *data)
{
struct g762_data *g762 = data;
clk_disable_unprepare(g762->clk);
clk_put(g762->clk);
}
static int g762_of_clock_enable(struct i2c_client *client) static int g762_of_clock_enable(struct i2c_client *client)
{ {
struct g762_data *data; struct g762_data *data;
...@@ -626,6 +633,7 @@ static int g762_of_clock_enable(struct i2c_client *client) ...@@ -626,6 +633,7 @@ static int g762_of_clock_enable(struct i2c_client *client)
data = i2c_get_clientdata(client); data = i2c_get_clientdata(client);
data->clk = clk; data->clk = clk;
devm_add_action(&client->dev, g762_of_clock_disable, data);
return 0; return 0;
clk_unprep: clk_unprep:
...@@ -637,17 +645,6 @@ static int g762_of_clock_enable(struct i2c_client *client) ...@@ -637,17 +645,6 @@ static int g762_of_clock_enable(struct i2c_client *client)
return ret; return ret;
} }
static void g762_of_clock_disable(struct i2c_client *client)
{
struct g762_data *data = i2c_get_clientdata(client);
if (!data->clk)
return;
clk_disable_unprepare(data->clk);
clk_put(data->clk);
}
static int g762_of_prop_import_one(struct i2c_client *client, static int g762_of_prop_import_one(struct i2c_client *client,
const char *pname, const char *pname,
int (*psetter)(struct device *dev, int (*psetter)(struct device *dev,
...@@ -698,8 +695,6 @@ static int g762_of_clock_enable(struct i2c_client *client) ...@@ -698,8 +695,6 @@ static int g762_of_clock_enable(struct i2c_client *client)
{ {
return 0; return 0;
} }
static void g762_of_clock_disable(struct i2c_client *client) { }
#endif #endif
/* /*
...@@ -1054,6 +1049,7 @@ static inline int g762_fan_init(struct device *dev) ...@@ -1054,6 +1049,7 @@ static inline int g762_fan_init(struct device *dev)
static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id)
{ {
struct device *dev = &client->dev; struct device *dev = &client->dev;
struct device *hwmon_dev;
struct g762_data *data; struct g762_data *data;
int ret; int ret;
...@@ -1080,35 +1076,15 @@ static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -1080,35 +1076,15 @@ static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id)
return ret; return ret;
ret = g762_of_prop_import(client); ret = g762_of_prop_import(client);
if (ret) if (ret)
goto clock_dis; return ret;
/* ... or platform_data */ /* ... or platform_data */
ret = g762_pdata_prop_import(client); ret = g762_pdata_prop_import(client);
if (ret) if (ret)
goto clock_dis;
data->hwmon_dev = hwmon_device_register_with_groups(dev, client->name,
data, g762_groups);
if (IS_ERR(data->hwmon_dev)) {
ret = PTR_ERR(data->hwmon_dev);
goto clock_dis;
}
return 0;
clock_dis:
g762_of_clock_disable(client);
return ret; return ret;
}
static int g762_remove(struct i2c_client *client)
{
struct g762_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->hwmon_dev); hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
g762_of_clock_disable(client); data, g762_groups);
return PTR_ERR_OR_ZERO(hwmon_dev);
return 0;
} }
static struct i2c_driver g762_driver = { static struct i2c_driver g762_driver = {
...@@ -1117,7 +1093,6 @@ static struct i2c_driver g762_driver = { ...@@ -1117,7 +1093,6 @@ static struct i2c_driver g762_driver = {
.of_match_table = of_match_ptr(g762_dt_match), .of_match_table = of_match_ptr(g762_dt_match),
}, },
.probe = g762_probe, .probe = g762_probe,
.remove = g762_remove,
.id_table = g762_id, .id_table = g762_id,
}; };
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
*/ */
static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b,
I2C_CLIENT_END }; I2C_CLIENT_END };
enum chips { lm92, max6635 };
/* The LM92 registers */ /* The LM92 registers */
#define LM92_REG_CONFIG 0x01 /* 8-bit, RW */ #define LM92_REG_CONFIG 0x01 /* 8-bit, RW */
...@@ -259,62 +260,6 @@ static void lm92_init_client(struct i2c_client *client) ...@@ -259,62 +260,6 @@ static void lm92_init_client(struct i2c_client *client)
config & 0xFE); config & 0xFE);
} }
/*
* The MAX6635 has no identification register, so we have to use tricks
* to identify it reliably. This is somewhat slow.
* Note that we do NOT rely on the 2 MSB of the configuration register
* always reading 0, as suggested by the datasheet, because it was once
* reported not to be true.
*/
static int max6635_check(struct i2c_client *client)
{
u16 temp_low, temp_high, temp_hyst, temp_crit;
u8 conf;
int i;
/*
* No manufacturer ID register, so a read from this address will
* always return the last read value.
*/
temp_low = i2c_smbus_read_word_data(client, LM92_REG_TEMP_LOW);
if (i2c_smbus_read_word_data(client, LM92_REG_MAN_ID) != temp_low)
return 0;
temp_high = i2c_smbus_read_word_data(client, LM92_REG_TEMP_HIGH);
if (i2c_smbus_read_word_data(client, LM92_REG_MAN_ID) != temp_high)
return 0;
/* Limits are stored as integer values (signed, 9-bit). */
if ((temp_low & 0x7f00) || (temp_high & 0x7f00))
return 0;
temp_hyst = i2c_smbus_read_word_data(client, LM92_REG_TEMP_HYST);
temp_crit = i2c_smbus_read_word_data(client, LM92_REG_TEMP_CRIT);
if ((temp_hyst & 0x7f00) || (temp_crit & 0x7f00))
return 0;
/*
* Registers addresses were found to cycle over 16-byte boundaries.
* We don't test all registers with all offsets so as to save some
* reads and time, but this should still be sufficient to dismiss
* non-MAX6635 chips.
*/
conf = i2c_smbus_read_byte_data(client, LM92_REG_CONFIG);
for (i = 16; i < 96; i *= 2) {
if (temp_hyst != i2c_smbus_read_word_data(client,
LM92_REG_TEMP_HYST + i - 16)
|| temp_crit != i2c_smbus_read_word_data(client,
LM92_REG_TEMP_CRIT + i)
|| temp_low != i2c_smbus_read_word_data(client,
LM92_REG_TEMP_LOW + i + 16)
|| temp_high != i2c_smbus_read_word_data(client,
LM92_REG_TEMP_HIGH + i + 32)
|| conf != i2c_smbus_read_byte_data(client,
LM92_REG_CONFIG + i))
return 0;
}
return 1;
}
static struct attribute *lm92_attrs[] = { static struct attribute *lm92_attrs[] = {
&sensor_dev_attr_temp1_input.dev_attr.attr, &sensor_dev_attr_temp1_input.dev_attr.attr,
&sensor_dev_attr_temp1_crit.dev_attr.attr, &sensor_dev_attr_temp1_crit.dev_attr.attr,
...@@ -348,8 +293,6 @@ static int lm92_detect(struct i2c_client *new_client, ...@@ -348,8 +293,6 @@ static int lm92_detect(struct i2c_client *new_client,
if ((config & 0xe0) == 0x00 && man_id == 0x0180) if ((config & 0xe0) == 0x00 && man_id == 0x0180)
pr_info("lm92: Found National Semiconductor LM92 chip\n"); pr_info("lm92: Found National Semiconductor LM92 chip\n");
else if (max6635_check(new_client))
pr_info("lm92: Found Maxim MAX6635 chip\n");
else else
return -ENODEV; return -ENODEV;
...@@ -387,8 +330,8 @@ static int lm92_probe(struct i2c_client *new_client, ...@@ -387,8 +330,8 @@ static int lm92_probe(struct i2c_client *new_client,
*/ */
static const struct i2c_device_id lm92_id[] = { static const struct i2c_device_id lm92_id[] = {
{ "lm92", 0 }, { "lm92", lm92 },
/* max6635 could be added here */ { "max6635", max6635 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, lm92_id); MODULE_DEVICE_TABLE(i2c, lm92_id);
......
This diff is collapsed.
...@@ -31,8 +31,8 @@ config SENSORS_ADM1275 ...@@ -31,8 +31,8 @@ config SENSORS_ADM1275
default n default n
help help
If you say yes here you get hardware monitoring support for Analog If you say yes here you get hardware monitoring support for Analog
Devices ADM1075, ADM1275, ADM1276, ADM1278, ADM1293, and ADM1294 Devices ADM1075, ADM1272, ADM1275, ADM1276, ADM1278, ADM1293,
Hot-Swap Controller and Digital Power Monitors. and ADM1294 Hot-Swap Controller and Digital Power Monitors.
This driver can also be built as a module. If so, the module will This driver can also be built as a module. If so, the module will
be called adm1275. be called adm1275.
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* and Digital Power Monitor * and Digital Power Monitor
* *
* Copyright (c) 2011 Ericsson AB. * Copyright (c) 2011 Ericsson AB.
* Copyright (c) 2018 Guenter Roeck
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -24,7 +25,7 @@ ...@@ -24,7 +25,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include "pmbus.h" #include "pmbus.h"
enum chips { adm1075, adm1275, adm1276, adm1278, adm1293, adm1294 }; enum chips { adm1075, adm1272, adm1275, adm1276, adm1278, adm1293, adm1294 };
#define ADM1275_MFR_STATUS_IOUT_WARN2 BIT(0) #define ADM1275_MFR_STATUS_IOUT_WARN2 BIT(0)
#define ADM1293_MFR_STATUS_VAUX_UV_WARN BIT(5) #define ADM1293_MFR_STATUS_VAUX_UV_WARN BIT(5)
...@@ -41,6 +42,8 @@ enum chips { adm1075, adm1275, adm1276, adm1278, adm1293, adm1294 }; ...@@ -41,6 +42,8 @@ enum chips { adm1075, adm1275, adm1276, adm1278, adm1293, adm1294 };
#define ADM1075_IRANGE_25 BIT(3) #define ADM1075_IRANGE_25 BIT(3)
#define ADM1075_IRANGE_MASK (BIT(3) | BIT(4)) #define ADM1075_IRANGE_MASK (BIT(3) | BIT(4))
#define ADM1272_IRANGE BIT(0)
#define ADM1278_TEMP1_EN BIT(3) #define ADM1278_TEMP1_EN BIT(3)
#define ADM1278_VIN_EN BIT(2) #define ADM1278_VIN_EN BIT(2)
#define ADM1278_VOUT_EN BIT(1) #define ADM1278_VOUT_EN BIT(1)
...@@ -105,6 +108,19 @@ static const struct coefficients adm1075_coefficients[] = { ...@@ -105,6 +108,19 @@ static const struct coefficients adm1075_coefficients[] = {
[4] = { 4279, 0, -1 }, /* power, irange50 */ [4] = { 4279, 0, -1 }, /* power, irange50 */
}; };
static const struct coefficients adm1272_coefficients[] = {
[0] = { 6770, 0, -2 }, /* voltage, vrange 60V */
[1] = { 4062, 0, -2 }, /* voltage, vrange 100V */
[2] = { 1326, 20480, -1 }, /* current, vsense range 15mV */
[3] = { 663, 20480, -1 }, /* current, vsense range 30mV */
[4] = { 3512, 0, -2 }, /* power, vrange 60V, irange 15mV */
[5] = { 21071, 0, -3 }, /* power, vrange 100V, irange 15mV */
[6] = { 17561, 0, -3 }, /* power, vrange 60V, irange 30mV */
[7] = { 10535, 0, -3 }, /* power, vrange 100V, irange 30mV */
[8] = { 42, 31871, -1 }, /* temperature */
};
static const struct coefficients adm1275_coefficients[] = { static const struct coefficients adm1275_coefficients[] = {
[0] = { 19199, 0, -2 }, /* voltage, vrange set */ [0] = { 19199, 0, -2 }, /* voltage, vrange set */
[1] = { 6720, 0, -1 }, /* voltage, vrange not set */ [1] = { 6720, 0, -1 }, /* voltage, vrange not set */
...@@ -154,7 +170,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg) ...@@ -154,7 +170,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
const struct adm1275_data *data = to_adm1275_data(info); const struct adm1275_data *data = to_adm1275_data(info);
int ret = 0; int ret = 0;
if (page) if (page > 0)
return -ENXIO; return -ENXIO;
switch (reg) { switch (reg) {
...@@ -240,7 +256,7 @@ static int adm1275_write_word_data(struct i2c_client *client, int page, int reg, ...@@ -240,7 +256,7 @@ static int adm1275_write_word_data(struct i2c_client *client, int page, int reg,
const struct adm1275_data *data = to_adm1275_data(info); const struct adm1275_data *data = to_adm1275_data(info);
int ret; int ret;
if (page) if (page > 0)
return -ENXIO; return -ENXIO;
switch (reg) { switch (reg) {
...@@ -335,6 +351,7 @@ static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg) ...@@ -335,6 +351,7 @@ static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg)
static const struct i2c_device_id adm1275_id[] = { static const struct i2c_device_id adm1275_id[] = {
{ "adm1075", adm1075 }, { "adm1075", adm1075 },
{ "adm1272", adm1272 },
{ "adm1275", adm1275 }, { "adm1275", adm1275 },
{ "adm1276", adm1276 }, { "adm1276", adm1276 },
{ "adm1278", adm1278 }, { "adm1278", adm1278 },
...@@ -451,6 +468,54 @@ static int adm1275_probe(struct i2c_client *client, ...@@ -451,6 +468,54 @@ static int adm1275_probe(struct i2c_client *client,
info->func[0] |= info->func[0] |=
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
break; break;
case adm1272:
data->have_vout = true;
data->have_pin_max = true;
data->have_temp_max = true;
coefficients = adm1272_coefficients;
vindex = (config & ADM1275_VRANGE) ? 1 : 0;
cindex = (config & ADM1272_IRANGE) ? 3 : 2;
/* pindex depends on the combination of the above */
switch (config & (ADM1275_VRANGE | ADM1272_IRANGE)) {
case 0:
default:
pindex = 4;
break;
case ADM1275_VRANGE:
pindex = 5;
break;
case ADM1272_IRANGE:
pindex = 6;
break;
case ADM1275_VRANGE | ADM1272_IRANGE:
pindex = 7;
break;
}
tindex = 8;
info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
/* Enable VOUT if not enabled (it is disabled by default) */
if (!(config & ADM1278_VOUT_EN)) {
config |= ADM1278_VOUT_EN;
ret = i2c_smbus_write_byte_data(client,
ADM1275_PMON_CONFIG,
config);
if (ret < 0) {
dev_err(&client->dev,
"Failed to enable VOUT monitoring\n");
return -ENODEV;
}
}
if (config & ADM1278_TEMP1_EN)
info->func[0] |=
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
if (config & ADM1278_VIN_EN)
info->func[0] |= PMBUS_HAVE_VIN;
break;
case adm1275: case adm1275:
if (device_config & ADM1275_IOUT_WARN2_SELECT) if (device_config & ADM1275_IOUT_WARN2_SELECT)
data->have_oc_fault = true; data->have_oc_fault = true;
......
...@@ -45,7 +45,7 @@ static int max8688_read_word_data(struct i2c_client *client, int page, int reg) ...@@ -45,7 +45,7 @@ static int max8688_read_word_data(struct i2c_client *client, int page, int reg)
{ {
int ret; int ret;
if (page) if (page > 0)
return -ENXIO; return -ENXIO;
switch (reg) { switch (reg) {
......
This diff is collapsed.
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA
* *
* Data sheet available (5/2010) at * Data sheet available at http://www.sensirion.com/file/datasheet_sht21
* http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT21.pdf
*/ */
#include <linux/module.h> #include <linux/module.h>
......
...@@ -136,6 +136,9 @@ static int via_cputemp_probe(struct platform_device *pdev) ...@@ -136,6 +136,9 @@ static int via_cputemp_probe(struct platform_device *pdev)
data->id = pdev->id; data->id = pdev->id;
data->name = "via_cputemp"; data->name = "via_cputemp";
if (c->x86 == 7) {
data->msr_temp = 0x1423;
} else {
switch (c->x86_model) { switch (c->x86_model) {
case 0xA: case 0xA:
/* C7 A */ /* C7 A */
...@@ -151,6 +154,7 @@ static int via_cputemp_probe(struct platform_device *pdev) ...@@ -151,6 +154,7 @@ static int via_cputemp_probe(struct platform_device *pdev)
default: default:
return -ENODEV; return -ENODEV;
} }
}
/* test if we can access the TEMPERATURE MSR */ /* test if we can access the TEMPERATURE MSR */
err = rdmsr_safe_on_cpu(data->id, data->msr_temp, &eax, &edx); err = rdmsr_safe_on_cpu(data->id, data->msr_temp, &eax, &edx);
...@@ -283,6 +287,7 @@ static const struct x86_cpu_id __initconst cputemp_ids[] = { ...@@ -283,6 +287,7 @@ static const struct x86_cpu_id __initconst cputemp_ids[] = {
{ X86_VENDOR_CENTAUR, 6, 0xa, }, /* C7 A */ { X86_VENDOR_CENTAUR, 6, 0xa, }, /* C7 A */
{ X86_VENDOR_CENTAUR, 6, 0xd, }, /* C7 D */ { X86_VENDOR_CENTAUR, 6, 0xd, }, /* C7 D */
{ X86_VENDOR_CENTAUR, 6, 0xf, }, /* Nano */ { X86_VENDOR_CENTAUR, 6, 0xf, }, /* Nano */
{ X86_VENDOR_CENTAUR, 7, X86_MODEL_ANY, },
{} {}
}; };
MODULE_DEVICE_TABLE(x86cpu, cputemp_ids); MODULE_DEVICE_TABLE(x86cpu, cputemp_ids);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment