Re: [PATCH v8 06/34] dt-bindings: clock: tegra-car: Document new tegra-clocks sub-node

Thierry Reding
2021-08-18T16:40:06Z

[-- Attachment #1: Type: text/plain, Size: 5584 bytes --]

On Wed, Aug 18, 2021 at 06:05:11PM +0300, Dmitry Osipenko wrote:
> 18.08.2021 16:59, Thierry Reding пишет:
> > On Tue, Aug 17, 2021 at 04:27:26AM +0300, Dmitry Osipenko wrote:
> >> Document tegra-clocks sub-node which describes Tegra SoC clocks that
> >> require a higher voltage of the core power domain in order to operate
> >> properly on a higher clock rates. Each node contains a phandle to OPP
> >> table and power domain.
> >>
> >> The root PLLs and system clocks don't have any specific device dedicated
> >> to them, clock controller is in charge of managing power for them.
> >>
> >> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> >> ---
> >> .../bindings/clock/nvidia,tegra20-car.yaml | 51 +++++++++++++++++++
> >> 1 file changed, 51 insertions(+)
> >>
> >> diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml
> >> index 459d2a525393..7f5cd27e4ce0 100644
> >> --- a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml
> >> +++ b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml
> >> @@ -42,6 +42,48 @@ properties:
> >> "#reset-cells":
> >> const: 1
> >>
> >> + tegra-clocks:
> >> + description: child nodes are the output clocks from the CAR
> >> + type: object
> >> +
> >> + patternProperties:
> >> + "^[a-z]+[0-9]+$":
> >> + type: object
> >> + properties:
> >> + compatible:
> >> + allOf:
> >> + - items:
> >> + - enum:
> >> + - nvidia,tegra20-sclk
> >> + - nvidia,tegra30-sclk
> >> + - nvidia,tegra30-pllc
> >> + - nvidia,tegra30-plle
> >> + - nvidia,tegra30-pllm
> >> + - const: nvidia,tegra-clock
> >> +
> >> + operating-points-v2:
> >> + $ref: /schemas/types.yaml#/definitions/phandle
> >> + description:
> >> + Phandle to OPP table that contains frequencies, voltages and
> >> + opp-supported-hw property, which is a bitfield indicating
> >> + SoC process or speedo ID mask.
> >> +
> >> + clocks:
> >> + items:
> >> + - description: node's clock
> >> +
> >> + power-domains:
> >> + maxItems: 1
> >> + description: phandle to the core SoC power domain
> >> +
> >> + required:
> >> + - compatible
> >> + - operating-points-v2
> >> + - clocks
> >> + - power-domains
> >> +
> >> + additionalProperties: false
> >> +
> >> required:
> >> - compatible
> >> - reg
> >> @@ -59,6 +101,15 @@ examples:
> >> reg = <0x60006000 0x1000>;
> >> #clock-cells = <1>;
> >> #reset-cells = <1>;
> >> +
> >> + tegra-clocks {
> >> + sclk {
> >> + compatible = "nvidia,tegra20-sclk", "nvidia,tegra-clock";
> >> + operating-points-v2 = <&opp_table>;
> >> + clocks = <&tegra_car TEGRA20_CLK_SCLK>;
> >> + power-domains = <&domain>;
> >> + };
> >> + };
> >
> > I wonder if it'd be better to match on the name of the node rather than
> > add an artificial compatible string. We usually use the compatible
> > string to match a device, but here you're really trying to add
> > information about a resource provided by the CAR controller.
> >
> > We do similar things for example in PMIC bindings where the individual
> > regulators are represented in the device tree via nodes named after the
> > regulator.
> >
> > You could then also leave out the clocks property, which is weird as it
> > is because it's basically a self-reference. But you don't really need
> > the reference here in the first place because the CAR is already the
> > parent of SCLK.
>
> We don't have a platform device for CaR. I don't see how it's going to
> work. We need to create a platform device for each RPM-capable clock
> because that's how RPM works. The compatible string is required for
> instantiating OF-devices from a node, otherwise we will have to
> re-invent the OF core.

I think we do have a platform device for CAR. It's just not bound
against by the driver because these clock drivers are "special". But
from other parts of the series you're already trying to fix that, at
least partially.

But it doesn't seem right to create a platform device for each RPM-
capable clock. Why do they need to be devices? They aren't, so why
pretend? Is it that some API that we want to use here requires the
struct device?

> > Also, I don't think the tegra- prefix is necessary here. The parent node
> > is already identified as Tegra via the compatible string.
> >
> > In the case of CAR, I'd imagine something like:
> >
> > clocks {
> > sclk {
> > operating-points-v2 = <&opp_table>;
> > power-domains = <&domain>;
> > };
> > };
> >
> > Now you've only got the bare minimum in here that you actually add. All
> > the other data that you used to have is simply derived from the parent.
>
> 'clocks' is already a generic keyword in DT. It's probably not okay to
> redefine it.

"clocks" is not a generic keyword. It's the name of a property and given
that we're talking about the clock provider here, it doesn't need a
clocks property of its own, so it should be fine to use that for the
node.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]