forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ipq806x: Add kmod-hwmon-emc2305 for devices with FAN controller
Kernel driver patches have also been added. These patches should be taken from /target/linux/bcm27xx/patches-*/ Signed-off-by: Oleg S <[email protected]>
- Loading branch information
Showing
6 changed files
with
416 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
75 changes: 75 additions & 0 deletions
75
...x/ipq806x/patches-6.1/950-0412-dt-bindings-hwmon-add-microchip-emc2305.yaml-dt-bind.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
From 25478932f5d9e6f763cdf9a0ee2272e33510a76a Mon Sep 17 00:00:00 2001 | ||
From: Michael Shych <[email protected]> | ||
Date: Sat, 30 Apr 2022 14:49:04 +0300 | ||
Subject: [PATCH] dt-bindings: hwmon: add microchip,emc2305.yaml dt | ||
binding description. | ||
|
||
Submitted to linux-hwmon mailing list at | ||
https://patchwork.kernel.org/project/linux-hwmon/patch/[email protected]/ | ||
|
||
Add basic description of emc2305 driver device tree binding. | ||
|
||
Signed-off-by: Michael Shych <[email protected]> | ||
Reviewed-by: Vadim Pasternak <[email protected]> | ||
--- | ||
.../bindings/hwmon/microchip,emc2305.yaml | 54 +++++++++++++++++++ | ||
1 file changed, 54 insertions(+) | ||
create mode 100644 Documentation/devicetree/bindings/hwmon/microchip,emc2305.yaml | ||
|
||
--- /dev/null | ||
+++ b/Documentation/devicetree/bindings/hwmon/microchip,emc2305.yaml | ||
@@ -0,0 +1,54 @@ | ||
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||
+%YAML 1.2 | ||
+--- | ||
+ | ||
+$id: http://devicetree.org/schemas/hwmon/emc2305.yaml# | ||
+$schema: http://devicetree.org/meta-schemas/core.yaml# | ||
+ | ||
+title: Microchip EMC2305 RPM-based PWM Fan Speed Controller | ||
+ | ||
+properties: | ||
+ compatible: | ||
+ enum: | ||
+ - microcip,emc2305 | ||
+ | ||
+ emc2305,pwm-min: | ||
+ description: | ||
+ Min pwm of emc2305 | ||
+ maxItems: 1 | ||
+ emc2305,pwm-max: | ||
+ description: | ||
+ Max pwm of emc2305 | ||
+ maxItems: 1 | ||
+ emc2305,pwm-channel: | ||
+ description: | ||
+ Max number of pwm channels | ||
+ maxItems: 1 | ||
+ emcs205,max-state: | ||
+ description: | ||
+ maxItems: 1 | ||
+ emc2305,cooling-levels: | ||
+ description: | ||
+ Quantity of cooling level state. | ||
+ maxItems: 1 | ||
+ | ||
+required: | ||
+ - compatible | ||
+ | ||
+optional: | ||
+ - emc2305,min-pwm | ||
+ - emc2305,max-pwm | ||
+ - emc2305,pwm-channels | ||
+ - emc2305,cooling-levels | ||
+ | ||
+additionalProperties: false | ||
+ | ||
+examples: | ||
+ - | | ||
+ fan { | ||
+ emc2305,compatible = "microchip,emc2305"; | ||
+ emc2305,pwm-min = <0>; | ||
+ emc2305,pwm-max = <255>; | ||
+ emc2305,pwm-channel = <5> | ||
+ emc2305,cooling-levels = <10>; | ||
+ }; |
40 changes: 40 additions & 0 deletions
40
...linux/ipq806x/patches-6.1/950-0413-dtbindings-Fixup-microchip-emc2305.yaml-bindings.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
From 2bc4fabde3e63ffb5484804a5f0d1ee950d77475 Mon Sep 17 00:00:00 2001 | ||
From: Dave Stevenson <[email protected]> | ||
Date: Tue, 10 May 2022 14:03:30 +0100 | ||
Subject: [PATCH] dtbindings: Fixup microchip,emc2305.yaml bindings | ||
|
||
The bindings submitted to mainline had some issues, so fix them up. | ||
|
||
Signed-off-by: Dave Stevenson <[email protected]> | ||
--- | ||
.../devicetree/bindings/hwmon/microchip,emc2305.yaml | 8 ++++---- | ||
1 file changed, 4 insertions(+), 4 deletions(-) | ||
|
||
--- a/Documentation/devicetree/bindings/hwmon/microchip,emc2305.yaml | ||
+++ b/Documentation/devicetree/bindings/hwmon/microchip,emc2305.yaml | ||
@@ -5,13 +5,13 @@ | ||
$id: http://devicetree.org/schemas/hwmon/emc2305.yaml# | ||
$schema: http://devicetree.org/meta-schemas/core.yaml# | ||
|
||
-title: Microchip EMC2305 RPM-based PWM Fan Speed Controller | ||
+title: Microchip EMC230[1|2|3|5] RPM-based PWM Fan Speed Controller | ||
|
||
properties: | ||
compatible: | ||
enum: | ||
- - microcip,emc2305 | ||
- | ||
+ - microchip,emc2305 | ||
+ - microchip,emc2301 | ||
emc2305,pwm-min: | ||
description: | ||
Min pwm of emc2305 | ||
@@ -46,7 +46,7 @@ additionalProperties: false | ||
examples: | ||
- | | ||
fan { | ||
- emc2305,compatible = "microchip,emc2305"; | ||
+ compatible = "microchip,emc2305"; | ||
emc2305,pwm-min = <0>; | ||
emc2305,pwm-max = <255>; | ||
emc2305,pwm-channel = <5> |
163 changes: 163 additions & 0 deletions
163
...x/ipq806x/patches-6.1/950-0441-hwmon-emc2305-fixups-for-driver-submitted-to-mailing.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
From c53aee9d78372213c34f5ebfb084b58be754a23c Mon Sep 17 00:00:00 2001 | ||
From: Phil Elwell <[email protected]> | ||
Date: Thu, 5 May 2022 15:46:07 +0100 | ||
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. | ||
|
||
Signed-off-by: Phil Elwell <[email protected]> | ||
Signed-off-by: Dave Stevenson <[email protected]> | ||
--- | ||
drivers/hwmon/emc2305.c | 73 +++++++++++++++++++++++++++++++++++++++-- | ||
1 file changed, 71 insertions(+), 2 deletions(-) | ||
|
||
--- a/drivers/hwmon/emc2305.c | ||
+++ b/drivers/hwmon/emc2305.c | ||
@@ -15,12 +15,13 @@ | ||
static const unsigned short | ||
emc2305_normal_i2c[] = { 0x27, 0x2c, 0x2d, 0x2e, 0x2f, 0x4c, 0x4d, I2C_CLIENT_END }; | ||
|
||
+#define EMC2305_REG_FAN_STATUS 0x24 | ||
+#define EMC2305_REG_FAN_STALL_STATUS 0x25 | ||
#define EMC2305_REG_DRIVE_FAIL_STATUS 0x27 | ||
#define EMC2305_REG_VENDOR 0xfe | ||
#define EMC2305_FAN_MAX 0xff | ||
#define EMC2305_FAN_MIN 0x00 | ||
#define EMC2305_FAN_MAX_STATE 10 | ||
-#define EMC2305_DEVICE 0x34 | ||
#define EMC2305_VENDOR 0x5d | ||
#define EMC2305_REG_PRODUCT_ID 0xfd | ||
#define EMC2305_TACH_REGS_UNUSE_BITS 3 | ||
@@ -39,6 +40,7 @@ emc2305_normal_i2c[] = { 0x27, 0x2c, 0x2 | ||
#define EMC2305_RPM_FACTOR 3932160 | ||
|
||
#define EMC2305_REG_FAN_DRIVE(n) (0x30 + 0x10 * (n)) | ||
+#define EMC2305_REG_FAN_CFG(n) (0x32 + 0x10 * (n)) | ||
#define EMC2305_REG_FAN_MIN_DRIVE(n) (0x38 + 0x10 * (n)) | ||
#define EMC2305_REG_FAN_TACH(n) (0x3e + 0x10 * (n)) | ||
|
||
@@ -58,6 +60,15 @@ static const struct i2c_device_id emc230 | ||
}; | ||
MODULE_DEVICE_TABLE(i2c, emc2305_ids); | ||
|
||
+static const struct of_device_id emc2305_dt_ids[] = { | ||
+ { .compatible = "microchip,emc2305" }, | ||
+ { .compatible = "microchip,emc2303" }, | ||
+ { .compatible = "microchip,emc2302" }, | ||
+ { .compatible = "microchip,emc2301" }, | ||
+ { } | ||
+}; | ||
+MODULE_DEVICE_TABLE(of, emc2305_dt_ids); | ||
+ | ||
/** | ||
* @cdev: cooling device; | ||
* @curr_state: cooling current state; | ||
@@ -101,6 +112,7 @@ struct emc2305_data { | ||
u8 pwm_num; | ||
bool pwm_separate; | ||
u8 pwm_min[EMC2305_PWM_MAX]; | ||
+ u8 pwm_max; | ||
struct emc2305_cdev_data cdev_data[EMC2305_PWM_MAX]; | ||
}; | ||
|
||
@@ -273,7 +285,7 @@ static int emc2305_set_pwm(struct device | ||
struct i2c_client *client = data->client; | ||
int ret; | ||
|
||
- if (val < data->pwm_min[channel] || val > EMC2305_FAN_MAX) | ||
+ if (val < data->pwm_min[channel] || val > data->pwm_max) | ||
return -EINVAL; | ||
|
||
ret = i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_DRIVE(channel), val); | ||
@@ -284,6 +296,49 @@ static int emc2305_set_pwm(struct device | ||
return 0; | ||
} | ||
|
||
+static int emc2305_get_tz_of(struct device *dev) | ||
+{ | ||
+ struct device_node *np = dev->of_node; | ||
+ struct emc2305_data *data = dev_get_drvdata(dev); | ||
+ int ret = 0; | ||
+ u32 val; | ||
+ int i; | ||
+ | ||
+ /* OF parameters are optional - overwrite default setting | ||
+ * if some of them are provided. | ||
+ */ | ||
+ | ||
+ ret = of_property_read_u32(np, "emc2305,cooling-levels", &val); | ||
+ if (!ret) | ||
+ data->max_state = (u8)val; | ||
+ else if (ret != -EINVAL) | ||
+ return ret; | ||
+ | ||
+ ret = of_property_read_u32(np, "emc2305,pwm-max", &val); | ||
+ if (!ret) | ||
+ data->pwm_max = (u8)val; | ||
+ else if (ret != -EINVAL) | ||
+ return ret; | ||
+ | ||
+ ret = of_property_read_u32(np, "emc2305,pwm-min", &val); | ||
+ if (!ret) | ||
+ for (i = 0; i < EMC2305_PWM_MAX; i++) | ||
+ data->pwm_min[i] = (u8)val; | ||
+ else if (ret != -EINVAL) | ||
+ return ret; | ||
+ | ||
+ /* Not defined or 0 means one thermal zone over all cooling devices. | ||
+ * Otherwise - separated thermal zones for each PWM channel. | ||
+ */ | ||
+ ret = of_property_read_u32(np, "emc2305,pwm-channel", &val); | ||
+ if (!ret) | ||
+ data->pwm_separate = (val != 0); | ||
+ else if (ret != -EINVAL) | ||
+ return ret; | ||
+ | ||
+ return 0; | ||
+} | ||
+ | ||
static int emc2305_set_single_tz(struct device *dev, int idx) | ||
{ | ||
struct emc2305_data *data = dev_get_drvdata(dev); | ||
@@ -572,11 +627,18 @@ static int emc2305_probe(struct i2c_clie | ||
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; | ||
} else { | ||
data->max_state = EMC2305_FAN_MAX_STATE; | ||
data->pwm_separate = false; | ||
for (i = 0; i < EMC2305_PWM_MAX; i++) | ||
data->pwm_min[i] = EMC2305_FAN_MIN; | ||
+ data->pwm_max = EMC2305_FAN_MAX; | ||
+ if (dev->of_node) { | ||
+ ret = emc2305_get_tz_of(dev); | ||
+ if (ret < 0) | ||
+ return ret; | ||
+ } | ||
} | ||
|
||
data->hwmon_dev = devm_hwmon_device_register_with_info(dev, "emc2305", data, | ||
@@ -597,6 +659,12 @@ static int emc2305_probe(struct i2c_clie | ||
return ret; | ||
} | ||
|
||
+ /* Acknowledge any existing faults. Stops the device responding on the | ||
+ * SMBus alert address. | ||
+ */ | ||
+ i2c_smbus_read_byte_data(client, EMC2305_REG_FAN_STALL_STATUS); | ||
+ i2c_smbus_read_byte_data(client, EMC2305_REG_FAN_STATUS); | ||
+ | ||
return 0; | ||
} | ||
|
||
@@ -612,6 +680,7 @@ static struct i2c_driver emc2305_driver | ||
.class = I2C_CLASS_HWMON, | ||
.driver = { | ||
.name = "emc2305", | ||
+ .of_match_table = emc2305_dt_ids, | ||
}, | ||
.probe = emc2305_probe, | ||
.remove = emc2305_remove, |
54 changes: 54 additions & 0 deletions
54
...x/ipq806x/patches-6.1/950-0687-hwmon-emc2305-Add-calls-to-initialise-of-cooling-map.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
From 76f8210c9498983b492645ec2c90c5c547ae415b Mon Sep 17 00:00:00 2001 | ||
From: Dave Stevenson <[email protected]> | ||
Date: Fri, 21 Apr 2023 14:49:38 +0100 | ||
Subject: [PATCH] hwmon: emc2305: Add calls to initialise of cooling | ||
maps | ||
|
||
Commit 46ef9d4ed26b ("hwmon: emc2305: fixups for driver submitted to | ||
mailing lists") missed adding the call to thermal_of_cooling_device_register | ||
required to configure any cooling maps for the device, hence stopping it | ||
from actually ever changing speed. | ||
|
||
Signed-off-by: Dave Stevenson <[email protected]> | ||
--- | ||
drivers/hwmon/emc2305.c | 22 ++++++++++++++++------ | ||
1 file changed, 16 insertions(+), 6 deletions(-) | ||
|
||
--- a/drivers/hwmon/emc2305.c | ||
+++ b/drivers/hwmon/emc2305.c | ||
@@ -348,9 +348,17 @@ static int emc2305_set_single_tz(struct | ||
cdev_idx = (idx) ? idx - 1 : 0; | ||
pwm = data->pwm_min[cdev_idx]; | ||
|
||
- data->cdev_data[cdev_idx].cdev = | ||
- thermal_cooling_device_register(emc2305_fan_name[idx], data, | ||
- &emc2305_cooling_ops); | ||
+ 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); | ||
+ else | ||
+ data->cdev_data[cdev_idx].cdev = | ||
+ thermal_cooling_device_register(emc2305_fan_name[idx], | ||
+ data, | ||
+ &emc2305_cooling_ops); | ||
|
||
if (IS_ERR(data->cdev_data[cdev_idx].cdev)) { | ||
dev_err(dev, "Failed to register cooling device %s\n", emc2305_fan_name[idx]); | ||
@@ -403,9 +411,11 @@ static void emc2305_unset_tz(struct devi | ||
int i; | ||
|
||
/* Unregister cooling device. */ | ||
- for (i = 0; i < EMC2305_PWM_MAX; i++) | ||
- if (data->cdev_data[i].cdev) | ||
- thermal_cooling_device_unregister(data->cdev_data[i].cdev); | ||
+ if (!dev->of_node) { | ||
+ for (i = 0; i < EMC2305_PWM_MAX; i++) | ||
+ if (data->cdev_data[i].cdev) | ||
+ thermal_cooling_device_unregister(data->cdev_data[i].cdev); | ||
+ } | ||
} | ||
|
||
static umode_t |
Oops, something went wrong.