Message ID | 20230202101032.26737-2-maarten.zanders@mind.be |
---|---|
State | Superseded |
Headers | show |
Series | leds: lp55xx: configure internal charge pump | expand |
On 02/02/2023 11:10, Maarten Zanders wrote: > Add a binding to configure the internal charge pump for lp55xx. > > Signed-off-by: Maarten Zanders <maarten.zanders@mind.be> > --- > > Notes: > v1: implement as bool to disable charge pump > v2: rewrite to use string configuration, supporting all modes > v3: simplification by replacing string option by u8 constant, > removing previous Reviewed-by tags as it's a complete > rewrite of the patch. > v4: added notes > > .../devicetree/bindings/leds/leds-lp55xx.yaml | 8 ++++++++ > include/dt-bindings/leds/leds-lp55xx.h | 10 ++++++++++ > 2 files changed, 18 insertions(+) > create mode 100644 include/dt-bindings/leds/leds-lp55xx.h > > diff --git a/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml b/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml > index ae607911f1db..22e63d89d770 100644 > --- a/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml > +++ b/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml > @@ -66,6 +66,12 @@ properties: > '#size-cells': > const: 0 > > + ti,charge-pump-mode: > + description: > + Set the operating mode of the internal charge pump as defined in > + <dt-bindings/leds/leds-lp55xx.h>. Defaults to auto. > + $ref: /schemas/types.yaml#/definitions/uint8 > + > patternProperties: > '^multi-led@[0-8]$': > type: object > @@ -152,6 +158,7 @@ additionalProperties: false > examples: > - | > #include <dt-bindings/leds/common.h> > + #include <dt-bindings/leds/leds-lp55xx.h> > > i2c { > #address-cells = <1>; > @@ -164,6 +171,7 @@ examples: > reg = <0x32>; > clock-mode = /bits/ 8 <2>; > pwr-sel = /bits/ 8 <3>; /* D1~9 connected to VOUT */ > + ti,charge-pump-mode = /bits/ 8 <LP55XX_CP_BYPASS>; No. V2 was correct. What happened here? You got review for v2, but suddenly entire patch goes into other direction... Best regards, Krzysztof
First off, bear with me here, I only recently started upstreaming patches to kernel. It still feels like navigating an extremely busy shipping lane... Either way, your feedback is highly valued. On 2/2/23 14:15, Krzysztof Kozlowski wrote: > >> diff --git a/include/dt-bindings/leds/leds-lp55xx.h b/include/dt-bindings/leds/leds-lp55xx.h >> new file mode 100644 >> index 000000000000..8f59c1c12dee >> --- /dev/null >> +++ b/include/dt-bindings/leds/leds-lp55xx.h >> @@ -0,0 +1,10 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +#ifndef _DT_BINDINGS_LEDS_LP55XX_H >> +#define _DT_BINDINGS_LEDS_LP55XX_H >> + >> +#define LP55XX_CP_OFF 0 >> +#define LP55XX_CP_BYPASS 1 >> +#define LP55XX_CP_BOOST 2 >> +#define LP55XX_CP_AUTO 3 > Additionally, these are not used, so it's a dead binding. Drop. Sorry, > this is not the approach you should take. > > Best regards, > Krzysztof > These definitions are intended to be used in the DTS's, so it seems normal to me that most of them go unused in the code? What am I missing? As for the changes v2 > v3, this was based on input I got on v2 from Lee Jones, maintainer for leds, on the implementation of the parsing of this option: >> + pdata->charge_pump_mode = LP55XX_CP_AUTO; >> + ret = of_property_read_string(np, "ti,charge-pump-mode", &pm); >> + if (!ret) { >> + for (cp_mode = LP55XX_CP_OFF; >> + cp_mode < ARRAY_SIZE(charge_pump_modes); >> + cp_mode++) { >> + if (!strcasecmp(pm, charge_pump_modes[cp_mode])) { >> + pdata->charge_pump_mode = cp_mode; >> + break; >> + } >> + } >> + } > A little over-engineered, no? > > Why not make the property a numerical value, then simply: > > ret = of_property_read_u32(np, "ti,charge-pump-mode", &pdata->charge_pump_mode); > if (ret) > data->charge_pump_mode = LP55XX_CP_AUTO; I found examples of similar configuration options of both types with other drivers in the kernel tree (ie string & uint8). I can appreciate both viewpoints but unfortunately cannot comply with both. Best regards, Maarten
On 2/2/23 14:43, Krzysztof Kozlowski wrote: > > Strings in DTS are usually easier to for humans to read, but it's not a > requirement to use them. The problem of storing register values is that > binding is tied/coupled with hardware programming model, so you cannot > add a new device if the register value is a bit different (e.g. > LP55XX_CP_OFF is 0x1). You need entire new binding for such case. With > string - no need. I understand and this is why I started with the string in the first place (as suggested by yourself in V1). > With binding constants (IDs) also no need, so was this > the intention? Just to be clear - it is then ID or binding constant, not > a value for hardware register. > For simplicity sake, yes, now the setting is propagating directly into the register as a bit value. But this is how the current implementation of the drivers work. If we add a device in the future which indeed has different bit mappings, that driver will have to do a mapping of the DT binding to its own bit field definitions. I consider this DT binding as the "master", which is now conveniently chosen to match the register values. Cheers, Maarten
On 02/02/2023 15:12, Maarten Zanders wrote: > > On 2/2/23 14:43, Krzysztof Kozlowski wrote: >> >> Strings in DTS are usually easier to for humans to read, but it's not a >> requirement to use them. The problem of storing register values is that >> binding is tied/coupled with hardware programming model, so you cannot >> add a new device if the register value is a bit different (e.g. >> LP55XX_CP_OFF is 0x1). You need entire new binding for such case. With >> string - no need. > I understand and this is why I started with the string in the first > place (as suggested by yourself in V1). >> With binding constants (IDs) also no need, so was this >> the intention? Just to be clear - it is then ID or binding constant, not >> a value for hardware register. >> > For simplicity sake, yes, now the setting is propagating directly into > the register as a bit value. But this is how the current implementation > of the drivers work. If we add a device in the future which indeed has > different bit mappings, that driver will have to do a mapping of the DT > binding to its own bit field definitions. I consider this DT binding as > the "master", which is now conveniently chosen to match the register values. OK, that makes sense. Best regards, Krzysztof
On 02/02/2023 11:10, Maarten Zanders wrote: > Add a binding to configure the internal charge pump for lp55xx. > > Signed-off-by: Maarten Zanders <maarten.zanders@mind.be> > --- > > Notes: > v1: implement as bool to disable charge pump > v2: rewrite to use string configuration, supporting all modes > v3: simplification by replacing string option by u8 constant, > removing previous Reviewed-by tags as it's a complete > rewrite of the patch. > v4: added notes > > .../devicetree/bindings/leds/leds-lp55xx.yaml | 8 ++++++++ > include/dt-bindings/leds/leds-lp55xx.h | 10 ++++++++++ > 2 files changed, 18 insertions(+) > create mode 100644 include/dt-bindings/leds/leds-lp55xx.h > > diff --git a/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml b/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml > index ae607911f1db..22e63d89d770 100644 > --- a/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml > +++ b/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml > @@ -66,6 +66,12 @@ properties: > '#size-cells': > const: 0 > > + ti,charge-pump-mode: > + description: > + Set the operating mode of the internal charge pump as defined in > + <dt-bindings/leds/leds-lp55xx.h>. Defaults to auto. > + $ref: /schemas/types.yaml#/definitions/uint8 This should be then uint32 default: 3 (and drop last sentence about default) > + > patternProperties: > '^multi-led@[0-8]$': > type: object > @@ -152,6 +158,7 @@ additionalProperties: false > examples: > - | > #include <dt-bindings/leds/common.h> > + #include <dt-bindings/leds/leds-lp55xx.h> > > i2c { > #address-cells = <1>; > @@ -164,6 +171,7 @@ examples: > reg = <0x32>; > clock-mode = /bits/ 8 <2>; > pwr-sel = /bits/ 8 <3>; /* D1~9 connected to VOUT */ > + ti,charge-pump-mode = /bits/ 8 <LP55XX_CP_BYPASS>; > > led@0 { > reg = <0>; > diff --git a/include/dt-bindings/leds/leds-lp55xx.h b/include/dt-bindings/leds/leds-lp55xx.h > new file mode 100644 > index 000000000000..8f59c1c12dee > --- /dev/null > +++ b/include/dt-bindings/leds/leds-lp55xx.h > @@ -0,0 +1,10 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ Dual license. > +#ifndef _DT_BINDINGS_LEDS_LP55XX_H > +#define _DT_BINDINGS_LEDS_LP55XX_H > + > +#define LP55XX_CP_OFF 0 > +#define LP55XX_CP_BYPASS 1 > +#define LP55XX_CP_BOOST 2 > +#define LP55XX_CP_AUTO 3 > + > +#endif /* _DT_BINDINGS_LEDS_LP55XX_H */ Best regards, Krzysztof
On 2/2/23 21:13, Krzysztof Kozlowski wrote: > + ti,charge-pump-mode: >> + description: >> + Set the operating mode of the internal charge pump as defined in >> + <dt-bindings/leds/leds-lp55xx.h>. Defaults to auto. >> + $ref: /schemas/types.yaml#/definitions/uint8 > This should be then uint32 Why is that? I specifically chose uint8 because other settings for LED are also uint8. The implementation is also uint8. I surely hope we'll never get to >256 modes for a charge pump. > default: 3 > (and drop last sentence about default) OK > +/* SPDX-License-Identifier: GPL-2.0 */ > Dual license. OK Best regards, Maarten
On 03/02/2023 16:38, Maarten Zanders wrote: > > On 2/2/23 21:13, Krzysztof Kozlowski wrote: >> + ti,charge-pump-mode: >>> + description: >>> + Set the operating mode of the internal charge pump as defined in >>> + <dt-bindings/leds/leds-lp55xx.h>. Defaults to auto. >>> + $ref: /schemas/types.yaml#/definitions/uint8 >> This should be then uint32 > > Why is that? I specifically chose uint8 because other settings for LED > are also uint8. The implementation is also uint8. I surely hope we'll > never get to >256 modes for a charge pump. Because all IDs are unsigned int. Best regards, Krzysztof
diff --git a/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml b/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml index ae607911f1db..22e63d89d770 100644 --- a/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml +++ b/Documentation/devicetree/bindings/leds/leds-lp55xx.yaml @@ -66,6 +66,12 @@ properties: '#size-cells': const: 0 + ti,charge-pump-mode: + description: + Set the operating mode of the internal charge pump as defined in + <dt-bindings/leds/leds-lp55xx.h>. Defaults to auto. + $ref: /schemas/types.yaml#/definitions/uint8 + patternProperties: '^multi-led@[0-8]$': type: object @@ -152,6 +158,7 @@ additionalProperties: false examples: - | #include <dt-bindings/leds/common.h> + #include <dt-bindings/leds/leds-lp55xx.h> i2c { #address-cells = <1>; @@ -164,6 +171,7 @@ examples: reg = <0x32>; clock-mode = /bits/ 8 <2>; pwr-sel = /bits/ 8 <3>; /* D1~9 connected to VOUT */ + ti,charge-pump-mode = /bits/ 8 <LP55XX_CP_BYPASS>; led@0 { reg = <0>; diff --git a/include/dt-bindings/leds/leds-lp55xx.h b/include/dt-bindings/leds/leds-lp55xx.h new file mode 100644 index 000000000000..8f59c1c12dee --- /dev/null +++ b/include/dt-bindings/leds/leds-lp55xx.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _DT_BINDINGS_LEDS_LP55XX_H +#define _DT_BINDINGS_LEDS_LP55XX_H + +#define LP55XX_CP_OFF 0 +#define LP55XX_CP_BYPASS 1 +#define LP55XX_CP_BOOST 2 +#define LP55XX_CP_AUTO 3 + +#endif /* _DT_BINDINGS_LEDS_LP55XX_H */
Add a binding to configure the internal charge pump for lp55xx. Signed-off-by: Maarten Zanders <maarten.zanders@mind.be> --- Notes: v1: implement as bool to disable charge pump v2: rewrite to use string configuration, supporting all modes v3: simplification by replacing string option by u8 constant, removing previous Reviewed-by tags as it's a complete rewrite of the patch. v4: added notes .../devicetree/bindings/leds/leds-lp55xx.yaml | 8 ++++++++ include/dt-bindings/leds/leds-lp55xx.h | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 include/dt-bindings/leds/leds-lp55xx.h