Add DT bindings and simple usages for Loongson display controller
found in LS7A1000 bridges chip and LS2k1000 SoC.
Signed-off-by: Sui Jingfeng <[email protected]>
---
.../loongson/loongson,display-controller.yaml | 322 ++++++++++++++++++
1 file changed, 322 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
diff --git a/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml b/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
new file mode 100644
index 000000000000..b380602036f5
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
@@ -0,0 +1,322 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/loongson/loongson,display-controller.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Loongson LS7A1000/LS2K1000/LS2K0500 Display Controller Device Tree Bindings
+
+maintainers:
+ - Sui Jingfeng <[email protected]>
+
+description: |+
+
+ Loongson display controllers are simple which require scanout buffers
+ to be physically contiguous. LS2K1000/LS2K0500 is a SOC, only system
+ memory is available. LS7A1000/LS7A2000 is bridge chip which is equipped
+ with a dedicated video RAM which is 64MB or more, precise size can be
+ read from the PCI BAR 2 of the GPU device(0x0014:0x7A15) in the bridge
+ chip.
+
+ LSDC has two display pipes, each way has a DVO interface which provide
+ RGB888 signals, vertical & horizontal synchronisations, data enable and
+ the pixel clock. LSDC has two CRTC, each CRTC is able to scanout from
+ 1920x1080 resolution at 60Hz. Each CRTC has two FB address registers.
+
+ For LS7A1000, there are 4 dedicated GPIOs whose control register is
+ located at the DC register space. They are used to emulate two way i2c,
+ One for DVO0, another for DVO1.
+
+ LS2K1000 and LS2K0500 SoC grab i2c adapter from other module, either
+ general purpose GPIO emulated i2c or hardware i2c in the SoC.
+
+ LSDC's display pipeline have several components as below description,
+
+ The display controller in LS7A1000:
+ ___________________ _________
+ | -------| | |
+ | CRTC0 --> | DVO0 ----> Encoder0 ---> Connector0 ---> | Monitor |
+ | _ _ -------| ^ ^ |_________|
+ | | | | | -------| | |
+ | |_| |_| | i2c0 <--------+-------------+
+ | -------|
+ | DC IN LS7A1000 |
+ | _ _ -------|
+ | | | | | | i2c1 <--------+-------------+
+ | |_| |_| -------| | | _________
+ | -------| | | | |
+ | CRTC1 --> | DVO1 ----> Encoder1 ---> Connector1 ---> | Panel |
+ | -------| |_________|
+ |___________________|
+
+ Simple usage of LS7A1000 with LS3A4000 CPU:
+
+ +------+ +------------------------------------+
+ | DDR4 | | +-------------------+ |
+ +------+ | | PCIe Root complex | LS7A1000 |
+ || MC0 | +--++---------++----+ |
+ +----------+ HT 3.0 | || || |
+ | LS3A4000 |<-------->| +---++---+ +--++--+ +---------+ +------+
+ | CPU |<-------->| | GC1000 | | LSDC |<--->| DDR3 MC |<->| VRAM |
+ +----------+ | +--------+ +-+--+-+ +---------+ +------+
+ || MC1 +---------------|--|-----------------+
+ +------+ | |
+ | DDR4 | +-------+ DVO0 | | DVO1 +------+
+ +------+ VGA <--|ADV7125|<--------+ +-------->|TFP410|--> DVI/HDMI
+ +-------+ +------+
+
+ The display controller in LS2K1000/LS2K0500:
+ ___________________ _________
+ | -------| | |
+ | CRTC0 --> | DVO0 ----> Encoder0 ---> Connector0 ---> | Monitor |
+ | _ _ -------| ^ ^ |_________|
+ | | | | | | | |
+ | |_| |_| | +------+ |
+ | <---->| i2c0 |<---------+
+ | DC IN LS2K1000 | +------+
+ | _ _ | +------+
+ | | | | | <---->| i2c1 |----------+
+ | |_| |_| | +------+ | _________
+ | -------| | | | |
+ | CRTC1 --> | DVO1 ----> Encoder1 ---> Connector1 ---> | Panel |
+ | -------| |_________|
+ |___________________|
+
+properties:
+ $nodename:
+ pattern: "^display-controller@[0-9a-f],[0-9a-f]$"
+
+ compatible:
+ oneOf:
+ - items:
+ - enum:
+ - loongson,ls7a1000-dc
+ - loongson,ls2k1000-dc
+ - loongson,ls2k0500-dc
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ '#address-cells':
+ const: 1
+
+ '#size-cells':
+ const: 0
+
+ i2c@6:
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ description: |
+ Built-in GPIO emulate i2c exported for display bridge configuration,
+ monitor detection and edid read back etc, for ls7a1000 only.
+
+ properties:
+ $nodename:
+ const: i2c
+
+ compatible:
+ const: loongson,gpio-i2c
+
+ reg:
+ minItems: 1
+ description: address offset and range
+
+ loongson,nr:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Indicates the I2C bus number this DT node represents.
+
+ loongson,sda:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: gpio pin used for the sda signal
+
+ loongson,scl:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: gpio pin used for the scl signal
+
+ loongson,udelay:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: delay between GPIO operations, unit is us.
+
+ loongson,timeout:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: timeout to get data, unit is ms.
+
+ required:
+ - compatible
+ - loongson,sda
+ - loongson,scl
+ - loongson,nr
+
+ i2c@7:
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ description: |
+ Built-in GPIO emulate i2c exported for display bridge configuration,
+ monitor detection and edid read back etc, for ls7a1000 only.
+ properties:
+ $nodename:
+ const: i2c
+
+ compatible:
+ const: loongson,gpio-i2c
+
+ reg:
+ minItems: 1
+ description: address offset and range
+
+ loongson,nr:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Indicates the I2C bus number this DT node represents.
+
+ loongson,sda:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: gpio pin used for the sda signal
+
+ loongson,scl:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: gpio pin used for the scl signal
+
+ loongson,udelay:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: delay between GPIO operations, unit is us.
+
+ loongson,timeout:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: timeout to get data, unit is ms.
+
+ required:
+ - compatible
+ - loongson,sda
+ - loongson,scl
+ - loongson,nr
+
+ ports:
+ $ref: /schemas/graph.yaml#/properties/ports
+
+ properties:
+ port@0:
+ $ref: /schemas/graph.yaml#/properties/port
+ description: output port node connected with DPI panels or external encoders, with only one endpoint.
+
+ port@1:
+ $ref: /schemas/graph.yaml#/properties/port
+ description: output port node connected with DPI panels or external encoders, with only one endpoint.
+
+ required:
+ - port@0
+ - port@1
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - ports
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ bus {
+
+ #address-cells = <3>;
+ #size-cells = <2>;
+ #interrupt-cells = <2>;
+
+ display-controller@6,1 {
+ compatible = "loongson,ls7a1000-dc";
+ reg = <0x3100 0x0 0x0 0x0 0x0>;
+ interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ bus {
+
+ #address-cells = <3>;
+ #size-cells = <2>;
+ #interrupt-cells = <2>;
+
+ display-controller@6,1 {
+ compatible = "loongson,ls7a1000-dc";
+ reg = <0x3100 0x0 0x0 0x0 0x0>;
+ interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ i2c@6 {
+ compatible = "loongson,gpio-i2c";
+ reg = <0x00001650 0x00000020>;
+ loongson,nr = <6>;
+ loongson,sda = <0>;
+ loongson,scl = <1>;
+ loongson,udelay = <5>;
+ loongson,timeout = <2200>;
+ };
+
+ i2c@7 {
+ compatible = "loongson,gpio-i2c";
+ reg = <0x00001650 0x00000020>;
+ loongson,nr = <7>;
+ loongson,sda = <2>;
+ loongson,scl = <3>;
+ loongson,udelay = <5>;
+ loongson,timeout = <2200>;
+ };
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ port@0 {
+ reg = <0>;
+ endpoint {
+ remote-endpoint = <&vga_encoder_in>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ endpoint {
+ remote-endpoint = <&dvi_encoder_in>;
+ };
+ };
+ };
+ };
+ };
+
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ bus {
+
+ #address-cells = <3>;
+ #size-cells = <2>;
+ #interrupt-cells = <2>;
+
+ display-controller@6,0 {
+ compatible = "loongson,ls2k1000-dc";
+ reg = <0x3100 0x0 0x0 0x0 0x0>;
+ interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ port@0 {
+ reg = <0>;
+ endpoint {
+ remote-endpoint = <&panel_in>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ endpoint {
+ remote-endpoint = <&hdmi_encoder_in>;
+ };
+ };
+ };
+ };
+ };
+...
--
2.25.1
On 2022/3/27 22:02, Rob Herring wrote:
> On Sun, 27 Mar 2022 19:38:43 +0800, Sui Jingfeng wrote:
>> Add DT bindings and simple usages for Loongson display controller
>> found in LS7A1000 bridges chip and LS2k1000 SoC.
>>
>> Signed-off-by: Sui Jingfeng <[email protected]>
>> ---
>> .../loongson/loongson,display-controller.yaml | 322 ++++++++++++++++++
>> 1 file changed, 322 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
>>
> My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
> on your patch (DT_CHECKER_FLAGS is new in v5.13):
>
> yamllint warnings/errors:
>
> dtschema/dtc warnings/errors:
> /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.example.dt.yaml: display-controller@6,1: 'ports' is a required property
> From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
>
> doc reference errors (make refcheckdocs):
>
> See https://patchwork.ozlabs.org/patch/1609879
>
> This check can fail if there are any dependencies. The base for a patch
> series is generally the most recent rc1.
>
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
>
> pip3 install dtschema --upgrade
>
> Please check and re-submit.
>
It is my fault, remove the ports from the required will fix this,
I run make dt_binding_check before made it optional.
I will resend the patch.
On Sun, 27 Mar 2022 19:38:43 +0800, Sui Jingfeng wrote:
> Add DT bindings and simple usages for Loongson display controller
> found in LS7A1000 bridges chip and LS2k1000 SoC.
>
> Signed-off-by: Sui Jingfeng <[email protected]>
> ---
> .../loongson/loongson,display-controller.yaml | 322 ++++++++++++++++++
> 1 file changed, 322 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
>
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.example.dt.yaml: display-controller@6,1: 'ports' is a required property
From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/display/loongson/loongson,display-controller.yaml
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/patch/1609879
This check can fail if there are any dependencies. The base for a patch
series is generally the most recent rc1.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit.
On 2022/3/27 20:54, Jiaxun Yang wrote:
>
>
> 在 2022/3/27 12:38, Sui Jingfeng 写道:
>> Add DT bindings and simple usages for Loongson display controller
>> found in LS7A1000 bridges chip and LS2k1000 SoC.
>>
>> Signed-off-by: Sui Jingfeng <[email protected]>
> [...]
>> +
>> + - |
>> + #include <dt-bindings/interrupt-controller/irq.h>
>> + bus {
>> +
>> + #address-cells = <3>;
>> + #size-cells = <2>;
>> + #interrupt-cells = <2>;
>> +
>> + display-controller@6,1 {
>> + compatible = "loongson,ls7a1000-dc";
>> + reg = <0x3100 0x0 0x0 0x0 0x0>;
>> + interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
>> +
>> + #address-cells = <1>;
>> + #size-cells = <0>;
>> +
>> + i2c@6 {
>> + compatible = "loongson,gpio-i2c";
>> + reg = <0x00001650 0x00000020>;
> Hi Jingfeng,
>
> Thanks for your patch.
>
> Just curious about what is this "reg" for?
Hi, Jiaxun
Thanks for you take valuable time to review my patch.
Without it make dt_binding_check generate warnings:
Documentation/devicetree/bindings/display/loongson/loongson,display-controller.example.dts:65.23-73.19:
Warning (unit_address_vs_reg):
/example-1/bus/display-controller@6,1/i2c@6: node has a unit name, but
no reg or ranges property
reg are the control register offset and size of the dedicate GPIO, they
are not get used by the driver currently,
put in there just for silence the warning .
>> + loongson,nr = <6>;
> Why nr start from 6?
Bus number greater than 6 is safe because ls7a1000 bridge have 6 hardware I2C controller integrated. but
the driver for it is not upstream yet. To avoid potential conflict with the bus number of the hardware I2C driver.
In the future, if someone contribute the hardware I2C driver to upstream,
you don't need change it. Let me give you an example to show what it will be:
aliases {
i2c0 = &i2c0;
i2c1 = &i2c1;
i2c2 = &i2c2;
i2c3 = &i2c3;
i2c4 = &i2c4;
i2c5 = &i2c5;
i2c6 = &i2c6;
i2c7 = &i2c7;
};
i2c0: i2c@10090000 {
compatible = "loongson,ls-i2c";
reg = <0x10090000 0x8>;
interrupts = <73>;
interrupt-parent = <&platic>;
#address-cells = <1>;
#size-cells = <0>;
};
i2c1: i2c@10090100 {
compatible = "loongson,ls-i2c";
reg = <0x10090100 0x8>;
interrupts = <73>;
interrupt-parent = <&platic>;
#address-cells = <1>;
#size-cells = <0>;
};
i2c2: i2c@10090200 {
compatible = "loongson,ls-i2c";
reg = <0x10090200 0x8>;
interrupts = <73>;
interrupt-parent = <&platic>;
#address-cells = <1>;
#size-cells = <0>;
};
i2c3: i2c@10090300 {
compatible = "loongson,ls-i2c";
reg = <0x10090300 0x8>;
interrupts = <73>;
interrupt-parent = <&platic>;
#address-cells = <1>;
#size-cells = <0>;
};
i2c4: i2c@10090400 {
compatible = "loongson,ls-i2c";
reg = <0x10090400 0x8>;
interrupts = <73>;
interrupt-parent = <&platic>;
#address-cells = <1>;
#size-cells = <0>;
};
i2c5: i2c@10090500 {
compatible = "loongson,ls-i2c";
reg = <0x10090500 0x8>;
interrupts = <73>;
interrupt-parent = <&platic>;
#address-cells = <1>;
#size-cells = <0>;
};
> The approach you are handling I2C seems to be wired..
>
It is not wired, you can change it to 0 or 1 it you like currently,
you can even remove loongson,nr = <6> and loongson,nr = <7>,
then the i2c core driver will automatically allocate one for you.
It is very flexible actually.
> Actually you can reference how network subsystem is handling
> MDIO controller built-in into Ethernet controller [1] in this case. It is
> basically the same problem.
>
> [1]:
> https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/net/snps,dwmac.yaml
>
> Thanks.
> - Jiaxun
>
>> + loongson,sda = <0>;
>> + loongson,scl = <1>;
>> + loongson,udelay = <5>;
>> + loongson,timeout = <2200>;
>> + };
>> +
>> + i2c@7 {
>> + compatible = "loongson,gpio-i2c";
>> + reg = <0x00001650 0x00000020>;
>> + loongson,nr = <7>;
>> + loongson,sda = <2>;
>> + loongson,scl = <3>;
>> + loongson,udelay = <5>;
>> + loongson,timeout = <2200>;
>> + };
>> +
>> + ports {
>> + #address-cells = <1>;
>> + #size-cells = <0>;
>> + port@0 {
>> + reg = <0>;
>> + endpoint {
>> + remote-endpoint = <&vga_encoder_in>;
>> + };
>> + };
>> +
>> + port@1 {
>> + reg = <1>;
>> + endpoint {
>> + remote-endpoint = <&dvi_encoder_in>;
>> + };
>> + };
>> + };
>> + };
>> + };
>> +
>> + - |
>> + #include <dt-bindings/interrupt-controller/irq.h>
>> + bus {
>> +
>> + #address-cells = <3>;
>> + #size-cells = <2>;
>> + #interrupt-cells = <2>;
>> +
>> + display-controller@6,0 {
>> + compatible = "loongson,ls2k1000-dc";
>> + reg = <0x3100 0x0 0x0 0x0 0x0>;
>> + interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
>> +
>> + ports {
>> + #address-cells = <1>;
>> + #size-cells = <0>;
>> + port@0 {
>> + reg = <0>;
>> + endpoint {
>> + remote-endpoint = <&panel_in>;
>> + };
>> + };
>> +
>> + port@1 {
>> + reg = <1>;
>> + endpoint {
>> + remote-endpoint = <&hdmi_encoder_in>;
>> + };
>> + };
>> + };
>> + };
>> + };
>> +...
>
在 2022/3/27 12:38, Sui Jingfeng 写道:
> Add DT bindings and simple usages for Loongson display controller
> found in LS7A1000 bridges chip and LS2k1000 SoC.
>
> Signed-off-by: Sui Jingfeng <[email protected]>
[...]
> +
> + - |
> + #include <dt-bindings/interrupt-controller/irq.h>
> + bus {
> +
> + #address-cells = <3>;
> + #size-cells = <2>;
> + #interrupt-cells = <2>;
> +
> + display-controller@6,1 {
> + compatible = "loongson,ls7a1000-dc";
> + reg = <0x3100 0x0 0x0 0x0 0x0>;
> + interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
> +
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + i2c@6 {
> + compatible = "loongson,gpio-i2c";
> + reg = <0x00001650 0x00000020>;
Hi Jingfeng,
Thanks for your patch.
Just curious about what is this "reg" for?
> + loongson,nr = <6>;
Why nr start from 6?
The approach you are handling I2C seems to be wired..
Actually you can reference how network subsystem is handling
MDIO controller built-in into Ethernet controller [1] in this case. It is
basically the same problem.
[1]:
https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/net/snps,dwmac.yaml
Thanks.
- Jiaxun
> + loongson,sda = <0>;
> + loongson,scl = <1>;
> + loongson,udelay = <5>;
> + loongson,timeout = <2200>;
> + };
> +
> + i2c@7 {
> + compatible = "loongson,gpio-i2c";
> + reg = <0x00001650 0x00000020>;
> + loongson,nr = <7>;
> + loongson,sda = <2>;
> + loongson,scl = <3>;
> + loongson,udelay = <5>;
> + loongson,timeout = <2200>;
> + };
> +
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + port@0 {
> + reg = <0>;
> + endpoint {
> + remote-endpoint = <&vga_encoder_in>;
> + };
> + };
> +
> + port@1 {
> + reg = <1>;
> + endpoint {
> + remote-endpoint = <&dvi_encoder_in>;
> + };
> + };
> + };
> + };
> + };
> +
> + - |
> + #include <dt-bindings/interrupt-controller/irq.h>
> + bus {
> +
> + #address-cells = <3>;
> + #size-cells = <2>;
> + #interrupt-cells = <2>;
> +
> + display-controller@6,0 {
> + compatible = "loongson,ls2k1000-dc";
> + reg = <0x3100 0x0 0x0 0x0 0x0>;
> + interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
> +
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + port@0 {
> + reg = <0>;
> + endpoint {
> + remote-endpoint = <&panel_in>;
> + };
> + };
> +
> + port@1 {
> + reg = <1>;
> + endpoint {
> + remote-endpoint = <&hdmi_encoder_in>;
> + };
> + };
> + };
> + };
> + };
> +...