Commit b8e445b6 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull hwmon updates from Guenter Roeck:

 - Add support for trace events to hwmon core

 - Add support for NCT6797D, NCT6798D, MAX31725/6, LTM4686

 - Support all AMD Family 15h Model 6xh and Model 7xh processors in
   k10temp driver

 - Convert ina3221 driver to _info API

 - Fixes, cleanups, and improvements in various drivers

* tag 'hwmon-for-v4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: (46 commits)
  hwmon: (pmbus) Fix page count auto-detection.
  hwmon: (pmbus) remove redundant 'default n' from Kconfig
  hwmon: (core) Add trace events to _attr_show/store functions
  hwmon: (ina3221) Use _info API to register hwmon device
  hwmon: (npcm-750-pwm-fan) Change initial pwm target to 255
  hwmon: (ina3221) Validate shunt resistor value from DT
  hwmon: (tmp421) make const array 'names' static
  hwmon: (core) Add hwmon_in_enable attribute
  hwmon: (ina3221) mark PM functions as __maybe_unused
  hwmon: (ina3221) Read channel input source info from DT
  dt-bindings: hwmon: Add ina3221 documentation
  hwmon: (ina3221) Add suspend and resume functions
  hwmon: (ina3221) Fix INA3221_CONFIG_MODE macros
  hwmon: (ina3221) Add INA3221_CONFIG to volatile_table
  MAINTAINERS: Update PMBUS maintainer entry
  hwmon: (pwm-fan) Set fan speed to 0 on suspend
  hwmon: (pwm-fan) Silence error on probe deferral
  hwmon: (scpi-hwmon) remove redundant continue
  hwmon: (nct6775) Add support for NCT6798D
  hwmon: (nct6775) Add support for NCT6797D
  ...
parents cff22949 e7c6a556
Texas Instruments INA3221 Device Tree Bindings
1) ina3221 node
Required properties:
- compatible: Must be "ti,ina3221"
- reg: I2C address
Optional properties:
= The node contains optional child nodes for three channels =
= Each child node describes the information of input source =
- #address-cells: Required only if a child node is present. Must be 1.
- #size-cells: Required only if a child node is present. Must be 0.
2) child nodes
Required properties:
- reg: Must be 0, 1 or 2, corresponding to IN1, IN2 or IN3 port of INA3221
Optional properties:
- label: Name of the input source
- shunt-resistor-micro-ohms: Shunt resistor value in micro-Ohm
Example:
ina3221@40 {
compatible = "ti,ina3221";
reg = <0x40>;
#address-cells = <1>;
#size-cells = <0>;
input@0 {
reg = <0x0>;
status = "disabled";
};
input@1 {
reg = <0x1>;
shunt-resistor-micro-ohms = <5000>;
};
input@2 {
reg = <0x2>;
label = "VDD_5V";
shunt-resistor-micro-ohms = <5000>;
};
};
...@@ -15,6 +15,7 @@ Required properties: ...@@ -15,6 +15,7 @@ Required properties:
* "lltc,ltm2987" * "lltc,ltm2987"
* "lltc,ltm4675" * "lltc,ltm4675"
* "lltc,ltm4676" * "lltc,ltm4676"
* "lltc,ltm4686"
- reg: I2C slave address - reg: I2C slave address
Optional properties: Optional properties:
...@@ -30,6 +31,7 @@ Valid names of regulators depend on number of supplies supported per device: ...@@ -30,6 +31,7 @@ Valid names of regulators depend on number of supplies supported per device:
* ltc3880, ltc3882, ltc3886 : vout0 - vout1 * ltc3880, ltc3882, ltc3886 : vout0 - vout1
* ltc3883 : vout0 * ltc3883 : vout0
* ltm4676 : vout0 - vout1 * ltm4676 : vout0 - vout1
* ltm4686 : vout0 - vout1
Example: Example:
ltc2978@5e { ltc2978@5e {
......
...@@ -21,6 +21,8 @@ and power are calculated host-side from these. ...@@ -21,6 +21,8 @@ and power are calculated host-side from these.
Sysfs entries Sysfs entries
------------- -------------
in[123]_label Voltage channel labels
in[123]_enable Voltage channel enable controls
in[123]_input Bus voltage(mV) channels in[123]_input Bus voltage(mV) channels
curr[123]_input Current(mA) measurement channels curr[123]_input Current(mA) measurement channels
shunt[123]_resistor Shunt resistance(uOhm) channels shunt[123]_resistor Shunt resistance(uOhm) channels
......
...@@ -17,8 +17,8 @@ Supported chips: ...@@ -17,8 +17,8 @@ Supported chips:
Addresses scanned: none Addresses scanned: none
Datasheet: Publicly available at the Maxim website Datasheet: Publicly available at the Maxim website
http://www.maximintegrated.com/ http://www.maximintegrated.com/
* Maxim MAX6625, MAX6626 * Maxim MAX6625, MAX6626, MAX31725, MAX31726
Prefixes: 'max6625', 'max6626' Prefixes: 'max6625', 'max6626', 'max31725', 'max31726'
Addresses scanned: none Addresses scanned: none
Datasheet: Publicly available at the Maxim website Datasheet: Publicly available at the Maxim website
http://www.maxim-ic.com/ http://www.maxim-ic.com/
...@@ -86,7 +86,7 @@ The LM75 is essentially an industry standard; there may be other ...@@ -86,7 +86,7 @@ The LM75 is essentially an industry standard; there may be other
LM75 clones not listed here, with or without various enhancements, LM75 clones not listed here, with or without various enhancements,
that are supported. The clones are not detected by the driver, unless that are supported. The clones are not detected by the driver, unless
they reproduce the exact register tricks of the original LM75, and must they reproduce the exact register tricks of the original LM75, and must
therefore be instantiated explicitly. Higher resolution up to 12-bit therefore be instantiated explicitly. Higher resolution up to 16-bit
is supported by this driver, other specific enhancements are not. is supported by this driver, other specific enhancements are not.
The LM77 is not supported, contrary to what we pretended for a long time. The LM77 is not supported, contrary to what we pretended for a long time.
......
...@@ -55,6 +55,10 @@ Supported chips: ...@@ -55,6 +55,10 @@ Supported chips:
Prefix: 'ltm4676' Prefix: 'ltm4676'
Addresses scanned: - Addresses scanned: -
Datasheet: http://www.linear.com/product/ltm4676 Datasheet: http://www.linear.com/product/ltm4676
* Analog Devices LTM4686
Prefix: 'ltm4686'
Addresses scanned: -
Datasheet: http://www.analog.com/ltm4686
Author: Guenter Roeck <linux@roeck-us.net> Author: Guenter Roeck <linux@roeck-us.net>
...@@ -76,6 +80,7 @@ additional components on a single die. The chip is instantiated and reported ...@@ -76,6 +80,7 @@ additional components on a single die. The chip is instantiated and reported
as two separate chips on two different I2C bus addresses. as two separate chips on two different I2C bus addresses.
LTM4675 is a dual 9A or single 18A μModule regulator LTM4675 is a dual 9A or single 18A μModule regulator
LTM4676 is a dual 13A or single 26A uModule regulator. LTM4676 is a dual 13A or single 26A uModule regulator.
LTM4686 is a dual 10A or single 20A uModule regulator.
Usage Notes Usage Notes
......
...@@ -2,12 +2,12 @@ Kernel driver mc13783-adc ...@@ -2,12 +2,12 @@ Kernel driver mc13783-adc
========================= =========================
Supported chips: Supported chips:
* Freescale Atlas MC13783 * Freescale MC13783
Prefix: 'mc13783' Prefix: 'mc13783'
Datasheet: http://www.freescale.com/files/rf_if/doc/data_sheet/MC13783.pdf?fsrch=1 Datasheet: https://www.nxp.com/docs/en/data-sheet/MC13783.pdf
* Freescale Atlas MC13892 * Freescale MC13892
Prefix: 'mc13892' Prefix: 'mc13892'
Datasheet: http://cache.freescale.com/files/analog/doc/data_sheet/MC13892.pdf?fsrch=1&sr=1 Datasheet: https://www.nxp.com/docs/en/data-sheet/MC13892.pdf
Authors: Authors:
Sascha Hauer <s.hauer@pengutronix.de> Sascha Hauer <s.hauer@pengutronix.de>
......
...@@ -6468,6 +6468,7 @@ F: Documentation/devicetree/bindings/hwmon/ ...@@ -6468,6 +6468,7 @@ F: Documentation/devicetree/bindings/hwmon/
F: Documentation/hwmon/ F: Documentation/hwmon/
F: drivers/hwmon/ F: drivers/hwmon/
F: include/linux/hwmon*.h F: include/linux/hwmon*.h
F: include/trace/events/hwmon*.h
HARDWARE RANDOM NUMBER GENERATOR CORE HARDWARE RANDOM NUMBER GENERATOR CORE
M: Matt Mackall <mpm@selenic.com> M: Matt Mackall <mpm@selenic.com>
...@@ -8860,13 +8861,6 @@ S: Maintained ...@@ -8860,13 +8861,6 @@ S: Maintained
F: Documentation/hwmon/max16065 F: Documentation/hwmon/max16065
F: drivers/hwmon/max16065.c F: drivers/hwmon/max16065.c
MAX20751 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net>
L: linux-hwmon@vger.kernel.org
S: Maintained
F: Documentation/hwmon/max20751
F: drivers/hwmon/max20751.c
MAX2175 SDR TUNER DRIVER MAX2175 SDR TUNER DRIVER
M: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com> M: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>
L: linux-media@vger.kernel.org L: linux-media@vger.kernel.org
...@@ -11601,7 +11595,26 @@ W: http://hwmon.wiki.kernel.org/ ...@@ -11601,7 +11595,26 @@ W: http://hwmon.wiki.kernel.org/
W: http://www.roeck-us.net/linux/drivers/ W: http://www.roeck-us.net/linux/drivers/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/hwmon/ibm,cffps1.txt
F: Documentation/devicetree/bindings/hwmon/max31785.txt
F: Documentation/devicetree/bindings/hwmon/ltc2978.txt
F: Documentation/hwmon/adm1275
F: Documentation/hwmon/ibm-cffps
F: Documentation/hwmon/ir35221
F: Documentation/hwmon/lm25066
F: Documentation/hwmon/ltc2978
F: Documentation/hwmon/ltc3815
F: Documentation/hwmon/max16064
F: Documentation/hwmon/max20751
F: Documentation/hwmon/max31785
F: Documentation/hwmon/max34440
F: Documentation/hwmon/max8688
F: Documentation/hwmon/pmbus F: Documentation/hwmon/pmbus
F: Documentation/hwmon/pmbus-core
F: Documentation/hwmon/tps40422
F: Documentation/hwmon/ucd9000
F: Documentation/hwmon/ucd9200
F: Documentation/hwmon/zl6100
F: drivers/hwmon/pmbus/ F: drivers/hwmon/pmbus/
F: include/linux/pmbus.h F: include/linux/pmbus.h
......
...@@ -852,7 +852,7 @@ static int aspeed_create_pwm_cooling(struct device *dev, ...@@ -852,7 +852,7 @@ static int aspeed_create_pwm_cooling(struct device *dev,
dev_err(dev, "Property 'cooling-levels' cannot be read.\n"); dev_err(dev, "Property 'cooling-levels' cannot be read.\n");
return ret; return ret;
} }
snprintf(cdev->name, MAX_CDEV_NAME_LEN, "%s%d", child->name, pwm_port); snprintf(cdev->name, MAX_CDEV_NAME_LEN, "%pOFn%d", child, pwm_port);
cdev->tcdev = thermal_of_cooling_device_register(child, cdev->tcdev = thermal_of_cooling_device_register(child,
cdev->name, cdev->name,
......
...@@ -1210,10 +1210,8 @@ static int atk_register_hwmon(struct atk_data *data) ...@@ -1210,10 +1210,8 @@ static int atk_register_hwmon(struct atk_data *data)
data->hwmon_dev = hwmon_device_register_with_groups(dev, "atk0110", data->hwmon_dev = hwmon_device_register_with_groups(dev, "atk0110",
data, data,
data->attr_groups); data->attr_groups);
if (IS_ERR(data->hwmon_dev))
return PTR_ERR(data->hwmon_dev);
return 0; return PTR_ERR_OR_ZERO(data->hwmon_dev);
} }
static int atk_probe_if(struct atk_data *data) static int atk_probe_if(struct atk_data *data)
......
...@@ -24,6 +24,9 @@ ...@@ -24,6 +24,9 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/thermal.h> #include <linux/thermal.h>
#define CREATE_TRACE_POINTS
#include <trace/events/hwmon.h>
#define HWMON_ID_PREFIX "hwmon" #define HWMON_ID_PREFIX "hwmon"
#define HWMON_ID_FORMAT HWMON_ID_PREFIX "%d" #define HWMON_ID_FORMAT HWMON_ID_PREFIX "%d"
...@@ -171,6 +174,13 @@ static int hwmon_thermal_add_sensor(struct device *dev, ...@@ -171,6 +174,13 @@ static int hwmon_thermal_add_sensor(struct device *dev,
} }
#endif /* IS_REACHABLE(CONFIG_THERMAL) && ... */ #endif /* IS_REACHABLE(CONFIG_THERMAL) && ... */
static int hwmon_attr_base(enum hwmon_sensor_types type)
{
if (type == hwmon_in)
return 0;
return 1;
}
/* sysfs attribute management */ /* sysfs attribute management */
static ssize_t hwmon_attr_show(struct device *dev, static ssize_t hwmon_attr_show(struct device *dev,
...@@ -185,6 +195,9 @@ static ssize_t hwmon_attr_show(struct device *dev, ...@@ -185,6 +195,9 @@ static ssize_t hwmon_attr_show(struct device *dev,
if (ret < 0) if (ret < 0)
return ret; return ret;
trace_hwmon_attr_show(hattr->index + hwmon_attr_base(hattr->type),
hattr->name, val);
return sprintf(buf, "%ld\n", val); return sprintf(buf, "%ld\n", val);
} }
...@@ -193,6 +206,7 @@ static ssize_t hwmon_attr_show_string(struct device *dev, ...@@ -193,6 +206,7 @@ static ssize_t hwmon_attr_show_string(struct device *dev,
char *buf) char *buf)
{ {
struct hwmon_device_attribute *hattr = to_hwmon_attr(devattr); struct hwmon_device_attribute *hattr = to_hwmon_attr(devattr);
enum hwmon_sensor_types type = hattr->type;
const char *s; const char *s;
int ret; int ret;
...@@ -201,6 +215,9 @@ static ssize_t hwmon_attr_show_string(struct device *dev, ...@@ -201,6 +215,9 @@ static ssize_t hwmon_attr_show_string(struct device *dev,
if (ret < 0) if (ret < 0)
return ret; return ret;
trace_hwmon_attr_show_string(hattr->index + hwmon_attr_base(type),
hattr->name, s);
return sprintf(buf, "%s\n", s); return sprintf(buf, "%s\n", s);
} }
...@@ -221,14 +238,10 @@ static ssize_t hwmon_attr_store(struct device *dev, ...@@ -221,14 +238,10 @@ static ssize_t hwmon_attr_store(struct device *dev,
if (ret < 0) if (ret < 0)
return ret; return ret;
return count; trace_hwmon_attr_store(hattr->index + hwmon_attr_base(hattr->type),
} hattr->name, val);
static int hwmon_attr_base(enum hwmon_sensor_types type) return count;
{
if (type == hwmon_in)
return 0;
return 1;
} }
static bool is_string_attr(enum hwmon_sensor_types type, u32 attr) static bool is_string_attr(enum hwmon_sensor_types type, u32 attr)
...@@ -356,6 +369,7 @@ static const char * const hwmon_in_attr_templates[] = { ...@@ -356,6 +369,7 @@ static const char * const hwmon_in_attr_templates[] = {
[hwmon_in_max_alarm] = "in%d_max_alarm", [hwmon_in_max_alarm] = "in%d_max_alarm",
[hwmon_in_lcrit_alarm] = "in%d_lcrit_alarm", [hwmon_in_lcrit_alarm] = "in%d_lcrit_alarm",
[hwmon_in_crit_alarm] = "in%d_crit_alarm", [hwmon_in_crit_alarm] = "in%d_crit_alarm",
[hwmon_in_enable] = "in%d_enable",
}; };
static const char * const hwmon_curr_attr_templates[] = { static const char * const hwmon_curr_attr_templates[] = {
......
...@@ -458,9 +458,6 @@ static int populate_attr_groups(struct platform_device *pdev) ...@@ -458,9 +458,6 @@ static int populate_attr_groups(struct platform_device *pdev)
for_each_child_of_node(opal, np) { for_each_child_of_node(opal, np) {
const char *label; const char *label;
if (np->name == NULL)
continue;
type = get_sensor_type(np); type = get_sensor_type(np);
if (type == MAX_SENSOR_TYPE) if (type == MAX_SENSOR_TYPE)
continue; continue;
...@@ -589,9 +586,6 @@ static int create_device_attrs(struct platform_device *pdev) ...@@ -589,9 +586,6 @@ static int create_device_attrs(struct platform_device *pdev)
const char *label; const char *label;
enum sensors type; enum sensors type;
if (np->name == NULL)
continue;
type = get_sensor_type(np); type = get_sensor_type(np);
if (type == MAX_SENSOR_TYPE) if (type == MAX_SENSOR_TYPE)
continue; continue;
...@@ -603,8 +597,8 @@ static int create_device_attrs(struct platform_device *pdev) ...@@ -603,8 +597,8 @@ static int create_device_attrs(struct platform_device *pdev)
if (of_property_read_u32(np, "sensor-id", &sensor_id) && if (of_property_read_u32(np, "sensor-id", &sensor_id) &&
of_property_read_u32(np, "sensor-data", &sensor_id)) { of_property_read_u32(np, "sensor-data", &sensor_id)) {
dev_info(&pdev->dev, dev_info(&pdev->dev,
"'sensor-id' missing in the node '%s'\n", "'sensor-id' missing in the node '%pOFn'\n",
np->name); np);
continue; continue;
} }
......
...@@ -65,13 +65,9 @@ static int iio_hwmon_probe(struct platform_device *pdev) ...@@ -65,13 +65,9 @@ static int iio_hwmon_probe(struct platform_device *pdev)
int in_i = 1, temp_i = 1, curr_i = 1, humidity_i = 1; int in_i = 1, temp_i = 1, curr_i = 1, humidity_i = 1;
enum iio_chan_type type; enum iio_chan_type type;
struct iio_channel *channels; struct iio_channel *channels;
const char *name = "iio_hwmon";
struct device *hwmon_dev; struct device *hwmon_dev;
char *sname; char *sname;
if (dev->of_node && dev->of_node->name)
name = dev->of_node->name;
channels = devm_iio_channel_get_all(dev); channels = devm_iio_channel_get_all(dev);
if (IS_ERR(channels)) { if (IS_ERR(channels)) {
if (PTR_ERR(channels) == -ENODEV) if (PTR_ERR(channels) == -ENODEV)
...@@ -141,11 +137,15 @@ static int iio_hwmon_probe(struct platform_device *pdev) ...@@ -141,11 +137,15 @@ static int iio_hwmon_probe(struct platform_device *pdev)
st->attr_group.attrs = st->attrs; st->attr_group.attrs = st->attrs;
st->groups[0] = &st->attr_group; st->groups[0] = &st->attr_group;
sname = devm_kstrdup(dev, name, GFP_KERNEL); if (dev->of_node) {
if (!sname) sname = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node);
return -ENOMEM; if (!sname)
return -ENOMEM;
strreplace(sname, '-', '_');
} else {
sname = "iio_hwmon";
}
strreplace(sname, '-', '_');
hwmon_dev = devm_hwmon_device_register_with_groups(dev, sname, st, hwmon_dev = devm_hwmon_device_register_with_groups(dev, sname, st,
st->groups); st->groups);
return PTR_ERR_OR_ZERO(hwmon_dev); return PTR_ERR_OR_ZERO(hwmon_dev);
......
This diff is collapsed.
...@@ -325,8 +325,9 @@ static int k10temp_probe(struct pci_dev *pdev, ...@@ -325,8 +325,9 @@ static int k10temp_probe(struct pci_dev *pdev,
data->pdev = pdev; data->pdev = pdev;
if (boot_cpu_data.x86 == 0x15 && (boot_cpu_data.x86_model == 0x60 || if (boot_cpu_data.x86 == 0x15 &&
boot_cpu_data.x86_model == 0x70)) { ((boot_cpu_data.x86_model & 0xf0) == 0x60 ||
(boot_cpu_data.x86_model & 0xf0) == 0x70)) {
data->read_htcreg = read_htcreg_nb_f15; data->read_htcreg = read_htcreg_nb_f15;
data->read_tempreg = read_tempreg_nb_f15; data->read_tempreg = read_tempreg_nb_f15;
} else if (boot_cpu_data.x86 == 0x17) { } else if (boot_cpu_data.x86 == 0x17) {
......
...@@ -47,6 +47,7 @@ enum lm75_type { /* keep sorted in alphabetical order */ ...@@ -47,6 +47,7 @@ enum lm75_type { /* keep sorted in alphabetical order */
lm75b, lm75b,
max6625, max6625,
max6626, max6626,
max31725,
mcp980x, mcp980x,
stds75, stds75,
tcn75, tcn75,
...@@ -64,7 +65,6 @@ enum lm75_type { /* keep sorted in alphabetical order */ ...@@ -64,7 +65,6 @@ enum lm75_type { /* keep sorted in alphabetical order */
static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; 0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
/* The LM75 registers */ /* The LM75 registers */
#define LM75_REG_TEMP 0x00 #define LM75_REG_TEMP 0x00
#define LM75_REG_CONF 0x01 #define LM75_REG_CONF 0x01
...@@ -76,7 +76,7 @@ struct lm75_data { ...@@ -76,7 +76,7 @@ struct lm75_data {
struct i2c_client *client; struct i2c_client *client;
struct regmap *regmap; struct regmap *regmap;
u8 orig_conf; u8 orig_conf;
u8 resolution; /* In bits, between 9 and 12 */ u8 resolution; /* In bits, between 9 and 16 */
u8 resolution_limits; u8 resolution_limits;
unsigned int sample_time; /* In ms */ unsigned int sample_time; /* In ms */
}; };
...@@ -339,6 +339,10 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -339,6 +339,10 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
data->resolution_limits = 9; data->resolution_limits = 9;
data->sample_time = MSEC_PER_SEC / 4; data->sample_time = MSEC_PER_SEC / 4;
break; break;
case max31725:
data->resolution = 16;
data->sample_time = MSEC_PER_SEC / 8;
break;
case tcn75: case tcn75:
data->resolution = 9; data->resolution = 9;
data->sample_time = MSEC_PER_SEC / 8; data->sample_time = MSEC_PER_SEC / 8;
...@@ -415,6 +419,8 @@ static const struct i2c_device_id lm75_ids[] = { ...@@ -415,6 +419,8 @@ static const struct i2c_device_id lm75_ids[] = {
{ "lm75b", lm75b, }, { "lm75b", lm75b, },
{ "max6625", max6625, }, { "max6625", max6625, },
{ "max6626", max6626, }, { "max6626", max6626, },
{ "max31725", max31725, },
{ "max31726", max31725, },
{ "mcp980x", mcp980x, }, { "mcp980x", mcp980x, },
{ "stds75", stds75, }, { "stds75", stds75, },
{ "tcn75", tcn75, }, { "tcn75", tcn75, },
...@@ -471,6 +477,14 @@ static const struct of_device_id lm75_of_match[] = { ...@@ -471,6 +477,14 @@ static const struct of_device_id lm75_of_match[] = {
.compatible = "maxim,max6626", .compatible = "maxim,max6626",
.data = (void *)max6626 .data = (void *)max6626
}, },
{
.compatible = "maxim,max31725",
.data = (void *)max31725
},
{
.compatible = "maxim,max31726",
.data = (void *)max31725
},
{ {
.compatible = "maxim,mcp980x", .compatible = "maxim,mcp980x",
.data = (void *)mcp980x .data = (void *)mcp980x
......
...@@ -127,8 +127,8 @@ static struct lm92_data *lm92_update_device(struct device *dev) ...@@ -127,8 +127,8 @@ static struct lm92_data *lm92_update_device(struct device *dev)
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
if (time_after(jiffies, data->last_updated + HZ) if (time_after(jiffies, data->last_updated + HZ) ||
|| !data->valid) { !data->valid) {
dev_dbg(&client->dev, "Updating lm92 data\n"); dev_dbg(&client->dev, "Updating lm92 data\n");
for (i = 0; i < t_num_regs; i++) { for (i = 0; i < t_num_regs; i++) {
data->temp[i] = data->temp[i] =
...@@ -153,7 +153,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, ...@@ -153,7 +153,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
} }
static ssize_t set_temp(struct device *dev, struct device_attribute *devattr, static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct lm92_data *data = dev_get_drvdata(dev); struct lm92_data *data = dev_get_drvdata(dev);
...@@ -161,7 +161,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr, ...@@ -161,7 +161,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
int nr = attr->index; int nr = attr->index;
long val; long val;
int err; int err;
err = kstrtol(buf, 10, &val); err = kstrtol(buf, 10, &val);
if (err) if (err)
return err; return err;
...@@ -178,6 +178,7 @@ static ssize_t show_temp_hyst(struct device *dev, ...@@ -178,6 +178,7 @@ static ssize_t show_temp_hyst(struct device *dev,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct lm92_data *data = lm92_update_device(dev); struct lm92_data *data = lm92_update_device(dev);
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[attr->index]) return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[attr->index])
- TEMP_FROM_REG(data->temp[t_hyst])); - TEMP_FROM_REG(data->temp[t_hyst]));
} }
...@@ -186,6 +187,7 @@ static ssize_t temp1_min_hyst_show(struct device *dev, ...@@ -186,6 +187,7 @@ static ssize_t temp1_min_hyst_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct lm92_data *data = lm92_update_device(dev); struct lm92_data *data = lm92_update_device(dev);
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[t_min]) return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[t_min])
+ TEMP_FROM_REG(data->temp[t_hyst])); + TEMP_FROM_REG(data->temp[t_hyst]));
} }
...@@ -206,7 +208,7 @@ static ssize_t set_temp_hyst(struct device *dev, ...@@ -206,7 +208,7 @@ static ssize_t set_temp_hyst(struct device *dev,
val = clamp_val(val, -120000, 220000); val = clamp_val(val, -120000, 220000);
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp[t_hyst] = data->temp[t_hyst] =
TEMP_TO_REG(TEMP_FROM_REG(data->temp[attr->index]) - val); TEMP_TO_REG(TEMP_FROM_REG(data->temp[attr->index]) - val);
i2c_smbus_write_word_swapped(client, LM92_REG_TEMP_HYST, i2c_smbus_write_word_swapped(client, LM92_REG_TEMP_HYST,
data->temp[t_hyst]); data->temp[t_hyst]);
...@@ -218,6 +220,7 @@ static ssize_t alarms_show(struct device *dev, struct device_attribute *attr, ...@@ -218,6 +220,7 @@ static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct lm92_data *data = lm92_update_device(dev); struct lm92_data *data = lm92_update_device(dev);
return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->temp[t_input])); return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->temp[t_input]));
} }
...@@ -324,7 +327,6 @@ static int lm92_probe(struct i2c_client *new_client, ...@@ -324,7 +327,6 @@ static int lm92_probe(struct i2c_client *new_client,
return PTR_ERR_OR_ZERO(hwmon_dev); return PTR_ERR_OR_ZERO(hwmon_dev);
} }
/* /*
* Module and driver stuff * Module and driver stuff
*/ */
......
// SPDX-License-Identifier: GPL-2.0+
/* /*
* Driver for the ADC on Freescale Semiconductor MC13783 and MC13892 PMICs. * Driver for the ADC on Freescale Semiconductor MC13783 and MC13892 PMICs.
* *
* Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
* Copyright (C) 2009 Sascha Hauer, Pengutronix * Copyright (C) 2009 Sascha Hauer, Pengutronix
*
* 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.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <linux/mfd/mc13xxx.h> #include <linux/mfd/mc13xxx.h>
......
This diff is collapsed.
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
/* Define the Counter Register, value = 100 for match 100% */ /* Define the Counter Register, value = 100 for match 100% */
#define NPCM7XX_PWM_COUNTER_DEFAULT_NUM 255 #define NPCM7XX_PWM_COUNTER_DEFAULT_NUM 255
#define NPCM7XX_PWM_CMR_DEFAULT_NUM 127 #define NPCM7XX_PWM_CMR_DEFAULT_NUM 255
#define NPCM7XX_PWM_CMR_MAX 255 #define NPCM7XX_PWM_CMR_MAX 255
/* default all PWM channels PRESCALE2 = 1 */ /* default all PWM channels PRESCALE2 = 1 */
...@@ -861,7 +861,7 @@ static int npcm7xx_create_pwm_cooling(struct device *dev, ...@@ -861,7 +861,7 @@ static int npcm7xx_create_pwm_cooling(struct device *dev,
dev_err(dev, "Property 'cooling-levels' cannot be read.\n"); dev_err(dev, "Property 'cooling-levels' cannot be read.\n");
return ret; return ret;
} }
snprintf(cdev->name, THERMAL_NAME_LENGTH, "%s%d", child->name, snprintf(cdev->name, THERMAL_NAME_LENGTH, "%pOFn%d", child,
pwm_port); pwm_port);
cdev->tcdev = thermal_of_cooling_device_register(child, cdev->tcdev = thermal_of_cooling_device_register(child,
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
menuconfig PMBUS menuconfig PMBUS
tristate "PMBus support" tristate "PMBus support"
depends on I2C depends on I2C
default n
help help
Say yes here if you want to enable PMBus support. Say yes here if you want to enable PMBus support.
...@@ -28,7 +27,6 @@ config SENSORS_PMBUS ...@@ -28,7 +27,6 @@ config SENSORS_PMBUS
config SENSORS_ADM1275 config SENSORS_ADM1275
tristate "Analog Devices ADM1275 and compatibles" tristate "Analog Devices ADM1275 and compatibles"
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, ADM1272, ADM1275, ADM1276, ADM1278, ADM1293, Devices ADM1075, ADM1272, ADM1275, ADM1276, ADM1278, ADM1293,
...@@ -49,7 +47,6 @@ config SENSORS_IBM_CFFPS ...@@ -49,7 +47,6 @@ config SENSORS_IBM_CFFPS
config SENSORS_IR35221 config SENSORS_IR35221
tristate "Infineon IR35221" tristate "Infineon IR35221"
default n
help help
If you say yes here you get hardware monitoring support for the If you say yes here you get hardware monitoring support for the
Infineon IR35221 controller. Infineon IR35221 controller.
...@@ -59,7 +56,6 @@ config SENSORS_IR35221 ...@@ -59,7 +56,6 @@ config SENSORS_IR35221
config SENSORS_LM25066 config SENSORS_LM25066
tristate "National Semiconductor LM25066 and compatibles" tristate "National Semiconductor LM25066 and compatibles"
default n
help help
If you say yes here you get hardware monitoring support for National If you say yes here you get hardware monitoring support for National
Semiconductor LM25056, LM25066, LM5064, and LM5066. Semiconductor LM25056, LM25066, LM5064, and LM5066.
...@@ -69,7 +65,6 @@ config SENSORS_LM25066 ...@@ -69,7 +65,6 @@ config SENSORS_LM25066
config SENSORS_LTC2978 config SENSORS_LTC2978
tristate "Linear Technologies LTC2978 and compatibles" tristate "Linear Technologies LTC2978 and compatibles"
default n
help help
If you say yes here you get hardware monitoring support for Linear If you say yes here you get hardware monitoring support for Linear
Technology LTC2974, LTC2975, LTC2977, LTC2978, LTC2980, LTC3880, Technology LTC2974, LTC2975, LTC2977, LTC2978, LTC2980, LTC3880,
...@@ -83,11 +78,11 @@ config SENSORS_LTC2978_REGULATOR ...@@ -83,11 +78,11 @@ config SENSORS_LTC2978_REGULATOR
depends on SENSORS_LTC2978 && REGULATOR depends on SENSORS_LTC2978 && REGULATOR
help help
If you say yes here you get regulator support for Linear If you say yes here you get regulator support for Linear
Technology LTC2974, LTC2977, LTC2978, LTC3880, LTC3883, and LTM4676. Technology LTC2974, LTC2977, LTC2978, LTC3880, LTC3883, LTM4676
and LTM4686.
config SENSORS_LTC3815 config SENSORS_LTC3815
tristate "Linear Technologies LTC3815" tristate "Linear Technologies LTC3815"
default n
help help
If you say yes here you get hardware monitoring support for Linear If you say yes here you get hardware monitoring support for Linear
Technology LTC3815. Technology LTC3815.
...@@ -97,7 +92,6 @@ config SENSORS_LTC3815 ...@@ -97,7 +92,6 @@ config SENSORS_LTC3815
config SENSORS_MAX16064 config SENSORS_MAX16064
tristate "Maxim MAX16064" tristate "Maxim MAX16064"
default n
help help
If you say yes here you get hardware monitoring support for Maxim If you say yes here you get hardware monitoring support for Maxim
MAX16064. MAX16064.
...@@ -107,7 +101,6 @@ config SENSORS_MAX16064 ...@@ -107,7 +101,6 @@ config SENSORS_MAX16064
config SENSORS_MAX20751 config SENSORS_MAX20751
tristate "Maxim MAX20751" tristate "Maxim MAX20751"
default n
help help
If you say yes here you get hardware monitoring support for Maxim If you say yes here you get hardware monitoring support for Maxim
MAX20751. MAX20751.
...@@ -117,7 +110,6 @@ config SENSORS_MAX20751 ...@@ -117,7 +110,6 @@ config SENSORS_MAX20751
config SENSORS_MAX31785 config SENSORS_MAX31785
tristate "Maxim MAX31785 and compatibles" tristate "Maxim MAX31785 and compatibles"
default n
help help
If you say yes here you get hardware monitoring support for Maxim If you say yes here you get hardware monitoring support for Maxim
MAX31785. MAX31785.
...@@ -127,7 +119,6 @@ config SENSORS_MAX31785 ...@@ -127,7 +119,6 @@ config SENSORS_MAX31785
config SENSORS_MAX34440 config SENSORS_MAX34440
tristate "Maxim MAX34440 and compatibles" tristate "Maxim MAX34440 and compatibles"
default n
help help
If you say yes here you get hardware monitoring support for Maxim If you say yes here you get hardware monitoring support for Maxim
MAX34440, MAX34441, MAX34446, MAX34451, MAX34460, and MAX34461. MAX34440, MAX34441, MAX34446, MAX34451, MAX34460, and MAX34461.
...@@ -137,7 +128,6 @@ config SENSORS_MAX34440 ...@@ -137,7 +128,6 @@ config SENSORS_MAX34440
config SENSORS_MAX8688 config SENSORS_MAX8688
tristate "Maxim MAX8688" tristate "Maxim MAX8688"
default n
help help
If you say yes here you get hardware monitoring support for Maxim If you say yes here you get hardware monitoring support for Maxim
MAX8688. MAX8688.
...@@ -147,7 +137,6 @@ config SENSORS_MAX8688 ...@@ -147,7 +137,6 @@ config SENSORS_MAX8688
config SENSORS_TPS40422 config SENSORS_TPS40422
tristate "TI TPS40422" tristate "TI TPS40422"
default n
help help
If you say yes here you get hardware monitoring support for TI If you say yes here you get hardware monitoring support for TI
TPS40422. TPS40422.
...@@ -166,7 +155,6 @@ config SENSORS_TPS53679 ...@@ -166,7 +155,6 @@ config SENSORS_TPS53679
config SENSORS_UCD9000 config SENSORS_UCD9000
tristate "TI UCD90120, UCD90124, UCD90160, UCD9090, UCD90910" tristate "TI UCD90120, UCD90124, UCD90160, UCD9090, UCD90910"
default n
help help
If you say yes here you get hardware monitoring support for TI If you say yes here you get hardware monitoring support for TI
UCD90120, UCD90124, UCD90160, UCD9090, UCD90910, Sequencer and System UCD90120, UCD90124, UCD90160, UCD9090, UCD90910, Sequencer and System
...@@ -177,7 +165,6 @@ config SENSORS_UCD9000 ...@@ -177,7 +165,6 @@ config SENSORS_UCD9000
config SENSORS_UCD9200 config SENSORS_UCD9200
tristate "TI UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, UCD9248" tristate "TI UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, UCD9248"
default n
help help
If you say yes here you get hardware monitoring support for TI If you say yes here you get hardware monitoring support for TI
UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, and UCD9248 UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, and UCD9248
...@@ -188,7 +175,6 @@ config SENSORS_UCD9200 ...@@ -188,7 +175,6 @@ config SENSORS_UCD9200
config SENSORS_ZL6100 config SENSORS_ZL6100
tristate "Intersil ZL6100 and compatibles" tristate "Intersil ZL6100 and compatibles"
default n
help help
If you say yes here you get hardware monitoring support for Intersil If you say yes here you get hardware monitoring support for Intersil
ZL2004, ZL2005, ZL2006, ZL2008, ZL2105, ZL2106, ZL6100, ZL6105, ZL2004, ZL2005, ZL2006, ZL2008, ZL2105, ZL2106, ZL6100, ZL6105,
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* Copyright (c) 2011 Ericsson AB. * Copyright (c) 2011 Ericsson AB.
* Copyright (c) 2013, 2014, 2015 Guenter Roeck * Copyright (c) 2013, 2014, 2015 Guenter Roeck
* Copyright (c) 2015 Linear Technology * Copyright (c) 2015 Linear Technology
* Copyright (c) 2018 Analog Devices Inc.
* *
* 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
...@@ -28,7 +29,7 @@ ...@@ -28,7 +29,7 @@
#include "pmbus.h" #include "pmbus.h"
enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882, enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,
ltc3883, ltc3886, ltc3887, ltm2987, ltm4675, ltm4676 }; ltc3883, ltc3886, ltc3887, ltm2987, ltm4675, ltm4676, ltm4686 };
/* Common for all chips */ /* Common for all chips */
#define LTC2978_MFR_VOUT_PEAK 0xdd #define LTC2978_MFR_VOUT_PEAK 0xdd
...@@ -81,6 +82,7 @@ enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882, ...@@ -81,6 +82,7 @@ enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,
#define LTM4676_ID_REV1 0x4400 #define LTM4676_ID_REV1 0x4400
#define LTM4676_ID_REV2 0x4480 #define LTM4676_ID_REV2 0x4480
#define LTM4676A_ID 0x47e0 #define LTM4676A_ID 0x47e0
#define LTM4686_ID 0x4770
#define LTC2974_NUM_PAGES 4 #define LTC2974_NUM_PAGES 4
#define LTC2978_NUM_PAGES 8 #define LTC2978_NUM_PAGES 8
...@@ -512,6 +514,7 @@ static const struct i2c_device_id ltc2978_id[] = { ...@@ -512,6 +514,7 @@ static const struct i2c_device_id ltc2978_id[] = {
{"ltm2987", ltm2987}, {"ltm2987", ltm2987},
{"ltm4675", ltm4675}, {"ltm4675", ltm4675},
{"ltm4676", ltm4676}, {"ltm4676", ltm4676},
{"ltm4686", ltm4686},
{} {}
}; };
MODULE_DEVICE_TABLE(i2c, ltc2978_id); MODULE_DEVICE_TABLE(i2c, ltc2978_id);
...@@ -588,6 +591,8 @@ static int ltc2978_get_id(struct i2c_client *client) ...@@ -588,6 +591,8 @@ static int ltc2978_get_id(struct i2c_client *client)
else if (chip_id == LTM4676_ID_REV1 || chip_id == LTM4676_ID_REV2 || else if (chip_id == LTM4676_ID_REV1 || chip_id == LTM4676_ID_REV2 ||
chip_id == LTM4676A_ID) chip_id == LTM4676A_ID)
return ltm4676; return ltm4676;
else if (chip_id == LTM4686_ID)
return ltm4686;
dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id); dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
return -ENODEV; return -ENODEV;
...@@ -684,6 +689,7 @@ static int ltc2978_probe(struct i2c_client *client, ...@@ -684,6 +689,7 @@ static int ltc2978_probe(struct i2c_client *client,
case ltc3887: case ltc3887:
case ltm4675: case ltm4675:
case ltm4676: case ltm4676:
case ltm4686:
data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING; data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
info->read_word_data = ltc3880_read_word_data; info->read_word_data = ltc3880_read_word_data;
info->pages = LTC3880_NUM_PAGES; info->pages = LTC3880_NUM_PAGES;
...@@ -770,6 +776,7 @@ static const struct of_device_id ltc2978_of_match[] = { ...@@ -770,6 +776,7 @@ static const struct of_device_id ltc2978_of_match[] = {
{ .compatible = "lltc,ltm2987" }, { .compatible = "lltc,ltm2987" },
{ .compatible = "lltc,ltm4675" }, { .compatible = "lltc,ltm4675" },
{ .compatible = "lltc,ltm4676" }, { .compatible = "lltc,ltm4676" },
{ .compatible = "lltc,ltm4686" },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, ltc2978_of_match); MODULE_DEVICE_TABLE(of, ltc2978_of_match);
......
...@@ -118,6 +118,8 @@ static int pmbus_identify(struct i2c_client *client, ...@@ -118,6 +118,8 @@ static int pmbus_identify(struct i2c_client *client,
} else { } else {
info->pages = 1; info->pages = 1;
} }
pmbus_clear_faults(client);
} }
if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
......
...@@ -2015,7 +2015,10 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data, ...@@ -2015,7 +2015,10 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK)) if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK))
client->flags |= I2C_CLIENT_PEC; client->flags |= I2C_CLIENT_PEC;
pmbus_clear_faults(client); if (data->info->pages)
pmbus_clear_faults(client);
else
pmbus_clear_fault_page(client, -1);
if (info->identify) { if (info->identify) {
ret = (*info->identify)(client, info); ret = (*info->identify)(client, info);
......
...@@ -221,8 +221,12 @@ static int pwm_fan_probe(struct platform_device *pdev) ...@@ -221,8 +221,12 @@ static int pwm_fan_probe(struct platform_device *pdev)
ctx->pwm = devm_of_pwm_get(&pdev->dev, pdev->dev.of_node, NULL); ctx->pwm = devm_of_pwm_get(&pdev->dev, pdev->dev.of_node, NULL);
if (IS_ERR(ctx->pwm)) { if (IS_ERR(ctx->pwm)) {
dev_err(&pdev->dev, "Could not get PWM\n"); ret = PTR_ERR(ctx->pwm);
return PTR_ERR(ctx->pwm);
if (ret != -EPROBE_DEFER)
dev_err(&pdev->dev, "Could not get PWM: %d\n", ret);
return ret;
} }
platform_set_drvdata(pdev, ctx); platform_set_drvdata(pdev, ctx);
...@@ -290,9 +294,19 @@ static int pwm_fan_remove(struct platform_device *pdev) ...@@ -290,9 +294,19 @@ static int pwm_fan_remove(struct platform_device *pdev)
static int pwm_fan_suspend(struct device *dev) static int pwm_fan_suspend(struct device *dev)
{ {
struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
struct pwm_args args;
int ret;
pwm_get_args(ctx->pwm, &args);
if (ctx->pwm_value) {
ret = pwm_config(ctx->pwm, 0, args.period);
if (ret < 0)
return ret;
if (ctx->pwm_value)
pwm_disable(ctx->pwm); pwm_disable(ctx->pwm);
}
return 0; return 0;
} }
......
...@@ -56,7 +56,7 @@ scmi_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_types type, ...@@ -56,7 +56,7 @@ scmi_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_types type,
const struct scmi_sensors *scmi_sensors = drvdata; const struct scmi_sensors *scmi_sensors = drvdata;
sensor = *(scmi_sensors->info[type] + channel); sensor = *(scmi_sensors->info[type] + channel);
if (sensor && sensor->name) if (sensor)
return S_IRUGO; return S_IRUGO;
return 0; return 0;
......
...@@ -286,10 +286,8 @@ static int scpi_hwmon_probe(struct platform_device *pdev) ...@@ -286,10 +286,8 @@ static int scpi_hwmon_probe(struct platform_device *pdev)
* any thermal zones or if the thermal subsystem is * any thermal zones or if the thermal subsystem is
* not configured. * not configured.
*/ */
if (IS_ERR(z)) { if (IS_ERR(z))
devm_kfree(dev, zone); devm_kfree(dev, zone);
continue;
}
} }
return 0; return 0;
......
// SPDX-License-Identifier: GPL-2.0
/* /*
* sht15.c - support for the SHT15 Temperature and Humidity Sensor * sht15.c - support for the SHT15 Temperature and Humidity Sensor
* *
...@@ -9,10 +10,6 @@ ...@@ -9,10 +10,6 @@
* *
* Copyright (c) 2007 Wouter Horre * Copyright (c) 2007 Wouter Horre
* *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* For further information, see the Documentation/hwmon/sht15 file. * For further information, see the Documentation/hwmon/sht15 file.
*/ */
......
...@@ -226,8 +226,10 @@ static int tmp421_detect(struct i2c_client *client, ...@@ -226,8 +226,10 @@ static int tmp421_detect(struct i2c_client *client,
{ {
enum chips kind; enum chips kind;
struct i2c_adapter *adapter = client->adapter; struct i2c_adapter *adapter = client->adapter;
const char * const names[] = { "TMP421", "TMP422", "TMP423", static const char * const names[] = {
"TMP441", "TMP442" }; "TMP421", "TMP422", "TMP423",
"TMP441", "TMP442"
};
int addr = client->addr; int addr = client->addr;
u8 reg; u8 reg;
......
...@@ -118,6 +118,7 @@ enum hwmon_in_attributes { ...@@ -118,6 +118,7 @@ enum hwmon_in_attributes {
hwmon_in_max_alarm, hwmon_in_max_alarm,
hwmon_in_lcrit_alarm, hwmon_in_lcrit_alarm,
hwmon_in_crit_alarm, hwmon_in_crit_alarm,
hwmon_in_enable,
}; };
#define HWMON_I_INPUT BIT(hwmon_in_input) #define HWMON_I_INPUT BIT(hwmon_in_input)
...@@ -135,6 +136,7 @@ enum hwmon_in_attributes { ...@@ -135,6 +136,7 @@ enum hwmon_in_attributes {
#define HWMON_I_MAX_ALARM BIT(hwmon_in_max_alarm) #define HWMON_I_MAX_ALARM BIT(hwmon_in_max_alarm)
#define HWMON_I_LCRIT_ALARM BIT(hwmon_in_lcrit_alarm) #define HWMON_I_LCRIT_ALARM BIT(hwmon_in_lcrit_alarm)
#define HWMON_I_CRIT_ALARM BIT(hwmon_in_crit_alarm) #define HWMON_I_CRIT_ALARM BIT(hwmon_in_crit_alarm)
#define HWMON_I_ENABLE BIT(hwmon_in_enable)
enum hwmon_curr_attributes { enum hwmon_curr_attributes {
hwmon_curr_input, hwmon_curr_input,
......
/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM hwmon
#if !defined(_TRACE_HWMON_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_HWMON_H
#include <linux/tracepoint.h>
DECLARE_EVENT_CLASS(hwmon_attr_class,
TP_PROTO(int index, const char *attr_name, long val),
TP_ARGS(index, attr_name, val),
TP_STRUCT__entry(
__field(int, index)
__string(attr_name, attr_name)
__field(long, val)
),
TP_fast_assign(
__entry->index = index;
__assign_str(attr_name, attr_name);
__entry->val = val;
),
TP_printk("index=%d, attr_name=%s, val=%ld",
__entry->index, __get_str(attr_name), __entry->val)
);
DEFINE_EVENT(hwmon_attr_class, hwmon_attr_show,
TP_PROTO(int index, const char *attr_name, long val),
TP_ARGS(index, attr_name, val)
);
DEFINE_EVENT(hwmon_attr_class, hwmon_attr_store,
TP_PROTO(int index, const char *attr_name, long val),
TP_ARGS(index, attr_name, val)
);
TRACE_EVENT(hwmon_attr_show_string,
TP_PROTO(int index, const char *attr_name, const char *s),
TP_ARGS(index, attr_name, s),
TP_STRUCT__entry(
__field(int, index)
__string(attr_name, attr_name)
__string(label, s)
),
TP_fast_assign(
__entry->index = index;
__assign_str(attr_name, attr_name);
__assign_str(label, s);
),
TP_printk("index=%d, attr_name=%s, val=%s",
__entry->index, __get_str(attr_name), __get_str(label))
);
#endif /* _TRACE_HWMON_H */
/* This part must be outside protection */
#include <trace/define_trace.h>
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