From b0078b2c9f54eac77e2562d83e70ace41f8397cc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20Paulo=20Gon=C3=A7alves?= Date: Fri, 13 Jun 2025 10:42:39 -0300 Subject: [PATCH] hwmon: (amc6821) Move reading fan data from OF to a function MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Move fan property reading from OF to a separate function. This keeps OF data handling separate from the code logic and makes it easier to add features like cooling device support that use the same fan node. Signed-off-by: João Paulo Gonçalves Link: https://lore.kernel.org/r/20250613-b4-amc6821-cooling-device-support-v4-2-a8fc063c55de@toradex.com Signed-off-by: Guenter Roeck --- drivers/hwmon/amc6821.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c index 13a789cc85d24..612895db7d8d4 100644 --- a/drivers/hwmon/amc6821.c +++ b/drivers/hwmon/amc6821.c @@ -126,6 +126,7 @@ module_param(init, int, 0444); struct amc6821_data { struct regmap *regmap; struct mutex update_lock; + enum pwm_polarity pwm_polarity; }; /* @@ -848,11 +849,11 @@ static int amc6821_detect(struct i2c_client *client, struct i2c_board_info *info return 0; } -static enum pwm_polarity amc6821_pwm_polarity(struct i2c_client *client) +static enum pwm_polarity amc6821_pwm_polarity(struct i2c_client *client, + struct device_node *fan_np) { enum pwm_polarity polarity = PWM_POLARITY_NORMAL; struct of_phandle_args args; - struct device_node *fan_np; /* * For backward compatibility, the pwminv module parameter takes @@ -863,10 +864,6 @@ static enum pwm_polarity amc6821_pwm_polarity(struct i2c_client *client) if (pwminv > 0) return PWM_POLARITY_INVERSED; - fan_np = of_get_child_by_name(client->dev.of_node, "fan"); - if (!fan_np) - return PWM_POLARITY_NORMAL; - if (of_parse_phandle_with_args(fan_np, "pwms", "#pwm-cells", 0, &args)) goto out; of_node_put(args.np); @@ -877,10 +874,16 @@ static enum pwm_polarity amc6821_pwm_polarity(struct i2c_client *client) if (args.args[1] & PWM_POLARITY_INVERTED) polarity = PWM_POLARITY_INVERSED; out: - of_node_put(fan_np); return polarity; } +static void amc6821_of_fan_read_data(struct i2c_client *client, + struct amc6821_data *data, + struct device_node *fan_np) +{ + data->pwm_polarity = amc6821_pwm_polarity(client, fan_np); +} + static int amc6821_init_client(struct i2c_client *client, struct amc6821_data *data) { struct regmap *regmap = data->regmap; @@ -902,7 +905,7 @@ static int amc6821_init_client(struct i2c_client *client, struct amc6821_data *d return err; regval = AMC6821_CONF1_START; - if (amc6821_pwm_polarity(client) == PWM_POLARITY_INVERSED) + if (data->pwm_polarity == PWM_POLARITY_INVERSED) regval |= AMC6821_CONF1_PWMINV; err = regmap_update_bits(regmap, AMC6821_REG_CONF1, @@ -944,6 +947,7 @@ static int amc6821_probe(struct i2c_client *client) struct amc6821_data *data; struct device *hwmon_dev; struct regmap *regmap; + struct device_node *fan_np __free(device_node) = NULL; int err; data = devm_kzalloc(dev, sizeof(struct amc6821_data), GFP_KERNEL); @@ -956,6 +960,10 @@ static int amc6821_probe(struct i2c_client *client) "Failed to initialize regmap\n"); data->regmap = regmap; + fan_np = of_get_child_by_name(dev->of_node, "fan"); + if (fan_np) + amc6821_of_fan_read_data(client, data, fan_np); + err = amc6821_init_client(client, data); if (err) return err; -- 2.47.2