diff mbox series

[v3,1/4] dt-bindings: Add cros-ec Type C port driver

Message ID 20200220003102.204480-2-pmalani@chromium.org
State Changes Requested, archived
Headers show
Series platform/chrome: Add Type C connector class driver | expand

Checks

Context Check Description
robh/checkpatch success
robh/dt-meta-schema success

Commit Message

Prashant Malani Feb. 20, 2020, 12:30 a.m. UTC
Some Chrome OS devices with Embedded Controllers (EC) can read and
modify Type C port state.

Add an entry in the DT Bindings documentation that lists out the logical
device and describes the relevant port information, to be used by the
corresponding driver.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
---

Changes in v3:
- Fixed license identifier.
- Renamed "port" to "connector".
- Made "connector" be a "usb-c-connector" compatible property.
- Updated port-number description to explain min and max values,
  and removed $ref which was causing dt_binding_check errors.
- Fixed power-role, data-role and try-power-role details to make
  dt_binding_check pass.
- Fixed example to include parent EC SPI DT Node.

Changes in v2:
- No changes. Patch first introduced in v2 of series.

 .../bindings/chrome/google,cros-ec-typec.yaml | 86 +++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml

Comments

Stephen Boyd Feb. 27, 2020, 8:41 a.m. UTC | #1
Don't know what happened but my MUA can't seem to thread these patches.
I wonder if something got messed up during send?

Quoting Prashant Malani (2020-02-19 16:30:55)
> Some Chrome OS devices with Embedded Controllers (EC) can read and
> modify Type C port state.
> 
> Add an entry in the DT Bindings documentation that lists out the logical
> device and describes the relevant port information, to be used by the
> corresponding driver.
> 
> Signed-off-by: Prashant Malani <pmalani@chromium.org>
> ---
> 
> Changes in v3:
> - Fixed license identifier.
> - Renamed "port" to "connector".
> - Made "connector" be a "usb-c-connector" compatible property.
> - Updated port-number description to explain min and max values,
>   and removed $ref which was causing dt_binding_check errors.
> - Fixed power-role, data-role and try-power-role details to make
>   dt_binding_check pass.
> - Fixed example to include parent EC SPI DT Node.
> 
> Changes in v2:
> - No changes. Patch first introduced in v2 of series.
> 
>  .../bindings/chrome/google,cros-ec-typec.yaml | 86 +++++++++++++++++++
>  1 file changed, 86 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> 
> diff --git a/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> new file mode 100644
> index 00000000000000..97fd982612f120
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> @@ -0,0 +1,86 @@
> +# SPDX-License-Identifier: GPL-2.0-only

Can it be GPL or BSD 2 clause?

> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/chrome/google,cros-ec-typec.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Google Chrome OS EC(Embedded Controller) Type C port driver.
> +
> +maintainers:
> +  - Benson Leung <bleung@chromium.org>
> +  - Prashant Malani <pmalani@chromium.org>
> +
> +description:
> +  Chrome OS devices have an Embedded Controller(EC) which has access to
> +  Type C port state. This node is intended to allow the host to read and
> +  control the Type C ports. The node for this device should be under a
> +  cros-ec node like google,cros-ec-spi.
> +
> +properties:
> +  compatible:
> +    const: google,cros-ec-typec
> +
> +  connector:
> +    description: A node that represents a physical Type C connector port
> +      on the device.
> +    type: object
> +    properties:
> +      compatible:
> +        const: usb-c-connector
> +      port-number:
> +        description: The number used by the Chrome OS EC to identify
> +          this type C port. Valid values are 0 - (EC_USB_PD_MAX_PORTS - 1).

What is EC_USB_PD_MAX_PORTS? Can this be done through a reg property
instead?

> +      power-role:
> +        description: Determines the power role that the Type C port will
> +          adopt.
> +        maxItems: 1

I don't think this is necessary with enum below. schema can figure out
that max is 1.

> +        contains:
> +          enum:
> +            - sink
> +            - source
> +            - dual

Other bindings have newlines between properties. Can you please add them
to improve readability?

> +      data-role:
> +        description: Determines the data role that the Type C port will
> +          adopt.
> +        maxItems: 1
> +        contains:
> +          enum:
> +            - host
> +            - device
> +            - dual
> +      try-power-role:
> +        description: Determines the preferred power role of the Type C port.

How does this interact with power-role above? Is it different?

> +        maxItems: 1
> +        contains:
> +          enum:
> +            - sink
> +            - source
> +            - dual
> +
> +    required:
> +      - port-number
> +      - power-role
> +      - data-role
> +      - try-power-role
> +
> +required:
> +  - compatible
> +  - connector
> +
> +examples:
> +  - |+
> +    cros_ec: ec@0 {
> +      compatible = "google,cros-ec-spi";
> +
> +      typec {
> +        compatible = "google,cros-ec-typec";
> +
> +        usb_con: connector {
> +          compatible = "usb-c-connector";
> +          port-number = <0>;
> +          power-role = "dual";
> +          data-role = "dual";
> +          try-power-role = "source";
> +        };

I thought that perhaps this would be done with the OF graph APIs instead
of being a child of the ec node. I don't see how the usb connector is
anything besides a child of the top-level root node because it's
typically on the board. We put board level components at the root.

Yes, the connector is intimately involved with the EC here, but I would
think that we would have an OF graph connection from the USB controller
on the SoC to the USB connector, traversing through anything that may be
in that path, such as a USB hub. Maybe the connector node itself can
point to the EC type-c controller with some property like

	connector {
		...
		type-c-manager = <&phandle_to_typec_manager>
	};

So in the end it would look like this (note that the ec doesn't have a sub-node
to make a driver probe):

	/ {
		connector@0 {
			compatible = "usb-c-connector";
			label = "left";
			reg = <0>;
			power-role = "dual";
			type-c-manager = <&cros_ec>;
			...

			ports { 
				#address-cells = <1>;
				#size-cells = <0>;

				port@0 {
					reg = <0>;
					left_ufp: endpoint {
						remote-endpoint = <&usb_controller0>;
					};
				};
			};
		};

		connector@1 {
			compatible = "usb-c-connector";
			label = "right";
			reg = <1>;
			power-role = "dual";
			type-c-manager = <&cros_ec>;
			...

			ports { 
				#address-cells = <1>;
				#size-cells = <0>;

				port@0 {
					reg = <0>;
					right_ufp: endpoint {
						remote-endpoint = <&usb_controller1>;
					};
				};
			};
		};

		soc@0 {
			#address-cells = <1>;
			#size-cells = <0>;

			spi@a000000 {
				compatible = "soc,spi-controller";
				reg = <0xa000000 0x1000>;
				cros_ec: ec@0 {
					compatible = "google,cros-ec-spi";
					reg = <0>;
				};
			};

			usb@ca00000 {
				compatible = "soc,dwc3-controller";
				reg = <0xca00000 0x1000>;

				ports {
					port@0 {
						reg = <0>;
						usb_controller0: endpoint {
							remote-endpoint = <&left_ufp>;
						};
					};
				};
			};

			usb@ea00000 {
				compatible = "soc,dwc3-controller";
				reg = <0xea00000 0x1000>;

				ports {
					port@0 {
						reg = <0>;
						usb_controller1: endpoint {
							remote-endpoint = <&right_ufp>;
						};
					};
				};
			};
		};
	};
Heikki Krogerus Feb. 27, 2020, 3:12 p.m. UTC | #2
Hi,

On Wed, Feb 19, 2020 at 04:30:55PM -0800, Prashant Malani wrote:
> Some Chrome OS devices with Embedded Controllers (EC) can read and
> modify Type C port state.
> 
> Add an entry in the DT Bindings documentation that lists out the logical
> device and describes the relevant port information, to be used by the
> corresponding driver.
> 
> Signed-off-by: Prashant Malani <pmalani@chromium.org>
> ---
> 
> Changes in v3:
> - Fixed license identifier.
> - Renamed "port" to "connector".
> - Made "connector" be a "usb-c-connector" compatible property.
> - Updated port-number description to explain min and max values,
>   and removed $ref which was causing dt_binding_check errors.
> - Fixed power-role, data-role and try-power-role details to make
>   dt_binding_check pass.
> - Fixed example to include parent EC SPI DT Node.
> 
> Changes in v2:
> - No changes. Patch first introduced in v2 of series.
> 
>  .../bindings/chrome/google,cros-ec-typec.yaml | 86 +++++++++++++++++++
>  1 file changed, 86 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> 
> diff --git a/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> new file mode 100644
> index 00000000000000..97fd982612f120
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> @@ -0,0 +1,86 @@
> +# SPDX-License-Identifier: GPL-2.0-only
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/chrome/google,cros-ec-typec.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Google Chrome OS EC(Embedded Controller) Type C port driver.
> +
> +maintainers:
> +  - Benson Leung <bleung@chromium.org>
> +  - Prashant Malani <pmalani@chromium.org>
> +
> +description:
> +  Chrome OS devices have an Embedded Controller(EC) which has access to
> +  Type C port state. This node is intended to allow the host to read and
> +  control the Type C ports. The node for this device should be under a
> +  cros-ec node like google,cros-ec-spi.
> +
> +properties:
> +  compatible:
> +    const: google,cros-ec-typec
> +
> +  connector:
> +    description: A node that represents a physical Type C connector port
> +      on the device.
> +    type: object
> +    properties:
> +      compatible:
> +        const: usb-c-connector
> +      port-number:
> +        description: The number used by the Chrome OS EC to identify
> +          this type C port. Valid values are 0 - (EC_USB_PD_MAX_PORTS - 1).
> +      power-role:
> +        description: Determines the power role that the Type C port will
> +          adopt.
> +        maxItems: 1
> +        contains:
> +          enum:
> +            - sink
> +            - source
> +            - dual
> +      data-role:
> +        description: Determines the data role that the Type C port will
> +          adopt.
> +        maxItems: 1
> +        contains:
> +          enum:
> +            - host
> +            - device
> +            - dual
> +      try-power-role:
> +        description: Determines the preferred power role of the Type C port.
> +        maxItems: 1
> +        contains:
> +          enum:
> +            - sink
> +            - source
> +            - dual
> +
> +    required:
> +      - port-number
> +      - power-role
> +      - data-role
> +      - try-power-role

Do you really need to redefine those?

I think you just need to mention that there is a required sub-node
"connector", and the place where it's described. So something
like this:

        Required sub-node:
        - connector : The "usb-c-connector". The bindings of the
          connector node are specified in:

                Documentation/devicetree/bindings/connector/usb-connector.txt


Then you just need to define the Chrome OS EC specific properties, so
I guess just the "port-number".


thanks,
Heikki Krogerus Feb. 27, 2020, 4:38 p.m. UTC | #3
Hi Stephen,

On Thu, Feb 27, 2020 at 12:41:13AM -0800, Stephen Boyd wrote:
> > +examples:
> > +  - |+
> > +    cros_ec: ec@0 {
> > +      compatible = "google,cros-ec-spi";
> > +
> > +      typec {
> > +        compatible = "google,cros-ec-typec";
> > +
> > +        usb_con: connector {
> > +          compatible = "usb-c-connector";
> > +          port-number = <0>;
> > +          power-role = "dual";
> > +          data-role = "dual";
> > +          try-power-role = "source";
> > +        };
> 
> I thought that perhaps this would be done with the OF graph APIs instead
> of being a child of the ec node. I don't see how the usb connector is
> anything besides a child of the top-level root node because it's
> typically on the board. We put board level components at the root.

No.

The above follows the usb-connector bindings, so it is correct:
Documentation/devicetree/bindings/connector/usb-connector.txt

So the connector is always a child of the "CC controller" with the USB
Type-C connectors, which in this case is the EC (from operating systems
perspective). The "CC controller" controls connectors, and it doesn't
actually do anything else. So placing the connectors under the
"connector controller" is also logically correct.

> Yes, the connector is intimately involved with the EC here, but I would
> think that we would have an OF graph connection from the USB controller
> on the SoC to the USB connector, traversing through anything that may be
> in that path, such as a USB hub. Maybe the connector node itself can
> point to the EC type-c controller with some property like

I think your idea here is that there should be only a single node for
each connector that is then linked with every component that it is
physically connected to (right?), but please note that that is not
enough. Every component attached to the connector must have its own
child node that represents the "port" that is physically connected to
the USB Type-C connector.

So for example, the USB controller nodes have child nodes for every
USB2 port as well as for every USB3 port. Similarly, the GPU
controllers have child node for every DisplayPort, etc. And I believe
that is already how it has been done in DT (and also in ACPI).

Those "port" nodes then just need to be linked with the "connector"
node. I think for that the idea was to use OF graph, but I'm really
sceptical about that. The problem is that with the USB Type-C
connectors we have to be able to identify the connections, i.e. which
endpoint is the USB2 port, which is the DisplayPort and so on, and OF
graph does not give any means to do that on its own. We will have to
rely on separate device properties in order to do the identification.
Currently it is not documented anywhere which property should be used
for that.

For ACPI we are going to propose that with every type of connection,
there should be a device property that returns a reference to the
appropriate port. That way there are no problems identifying the
connections. All we need to do is to define the property names for
every type of connection. "usb2-port" for the USB2 or high speed port,
"usb3-port" for USB3, etc.


thanks,
Stephen Boyd Feb. 27, 2020, 10:07 p.m. UTC | #4
Quoting Heikki Krogerus (2020-02-27 08:38:25)
> Hi Stephen,
> 
> On Thu, Feb 27, 2020 at 12:41:13AM -0800, Stephen Boyd wrote:
> > > +examples:
> > > +  - |+
> > > +    cros_ec: ec@0 {
> > > +      compatible = "google,cros-ec-spi";
> > > +
> > > +      typec {
> > > +        compatible = "google,cros-ec-typec";
> > > +
> > > +        usb_con: connector {
> > > +          compatible = "usb-c-connector";
> > > +          port-number = <0>;
> > > +          power-role = "dual";
> > > +          data-role = "dual";
> > > +          try-power-role = "source";
> > > +        };
> > 
> > I thought that perhaps this would be done with the OF graph APIs instead
> > of being a child of the ec node. I don't see how the usb connector is
> > anything besides a child of the top-level root node because it's
> > typically on the board. We put board level components at the root.
> 
> No.
> 
> The above follows the usb-connector bindings, so it is correct:
> Documentation/devicetree/bindings/connector/usb-connector.txt
> 
> So the connector is always a child of the "CC controller" with the USB
> Type-C connectors, which in this case is the EC (from operating systems
> perspective). The "CC controller" controls connectors, and it doesn't
> actually do anything else. So placing the connectors under the
> "connector controller" is also logically correct.

Ah ok I see. The graph binding is for describing the data path, not the
control path. Makes sense. 

> 
> > Yes, the connector is intimately involved with the EC here, but I would
> > think that we would have an OF graph connection from the USB controller
> > on the SoC to the USB connector, traversing through anything that may be
> > in that path, such as a USB hub. Maybe the connector node itself can
> > point to the EC type-c controller with some property like
> 
> I think your idea here is that there should be only a single node for
> each connector that is then linked with every component that it is
> physically connected to (right?), but please note that that is not
> enough. Every component attached to the connector must have its own
> child node that represents the "port" that is physically connected to
> the USB Type-C connector.
> 
> So for example, the USB controller nodes have child nodes for every
> USB2 port as well as for every USB3 port. Similarly, the GPU
> controllers have child node for every DisplayPort, etc. And I believe
> that is already how it has been done in DT (and also in ACPI).

It looks like perhaps you're conflating ports in USB spec with the OF
graph port? I want there to be one node per type-c connector that I can
physically see on the device. Is that not sufficient?

Are there any examples of the type-c connector in DT? I see some
NXP/Freescale boards and one Renesas board so far. Maybe there are other
discussions I can read up on?

> 
> Those "port" nodes then just need to be linked with the "connector"
> node. I think for that the idea was to use OF graph, but I'm really
> sceptical about that. The problem is that with the USB Type-C
> connectors we have to be able to identify the connections, i.e. which
> endpoint is the USB2 port, which is the DisplayPort and so on, and OF
> graph does not give any means to do that on its own. We will have to
> rely on separate device properties in order to do the identification.
> Currently it is not documented anywhere which property should be used
> for that.

I hope that this patch series can document this. Why can't that work by
having multiple OF graph ports for USB2 port, DisplayPort, USB3 port,
etc? The data path goes to the connector and we can attach more
information to each port node to describe what type of endpoint is there
like a DisplayPort capable type-c connector for example.

> 
> For ACPI we are going to propose that with every type of connection,
> there should be a device property that returns a reference to the
> appropriate port. That way there are no problems identifying the
> connections. All we need to do is to define the property names for
> every type of connection. "usb2-port" for the USB2 or high speed port,
> "usb3-port" for USB3, etc.
> 

That sounds like something we should figure out now for DT firmwares
too. For this particular binding, I don't know if we need to do anything
besides figure out how to represent multiple connectors underneath the
EC node. The other properties seem fairly generic and so I'd expect this
series to migrate
Documentation/devicetree/bindings/connector/usb-connector.txt to YAML
and refine the binding with anything necessary, like a 'reg' property to
allow multiple ports to exist underneath the "CC controller".
Rob Herring (Arm) Feb. 27, 2020, 11:15 p.m. UTC | #5
On Thu, Feb 27, 2020 at 05:12:16PM +0200, Heikki Krogerus wrote:
> Hi,
> 
> On Wed, Feb 19, 2020 at 04:30:55PM -0800, Prashant Malani wrote:
> > Some Chrome OS devices with Embedded Controllers (EC) can read and
> > modify Type C port state.
> > 
> > Add an entry in the DT Bindings documentation that lists out the logical
> > device and describes the relevant port information, to be used by the
> > corresponding driver.
> > 
> > Signed-off-by: Prashant Malani <pmalani@chromium.org>
> > ---
> > 
> > Changes in v3:
> > - Fixed license identifier.
> > - Renamed "port" to "connector".
> > - Made "connector" be a "usb-c-connector" compatible property.
> > - Updated port-number description to explain min and max values,
> >   and removed $ref which was causing dt_binding_check errors.
> > - Fixed power-role, data-role and try-power-role details to make
> >   dt_binding_check pass.
> > - Fixed example to include parent EC SPI DT Node.
> > 
> > Changes in v2:
> > - No changes. Patch first introduced in v2 of series.
> > 
> >  .../bindings/chrome/google,cros-ec-typec.yaml | 86 +++++++++++++++++++
> >  1 file changed, 86 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> > 
> > diff --git a/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> > new file mode 100644
> > index 00000000000000..97fd982612f120
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> > @@ -0,0 +1,86 @@
> > +# SPDX-License-Identifier: GPL-2.0-only
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/chrome/google,cros-ec-typec.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Google Chrome OS EC(Embedded Controller) Type C port driver.
> > +
> > +maintainers:
> > +  - Benson Leung <bleung@chromium.org>
> > +  - Prashant Malani <pmalani@chromium.org>
> > +
> > +description:
> > +  Chrome OS devices have an Embedded Controller(EC) which has access to
> > +  Type C port state. This node is intended to allow the host to read and
> > +  control the Type C ports. The node for this device should be under a
> > +  cros-ec node like google,cros-ec-spi.
> > +
> > +properties:
> > +  compatible:
> > +    const: google,cros-ec-typec
> > +
> > +  connector:
> > +    description: A node that represents a physical Type C connector port
> > +      on the device.
> > +    type: object
> > +    properties:
> > +      compatible:
> > +        const: usb-c-connector
> > +      port-number:
> > +        description: The number used by the Chrome OS EC to identify
> > +          this type C port. Valid values are 0 - (EC_USB_PD_MAX_PORTS - 1).
> > +      power-role:
> > +        description: Determines the power role that the Type C port will
> > +          adopt.
> > +        maxItems: 1
> > +        contains:
> > +          enum:
> > +            - sink
> > +            - source
> > +            - dual
> > +      data-role:
> > +        description: Determines the data role that the Type C port will
> > +          adopt.
> > +        maxItems: 1
> > +        contains:
> > +          enum:
> > +            - host
> > +            - device
> > +            - dual
> > +      try-power-role:
> > +        description: Determines the preferred power role of the Type C port.
> > +        maxItems: 1
> > +        contains:
> > +          enum:
> > +            - sink
> > +            - source
> > +            - dual
> > +
> > +    required:
> > +      - port-number
> > +      - power-role
> > +      - data-role
> > +      - try-power-role
> 
> Do you really need to redefine those?

No.

> 
> I think you just need to mention that there is a required sub-node
> "connector", and the place where it's described. So something
> like this:
> 
>         Required sub-node:
>         - connector : The "usb-c-connector". The bindings of the
>           connector node are specified in:
> 
>                 Documentation/devicetree/bindings/connector/usb-connector.txt

Ideally, we'd convert this to schema first and then here just have:

connector:
  $ref: /schemas/connector/usb-connector.yaml#

> 
> 
> Then you just need to define the Chrome OS EC specific properties, so
> I guess just the "port-number".

'reg' as Stephen suggested.

Rob
Heikki Krogerus Feb. 28, 2020, 4:24 p.m. UTC | #6
Hi Stephen,

On Thu, Feb 27, 2020 at 02:07:53PM -0800, Stephen Boyd wrote:
> Quoting Heikki Krogerus (2020-02-27 08:38:25)
> > Hi Stephen,
> > 
> > On Thu, Feb 27, 2020 at 12:41:13AM -0800, Stephen Boyd wrote:
> > > > +examples:
> > > > +  - |+
> > > > +    cros_ec: ec@0 {
> > > > +      compatible = "google,cros-ec-spi";
> > > > +
> > > > +      typec {
> > > > +        compatible = "google,cros-ec-typec";
> > > > +
> > > > +        usb_con: connector {
> > > > +          compatible = "usb-c-connector";
> > > > +          port-number = <0>;
> > > > +          power-role = "dual";
> > > > +          data-role = "dual";
> > > > +          try-power-role = "source";
> > > > +        };
> > > 
> > > I thought that perhaps this would be done with the OF graph APIs instead
> > > of being a child of the ec node. I don't see how the usb connector is
> > > anything besides a child of the top-level root node because it's
> > > typically on the board. We put board level components at the root.
> > 
> > No.
> > 
> > The above follows the usb-connector bindings, so it is correct:
> > Documentation/devicetree/bindings/connector/usb-connector.txt
> > 
> > So the connector is always a child of the "CC controller" with the USB
> > Type-C connectors, which in this case is the EC (from operating systems
> > perspective). The "CC controller" controls connectors, and it doesn't
> > actually do anything else. So placing the connectors under the
> > "connector controller" is also logically correct.
> 
> Ah ok I see. The graph binding is for describing the data path, not the
> control path. Makes sense. 
> 
> > 
> > > Yes, the connector is intimately involved with the EC here, but I would
> > > think that we would have an OF graph connection from the USB controller
> > > on the SoC to the USB connector, traversing through anything that may be
> > > in that path, such as a USB hub. Maybe the connector node itself can
> > > point to the EC type-c controller with some property like
> > 
> > I think your idea here is that there should be only a single node for
> > each connector that is then linked with every component that it is
> > physically connected to (right?), but please note that that is not
> > enough. Every component attached to the connector must have its own
> > child node that represents the "port" that is physically connected to
> > the USB Type-C connector.
> > 
> > So for example, the USB controller nodes have child nodes for every
> > USB2 port as well as for every USB3 port. Similarly, the GPU
> > controllers have child node for every DisplayPort, etc. And I believe
> > that is already how it has been done in DT (and also in ACPI).
> 
> It looks like perhaps you're conflating ports in USB spec with the OF
> graph port? I want there to be one node per type-c connector that I can
> physically see on the device. Is that not sufficient?

It is. We don't need more than one node that represents the physical
connector (and we should not have more than one node for that). And
actually, I was not mixing the OF graph ports and USB ports... I
think I should be talking about PHY instead of "port". That is
probable more clear.

My point is that every PHY that is connected to a Type-C connector
must still be represented with its own node in devicetree and ACPI. So
there still needs to be a node for the USB2 PHY, USB3 PHY, DisplayPort
PHY, etc., on top of the connector node. I got the picture that you
are proposing that we don't need those PHY nodes anymore since we have
the connector nodes, but maybe I misunderstood?

> Are there any examples of the type-c connector in DT? I see some
> NXP/Freescale boards and one Renesas board so far. Maybe there are other
> discussions I can read up on?
> 
> > 
> > Those "port" nodes then just need to be linked with the "connector"
> > node. I think for that the idea was to use OF graph, but I'm really
> > sceptical about that. The problem is that with the USB Type-C
> > connectors we have to be able to identify the connections, i.e. which
> > endpoint is the USB2 port, which is the DisplayPort and so on, and OF
> > graph does not give any means to do that on its own. We will have to
> > rely on separate device properties in order to do the identification.
> > Currently it is not documented anywhere which property should be used
> > for that.
> 
> I hope that this patch series can document this.

Well, we do need that to be documented, but do we really need to block
this series because of that? This driver does not depend on OF graph
yet.

> Why can't that work by having multiple OF graph ports for USB2 port,
> DisplayPort, USB3 port, etc? The data path goes to the connector and
> we can attach more information to each port node to describe what
> type of endpoint is there like a DisplayPort capable type-c
> connector for example.

The PHY nodes we must still always have. So the OF graph will always
describe the connection between the PHY and the connector, and the
connection between the PHY and the controller must be described
separately.

> > For ACPI we are going to propose that with every type of connection,
> > there should be a device property that returns a reference to the
> > appropriate port. That way there are no problems identifying the
> > connections. All we need to do is to define the property names for
> > every type of connection. "usb2-port" for the USB2 or high speed port,
> > "usb3-port" for USB3, etc.
> > 
> 
> That sounds like something we should figure out now for DT firmwares
> too. For this particular binding, I don't know if we need to do anything
> besides figure out how to represent multiple connectors underneath the
> EC node. The other properties seem fairly generic and so I'd expect this
> series to migrate
> Documentation/devicetree/bindings/connector/usb-connector.txt to YAML
> and refine the binding with anything necessary, like a 'reg' property to
> allow multiple ports to exist underneath the "CC controller".

OK.

thanks,
Stephen Boyd Feb. 29, 2020, 12:43 a.m. UTC | #7
Quoting Heikki Krogerus (2020-02-28 08:24:00)
> On Thu, Feb 27, 2020 at 02:07:53PM -0800, Stephen Boyd wrote:
> > Quoting Heikki Krogerus (2020-02-27 08:38:25)
> > > No.
> > > 
> > > The above follows the usb-connector bindings, so it is correct:
> > > Documentation/devicetree/bindings/connector/usb-connector.txt
> > > 
> > > So the connector is always a child of the "CC controller" with the USB
> > > Type-C connectors, which in this case is the EC (from operating systems
> > > perspective). The "CC controller" controls connectors, and it doesn't
> > > actually do anything else. So placing the connectors under the
> > > "connector controller" is also logically correct.
> > 
> > Ah ok I see. The graph binding is for describing the data path, not the
> > control path. Makes sense. 
> > 
> > > 
> > > > Yes, the connector is intimately involved with the EC here, but I would
> > > > think that we would have an OF graph connection from the USB controller
> > > > on the SoC to the USB connector, traversing through anything that may be
> > > > in that path, such as a USB hub. Maybe the connector node itself can
> > > > point to the EC type-c controller with some property like
> > > 
> > > I think your idea here is that there should be only a single node for
> > > each connector that is then linked with every component that it is
> > > physically connected to (right?), but please note that that is not
> > > enough. Every component attached to the connector must have its own
> > > child node that represents the "port" that is physically connected to
> > > the USB Type-C connector.
> > > 
> > > So for example, the USB controller nodes have child nodes for every
> > > USB2 port as well as for every USB3 port. Similarly, the GPU
> > > controllers have child node for every DisplayPort, etc. And I believe
> > > that is already how it has been done in DT (and also in ACPI).
> > 
> > It looks like perhaps you're conflating ports in USB spec with the OF
> > graph port? I want there to be one node per type-c connector that I can
> > physically see on the device. Is that not sufficient?
> 
> It is. We don't need more than one node that represents the physical
> connector (and we should not have more than one node for that). And
> actually, I was not mixing the OF graph ports and USB ports... I
> think I should be talking about PHY instead of "port". That is
> probable more clear.
> 
> My point is that every PHY that is connected to a Type-C connector
> must still be represented with its own node in devicetree and ACPI. So
> there still needs to be a node for the USB2 PHY, USB3 PHY, DisplayPort
> PHY, etc., on top of the connector node. I got the picture that you
> are proposing that we don't need those PHY nodes anymore since we have
> the connector nodes, but maybe I misunderstood?

Alright. Maybe a full example will help. See below. I think I understand
how it's supposed to look.

> 
> > Are there any examples of the type-c connector in DT? I see some
> > NXP/Freescale boards and one Renesas board so far. Maybe there are other
> > discussions I can read up on?
> > 
> > > 
> > > Those "port" nodes then just need to be linked with the "connector"
> > > node. I think for that the idea was to use OF graph, but I'm really
> > > sceptical about that. The problem is that with the USB Type-C
> > > connectors we have to be able to identify the connections, i.e. which
> > > endpoint is the USB2 port, which is the DisplayPort and so on, and OF
> > > graph does not give any means to do that on its own. We will have to
> > > rely on separate device properties in order to do the identification.
> > > Currently it is not documented anywhere which property should be used
> > > for that.
> > 
> > I hope that this patch series can document this.
> 
> Well, we do need that to be documented, but do we really need to block
> this series because of that? This driver does not depend on OF graph
> yet.

I don't know. I think this binding patch will go for another round so
maybe it's blocked in other ways?

> 
> > Why can't that work by having multiple OF graph ports for USB2 port,
> > DisplayPort, USB3 port, etc? The data path goes to the connector and
> > we can attach more information to each port node to describe what
> > type of endpoint is there like a DisplayPort capable type-c
> > connector for example.
> 
> The PHY nodes we must still always have. So the OF graph will always
> describe the connection between the PHY and the connector, and the
> connection between the PHY and the controller must be described
> separately.

Got it.

Here's the same example that hopefully shows how all this stuff can
work. I've added more nonsense to try and make it as complicated as
possible.

 / {

	// Expand single usb2/usb3 from SoC to 4 port hub
        usb-hub {
		compatible = "vendor,usb-hub-4-port";
		usb-vid = <0xaaad>;
		usb-pid = <0xffed>;
		vdd-supply = <&pp3300_usb>;
		reset-gpios = <&gpio_controller 50 GPIO_ACTIVE_LOW>;

		ports { 
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;
				usb2_hub0: endpoint0 {
					remote-endpoint = <&left_typec2>;
				};

				usb3_hub0: endpoint1 {
					remote-endpoint = <&left_typec3>;
				};
			};

			port@1 {
				reg = <1>;
				usb2_hub1: endpoint0 {
					remote-endpoint = <&right_typec2>;
				};

				usb3_hub1: endpoint1 {
					remote-endpoint = <&right_typec3>;
				};
			};

			port@2 {
				reg = <2>;
				usb2_hub2: endpoint0 {
					remote-endpoint = <&left_typea2>;
				};
				usb3_hub2: endpoint1 {
					remote-endpoint = <&left_typea3>;
				};
			};

			port@3 {
				reg = <3>;
				usb2_hub3: endpoint0 {
					// Not connected
				};
				usb3_hub3: endpoint1 {
					// Not connected
				};
			};

			port@4 {
				reg = <4>;
				usb2_hub_in: endpoint0 {
					remote-endpoint = <&usb2_phy_out>;
				};
				usb3_hub_in: endpoint1 {
					remote-endpoint = <&usb3_phy_out>;
				};
			};
		};
	};

	// Maybe this should go under EC node too if EC controls it
	// somehow?
	connector {
		compatible = "usb-a-connector";
		label = "type-A-left"

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				left_typea2: endpoint0 {
					remote-endpoint = <&usb2_hub2>;
				};
				left_typea3: endpoint1 {
					remote-endpoint = <&usb3_hub2>;
				};
			};

	};

	// Steer DP to either left or right type-c port
	mux {
		compatible = "vendor,dp-mux";
		// Inactive: port 0
		// Active: port 1
		mux-gpios = <&gpio_controller 23 GPIO_ACTIVE_HIGH>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				mux_dp_0: endpoint {
					remote-endpoint = <&right_typec_dp>;
				};
			};

			port@1 {
				reg = <1>;
				mux_dp_1: endpoint {
					remote-endpoint = <&left_typec_dp>;
				};
			};

			port@2 {
				reg = <1>;
				mux_dp_in: endpoint {
					remote-endpoint = <&dp_phy_out>;
				};
			};
		};
	};

        soc@0 {
                #address-cells = <1>;
                #size-cells = <0>;

                spi@a000000 {
                        compatible = "soc,spi-controller";
                        reg = <0xa000000 0x1000>;
                        cros_ec: ec@0 {
                                compatible = "google,cros-ec-spi";
                                reg = <0>;

                                connector@0 {
                                        compatible = "usb-c-connector";
                                        label = "type-c-left";
                                        reg = <0>;
                                        power-role = "dual";
                                        ...

                                        ports {  // Maybe ports is overkill with only one port?
                                                #address-cells = <1>;
                                                #size-cells = <0>;

                                                port@0 {
                                                        reg = <0>;
                                                        left_typec2: endpoint0 {
                                                                remote-endpoint = <&usb2_hub0>;
                                                        };

                                                        left_typec3: endpoint1 {
                                                                remote-endpoint = <&usb3_hub0>;
                                                        };

                                                        left_typec_dp: endpoint2 {
                                                                remote-endpoint = <&mux_dp_1>;
                                                        };
                                                };
                                        };
                                };

                                connector@1 {
                                        compatible = "usb-c-connector";
                                        label = "type-c-right";
                                        reg = <1>;
                                        power-role = "dual";
                                        ...

                                        ports { 
                                                #address-cells = <1>;
                                                #size-cells = <0>;

                                                port@0 {
                                                        reg = <0>;
                                                        right_typec2: endpoint0 {
                                                                remote-endpoint = <&usb2_hub1>;
                                                        };

                                                        right_typec3: endpoint1 {
                                                                remote-endpoint = <&usb3_hub1>;
                                                        };

                                                        right_typec_dp: endpoint2 {
                                                                remote-endpoint = <&mux_dp_0>;
                                                        };
                                                };
                                        };
                                };
                        };
                };

                usb2_phy: phy@da00000 {
                        compatible = "soc,usb2-phy";
                        reg = <0xda00000 0x1000>;
                        ports {
                                port@0 {
                                        reg = <0>;
                                        usb2_phy_out: endpoint {
                                                remote-endpoint = <&usb2_hub_in>;
                                        };
                                };
                        };
                };

                usb3_phy: phy@db00000 {
                        compatible = "soc,usb3-phy";
                        reg = <0xdb00000 0x1000>;
                        ports {
                                port@0 {
                                        reg = <0>;
                                        usb3_phy_out: endpoint {
                                                remote-endpoint = <&usb3_hub_in>;
                                        };
                                };
                        };
                };

                dp_phy: phy@dc00000 {
                        compatible = "soc,dp-phy";
                        reg = <0xdc00000 0x1000>;
                        ports {
                                port@0 {
                                        reg = <0>;
                                        dp_phy_out: endpoint {
                                                remote-endpoint = <&mux_dp_in>;
                                        };
                                };
                        };
                };

                usb@ea00000 {
                        compatible = "soc,dwc3-controller";
                        reg = <0xea00000 0x1000>;
                        phys = <&usb2_phy>, <&usb3_phy>;
                };

	        display-controller@eb00000 {
                        compatible = "soc,dwc3-controller";
                        reg = <0xeb00000 0x1000>;
                        phys = <&dp_phy>;
			// TODO: Connect audio to DP phy somehow
	        };

        };
 };
Prashant Malani March 4, 2020, 5:53 p.m. UTC | #8
Hi Rob,

Thanks for reviewing the patch. Please see inline.

On Thu, Feb 27, 2020 at 05:15:47PM -0600, Rob Herring wrote:
> On Thu, Feb 27, 2020 at 05:12:16PM +0200, Heikki Krogerus wrote:
> > Hi,
> > 
> > On Wed, Feb 19, 2020 at 04:30:55PM -0800, Prashant Malani wrote:
> > > Some Chrome OS devices with Embedded Controllers (EC) can read and
> > > modify Type C port state.
> > > 
> > > Add an entry in the DT Bindings documentation that lists out the logical
> > > device and describes the relevant port information, to be used by the
> > > corresponding driver.
> > > 
> > > Signed-off-by: Prashant Malani <pmalani@chromium.org>
> > > ---
> > > 
> > > Changes in v3:
> > > - Fixed license identifier.
> > > - Renamed "port" to "connector".
> > > - Made "connector" be a "usb-c-connector" compatible property.
> > > - Updated port-number description to explain min and max values,
> > >   and removed $ref which was causing dt_binding_check errors.
> > > - Fixed power-role, data-role and try-power-role details to make
> > >   dt_binding_check pass.
> > > - Fixed example to include parent EC SPI DT Node.
> > > 
> > > Changes in v2:
> > > - No changes. Patch first introduced in v2 of series.
> > > 
> > >  .../bindings/chrome/google,cros-ec-typec.yaml | 86 +++++++++++++++++++
> > >  1 file changed, 86 insertions(+)
> > >  create mode 100644 Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> > > 
> > > diff --git a/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> > > new file mode 100644
> > > index 00000000000000..97fd982612f120
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
> > > @@ -0,0 +1,86 @@
> > > +# SPDX-License-Identifier: GPL-2.0-only
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/chrome/google,cros-ec-typec.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Google Chrome OS EC(Embedded Controller) Type C port driver.
> > > +
> > > +maintainers:
> > > +  - Benson Leung <bleung@chromium.org>
> > > +  - Prashant Malani <pmalani@chromium.org>
> > > +
> > > +description:
> > > +  Chrome OS devices have an Embedded Controller(EC) which has access to
> > > +  Type C port state. This node is intended to allow the host to read and
> > > +  control the Type C ports. The node for this device should be under a
> > > +  cros-ec node like google,cros-ec-spi.
> > > +
> > > +properties:
> > > +  compatible:
> > > +    const: google,cros-ec-typec
> > > +
> > > +  connector:
> > > +    description: A node that represents a physical Type C connector port
> > > +      on the device.
> > > +    type: object
> > > +    properties:
> > > +      compatible:
> > > +        const: usb-c-connector
> > > +      port-number:
> > > +        description: The number used by the Chrome OS EC to identify
> > > +          this type C port. Valid values are 0 - (EC_USB_PD_MAX_PORTS - 1).
> > > +      power-role:
> > > +        description: Determines the power role that the Type C port will
> > > +          adopt.
> > > +        maxItems: 1
> > > +        contains:
> > > +          enum:
> > > +            - sink
> > > +            - source
> > > +            - dual
> > > +      data-role:
> > > +        description: Determines the data role that the Type C port will
> > > +          adopt.
> > > +        maxItems: 1
> > > +        contains:
> > > +          enum:
> > > +            - host
> > > +            - device
> > > +            - dual
> > > +      try-power-role:
> > > +        description: Determines the preferred power role of the Type C port.
> > > +        maxItems: 1
> > > +        contains:
> > > +          enum:
> > > +            - sink
> > > +            - source
> > > +            - dual
> > > +
> > > +    required:
> > > +      - port-number
> > > +      - power-role
> > > +      - data-role
> > > +      - try-power-role
> > 
> > Do you really need to redefine those?
> 
> No.
> 
> > 
> > I think you just need to mention that there is a required sub-node
> > "connector", and the place where it's described. So something
> > like this:
> > 
> >         Required sub-node:
> >         - connector : The "usb-c-connector". The bindings of the
> >           connector node are specified in:
> > 
> >                 Documentation/devicetree/bindings/connector/usb-connector.txt
> 
> Ideally, we'd convert this to schema first and then here just have:

I've converted this to schema here: https://lkml.org/lkml/2020/3/4/790
I've sent that patch separately from this series, since there is ongoing
discussion regarding the structure of the bindings (and use of OF graph
API) here.


> 
> connector:
>   $ref: /schemas/connector/usb-connector.yaml#
> 
> > 
> > 
> > Then you just need to define the Chrome OS EC specific properties, so
> > I guess just the "port-number".
> 
> 'reg' as Stephen suggested.
> 
> Rob
Heikki Krogerus March 5, 2020, 4:57 p.m. UTC | #9
On Fri, Feb 28, 2020 at 04:43:54PM -0800, Stephen Boyd wrote:
> Quoting Heikki Krogerus (2020-02-28 08:24:00)
> > On Thu, Feb 27, 2020 at 02:07:53PM -0800, Stephen Boyd wrote:
> > > Quoting Heikki Krogerus (2020-02-27 08:38:25)
> > > > No.
> > > > 
> > > > The above follows the usb-connector bindings, so it is correct:
> > > > Documentation/devicetree/bindings/connector/usb-connector.txt
> > > > 
> > > > So the connector is always a child of the "CC controller" with the USB
> > > > Type-C connectors, which in this case is the EC (from operating systems
> > > > perspective). The "CC controller" controls connectors, and it doesn't
> > > > actually do anything else. So placing the connectors under the
> > > > "connector controller" is also logically correct.
> > > 
> > > Ah ok I see. The graph binding is for describing the data path, not the
> > > control path. Makes sense. 
> > > 
> > > > 
> > > > > Yes, the connector is intimately involved with the EC here, but I would
> > > > > think that we would have an OF graph connection from the USB controller
> > > > > on the SoC to the USB connector, traversing through anything that may be
> > > > > in that path, such as a USB hub. Maybe the connector node itself can
> > > > > point to the EC type-c controller with some property like
> > > > 
> > > > I think your idea here is that there should be only a single node for
> > > > each connector that is then linked with every component that it is
> > > > physically connected to (right?), but please note that that is not
> > > > enough. Every component attached to the connector must have its own
> > > > child node that represents the "port" that is physically connected to
> > > > the USB Type-C connector.
> > > > 
> > > > So for example, the USB controller nodes have child nodes for every
> > > > USB2 port as well as for every USB3 port. Similarly, the GPU
> > > > controllers have child node for every DisplayPort, etc. And I believe
> > > > that is already how it has been done in DT (and also in ACPI).
> > > 
> > > It looks like perhaps you're conflating ports in USB spec with the OF
> > > graph port? I want there to be one node per type-c connector that I can
> > > physically see on the device. Is that not sufficient?
> > 
> > It is. We don't need more than one node that represents the physical
> > connector (and we should not have more than one node for that). And
> > actually, I was not mixing the OF graph ports and USB ports... I
> > think I should be talking about PHY instead of "port". That is
> > probable more clear.
> > 
> > My point is that every PHY that is connected to a Type-C connector
> > must still be represented with its own node in devicetree and ACPI. So
> > there still needs to be a node for the USB2 PHY, USB3 PHY, DisplayPort
> > PHY, etc., on top of the connector node. I got the picture that you
> > are proposing that we don't need those PHY nodes anymore since we have
> > the connector nodes, but maybe I misunderstood?
> 
> Alright. Maybe a full example will help. See below. I think I understand
> how it's supposed to look.
> 
> > 
> > > Are there any examples of the type-c connector in DT? I see some
> > > NXP/Freescale boards and one Renesas board so far. Maybe there are other
> > > discussions I can read up on?
> > > 
> > > > 
> > > > Those "port" nodes then just need to be linked with the "connector"
> > > > node. I think for that the idea was to use OF graph, but I'm really
> > > > sceptical about that. The problem is that with the USB Type-C
> > > > connectors we have to be able to identify the connections, i.e. which
> > > > endpoint is the USB2 port, which is the DisplayPort and so on, and OF
> > > > graph does not give any means to do that on its own. We will have to
> > > > rely on separate device properties in order to do the identification.
> > > > Currently it is not documented anywhere which property should be used
> > > > for that.
> > > 
> > > I hope that this patch series can document this.
> > 
> > Well, we do need that to be documented, but do we really need to block
> > this series because of that? This driver does not depend on OF graph
> > yet.
> 
> I don't know. I think this binding patch will go for another round so
> maybe it's blocked in other ways?

Let me put it this way: Since the code in this series does not utilize
the connection description, it actually should _not_ propose the
binding for it. The connection description is out side the scope of
the series.

The connection description is still far from being clear in any case.

> > > Why can't that work by having multiple OF graph ports for USB2 port,
> > > DisplayPort, USB3 port, etc? The data path goes to the connector and
> > > we can attach more information to each port node to describe what
> > > type of endpoint is there like a DisplayPort capable type-c
> > > connector for example.
> > 
> > The PHY nodes we must still always have. So the OF graph will always
> > describe the connection between the PHY and the connector, and the
> > connection between the PHY and the controller must be described
> > separately.
> 
> Got it.
> 
> Here's the same example that hopefully shows how all this stuff can
> work. I've added more nonsense to try and make it as complicated as
> possible.

You are not suggesting anything for the identification problem below,
so how do we know where does an endpoint actually go to in the code?

But could you actually please first explain what exactly is the
benefit from using OF graph with with the USB Type-C connector? Why
not just use good old phandles, i.e. device properties that return
reference to a node? With those the device property name by itself is
the identifier.

>  / {
> 
> 	// Expand single usb2/usb3 from SoC to 4 port hub
>         usb-hub {
> 		compatible = "vendor,usb-hub-4-port";
> 		usb-vid = <0xaaad>;
> 		usb-pid = <0xffed>;
> 		vdd-supply = <&pp3300_usb>;
> 		reset-gpios = <&gpio_controller 50 GPIO_ACTIVE_LOW>;
> 
> 		ports { 
> 			#address-cells = <1>;
> 			#size-cells = <0>;
> 
> 			port@0 {
> 				reg = <0>;
> 				usb2_hub0: endpoint0 {
> 					remote-endpoint = <&left_typec2>;
> 				};
> 
> 				usb3_hub0: endpoint1 {
> 					remote-endpoint = <&left_typec3>;
> 				};
> 			};

Note. USB2 and USB3 are separate ports.

> 			port@1 {
> 				reg = <1>;
> 				usb2_hub1: endpoint0 {
> 					remote-endpoint = <&right_typec2>;
> 				};
> 
> 				usb3_hub1: endpoint1 {
> 					remote-endpoint = <&right_typec3>;
> 				};
> 			};
> 
> 			port@2 {
> 				reg = <2>;
> 				usb2_hub2: endpoint0 {
> 					remote-endpoint = <&left_typea2>;
> 				};
> 				usb3_hub2: endpoint1 {
> 					remote-endpoint = <&left_typea3>;
> 				};
> 			};
> 
> 			port@3 {
> 				reg = <3>;
> 				usb2_hub3: endpoint0 {
> 					// Not connected
> 				};
> 				usb3_hub3: endpoint1 {
> 					// Not connected
> 				};
> 			};
> 
> 			port@4 {
> 				reg = <4>;
> 				usb2_hub_in: endpoint0 {
> 					remote-endpoint = <&usb2_phy_out>;
> 				};
> 				usb3_hub_in: endpoint1 {
> 					remote-endpoint = <&usb3_phy_out>;
> 				};
> 			};
> 		};
> 	};

I don't still see any kind of independent device nodes for the USB
ports? Is the idea to only have the OF graph "ports" to represent the
physical USB ports?

It was clearly a mistake to talk about PHY, but in any case...

All the physical ports really need to have their own device nodes. If
we are to use OF graph, then a OF graph "port" is an interface to a
physical USB port, DisplayPort, Thunderbolt 3 port, whatever port,
that then has an endpoint to the connector. OF graph ports are
generic, and they can not represent physical points on the hardware,
while the USB, DP, whatever ports are specific and represent the
physical points on the hardware.

So basically, the OF graph describes the connection (the interconnect)
between the physical ports on the components and the connector, but it
does _not_ describe the connectors nor the physical ports themselves.

That is the only way I see this ever working. Otherwise you don't have
a clear place where to put for example device nodes describing
integrated USB devices, or even a clear way to describe port specific
properties.

> 	// Maybe this should go under EC node too if EC controls it
> 	// somehow?
> 	connector {
> 		compatible = "usb-a-connector";
> 		label = "type-A-left"
> 
> 		ports {
> 			#address-cells = <1>;
> 			#size-cells = <0>;
> 			port@0 {
> 				reg = <0>;
> 				left_typea2: endpoint0 {
> 					remote-endpoint = <&usb2_hub2>;
> 				};
> 				left_typea3: endpoint1 {
> 					remote-endpoint = <&usb3_hub2>;
> 				};
> 			};
> 
> 	};

Is this actually necessary? You will never associate the connector in
this case with a real device entry (struct device), so why define the
node at all?

The node will give you the connector type, but since (AFAIK) that
information is not used anywhere in case of Type-A, why bother?

> 	// Steer DP to either left or right type-c port
> 	mux {
> 		compatible = "vendor,dp-mux";
> 		// Inactive: port 0
> 		// Active: port 1
> 		mux-gpios = <&gpio_controller 23 GPIO_ACTIVE_HIGH>;
> 
> 		ports {
> 			#address-cells = <1>;
> 			#size-cells = <0>;
> 			port@0 {
> 				reg = <0>;
> 				mux_dp_0: endpoint {
> 					remote-endpoint = <&right_typec_dp>;
> 				};
> 			};
> 
> 			port@1 {
> 				reg = <1>;
> 				mux_dp_1: endpoint {
> 					remote-endpoint = <&left_typec_dp>;
> 				};
> 			};
> 
> 			port@2 {
> 				reg = <1>;
> 				mux_dp_in: endpoint {
> 					remote-endpoint = <&dp_phy_out>;
> 				};
> 			};
> 		};
> 	};

If you use the mux between the DP and the connector, then you actually
should do the same with the USB ports as well. They will after all go
trough the same mux, right?

But using the mux in the middle even with the DP is problematic. We
will simply not always have a mux to control. Therefore our plan was
to always describe the connections directly from the connector to
whatever location they ultimately go to without the mux in the middle.
The mux will have its connection described in the connector node, but
in parallel.

I'll skip the rest if it's OK. I think at this point we really need an
explanation to the question: why do we have to use OF graph with the
USB Type-C connectors at all?

The identification problem has to be solved if it is to be used in any
case, but in the end, what value does OF graph add? Right now it looks
like something that just adds unnecessary complexity.

I'm sure that it is useful when it is possible to predict where the
endpoints actually go. For example with the cameras, every endpoint
an image processor has is most likely a sensor. But the USB Type-C
connectors can go anywhere (I guess even to the image processor).

With USB Type-C connector, the good old reference properties would
simply be superior.


thanks,
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
new file mode 100644
index 00000000000000..97fd982612f120
--- /dev/null
+++ b/Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
@@ -0,0 +1,86 @@ 
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/chrome/google,cros-ec-typec.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Google Chrome OS EC(Embedded Controller) Type C port driver.
+
+maintainers:
+  - Benson Leung <bleung@chromium.org>
+  - Prashant Malani <pmalani@chromium.org>
+
+description:
+  Chrome OS devices have an Embedded Controller(EC) which has access to
+  Type C port state. This node is intended to allow the host to read and
+  control the Type C ports. The node for this device should be under a
+  cros-ec node like google,cros-ec-spi.
+
+properties:
+  compatible:
+    const: google,cros-ec-typec
+
+  connector:
+    description: A node that represents a physical Type C connector port
+      on the device.
+    type: object
+    properties:
+      compatible:
+        const: usb-c-connector
+      port-number:
+        description: The number used by the Chrome OS EC to identify
+          this type C port. Valid values are 0 - (EC_USB_PD_MAX_PORTS - 1).
+      power-role:
+        description: Determines the power role that the Type C port will
+          adopt.
+        maxItems: 1
+        contains:
+          enum:
+            - sink
+            - source
+            - dual
+      data-role:
+        description: Determines the data role that the Type C port will
+          adopt.
+        maxItems: 1
+        contains:
+          enum:
+            - host
+            - device
+            - dual
+      try-power-role:
+        description: Determines the preferred power role of the Type C port.
+        maxItems: 1
+        contains:
+          enum:
+            - sink
+            - source
+            - dual
+
+    required:
+      - port-number
+      - power-role
+      - data-role
+      - try-power-role
+
+required:
+  - compatible
+  - connector
+
+examples:
+  - |+
+    cros_ec: ec@0 {
+      compatible = "google,cros-ec-spi";
+
+      typec {
+        compatible = "google,cros-ec-typec";
+
+        usb_con: connector {
+          compatible = "usb-c-connector";
+          port-number = <0>;
+          power-role = "dual";
+          data-role = "dual";
+          try-power-role = "source";
+        };
+      };
+    };