meson64-6.17: reworked hwmon-emc2305-fixups-for-driver.patch; thanks to pyavitz

Co-authored-by: Patrick Yavitz <pyavitz@gmail.com>
This commit is contained in:
Ricardo Pardini 2025-10-05 17:30:48 +02:00 committed by Igor
parent bd862d0873
commit 2637ec73c5
1 changed files with 47 additions and 35 deletions

View File

@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Patrick Yavitz <pyavitz@gmail.com>
Date: Wed, 9 Apr 2025 04:34:27 -0400
Subject: hwmon: emc2305: fixups for driver
From 0d77bfb43c27fd94f58f4d6981839aee290dd694 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.com>
Date: Sat, 16 Aug 2025 20:34:59 -0400
Subject: [PATCH] hwmon: emc2305: fixups for driver submitted to mailing lists
The driver had a number of issues, checkpatch warnings/errors,
and other limitations, so fix these up to make it usable.
@ -33,16 +33,16 @@ As this is all downstream only, revert to u8 to match 5.15.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
drivers/hwmon/emc2305.c | 110 +++++++++-
1 file changed, 104 insertions(+), 6 deletions(-)
drivers/hwmon/emc2305.c | 111 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 107 insertions(+), 4 deletions(-)
diff --git a/drivers/hwmon/emc2305.c b/drivers/hwmon/emc2305.c
index 111111111111..222222222222 100644
index 60809289f816..66ba8800970c 100644
--- a/drivers/hwmon/emc2305.c
+++ b/drivers/hwmon/emc2305.c
@@ -12,12 +12,13 @@
#include <linux/platform_data/emc2305.h>
#include <linux/thermal.h>
@@ -15,12 +15,13 @@
#include <linux/of_device.h>
#include <linux/util_macros.h>
+#define EMC2305_REG_FAN_STATUS 0x24
+#define EMC2305_REG_FAN_STALL_STATUS 0x25
@ -55,7 +55,7 @@ index 111111111111..222222222222 100644
#define EMC2305_VENDOR 0x5d
#define EMC2305_REG_PRODUCT_ID 0xfd
#define EMC2305_TACH_REGS_UNUSE_BITS 3
@@ -36,6 +37,7 @@
@@ -45,6 +46,7 @@
#define EMC2305_RPM_FACTOR 3932160
#define EMC2305_REG_FAN_DRIVE(n) (0x30 + 0x10 * (n))
@ -63,15 +63,15 @@ index 111111111111..222222222222 100644
#define EMC2305_REG_FAN_MIN_DRIVE(n) (0x38 + 0x10 * (n))
#define EMC2305_REG_FAN_TACH(n) (0x3e + 0x10 * (n))
@@ -100,6 +102,7 @@ struct emc2305_data {
u8 pwm_num;
@@ -117,6 +119,7 @@ struct emc2305_data {
u8 pwm_polarity_mask;
bool pwm_separate;
u8 pwm_min[EMC2305_PWM_MAX];
+ u8 pwm_max;
u16 pwm_freq[EMC2305_PWM_MAX];
struct emc2305_cdev_data cdev_data[EMC2305_PWM_MAX];
};
@@ -112,6 +115,8 @@ static char *emc2305_fan_name[] = {
@@ -130,6 +133,8 @@ static char *emc2305_fan_name[] = {
"emc2305_fan5",
};
@ -80,7 +80,7 @@ index 111111111111..222222222222 100644
static int emc2305_get_max_channel(const struct emc2305_data *data)
{
return data->pwm_num;
@@ -270,7 +275,7 @@ static int emc2305_set_pwm(struct device *dev, long val, int channel)
@@ -288,7 +293,7 @@ static int emc2305_set_pwm(struct device *dev, long val, int channel)
struct i2c_client *client = data->client;
int ret;
@ -89,7 +89,7 @@ index 111111111111..222222222222 100644
return -EINVAL;
ret = i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_DRIVE(channel), val);
@@ -281,6 +286,49 @@ static int emc2305_set_pwm(struct device *dev, long val, int channel)
@@ -299,6 +304,49 @@ static int emc2305_set_pwm(struct device *dev, long val, int channel)
return 0;
}
@ -136,32 +136,30 @@ index 111111111111..222222222222 100644
+ return 0;
+}
+
static int emc2305_set_single_tz(struct device *dev, int idx)
static int emc2305_set_single_tz(struct device *dev, struct device_node *fan_node, int idx)
{
struct emc2305_data *data = dev_get_drvdata(dev);
@@ -290,9 +338,16 @@ static int emc2305_set_single_tz(struct device *dev, int idx)
@@ -308,10 +356,16 @@ static int emc2305_set_single_tz(struct device *dev, struct device_node *fan_nod
cdev_idx = (idx) ? idx - 1 : 0;
pwm = data->pwm_min[cdev_idx];
- data->cdev_data[cdev_idx].cdev =
- devm_thermal_of_cooling_device_register(dev, dev->of_node,
- emc2305_fan_name[idx], data,
+ if (dev->of_node)
+ data->cdev_data[cdev_idx].cdev =
+ devm_thermal_of_cooling_device_register(dev, dev->of_node,
+ emc2305_fan_name[idx],
+ data,
+ &emc2305_cooling_ops);
devm_thermal_of_cooling_device_register(dev, fan_node,
emc2305_fan_name[idx], data,
&emc2305_cooling_ops);
+ else
+ data->cdev_data[cdev_idx].cdev =
+ thermal_cooling_device_register(emc2305_fan_name[idx],
+ data,
&emc2305_cooling_ops);
+ &emc2305_cooling_ops);
if (IS_ERR(data->cdev_data[cdev_idx].cdev)) {
@@ -337,9 +392,26 @@ static int emc2305_set_tz(struct device *dev)
dev_err(dev, "Failed to register cooling device %s\n", emc2305_fan_name[idx]);
@@ -355,9 +409,26 @@ static int emc2305_set_tz(struct device *dev)
for (i = 0; i < data->pwm_num; i++) {
ret = emc2305_set_single_tz(dev, i + 1);
ret = emc2305_set_single_tz(dev, dev->of_node, i + 1);
if (ret)
- return ret;
+ goto thermal_cooling_device_register_fail;
@ -187,11 +185,25 @@ index 111111111111..222222222222 100644
}
static umode_t
@@ -561,11 +633,18 @@ static int emc2305_probe(struct i2c_client *client)
data->pwm_separate = pdata->pwm_separate;
for (i = 0; i < EMC2305_PWM_MAX; i++)
data->pwm_min[i] = pdata->pwm_min[i];
+ data->pwm_max = EMC2305_FAN_MAX;
@@ -657,6 +728,7 @@ static int emc2305_probe(struct i2c_client *client)
data->pwm_min[i] = pdata->pwm_min[i];
data->pwm_freq[i] = pdata->pwm_freq[i];
}
+ data->pwm_max = EMC2305_FAN_MAX;
} else {
data->max_state = EMC2305_FAN_MAX_STATE;
data->pwm_separate = false;
@@ -666,12 +738,24 @@ static int emc2305_probe(struct i2c_client *client)
data->pwm_min[i] = EMC2305_FAN_MIN;
data->pwm_freq[i] = base_freq_table[3];
}
+ data->pwm_max = EMC2305_FAN_MAX;
+ if (dev->of_node) {
+ ret = emc2305_get_tz_of(dev);
+ if (ret < 0)
+ return ret;
+ }
}
} else {
data->max_state = EMC2305_FAN_MAX_STATE;
data->pwm_separate = false;
@ -206,7 +218,7 @@ index 111111111111..222222222222 100644
}
data->hwmon_dev = devm_hwmon_device_register_with_info(dev, "emc2305", data,
@@ -586,21 +665,40 @@ static int emc2305_probe(struct i2c_client *client)
@@ -713,21 +797,40 @@ static int emc2305_probe(struct i2c_client *client)
return ret;
}
@ -248,5 +260,5 @@ index 111111111111..222222222222 100644
};
--
Armbian
2.43.0