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>;
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 */
--
2.37.3
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
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> > 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
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 02/02/2023 14:35, Maarten Zanders wrote:
> 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?
Bindings mean drivers are using them. Your driver is not using it. It's
a register value, isn't it? Register values are not suitable for
bindings. There is no need for them to be in bindings.
>
> 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.
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. 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.
Best regards,
Krzysztof
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
> +
> 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
© 2016 - 2026 Red Hat, Inc.