Re: [PATCH v1 2/2] hwmon: (amc6821) Add PWM polarity configuration with OF

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Francesco,

On 2/19/25 11:33 AM, Francesco Dolcini wrote:
Hello Quentin,

On Wed, Feb 19, 2025 at 11:08:43AM +0100, Quentin Schulz wrote:
On 2/18/25 5:56 PM, Francesco Dolcini wrote:
From: Francesco Dolcini <francesco.dolcini@xxxxxxxxxxx>

Add support to configure the PWM-Out pin polarity based on a device
tree property.

Signed-off-by: Francesco Dolcini <francesco.dolcini@xxxxxxxxxxx>
---
   drivers/hwmon/amc6821.c | 7 +++++--
   1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c
index 1e3c6acd8974..1ea2d97eebca 100644
--- a/drivers/hwmon/amc6821.c
+++ b/drivers/hwmon/amc6821.c
@@ -845,7 +845,7 @@ static int amc6821_detect(struct i2c_client *client, struct i2c_board_info *info
   	return 0;
   }
-static int amc6821_init_client(struct amc6821_data *data)
+static int amc6821_init_client(struct i2c_client *client, struct amc6821_data *data)
   {
   	struct regmap *regmap = data->regmap;
   	int err;
@@ -864,6 +864,9 @@ static int amc6821_init_client(struct amc6821_data *data)
   		if (err)
   			return err;
+		if (of_property_read_bool(client->dev.of_node, "ti,pwm-inverted"))

I know that the AMC6821 is doing a lot of smart things, but this really
tickled me. PWM controllers actually do support that already via
PWM_POLARITY_INVERTED flag for example. See
Documentation/devicetree/bindings/hwmon/adt7475.yaml which seems to be
another HWMON driver which acts as a PWM controller. I'm not sure this is
relevant, applicable or desired but I wanted to highlight this.

 From the DT binding point of view, it seems to implement the same I am
proposing here with adi,pwm-active-state property.


Ah! It seems like I read only the part that agreed with the idea I had in mind :)

Do you have anything more specific in mind?


Yes, #pwm-cells just below in the binding. You can then see that the third cell in a PWM specifier is for the polarity. If I didn't misread once more, I believe that what's in adi,pwm-active-state is ignored based on the content of the PWM flags in a PWM cell specifier, c.f. adt7475_set_pwm_polarity followed by adt7475_fan_pwm_config in adt7475_probe. I would have assumed that having the polarity inverted in adi,pwm-active-state would mean that the meaning of the flag in the PWM cell specifier would be inverted as well, meaning 0 -> inverted, PWM_POLARITY_INVERTED -> doubly inverted so "normal" polarity.

adt7475_fan_pwm_config was added a few years after adt7475_set_pwm_polarity.


+			pwminv = 1;
+

This is silently overriding the module parameter.

I don't think this is a good idea, at the very least not silently.

I was thinking at the same, and in the end I do have proposed this
solution in any case.

Let's look at the 2 use cases in which the DT property and the module
parameter are different.

## 1

module parameter pwminv=0
ti,pwm-inverted DT property present

=> we enable the PWM inversion

I think this is fair, if someone has a DT based system we need to assume
that the DT is correct. This is a HW configuration, not a module
parameter.

## 2

module parameter pwminv=1
ti,pwm-inverted DT property absent

=> we enable the PWM inversion

In this case the module parameter is overriding the DT. It means that
someone explicitly set pwminv=1 module parameter. I think is fair to
fulfill the module parameter request in this case, overriding the DT


Why are we not assuming the DT is correct here as well? I don't like that the behavior is different depending on the presence of the DT property. Its absence should carry as much weight as its presence. If you don't want that to be the case, we can always have another property like

ti,pwm-polarity = <0>; /* normal polarity */

or

ti,pwm-polarity = <PWM_POLARITY_INVERTED>;

and then the absence of the DT property is a "weak" normal polarity for which we shouldn't print the error message if it differs from the module param. But honestly, I don't think the DT people will be happy with that suggestion :)

I would suggest to add some logic in the probe function to set this value
and check its consistency.

With that said I can implement something around the lines you proposed,
if you still think is worth doing it. I would personally just keep the
priority on the module parameter over the DT and add an info print on what
is actually configured by the driver (not checking if they are
different).
	

Module params over DT is fine with me, I just want consistency here, so if it's always the case, fine :)

Not really sure we need a dev_info, that's pretty verbose. I liked dev_err for when both settings differ.

Cheers,
Quentin




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux