Re: [PATCH v4 2/3] dt-bindings: display: ti: Add schema for AM625 OLDI Transmitter

Rob Herring
2024-12-04T14:09:45Z

On Sun, Nov 24, 2024 at 08:06:48PM +0530, Aradhya Bhatia wrote:
> From: Aradhya Bhatia <a-bhatia1@ti.com>
>
> The OLDI transmitters (TXes) do not have registers of their own, and are
> dependent on the source video-ports (VPs) from the DSS to provide
> configuration data. This hardware doesn't directly sit on the internal
> bus of the SoC, but does so via the DSS. Hence, the OLDI TXes are
> supposed to be child nodes under the DSS, and not independent devices.
>
> Two of the OLDI TXes can function in tandem to output dual-link OLDI
> output, or cloned single-link outputs. In these cases, one OLDI will be
> the primary OLDI, and the other one, a companion. The following diagram
> represents such a configuration.
>
> +-----+-----+ +-------+
> | | | | |
> | | VP1 +----+--->+ OLDI0 | (Primary - may need companion)
> | | | | | |
> | DSS +-----+ | +-------+
> | | | |
> | | VP2 | | +-------+
> | | | | | |
> +-----+-----+ +--->+ OLDI1 | (Companion OLDI)
> | |
> +-------+
>
> The DSS in AM625 SoC has a configuration like the one above. The AM625
> DSS VP1 (port@0) can connect and control 2 OLDI TXes, to use them in
> dual-link or cloned single-link OLDI modes. It is only the VP1 that can
> connect to either OLDI TXes for the AM625 DSS, and not the VP2.
>
> Alternatively, on some future TI SoCs, along with the above
> configuration, the OLDI TX can _also_ connect to separate video sources,
> making them work entirely independent of each other. In this case,
> neither of the OLDIs are "companion" or "secondary" OLDIs, and nor do
> they require one. They both are independent and primary OLDIs. The
> following diagram represents such a configuration.
>
> +-----+-----+ +-------+
> | | | | |
> | | VP1 +--+----------->+ OLDI0 | (Primary - may need companion)
> | | | | | |
> | +-----+ | +-------+
> | | | |
> | | VP2 | |
> | | | |
> | DSS +-----+ | +---+ +-------+
> | | | +-->+ M | | |
> | | VP3 +----->+ U +--->+ OLDI1 | (Companion or Primary)
> | | | | X | | |
> | +-----+ +---+ +-------+
> | | |
> | | VP4 |
> | | |
> +-----+-----+
>
> Note that depending on the mux configuration, the OLDIs can either be
> working together in tandem - sourced by VP1, OR, they could be working
> independently sourced by VP1 and VP3 respectively.
> The idea is to support all the configurations with this OLDI TX schema.
>
> The OLDI functionality is further supported by a system-control module,
> which contains a few registers to control OLDI IO power and other
> electrical characteristics of the IO lanes.
>
> Add devicetree binding schema for the OLDI TXes to support various
> configurations, and extend their support to the AM625 DSS.
>
> Signed-off-by: Aradhya Bhatia <a-bhatia1@ti.com>
> Signed-off-by: Aradhya Bhatia <aradhya.bhatia@linux.dev>
> ---
> .../bindings/display/ti/ti,am625-oldi.yaml | 119 ++++++++++++++
> .../bindings/display/ti/ti,am65x-dss.yaml | 153 ++++++++++++++++++
> MAINTAINERS | 1 +
> 3 files changed, 273 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/display/ti/ti,am625-oldi.yaml
>
> diff --git a/Documentation/devicetree/bindings/display/ti/ti,am625-oldi.yaml b/Documentation/devicetree/bindings/display/ti/ti,am625-oldi.yaml
> new file mode 100644
> index 000000000000..51b24db04e89
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/ti/ti,am625-oldi.yaml
> @@ -0,0 +1,119 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/display/ti/ti,am625-oldi.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Texas Instruments AM625 OLDI Transmitter
> +
> +maintainers:
> + - Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> + - Aradhya Bhatia <aradhya.bhatia@linux.dev>
> +
> +description:
> + The AM625 TI Keystone OpenLDI transmitter (OLDI TX) supports serialized RGB
> + pixel data transmission between host and flat panel display over LVDS (Low
> + Voltage Differential Sampling) interface. The OLDI TX consists of 7-to-1 data
> + serializers, and 4-data and 1-clock LVDS outputs. It supports the LVDS output
> + formats "jeida-18", "jeida-24" and "vesa-18", and can accept 24-bit RGB or
> + padded and un-padded 18-bit RGB bus formats as input.
> +
> +properties:
> + reg:
> + maxItems: 1
> +
> + clocks:
> + maxItems: 1
> + description: serial clock input for the OLDI transmitters
> +
> + clock-names:
> + const: serial
> +
> + ti,companion-oldi:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description:
> + phandle to companion OLDI transmitter. This property is mandatory for the
> + primarty OLDI TX if the OLDI TXes are expected to work either in dual-lvds
> + mode or in clone mode. This property should point to the secondary OLDI
> + TX.
> +
> + ti,secondary-oldi:
> + type: boolean
> + description:
> + Boolean property to mark the OLDI transmitter as the secondary one, when the
> + OLDI hardware is expected to run as a companion HW, in cases of dual-lvds
> + mode or clone mode. The primary OLDI hardware is responsible for all the
> + hardware configuration.
> +
> + ti,oldi-io-ctrl:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description:
> + phandle to syscon device node mapping OLDI IO_CTRL registers found in the
> + control MMR region. These registers are required to toggle the I/O lane
> + power, and control its electrical characteristics.
> +
> + ports:
> + $ref: /schemas/graph.yaml#/properties/ports
> +
> + properties:
> + port@0:
> + $ref: /schemas/graph.yaml#/properties/port
> + description: Parallel RGB input port
> +
> + port@1:
> + $ref: /schemas/graph.yaml#/properties/port
> + description: LVDS output port
> +
> + required:
> + - port@0
> + - port@1
> +
> +allOf:
> + - if:
> + required:
> + - ti,secondary-oldi
> + then:
> + properties:
> + ti,companion-oldi: false
> +
> +required:
> + - reg
> + - clocks
> + - clock-names
> + - ti,oldi-io-ctrl
> + - ports
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/soc/ti,sci_pm_domain.h>
> +
> + oldi-transmitters {

Drop the example here. It's incomplete without the parent and it is
never validated with this schema because there is no way to select it.

> + #address-cells = <1>;
> + #size-cells = <0>;
> + oldi: oldi@0 {
> + reg = <0>;
> + clocks = <&k3_clks 186 0>;
> + clock-names = "serial";
> + ti,oldi-io-ctrl = <&dss_oldi_io_ctrl>;
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + port@0 {
> + reg = <0>;
> + oldi_in: endpoint {
> + remote-endpoint = <&dpi_out>;
> + };
> + };
> + port@1 {
> + reg = <1>;
> + oldi_out: endpoint {
> + remote-endpoint = <&panel_in>;
> + };
> + };
> + };
> + };
> + };
> +
> +...
> diff --git a/Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml b/Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml
> index 399d68986326..eb6a65f9970d 100644
> --- a/Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml
> +++ b/Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml
> @@ -91,6 +91,24 @@ properties:
> For AM625 DSS, the internal DPI output port node from video
> port 1.
> For AM62A7 DSS, the port is tied off inside the SoC.
> + properties:
> + endpoint@0:
> + $ref: /schemas/graph.yaml#/properties/endpoint
> + description:
> + For AM625 DSS, VP Connection to OLDI0.
> + For AM65X DSS, OLDI output from the SoC.
> +
> + endpoint@1:
> + $ref: /schemas/graph.yaml#/properties/endpoint
> + description:
> + For AM625 DSS, VP Connection to OLDI1.
> +
> + anyOf:
> + - required:
> + - endpoint
> + - required:
> + - endpoint@0
> + - endpoint@1
>
> port@1:
> $ref: /schemas/graph.yaml#/properties/port
> @@ -112,6 +130,26 @@ properties:
> Input memory (from main memory to dispc) bandwidth limit in
> bytes per second
>
> + oldi-transmitters:
> + description:
> + Child node under the DSS, to describe all the OLDI transmitters connected
> + to the DSS videoports.
> + type: object
> + additionalProperties: false

blank line here.

> + properties:
> + "#address-cells":
> + const: 1
> +
> + "#size-cells":
> + const: 0
> +
> + patternProperties:
> + '^oldi@[0-1]$':
> + type: object
> + $ref: ti,am625-oldi.yaml#
> + unevaluatedProperties: false
> + description: OLDI transmitters connected to the DSS VPs

You can drop 'type' and 'unevaluatedProperties' here.

> +
> allOf:
> - if:
> properties:
> @@ -123,6 +161,19 @@ allOf:
> ports:
> properties:
> port@0: false
> + oldi-transmitters: false
> +
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: ti,am65x-dss
> + then:
> + properties:
> + oldi-transmitters: false
> + port@0:

You missed a level with 'ports'.

> + properties:
> + endpoint@1: false
>
> required:
> - compatible
> @@ -171,3 +222,105 @@ examples:
> };
> };
> };
> +
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/interrupt-controller/irq.h>
> + #include <dt-bindings/soc/ti,sci_pm_domain.h>
> +
> + bus {
> + #address-cells = <2>;
> + #size-cells = <2>;
> + dss1: dss@30200000 {
> + compatible = "ti,am625-dss";
> + reg = <0x00 0x30200000 0x00 0x1000>, /* common */
> + <0x00 0x30202000 0x00 0x1000>, /* vidl1 */
> + <0x00 0x30206000 0x00 0x1000>, /* vid */
> + <0x00 0x30207000 0x00 0x1000>, /* ovr1 */
> + <0x00 0x30208000 0x00 0x1000>, /* ovr2 */
> + <0x00 0x3020a000 0x00 0x1000>, /* vp1 */
> + <0x00 0x3020b000 0x00 0x1000>, /* vp2 */
> + <0x00 0x30201000 0x00 0x1000>; /* common1 */
> + reg-names = "common", "vidl1", "vid",
> + "ovr1", "ovr2", "vp1", "vp2", "common1";
> + power-domains = <&k3_pds 186 TI_SCI_PD_EXCLUSIVE>;
> + clocks = <&k3_clks 186 6>,
> + <&vp1_clock>,
> + <&k3_clks 186 2>;
> + clock-names = "fck", "vp1", "vp2";
> + interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
> + oldi-transmitters {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + oldi0: oldi@0 {
> + reg = <0>;
> + clocks = <&k3_clks 186 0>;
> + clock-names = "serial";
> + ti,companion-oldi = <&oldi1>;
> + ti,oldi-io-ctrl = <&dss_oldi_io_ctrl>;
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + port@0 {
> + reg = <0>;
> + oldi0_in: endpoint {
> + remote-endpoint = <&dpi0_out0>;
> + };
> + };
> + port@1 {
> + reg = <1>;
> + oldi0_out: endpoint {
> + remote-endpoint = <&panel_in0>;
> + };
> + };
> + };
> + };
> + oldi1: oldi@1 {
> + reg = <1>;
> + clocks = <&k3_clks 186 0>;
> + clock-names = "serial";
> + ti,secondary-oldi;
> + ti,oldi-io-ctrl = <&dss_oldi_io_ctrl>;
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + port@0 {
> + reg = <0>;
> + oldi1_in: endpoint {
> + remote-endpoint = <&dpi0_out1>;
> + };
> + };
> + port@1 {
> + reg = <1>;
> + oldi1_out: endpoint {
> + remote-endpoint = <&panel_in1>;
> + };
> + };
> + };
> + };
> + };
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + port@0 {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + reg = <0>;
> + dpi0_out0: endpoint@0 {
> + reg = <0>;
> + remote-endpoint = <&oldi0_in>;
> + };
> + dpi0_out1: endpoint@1 {
> + reg = <1>;
> + remote-endpoint = <&oldi1_in>;
> + };
> + };
> + port@1 {
> + reg = <1>;
> + dpi1_out: endpoint {
> + remote-endpoint = <&hdmi_bridge>;
> + };
> + };
> + };
> + };
> + };
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 93415153247b..d47a56c4d276 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -7817,6 +7817,7 @@ M: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> L: dri-devel@lists.freedesktop.org
> S: Maintained
> T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
> +F: Documentation/devicetree/bindings/display/ti/ti,am625-oldi.yaml
> F: Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml
> F: Documentation/devicetree/bindings/display/ti/ti,j721e-dss.yaml
> F: Documentation/devicetree/bindings/display/ti/ti,k2g-dss.yaml
> --
> 2.34.1
>