[1/1] dt-bindings: timer: Convert ingenic,tcu.txt to YAML
diff mbox series

Message ID 20200301174636.63446-2-paul@crapouillou.net
State In Next
Commit 186a0ea50b1e475ca86d5b10e9652a583a4df18e
Headers show
Series
  • Convert ingenic,tcu.txt to YAML
Related show

Commit Message

Paul Cercueil March 1, 2020, 5:46 p.m. UTC
Convert the ingenic,tcu.txt file to YAML.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
 .../devicetree/bindings/timer/ingenic,tcu.txt | 138 ----------
 .../bindings/timer/ingenic,tcu.yaml           | 235 ++++++++++++++++++
 2 files changed, 235 insertions(+), 138 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/timer/ingenic,tcu.txt
 create mode 100644 Documentation/devicetree/bindings/timer/ingenic,tcu.yaml

Comments

Rob Herring March 2, 2020, 5:06 p.m. UTC | #1
On Sun, Mar 1, 2020 at 11:47 AM Paul Cercueil <paul@crapouillou.net> wrote:
>

Well, this flew into linux-next quickly and breaks 'make
dt_binding_check'... Please drop, revert or fix quickly.

> Convert the ingenic,tcu.txt file to YAML.
>
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> ---
>  .../devicetree/bindings/timer/ingenic,tcu.txt | 138 ----------
>  .../bindings/timer/ingenic,tcu.yaml           | 235 ++++++++++++++++++
>  2 files changed, 235 insertions(+), 138 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/timer/ingenic,tcu.txt
>  create mode 100644 Documentation/devicetree/bindings/timer/ingenic,tcu.yaml


> diff --git a/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> new file mode 100644
> index 000000000000..1ded3b4762bb
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> @@ -0,0 +1,235 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/timer/ingenic,tcu.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Ingenic SoCs Timer/Counter Unit (TCU) devicetree bindings
> +
> +description: |
> +  For a description of the TCU hardware and drivers, have a look at
> +  Documentation/mips/ingenic-tcu.rst.
> +
> +maintainers:
> +  - Paul Cercueil <paul@crapouillou.net>
> +
> +properties:
> +  $nodename:
> +    pattern: "^timer@.*"

'.*' is redundant.

> +
> +  "#address-cells":
> +    const: 1
> +
> +  "#size-cells":
> +    const: 1
> +
> +  "#clock-cells":
> +    const: 1
> +
> +  "#interrupt-cells":
> +    const: 1
> +
> +  interrupt-controller: true
> +
> +  ranges: true
> +
> +  compatible:
> +    items:
> +      - enum:
> +        - ingenic,jz4740-tcu
> +        - ingenic,jz4725b-tcu
> +        - ingenic,jz4770-tcu
> +        - ingenic,x1000-tcu
> +      - const: simple-mfd

This breaks several examples in dt_binding_check because this schema
will be applied to every 'simple-mfd' node. You need a custom select
entry that excludes 'simple-mfd'. There should be several examples in
tree to copy.

> +
> +  reg:
> +    maxItems: 1
> +
> +  clocks:
> +    items:
> +      - description: RTC clock
> +      - description: EXT clock
> +      - description: PCLK clock
> +      - description: TCU clock
> +    minItems: 3
> +
> +  clock-names:
> +    items:
> +      - const: rtc
> +      - const: ext
> +      - const: pclk
> +      - const: tcu
> +    minItems: 3
> +
> +  interrupts:
> +    minItems: 1
> +    maxItems: 3

You need to define what each one is.

> +
> +  ingenic,pwm-channels-mask:
> +    description: Bitmask of TCU channels reserved for PWM use.
> +    allOf:
> +      - $ref: /schemas/types.yaml#/definitions/uint32
> +      - minimum: 0x00
> +      - maximum: 0xff
> +      - default: 0xfc
> +
> +patternProperties:
> +  "^watchdog@[a-f0-9]+$":
> +    type: object
> +    allOf: [ $ref: ../watchdog/watchdog.yaml# ]
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +            - ingenic,jz4740-watchdog
> +            - ingenic,jz4780-watchdog
> +          - items:
> +            - const: ingenic,jz4770-watchdog
> +            - const: ingenic,jz4740-watchdog
> +
> +      clocks:
> +        maxItems: 1
> +
> +      clock-names:
> +        const: wdt
> +
> +    required:
> +      - compatible
> +      - clocks
> +      - clock-names
> +
> +  "^pwm@[a-f0-9]+$":
> +    type: object
> +    allOf: [ $ref: ../pwm/pwm.yaml# ]
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +            - ingenic,jz4740-pwm
> +          - items:
> +            - enum:
> +              - ingenic,jz4770-pwm
> +              - ingenic,jz4780-pwm
> +            - const: ingenic,jz4740-pwm
> +
> +      clocks:
> +        minItems: 6
> +        maxItems: 8
> +
> +      clock-names:
> +        items:
> +          - const: timer0
> +          - const: timer1
> +          - const: timer2
> +          - const: timer3
> +          - const: timer4
> +          - const: timer5
> +          - const: timer6
> +          - const: timer7
> +        minItems: 6
> +
> +    required:
> +      - compatible
> +      - clocks
> +      - clock-names
> +
> +  "^timer@[a-f0-9]+":
> +    type: object
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +            - ingenic,jz4725b-ost
> +            - ingenic,jz4770-ost
> +          - items:
> +            - const: ingenic,jz4780-ost
> +            - const: ingenic,jz4770-ost
> +
> +
> +      clocks:
> +        maxItems: 1
> +
> +      clock-names:
> +        const: ost
> +
> +      interrupts:
> +        maxItems: 1
> +
> +    required:
> +      - compatible
> +      - clocks
> +      - clock-names
> +      - interrupts
> +
> +required:
> +  - "#clock-cells"
> +  - "#interrupt-cells"
> +  - interrupt-controller
> +  - compatible
> +  - reg
> +  - clocks
> +  - clock-names
> +  - interrupts
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/clock/jz4770-cgu.h>
> +    #include <dt-bindings/clock/ingenic,tcu.h>
> +    tcu: timer@10002000 {
> +      compatible = "ingenic,jz4770-tcu", "simple-mfd";
> +      reg = <0x10002000 0x1000>;
> +      #address-cells = <1>;
> +      #size-cells = <1>;
> +      ranges = <0x0 0x10002000 0x1000>;
> +
> +      #clock-cells = <1>;
> +
> +      clocks = <&cgu JZ4770_CLK_RTC>,
> +               <&cgu JZ4770_CLK_EXT>,
> +               <&cgu JZ4770_CLK_PCLK>;
> +      clock-names = "rtc", "ext", "pclk";
> +
> +      interrupt-controller;
> +      #interrupt-cells = <1>;
> +
> +      interrupt-parent = <&intc>;
> +      interrupts = <27 26 25>;
> +
> +      watchdog: watchdog@0 {
> +        compatible = "ingenic,jz4770-watchdog", "ingenic,jz4740-watchdog";
> +        reg = <0x0 0xc>;
> +
> +        clocks = <&tcu TCU_CLK_WDT>;
> +        clock-names = "wdt";
> +      };
> +
> +      pwm: pwm@40 {
> +        compatible = "ingenic,jz4770-pwm", "ingenic,jz4740-pwm";
> +        reg = <0x40 0x80>;
> +
> +        #pwm-cells = <3>;
> +
> +        clocks = <&tcu TCU_CLK_TIMER0>,
> +                 <&tcu TCU_CLK_TIMER1>,
> +                 <&tcu TCU_CLK_TIMER2>,
> +                 <&tcu TCU_CLK_TIMER3>,
> +                 <&tcu TCU_CLK_TIMER4>,
> +                 <&tcu TCU_CLK_TIMER5>,
> +                 <&tcu TCU_CLK_TIMER6>,
> +                 <&tcu TCU_CLK_TIMER7>;
> +        clock-names = "timer0", "timer1", "timer2", "timer3",
> +                "timer4", "timer5", "timer6", "timer7";
> +      };
> +
> +      ost: timer@e0 {
> +        compatible = "ingenic,jz4770-ost";
> +        reg = <0xe0 0x20>;
> +
> +        clocks = <&tcu TCU_CLK_OST>;
> +        clock-names = "ost";
> +
> +        interrupts = <15>;
> +      };
> +    };
> --
> 2.25.1
>
Daniel Lezcano March 2, 2020, 5:41 p.m. UTC | #2
On 02/03/2020 18:06, Rob Herring wrote:
> On Sun, Mar 1, 2020 at 11:47 AM Paul Cercueil <paul@crapouillou.net> wrote:
>>
> 
> Well, this flew into linux-next quickly and breaks 'make
> dt_binding_check'... Please drop, revert or fix quickly.

dropped.
Paul Cercueil March 2, 2020, 6:24 p.m. UTC | #3
Hi Rob,


Le lun., mars 2, 2020 at 11:06, Rob Herring <robh+dt@kernel.org> a 
écrit :
> On Sun, Mar 1, 2020 at 11:47 AM Paul Cercueil <paul@crapouillou.net> 
> wrote:
>> 
> 
> Well, this flew into linux-next quickly and breaks 'make
> dt_binding_check'... Please drop, revert or fix quickly.

For my defense I said to merge "provided Rob acks it" ;)

>>  Convert the ingenic,tcu.txt file to YAML.
>> 
>>  Signed-off-by: Paul Cercueil <paul@crapouillou.net>
>>  ---
>>   .../devicetree/bindings/timer/ingenic,tcu.txt | 138 ----------
>>   .../bindings/timer/ingenic,tcu.yaml           | 235 
>> ++++++++++++++++++
>>   2 files changed, 235 insertions(+), 138 deletions(-)
>>   delete mode 100644 
>> Documentation/devicetree/bindings/timer/ingenic,tcu.txt
>>   create mode 100644 
>> Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> 
> 
>>  diff --git 
>> a/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml 
>> b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
>>  new file mode 100644
>>  index 000000000000..1ded3b4762bb
>>  --- /dev/null
>>  +++ b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
>>  @@ -0,0 +1,235 @@
>>  +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>>  +%YAML 1.2
>>  +---
>>  +$id: http://devicetree.org/schemas/timer/ingenic,tcu.yaml#
>>  +$schema: http://devicetree.org/meta-schemas/core.yaml#
>>  +
>>  +title: Ingenic SoCs Timer/Counter Unit (TCU) devicetree bindings
>>  +
>>  +description: |
>>  +  For a description of the TCU hardware and drivers, have a look at
>>  +  Documentation/mips/ingenic-tcu.rst.
>>  +
>>  +maintainers:
>>  +  - Paul Cercueil <paul@crapouillou.net>
>>  +
>>  +properties:
>>  +  $nodename:
>>  +    pattern: "^timer@.*"
> 
> '.*' is redundant.
> 
>>  +
>>  +  "#address-cells":
>>  +    const: 1
>>  +
>>  +  "#size-cells":
>>  +    const: 1
>>  +
>>  +  "#clock-cells":
>>  +    const: 1
>>  +
>>  +  "#interrupt-cells":
>>  +    const: 1
>>  +
>>  +  interrupt-controller: true
>>  +
>>  +  ranges: true
>>  +
>>  +  compatible:
>>  +    items:
>>  +      - enum:
>>  +        - ingenic,jz4740-tcu
>>  +        - ingenic,jz4725b-tcu
>>  +        - ingenic,jz4770-tcu
>>  +        - ingenic,x1000-tcu
>>  +      - const: simple-mfd
> 
> This breaks several examples in dt_binding_check because this schema
> will be applied to every 'simple-mfd' node. You need a custom select
> entry that excludes 'simple-mfd'. There should be several examples in
> tree to copy.

Why would it be applied to all 'single-mfd' nodes? Doesn't what I wrote 
specify that it needs one of ingenic,*-tcu _and_ simple-mfd?

I'm not sure I understand what you mean.

I did grep for 'single-mfd' in all YAML files in Documentation/ and 
nothing really stands out.

-Paul

>>  +
>>  +  reg:
>>  +    maxItems: 1
>>  +
>>  +  clocks:
>>  +    items:
>>  +      - description: RTC clock
>>  +      - description: EXT clock
>>  +      - description: PCLK clock
>>  +      - description: TCU clock
>>  +    minItems: 3
>>  +
>>  +  clock-names:
>>  +    items:
>>  +      - const: rtc
>>  +      - const: ext
>>  +      - const: pclk
>>  +      - const: tcu
>>  +    minItems: 3
>>  +
>>  +  interrupts:
>>  +    minItems: 1
>>  +    maxItems: 3
> 
> You need to define what each one is.
> 
>>  +
>>  +  ingenic,pwm-channels-mask:
>>  +    description: Bitmask of TCU channels reserved for PWM use.
>>  +    allOf:
>>  +      - $ref: /schemas/types.yaml#/definitions/uint32
>>  +      - minimum: 0x00
>>  +      - maximum: 0xff
>>  +      - default: 0xfc
>>  +
>>  +patternProperties:
>>  +  "^watchdog@[a-f0-9]+$":
>>  +    type: object
>>  +    allOf: [ $ref: ../watchdog/watchdog.yaml# ]
>>  +    properties:
>>  +      compatible:
>>  +        oneOf:
>>  +          - enum:
>>  +            - ingenic,jz4740-watchdog
>>  +            - ingenic,jz4780-watchdog
>>  +          - items:
>>  +            - const: ingenic,jz4770-watchdog
>>  +            - const: ingenic,jz4740-watchdog
>>  +
>>  +      clocks:
>>  +        maxItems: 1
>>  +
>>  +      clock-names:
>>  +        const: wdt
>>  +
>>  +    required:
>>  +      - compatible
>>  +      - clocks
>>  +      - clock-names
>>  +
>>  +  "^pwm@[a-f0-9]+$":
>>  +    type: object
>>  +    allOf: [ $ref: ../pwm/pwm.yaml# ]
>>  +    properties:
>>  +      compatible:
>>  +        oneOf:
>>  +          - enum:
>>  +            - ingenic,jz4740-pwm
>>  +          - items:
>>  +            - enum:
>>  +              - ingenic,jz4770-pwm
>>  +              - ingenic,jz4780-pwm
>>  +            - const: ingenic,jz4740-pwm
>>  +
>>  +      clocks:
>>  +        minItems: 6
>>  +        maxItems: 8
>>  +
>>  +      clock-names:
>>  +        items:
>>  +          - const: timer0
>>  +          - const: timer1
>>  +          - const: timer2
>>  +          - const: timer3
>>  +          - const: timer4
>>  +          - const: timer5
>>  +          - const: timer6
>>  +          - const: timer7
>>  +        minItems: 6
>>  +
>>  +    required:
>>  +      - compatible
>>  +      - clocks
>>  +      - clock-names
>>  +
>>  +  "^timer@[a-f0-9]+":
>>  +    type: object
>>  +    properties:
>>  +      compatible:
>>  +        oneOf:
>>  +          - enum:
>>  +            - ingenic,jz4725b-ost
>>  +            - ingenic,jz4770-ost
>>  +          - items:
>>  +            - const: ingenic,jz4780-ost
>>  +            - const: ingenic,jz4770-ost
>>  +
>>  +
>>  +      clocks:
>>  +        maxItems: 1
>>  +
>>  +      clock-names:
>>  +        const: ost
>>  +
>>  +      interrupts:
>>  +        maxItems: 1
>>  +
>>  +    required:
>>  +      - compatible
>>  +      - clocks
>>  +      - clock-names
>>  +      - interrupts
>>  +
>>  +required:
>>  +  - "#clock-cells"
>>  +  - "#interrupt-cells"
>>  +  - interrupt-controller
>>  +  - compatible
>>  +  - reg
>>  +  - clocks
>>  +  - clock-names
>>  +  - interrupts
>>  +
>>  +additionalProperties: false
>>  +
>>  +examples:
>>  +  - |
>>  +    #include <dt-bindings/clock/jz4770-cgu.h>
>>  +    #include <dt-bindings/clock/ingenic,tcu.h>
>>  +    tcu: timer@10002000 {
>>  +      compatible = "ingenic,jz4770-tcu", "simple-mfd";
>>  +      reg = <0x10002000 0x1000>;
>>  +      #address-cells = <1>;
>>  +      #size-cells = <1>;
>>  +      ranges = <0x0 0x10002000 0x1000>;
>>  +
>>  +      #clock-cells = <1>;
>>  +
>>  +      clocks = <&cgu JZ4770_CLK_RTC>,
>>  +               <&cgu JZ4770_CLK_EXT>,
>>  +               <&cgu JZ4770_CLK_PCLK>;
>>  +      clock-names = "rtc", "ext", "pclk";
>>  +
>>  +      interrupt-controller;
>>  +      #interrupt-cells = <1>;
>>  +
>>  +      interrupt-parent = <&intc>;
>>  +      interrupts = <27 26 25>;
>>  +
>>  +      watchdog: watchdog@0 {
>>  +        compatible = "ingenic,jz4770-watchdog", 
>> "ingenic,jz4740-watchdog";
>>  +        reg = <0x0 0xc>;
>>  +
>>  +        clocks = <&tcu TCU_CLK_WDT>;
>>  +        clock-names = "wdt";
>>  +      };
>>  +
>>  +      pwm: pwm@40 {
>>  +        compatible = "ingenic,jz4770-pwm", "ingenic,jz4740-pwm";
>>  +        reg = <0x40 0x80>;
>>  +
>>  +        #pwm-cells = <3>;
>>  +
>>  +        clocks = <&tcu TCU_CLK_TIMER0>,
>>  +                 <&tcu TCU_CLK_TIMER1>,
>>  +                 <&tcu TCU_CLK_TIMER2>,
>>  +                 <&tcu TCU_CLK_TIMER3>,
>>  +                 <&tcu TCU_CLK_TIMER4>,
>>  +                 <&tcu TCU_CLK_TIMER5>,
>>  +                 <&tcu TCU_CLK_TIMER6>,
>>  +                 <&tcu TCU_CLK_TIMER7>;
>>  +        clock-names = "timer0", "timer1", "timer2", "timer3",
>>  +                "timer4", "timer5", "timer6", "timer7";
>>  +      };
>>  +
>>  +      ost: timer@e0 {
>>  +        compatible = "ingenic,jz4770-ost";
>>  +        reg = <0xe0 0x20>;
>>  +
>>  +        clocks = <&tcu TCU_CLK_OST>;
>>  +        clock-names = "ost";
>>  +
>>  +        interrupts = <15>;
>>  +      };
>>  +    };
>>  --
>>  2.25.1
>>
Rob Herring March 2, 2020, 7:07 p.m. UTC | #4
On Mon, Mar 2, 2020 at 12:25 PM Paul Cercueil <paul@crapouillou.net> wrote:
>
> Hi Rob,
>
>
> Le lun., mars 2, 2020 at 11:06, Rob Herring <robh+dt@kernel.org> a
> écrit :
> > On Sun, Mar 1, 2020 at 11:47 AM Paul Cercueil <paul@crapouillou.net>
> > wrote:
> >>
> >
> > Well, this flew into linux-next quickly and breaks 'make
> > dt_binding_check'... Please drop, revert or fix quickly.
>
> For my defense I said to merge "provided Rob acks it" ;)
>
> >>  Convert the ingenic,tcu.txt file to YAML.
> >>
> >>  Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> >>  ---
> >>   .../devicetree/bindings/timer/ingenic,tcu.txt | 138 ----------
> >>   .../bindings/timer/ingenic,tcu.yaml           | 235
> >> ++++++++++++++++++
> >>   2 files changed, 235 insertions(+), 138 deletions(-)
> >>   delete mode 100644
> >> Documentation/devicetree/bindings/timer/ingenic,tcu.txt
> >>   create mode 100644
> >> Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >
> >
> >>  diff --git
> >> a/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >> b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >>  new file mode 100644
> >>  index 000000000000..1ded3b4762bb
> >>  --- /dev/null
> >>  +++ b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >>  @@ -0,0 +1,235 @@
> >>  +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> >>  +%YAML 1.2
> >>  +---
> >>  +$id: http://devicetree.org/schemas/timer/ingenic,tcu.yaml#
> >>  +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >>  +
> >>  +title: Ingenic SoCs Timer/Counter Unit (TCU) devicetree bindings
> >>  +
> >>  +description: |
> >>  +  For a description of the TCU hardware and drivers, have a look at
> >>  +  Documentation/mips/ingenic-tcu.rst.
> >>  +
> >>  +maintainers:
> >>  +  - Paul Cercueil <paul@crapouillou.net>
> >>  +
> >>  +properties:
> >>  +  $nodename:
> >>  +    pattern: "^timer@.*"
> >
> > '.*' is redundant.
> >
> >>  +
> >>  +  "#address-cells":
> >>  +    const: 1
> >>  +
> >>  +  "#size-cells":
> >>  +    const: 1
> >>  +
> >>  +  "#clock-cells":
> >>  +    const: 1
> >>  +
> >>  +  "#interrupt-cells":
> >>  +    const: 1
> >>  +
> >>  +  interrupt-controller: true
> >>  +
> >>  +  ranges: true
> >>  +
> >>  +  compatible:
> >>  +    items:
> >>  +      - enum:
> >>  +        - ingenic,jz4740-tcu
> >>  +        - ingenic,jz4725b-tcu
> >>  +        - ingenic,jz4770-tcu
> >>  +        - ingenic,x1000-tcu
> >>  +      - const: simple-mfd
> >
> > This breaks several examples in dt_binding_check because this schema
> > will be applied to every 'simple-mfd' node. You need a custom select
> > entry that excludes 'simple-mfd'. There should be several examples in
> > tree to copy.
>
> Why would it be applied to all 'single-mfd' nodes?

single-mfd?

The way the tool decides to apply a schema or not is my matching on
any of the compatible strings (or node name if no compatible
specified). You can override this with 'select'.

> Doesn't what I wrote
> specify that it needs one of ingenic,*-tcu _and_ simple-mfd?

Yes, but matching is on any of them. You need to add:

select:
  properties:
    compatible:
      contains:
        enum:
          - ingenic,jz4740-tcu
          - ingenic,jz4725b-tcu
          - ingenic,jz4770-tcu
          - ingenic,x1000-tcu
  required:
    - compatible

> I'm not sure I understand what you mean.
>
> I did grep for 'single-mfd' in all YAML files in Documentation/ and
> nothing really stands out.

I guess even without the typo it was harder to find an example than I thought.

Note that I think I'll make the tool exclude 'simple-mfd', but it will
take some time for users to update so you still need to fix this.

Rob
Paul Cercueil March 2, 2020, 7:35 p.m. UTC | #5
Le lun., mars 2, 2020 at 13:07, Rob Herring <robh+dt@kernel.org> a 
écrit :
> On Mon, Mar 2, 2020 at 12:25 PM Paul Cercueil <paul@crapouillou.net> 
> wrote:
>> 
>>  Hi Rob,
>> 
>> 
>>  Le lun., mars 2, 2020 at 11:06, Rob Herring <robh+dt@kernel.org> a
>>  écrit :
>>  > On Sun, Mar 1, 2020 at 11:47 AM Paul Cercueil 
>> <paul@crapouillou.net>
>>  > wrote:
>>  >>
>>  >
>>  > Well, this flew into linux-next quickly and breaks 'make
>>  > dt_binding_check'... Please drop, revert or fix quickly.
>> 
>>  For my defense I said to merge "provided Rob acks it" ;)
>> 
>>  >>  Convert the ingenic,tcu.txt file to YAML.
>>  >>
>>  >>  Signed-off-by: Paul Cercueil <paul@crapouillou.net>
>>  >>  ---
>>  >>   .../devicetree/bindings/timer/ingenic,tcu.txt | 138 ----------
>>  >>   .../bindings/timer/ingenic,tcu.yaml           | 235
>>  >> ++++++++++++++++++
>>  >>   2 files changed, 235 insertions(+), 138 deletions(-)
>>  >>   delete mode 100644
>>  >> Documentation/devicetree/bindings/timer/ingenic,tcu.txt
>>  >>   create mode 100644
>>  >> Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
>>  >
>>  >
>>  >>  diff --git
>>  >> a/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
>>  >> b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
>>  >>  new file mode 100644
>>  >>  index 000000000000..1ded3b4762bb
>>  >>  --- /dev/null
>>  >>  +++ b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
>>  >>  @@ -0,0 +1,235 @@
>>  >>  +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>>  >>  +%YAML 1.2
>>  >>  +---
>>  >>  +$id: http://devicetree.org/schemas/timer/ingenic,tcu.yaml#
>>  >>  +$schema: http://devicetree.org/meta-schemas/core.yaml#
>>  >>  +
>>  >>  +title: Ingenic SoCs Timer/Counter Unit (TCU) devicetree 
>> bindings
>>  >>  +
>>  >>  +description: |
>>  >>  +  For a description of the TCU hardware and drivers, have a 
>> look at
>>  >>  +  Documentation/mips/ingenic-tcu.rst.
>>  >>  +
>>  >>  +maintainers:
>>  >>  +  - Paul Cercueil <paul@crapouillou.net>
>>  >>  +
>>  >>  +properties:
>>  >>  +  $nodename:
>>  >>  +    pattern: "^timer@.*"
>>  >
>>  > '.*' is redundant.
>>  >
>>  >>  +
>>  >>  +  "#address-cells":
>>  >>  +    const: 1
>>  >>  +
>>  >>  +  "#size-cells":
>>  >>  +    const: 1
>>  >>  +
>>  >>  +  "#clock-cells":
>>  >>  +    const: 1
>>  >>  +
>>  >>  +  "#interrupt-cells":
>>  >>  +    const: 1
>>  >>  +
>>  >>  +  interrupt-controller: true
>>  >>  +
>>  >>  +  ranges: true
>>  >>  +
>>  >>  +  compatible:
>>  >>  +    items:
>>  >>  +      - enum:
>>  >>  +        - ingenic,jz4740-tcu
>>  >>  +        - ingenic,jz4725b-tcu
>>  >>  +        - ingenic,jz4770-tcu
>>  >>  +        - ingenic,x1000-tcu
>>  >>  +      - const: simple-mfd
>>  >
>>  > This breaks several examples in dt_binding_check because this 
>> schema
>>  > will be applied to every 'simple-mfd' node. You need a custom 
>> select
>>  > entry that excludes 'simple-mfd'. There should be several 
>> examples in
>>  > tree to copy.
>> 
>>  Why would it be applied to all 'single-mfd' nodes?
> 
> single-mfd?

simple-mfd* of course, sorry.

> The way the tool decides to apply a schema or not is my matching on
> any of the compatible strings (or node name if no compatible
> specified). You can override this with 'select'.
> 
>>  Doesn't what I wrote
>>  specify that it needs one of ingenic,*-tcu _and_ simple-mfd?
> 
> Yes, but matching is on any of them. You need to add:

Alright, will do. Is there a reason why it's done that way? It sounds a 
bit counter-intuitive.

> select:
>   properties:
>     compatible:
>       contains:
>         enum:
>           - ingenic,jz4740-tcu
>           - ingenic,jz4725b-tcu
>           - ingenic,jz4770-tcu
>           - ingenic,x1000-tcu
>   required:
>     - compatible
> 
>>  I'm not sure I understand what you mean.
>> 
>>  I did grep for 'single-mfd' in all YAML files in Documentation/ and
>>  nothing really stands out.
> 
> I guess even without the typo it was harder to find an example than I 
> thought.
> 
> Note that I think I'll make the tool exclude 'simple-mfd', but it will
> take some time for users to update so you still need to fix this.

Alright, thanks for the help.

-Paul
Rob Herring March 2, 2020, 7:59 p.m. UTC | #6
On Mon, Mar 2, 2020 at 1:35 PM Paul Cercueil <paul@crapouillou.net> wrote:
>
>
>
> Le lun., mars 2, 2020 at 13:07, Rob Herring <robh+dt@kernel.org> a
> écrit :
> > On Mon, Mar 2, 2020 at 12:25 PM Paul Cercueil <paul@crapouillou.net>
> > wrote:
> >>
> >>  Hi Rob,
> >>
> >>
> >>  Le lun., mars 2, 2020 at 11:06, Rob Herring <robh+dt@kernel.org> a
> >>  écrit :
> >>  > On Sun, Mar 1, 2020 at 11:47 AM Paul Cercueil
> >> <paul@crapouillou.net>
> >>  > wrote:
> >>  >>
> >>  >
> >>  > Well, this flew into linux-next quickly and breaks 'make
> >>  > dt_binding_check'... Please drop, revert or fix quickly.
> >>
> >>  For my defense I said to merge "provided Rob acks it" ;)
> >>
> >>  >>  Convert the ingenic,tcu.txt file to YAML.
> >>  >>
> >>  >>  Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> >>  >>  ---
> >>  >>   .../devicetree/bindings/timer/ingenic,tcu.txt | 138 ----------
> >>  >>   .../bindings/timer/ingenic,tcu.yaml           | 235
> >>  >> ++++++++++++++++++
> >>  >>   2 files changed, 235 insertions(+), 138 deletions(-)
> >>  >>   delete mode 100644
> >>  >> Documentation/devicetree/bindings/timer/ingenic,tcu.txt
> >>  >>   create mode 100644
> >>  >> Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >>  >
> >>  >
> >>  >>  diff --git
> >>  >> a/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >>  >> b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >>  >>  new file mode 100644
> >>  >>  index 000000000000..1ded3b4762bb
> >>  >>  --- /dev/null
> >>  >>  +++ b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
> >>  >>  @@ -0,0 +1,235 @@
> >>  >>  +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> >>  >>  +%YAML 1.2
> >>  >>  +---
> >>  >>  +$id: http://devicetree.org/schemas/timer/ingenic,tcu.yaml#
> >>  >>  +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >>  >>  +
> >>  >>  +title: Ingenic SoCs Timer/Counter Unit (TCU) devicetree
> >> bindings
> >>  >>  +
> >>  >>  +description: |
> >>  >>  +  For a description of the TCU hardware and drivers, have a
> >> look at
> >>  >>  +  Documentation/mips/ingenic-tcu.rst.
> >>  >>  +
> >>  >>  +maintainers:
> >>  >>  +  - Paul Cercueil <paul@crapouillou.net>
> >>  >>  +
> >>  >>  +properties:
> >>  >>  +  $nodename:
> >>  >>  +    pattern: "^timer@.*"
> >>  >
> >>  > '.*' is redundant.
> >>  >
> >>  >>  +
> >>  >>  +  "#address-cells":
> >>  >>  +    const: 1
> >>  >>  +
> >>  >>  +  "#size-cells":
> >>  >>  +    const: 1
> >>  >>  +
> >>  >>  +  "#clock-cells":
> >>  >>  +    const: 1
> >>  >>  +
> >>  >>  +  "#interrupt-cells":
> >>  >>  +    const: 1
> >>  >>  +
> >>  >>  +  interrupt-controller: true
> >>  >>  +
> >>  >>  +  ranges: true
> >>  >>  +
> >>  >>  +  compatible:
> >>  >>  +    items:
> >>  >>  +      - enum:
> >>  >>  +        - ingenic,jz4740-tcu
> >>  >>  +        - ingenic,jz4725b-tcu
> >>  >>  +        - ingenic,jz4770-tcu
> >>  >>  +        - ingenic,x1000-tcu
> >>  >>  +      - const: simple-mfd
> >>  >
> >>  > This breaks several examples in dt_binding_check because this
> >> schema
> >>  > will be applied to every 'simple-mfd' node. You need a custom
> >> select
> >>  > entry that excludes 'simple-mfd'. There should be several
> >> examples in
> >>  > tree to copy.
> >>
> >>  Why would it be applied to all 'single-mfd' nodes?
> >
> > single-mfd?
>
> simple-mfd* of course, sorry.
>
> > The way the tool decides to apply a schema or not is my matching on
> > any of the compatible strings (or node name if no compatible
> > specified). You can override this with 'select'.
> >
> >>  Doesn't what I wrote
> >>  specify that it needs one of ingenic,*-tcu _and_ simple-mfd?
> >
> > Yes, but matching is on any of them. You need to add:
>
> Alright, will do. Is there a reason why it's done that way? It sounds a
> bit counter-intuitive.

I'm not sure how we could do it differently. We need some way to
express 'apply this schema to a node if ...'. If we just matched on
'compatible' schema as is, then we'd get silence if there's any error
in 'compatible'. That can still happen, but it's reduced in the cases
where there's more than one compatible string as only 1 has to be
right. It's also very common that valid combinations of compatible
strings are not documented clearly or followed correctly, so we can
catch these errors. I wasn't a fan of having to list out compatible
strings twice, so the tool does it for you in the common case.

Rob

Patch
diff mbox series

diff --git a/Documentation/devicetree/bindings/timer/ingenic,tcu.txt b/Documentation/devicetree/bindings/timer/ingenic,tcu.txt
deleted file mode 100644
index 91f704951845..000000000000
--- a/Documentation/devicetree/bindings/timer/ingenic,tcu.txt
+++ /dev/null
@@ -1,138 +0,0 @@ 
-Ingenic JZ47xx SoCs Timer/Counter Unit devicetree bindings
-==========================================================
-
-For a description of the TCU hardware and drivers, have a look at
-Documentation/mips/ingenic-tcu.rst.
-
-Required properties:
-
-- compatible: Must be one of:
-  * ingenic,jz4740-tcu
-  * ingenic,jz4725b-tcu
-  * ingenic,jz4770-tcu
-  * ingenic,x1000-tcu
-  followed by "simple-mfd".
-- reg: Should be the offset/length value corresponding to the TCU registers
-- clocks: List of phandle & clock specifiers for clocks external to the TCU.
-  The "pclk", "rtc" and "ext" clocks should be provided. The "tcu" clock
-  should be provided if the SoC has it.
-- clock-names: List of name strings for the external clocks.
-- #clock-cells: Should be <1>;
-  Clock consumers specify this argument to identify a clock. The valid values
-  may be found in <dt-bindings/clock/ingenic,tcu.h>.
-- interrupt-controller : Identifies the node as an interrupt controller
-- #interrupt-cells : Specifies the number of cells needed to encode an
-  interrupt source. The value should be 1.
-- interrupts : Specifies the interrupt the controller is connected to.
-
-Optional properties:
-
-- ingenic,pwm-channels-mask: Bitmask of TCU channels reserved for PWM use.
-  Default value is 0xfc.
-
-
-Children nodes
-==========================================================
-
-
-PWM node:
----------
-
-Required properties:
-
-- compatible: Must be one of:
-  * ingenic,jz4740-pwm
-  * ingenic,jz4725b-pwm
-- #pwm-cells: Should be 3. See ../pwm/pwm.yaml for a description of the cell
-  format.
-- clocks: List of phandle & clock specifiers for the TCU clocks.
-- clock-names: List of name strings for the TCU clocks.
-
-
-Watchdog node:
---------------
-
-Required properties:
-
-- compatible: Must be "ingenic,jz4740-watchdog"
-- clocks: phandle to the WDT clock
-- clock-names: should be "wdt"
-
-
-OS Timer node:
----------
-
-Required properties:
-
-- compatible: Must be one of:
-  * ingenic,jz4725b-ost
-  * ingenic,jz4770-ost
-- clocks: phandle to the OST clock
-- clock-names: should be "ost"
-- interrupts : Specifies the interrupt the OST is connected to.
-
-
-Example
-==========================================================
-
-#include <dt-bindings/clock/jz4770-cgu.h>
-#include <dt-bindings/clock/ingenic,tcu.h>
-
-/ {
-	tcu: timer@10002000 {
-		compatible = "ingenic,jz4770-tcu", "simple-mfd";
-		reg = <0x10002000 0x1000>;
-		#address-cells = <1>;
-		#size-cells = <1>;
-		ranges = <0x0 0x10002000 0x1000>;
-
-		#clock-cells = <1>;
-
-		clocks = <&cgu JZ4770_CLK_RTC
-			  &cgu JZ4770_CLK_EXT
-			  &cgu JZ4770_CLK_PCLK>;
-		clock-names = "rtc", "ext", "pclk";
-
-		interrupt-controller;
-		#interrupt-cells = <1>;
-
-		interrupt-parent = <&intc>;
-		interrupts = <27 26 25>;
-
-		watchdog: watchdog@0 {
-			compatible = "ingenic,jz4740-watchdog";
-			reg = <0x0 0xc>;
-
-			clocks = <&tcu TCU_CLK_WDT>;
-			clock-names = "wdt";
-		};
-
-		pwm: pwm@40 {
-			compatible = "ingenic,jz4740-pwm";
-			reg = <0x40 0x80>;
-
-			#pwm-cells = <3>;
-
-			clocks = <&tcu TCU_CLK_TIMER0
-				  &tcu TCU_CLK_TIMER1
-				  &tcu TCU_CLK_TIMER2
-				  &tcu TCU_CLK_TIMER3
-				  &tcu TCU_CLK_TIMER4
-				  &tcu TCU_CLK_TIMER5
-				  &tcu TCU_CLK_TIMER6
-				  &tcu TCU_CLK_TIMER7>;
-			clock-names = "timer0", "timer1", "timer2", "timer3",
-				      "timer4", "timer5", "timer6", "timer7";
-		};
-
-		ost: timer@e0 {
-			compatible = "ingenic,jz4770-ost";
-			reg = <0xe0 0x20>;
-
-			clocks = <&tcu TCU_CLK_OST>;
-			clock-names = "ost";
-
-			interrupts = <15>;
-		};
-	};
-};
diff --git a/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
new file mode 100644
index 000000000000..1ded3b4762bb
--- /dev/null
+++ b/Documentation/devicetree/bindings/timer/ingenic,tcu.yaml
@@ -0,0 +1,235 @@ 
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/timer/ingenic,tcu.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Ingenic SoCs Timer/Counter Unit (TCU) devicetree bindings
+
+description: |
+  For a description of the TCU hardware and drivers, have a look at
+  Documentation/mips/ingenic-tcu.rst.
+
+maintainers:
+  - Paul Cercueil <paul@crapouillou.net>
+
+properties:
+  $nodename:
+    pattern: "^timer@.*"
+
+  "#address-cells":
+    const: 1
+
+  "#size-cells":
+    const: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#interrupt-cells":
+    const: 1
+
+  interrupt-controller: true
+
+  ranges: true
+
+  compatible:
+    items:
+      - enum:
+        - ingenic,jz4740-tcu
+        - ingenic,jz4725b-tcu
+        - ingenic,jz4770-tcu
+        - ingenic,x1000-tcu
+      - const: simple-mfd
+
+  reg:
+    maxItems: 1
+
+  clocks:
+    items:
+      - description: RTC clock
+      - description: EXT clock
+      - description: PCLK clock
+      - description: TCU clock
+    minItems: 3
+
+  clock-names:
+    items:
+      - const: rtc
+      - const: ext
+      - const: pclk
+      - const: tcu
+    minItems: 3
+
+  interrupts:
+    minItems: 1
+    maxItems: 3
+
+  ingenic,pwm-channels-mask:
+    description: Bitmask of TCU channels reserved for PWM use.
+    allOf:
+      - $ref: /schemas/types.yaml#/definitions/uint32
+      - minimum: 0x00
+      - maximum: 0xff
+      - default: 0xfc
+
+patternProperties:
+  "^watchdog@[a-f0-9]+$":
+    type: object
+    allOf: [ $ref: ../watchdog/watchdog.yaml# ]
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+            - ingenic,jz4740-watchdog
+            - ingenic,jz4780-watchdog
+          - items:
+            - const: ingenic,jz4770-watchdog
+            - const: ingenic,jz4740-watchdog
+
+      clocks:
+        maxItems: 1
+
+      clock-names:
+        const: wdt
+
+    required:
+      - compatible
+      - clocks
+      - clock-names
+
+  "^pwm@[a-f0-9]+$":
+    type: object
+    allOf: [ $ref: ../pwm/pwm.yaml# ]
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+            - ingenic,jz4740-pwm
+          - items:
+            - enum:
+              - ingenic,jz4770-pwm
+              - ingenic,jz4780-pwm
+            - const: ingenic,jz4740-pwm
+
+      clocks:
+        minItems: 6
+        maxItems: 8
+
+      clock-names:
+        items:
+          - const: timer0
+          - const: timer1
+          - const: timer2
+          - const: timer3
+          - const: timer4
+          - const: timer5
+          - const: timer6
+          - const: timer7
+        minItems: 6
+
+    required:
+      - compatible
+      - clocks
+      - clock-names
+
+  "^timer@[a-f0-9]+":
+    type: object
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+            - ingenic,jz4725b-ost
+            - ingenic,jz4770-ost
+          - items:
+            - const: ingenic,jz4780-ost
+            - const: ingenic,jz4770-ost
+
+
+      clocks:
+        maxItems: 1
+
+      clock-names:
+        const: ost
+
+      interrupts:
+        maxItems: 1
+
+    required:
+      - compatible
+      - clocks
+      - clock-names
+      - interrupts
+
+required:
+  - "#clock-cells"
+  - "#interrupt-cells"
+  - interrupt-controller
+  - compatible
+  - reg
+  - clocks
+  - clock-names
+  - interrupts
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/jz4770-cgu.h>
+    #include <dt-bindings/clock/ingenic,tcu.h>
+    tcu: timer@10002000 {
+      compatible = "ingenic,jz4770-tcu", "simple-mfd";
+      reg = <0x10002000 0x1000>;
+      #address-cells = <1>;
+      #size-cells = <1>;
+      ranges = <0x0 0x10002000 0x1000>;
+
+      #clock-cells = <1>;
+
+      clocks = <&cgu JZ4770_CLK_RTC>,
+               <&cgu JZ4770_CLK_EXT>,
+               <&cgu JZ4770_CLK_PCLK>;
+      clock-names = "rtc", "ext", "pclk";
+
+      interrupt-controller;
+      #interrupt-cells = <1>;
+
+      interrupt-parent = <&intc>;
+      interrupts = <27 26 25>;
+
+      watchdog: watchdog@0 {
+        compatible = "ingenic,jz4770-watchdog", "ingenic,jz4740-watchdog";
+        reg = <0x0 0xc>;
+
+        clocks = <&tcu TCU_CLK_WDT>;
+        clock-names = "wdt";
+      };
+
+      pwm: pwm@40 {
+        compatible = "ingenic,jz4770-pwm", "ingenic,jz4740-pwm";
+        reg = <0x40 0x80>;
+
+        #pwm-cells = <3>;
+
+        clocks = <&tcu TCU_CLK_TIMER0>,
+                 <&tcu TCU_CLK_TIMER1>,
+                 <&tcu TCU_CLK_TIMER2>,
+                 <&tcu TCU_CLK_TIMER3>,
+                 <&tcu TCU_CLK_TIMER4>,
+                 <&tcu TCU_CLK_TIMER5>,
+                 <&tcu TCU_CLK_TIMER6>,
+                 <&tcu TCU_CLK_TIMER7>;
+        clock-names = "timer0", "timer1", "timer2", "timer3",
+                "timer4", "timer5", "timer6", "timer7";
+      };
+
+      ost: timer@e0 {
+        compatible = "ingenic,jz4770-ost";
+        reg = <0xe0 0x20>;
+
+        clocks = <&tcu TCU_CLK_OST>;
+        clock-names = "ost";
+
+        interrupts = <15>;
+      };
+    };