All of lore.kernel.org
 help / color / mirror / Atom feed
From: Florin Leotescu <florin.leotescu@oss.nxp.com>
To: Guenter Roeck <linux@roeck-us.net>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Michael Shych <michaelsh@nvidia.com>,
	linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Cc: daniel.baluta@nxp.com, viorel.suman@nxp.com,
	linux-arm-kernel@lists.infradead.org, imx@lists.linux.dev,
	festevam@gmail.com, Florin Leotescu <florin.leotescu@nxp.com>
Subject: Re: [RFC PATCH v2 2/2] hwmon: emc2305: Support configurable fan PWM at shutdown
Date: Thu, 12 Mar 2026 16:34:56 +0200	[thread overview]
Message-ID: <abLPEDnqoSWZwFcX@ro-kernel-workstation> (raw)
In-Reply-To: <20260312122248.1281572-3-florin.leotescu@oss.nxp.com>

Hi, 

The previous version was based on an outdated local branch and
included the of_node_put(child) fix, which is already upstream.
I'll resend a cleaned-up v3 rebased on current upstream.

On Thu, Mar 12, 2026 at 02:22:48PM +0200, florin.leotescu@oss.nxp.com wrote:
> From: Florin Leotescu <florin.leotescu@nxp.com>
> 
> Some systems require fans to enter in a defined safe state during system
> shutdown or reboot handoff.
> 
> Add support for the optional Device Tree property "fan-shutdown-percent"
> to configure the shutdown PWM duty cycle per fan output.
> 
> If the property is present for a fan channel, the driver converts the
> configured percentage value to the corresponding PWM duty cycle and
> applies it during driver shutdown.
> 
> If the property is not present, the fan state remains unchanged.
> 
> Signed-off-by: Florin Leotescu <florin.leotescu@nxp.com>
> ---
>  drivers/hwmon/emc2305.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/drivers/hwmon/emc2305.c b/drivers/hwmon/emc2305.c
> index 60809289f816..1fb5eac75f4a 100644
> --- a/drivers/hwmon/emc2305.c
> +++ b/drivers/hwmon/emc2305.c
> @@ -32,6 +32,7 @@
>  #define EMC2305_REG_DRIVE_PWM_OUT	0x2b
>  #define EMC2305_OPEN_DRAIN		0x0
>  #define EMC2305_PUSH_PULL		0x1
> +#define EMC2305_PWM_SHUTDOWN_UNSET      -1
>  
>  #define EMC2305_PWM_DUTY2STATE(duty, max_state, pwm_max) \
>  	DIV_ROUND_CLOSEST((duty) * (max_state), (pwm_max))
> @@ -104,6 +105,7 @@ struct emc2305_cdev_data {
>   * @pwm_output_mask: PWM output mask
>   * @pwm_polarity_mask: PWM polarity mask
>   * @pwm_separate: separate PWM settings for every channel
> + * @pwm_shutdown: Set shutdown PWM.
>   * @pwm_min: array of minimum PWM per channel
>   * @pwm_freq: array of PWM frequency per channel
>   * @cdev_data: array of cooling devices data
> @@ -116,6 +118,7 @@ struct emc2305_data {
>  	u8 pwm_output_mask;
>  	u8 pwm_polarity_mask;
>  	bool pwm_separate;
> +	s16 pwm_shutdown[EMC2305_PWM_MAX];
>  	u8 pwm_min[EMC2305_PWM_MAX];
>  	u16 pwm_freq[EMC2305_PWM_MAX];
>  	struct emc2305_cdev_data cdev_data[EMC2305_PWM_MAX];
> @@ -539,6 +542,7 @@ static int emc2305_of_parse_pwm_child(struct device *dev,
>  				      struct device_node *child,
>  				      struct emc2305_data *data)
>  {	u32 ch;
> +	u32 pwm_shutdown_percent;
>  	int ret;
>  	struct of_phandle_args args;
>  
> @@ -578,6 +582,19 @@ static int emc2305_of_parse_pwm_child(struct device *dev,
>  		data->pwm_output_mask |= EMC2305_OPEN_DRAIN << ch;
>  	}
>  
> +	of_node_put(args.np);
> +
> +	ret = of_property_read_u32(child, "fan-shutdown-percent",
> +				   &pwm_shutdown_percent);
> +
> +	data->pwm_shutdown[ch] = EMC2305_PWM_SHUTDOWN_UNSET;
> +
> +	if (!ret) {
> +		pwm_shutdown_percent = clamp(pwm_shutdown_percent, 0, 100);
> +		data->pwm_shutdown[ch] =
> +			DIV_ROUND_CLOSEST(pwm_shutdown_percent * EMC2305_FAN_MAX, 100);
> +	}
> +
>  	return 0;
>  }
>  
> @@ -716,6 +733,23 @@ static int emc2305_probe(struct i2c_client *client)
>  	return 0;
>  }
>  
> +static void emc2305_shutdown(struct i2c_client *client)
> +{
> +	int i;
> +	int ret;
> +	struct emc2305_data *data = i2c_get_clientdata(client);
> +
> +	for (i = 0; i < data->pwm_num; i++) {
> +		if (data->pwm_shutdown[i] != EMC2305_PWM_SHUTDOWN_UNSET) {
> +			ret = i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_DRIVE(i),
> +							data->pwm_shutdown[i]);
> +			if (ret < 0)
> +				dev_warn(&client->dev,
> +					 "Failed to set shutdown PWM for ch %d\n", i);
> +		}
> +	}
> +}
> +
>  static const struct of_device_id of_emc2305_match_table[] = {
>  	{ .compatible = "microchip,emc2305", },
>  	{},
> @@ -728,6 +762,7 @@ static struct i2c_driver emc2305_driver = {
>  		.of_match_table = of_emc2305_match_table,
>  	},
>  	.probe = emc2305_probe,
> +	.shutdown = emc2305_shutdown,
>  	.id_table = emc2305_ids,
>  };
>  
> -- 
> 2.34.1
> 

      reply	other threads:[~2026-03-12 14:19 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-12 12:22 [RFC PATCH v2 0/2] hwmon: emc2305: Support configurable fan PWM at shutdown florin.leotescu
2026-03-12 12:22 ` [RFC PATCH v2 1/2] dt-bindings: hwmon: emc2305: Add fan-shutdown-percent property florin.leotescu
2026-03-12 17:37   ` Conor Dooley
2026-03-13 17:14     ` Florin Leotescu
2026-03-13 17:38       ` Conor Dooley
2026-03-13 18:12         ` Guenter Roeck
2026-03-13 20:55           ` Conor Dooley
2026-03-12 12:22 ` [RFC PATCH v2 2/2] hwmon: emc2305: Support configurable fan PWM at shutdown florin.leotescu
2026-03-12 14:34   ` Florin Leotescu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=abLPEDnqoSWZwFcX@ro-kernel-workstation \
    --to=florin.leotescu@oss.nxp.com \
    --cc=conor+dt@kernel.org \
    --cc=daniel.baluta@nxp.com \
    --cc=devicetree@vger.kernel.org \
    --cc=festevam@gmail.com \
    --cc=florin.leotescu@nxp.com \
    --cc=imx@lists.linux.dev \
    --cc=krzk+dt@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=michaelsh@nvidia.com \
    --cc=robh@kernel.org \
    --cc=viorel.suman@nxp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.