Thanks for reviews Stephen. Please find my comments according to new design.
On 2020-04-23 16:41, Stephen Boyd wrote:
Quoting Tanmay Shah (2020-03-31 17:30:27)
diff --git a/Documentation/devicetree/bindings/display/msm/dp-sc7180.yaml b/Documentation/devicetree/bindings/display/msm/dp-sc7180.yaml new file mode 100644 index 0000000..761a01d --- /dev/null +++ b/Documentation/devicetree/bindings/display/msm/dp-sc7180.yaml @@ -0,0 +1,325 @@ +# SPDX-License-Identifier: GPL-2.0-only +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/msm/dp-sc7180.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml#
+title: Description of Qualcomm Display Port dt properties.
This title should be something like
"Qualcomm Display Port Controller"
Changed title as suggested.
+maintainers:
- Chandan Uddaraju chandanu@codeaurora.org
- Vara Reddy varar@codeaurora.org
+description: |
- Device tree bindings for MSM Display Port which supports DP host
controllers
- that are compatible with VESA Display Port interface specification.
+properties:
- "msm_dp":
- type: object
- description: |
Node containing Display port register address bases, clocks,
power supplies.
- properties:
compatible:
items:
- const: qcom,dp-display
cell-index:
description: Specifies the controller instance.
reg:
description: Physical base address and length of controller's
registers.
reg-names:
description: |
Names for different register regions defined above. The
required region
is mentioned below.
items:
- const: dp_ahb
- const: dp_aux
- const: dp_link
- const: dp_p0
- const: dp_phy
- const: dp_ln_tx0
- const: dp_ln_tx1
- const: afprom_physical
- const: dp_pll
- const: usb3_dp_com
- const: hdcp_physical
interrupts:
description: The interrupt signal from the DP block.
clocks:
description: List of clock specifiers for clocks needed by the
device.
clock-names:
description: |
Device clock names in the same order as mentioned in clocks
property.
The required clocks are mentioned below.
items:
- const: core_aux_clk
- const: core_ref_clk_src
- const: core_usb_ref_clk
- const: core_usb_cfg_ahb_clk
- const: core_usb_pipe_clk
- const: ctrl_link_clk
- const: ctrl_link_iface_clk
- const: ctrl_pixel_clk
- const: crypto_clk
- const: pixel_clk_rcg
pll-node:
description: phandle to DP PLL node.
vdda-1p2-supply:
description: phandle to vdda 1.2V regulator node.
vdda-0p9-supply:
description: phandle to vdda 0.9V regulator node.
aux-cfg0-settings:
description: |
Specifies the DP AUX configuration 0 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg1-settings:
description: |
Specifies the DP AUX configuration 1 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg2-settings:
description: |
Specifies the DP AUX configuration 2 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg3-settings:
description: |
Specifies the DP AUX configuration 3 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg4-settings:
description: |
Specifies the DP AUX configuration 4 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg5-settings:
description: |
Specifies the DP AUX configuration 5 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg6-settings:
description: |
Specifies the DP AUX configuration 6 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg7-settings:
description: |
Specifies the DP AUX configuration 7 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg8-settings:
description: |
Specifies the DP AUX configuration 8 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
aux-cfg9-settings:
description: |
Specifies the DP AUX configuration 9 settings.
The first entry in this array corresponds to the register
offset
within DP AUX, while the remaining entries indicate the
programmable values.
max-pclk-frequency-khz:
description: Maximum displayport pixel clock supported for the
chipset.
data-lanes:
description: Maximum number of lanes that can be used for
Display port.
This should be an array of cells, not a single cell indicating the number of lanes.
Done. Now data-lanes is array of integers and size of array represents maximum number of lanes supported.
usbplug-cc-gpio:
maxItems: 1
description: Specifies the usbplug orientation gpio.
aux-en-gpio:
maxItems: 1
description: Specifies the aux-channel enable gpio.
aux-sel-gpio:
maxItems: 1
description: Specifies the sux-channel select gpio.
ports:
description: |
Contains display port controller endpoint subnode.
remote-endpoint: |
For port@0, set to phandle of the connected panel/bridge's
input endpoint. For port@1, set to the DPU interface
output.
Documentation/devicetree/bindings/graph.txt and
Documentation/devicetree/bindings/media/video-interfaces.txt.
- "dp_pll":
type: object
description: Node contains properties of Display port pll and
phy driver.
properties:
compatible:
items:
- const: qcom,dp-pll-10nm
cell-index:
description: Specifies the controller instance.
reg:
description: Physical base address and length of DP phy and
pll registers.
reg-names:
description: |
Names for different register regions defined above. The
required region
is mentioned below.
items:
- const: pll_base
- const: phy_base
- const: ln_tx0_base
- const: ln_tx1_base
- const: gdsc_base
clocks:
description: List of clock specifiers for clocks needed by
the device.
clock-names:
description: |
Device clock names in the same order as mentioned in
clocks property.
The required clocks are mentioned below.
items:
- const: iface
- const: ref
- const: cfg_ahb
- const: pipe
+examples:
- |
- #include <dt-bindings/interrupt-controller/arm-gic.h>
- #include <dt-bindings/clock/qcom,dispcc-sdm845.h>
- #include <dt-bindings/clock/qcom,gcc-sdm845.h>
- #include <dt-bindings/clock/qcom,rpmh.h>
- #include <dt-bindings/gpio/gpio.h>
- msm_dp: displayport-controller@ae90000{
cell-index = <0>;
compatible = "qcom,dp-display";
reg = <0 0xae90000 0 0x200>,
<0 0xae90200 0 0x200>,
<0 0xae90400 0 0xc00>,
<0 0xae91000 0 0x400>,
<0 0x88eaa00 0 0x200>,
<0 0x88ea200 0 0x200>,
<0 0x88ea600 0 0x200>,
<0 0x780000 0 0x6228>,
<0 0x088ea000 0 0x40>,
<0 0x88e8000 0 0x20>,
<0 0x0aee1000 0 0x034>;
This needs to be split up into at least two nodes. Any address above that starts in 88e needs to be put into a new node underneath the qmp phy. That is the "DP PHY" that lives in the power domain of the USB+DP combo phy. The qfprom_physical reg property should be removed from here and this binding should use the nvmem binding to reach into the qfprom to read out things (I guess there's some sort of HDCP key in the qfprom?).
After that I don't know why there are so many different reg properties for the DP controller here and why it needs to be split up. It looks like we should just map the register space from 0xae90000 up to 0xae91400 as one big register region and have the driver figure out how to operate on top of that. If it changes between SoC versions then we should have a more specific compatible that tells us what registers are in what place.
Done. Only one register region is specified here now in new bindings i.e. dp_controller starting from 0xae90000 upto 0xae91400. Removed rest of the module offsets. Driver will access each module using offset as required. Also PHY and USB3 DPCOM register bases are hard-coded in driver. Removed redundant qfprom and hdcp registers from bindings.
reg-names = "dp_ahb", "dp_aux", "dp_link",
"dp_p0", "dp_phy", "dp_ln_tx0", "dp_ln_tx1",
"qfprom_physical", "dp_pll",
"usb3_dp_com", "hdcp_physical";
interrupt-parent = <&display_subsystem>;
interrupts = <12 0>;
clocks = <&dispcc DISP_CC_MDSS_DP_AUX_CLK>,
<&rpmhcc RPMH_CXO_CLK>,
<&gcc GCC_USB3_PRIM_CLKREF_CLK>,
<&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>,
<&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>,
<&dispcc DISP_CC_MDSS_DP_LINK_CLK>,
<&dispcc DISP_CC_MDSS_DP_LINK_INTF_CLK>,
<&dispcc DISP_CC_MDSS_DP_PIXEL_CLK>,
<&dispcc DISP_CC_MDSS_DP_CRYPTO_CLK>,
<&dispcc DISP_CC_MDSS_DP_PIXEL_CLK_SRC>;
clock-names = "core_aux_clk", "core_ref_clk_src",
"core_usb_ref_clk", "core_usb_cfg_ahb_clk",
"core_usb_pipe_clk", "ctrl_link_clk",
"ctrl_link_iface_clk", "ctrl_pixel_clk",
"crypto_clk", "pixel_clk_rcg";
pll-node = <&dp_pll>;
If the DP PLL and DP controller need to be controlled from two software entities, it may make sense to just combine that DP PLL into the controller node and have this node be a clk provider. The pll-node property is pretty ugly and should be removed.
Done. Removed PLL as separate node and combined PLL as module of DP driver. Removed pll-node property as well.
vdda-1p2-supply = <&vreg_l3c_1p2>;
vdda-0p9-supply = <&vreg_l4a_0p8>;
aux-cfg0-settings = [20 00];
aux-cfg1-settings = [24 13 23 1d];
aux-cfg2-settings = [28 24];
aux-cfg3-settings = [2c 00];
aux-cfg4-settings = [30 0a];
aux-cfg5-settings = [34 26];
aux-cfg6-settings = [38 0a];
aux-cfg7-settings = [3c 03];
aux-cfg8-settings = [40 bb];
aux-cfg9-settings = [44 03];
This pile of properties is board specific configuration tuning or something? Can this go into the driver? Or can it be made more human readable? I seem to recall that the USB phy had similar properties and we made them into human readable properties when board integrators needed to change them. The easiest approach there is to put everything in the driver for now and then when something has to change for a board it gets punted out to the DT and that overrides the "default" settings that are used in the driver.
Made aux-cfg[0-9]-settingsproperties optional in bindings. Added default configurations in driver and using them if these properties are not mentioned in dts.
max-pclk-frequency-khz = <67500>;
What is this? Why isn't this in the driver?
Done. Removed this property from bindings and setting default value in driver.
data-lanes = <2>;
aux-en-gpio = <&msmgpio 55 1>;
aux-sel-gpio = <&msmgpio 110 1>;
usbplug-cc-gpio = <&msmgpio 90 1>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
dp_in: endpoint {
remote-endpoint = <&dpu_intf0_out>;
};
};
port@1 {
reg = <1>;
dp_out: endpoint {
};
};
};
- };
- dp_pll: dp-pll@088ea000 {
compatible = "qcom,dp-pll-10nm";
label = "DP PLL";
cell-index = <0>;
#clock-cells = <1>;
reg = <0 0x088ea000 0 0x200>,
<0 0x088eaa00 0 0x200>,
<0 0x088ea200 0 0x200>,
<0 0x088ea600 0 0x200>,
<0 0x08803000 0 0x8>;
reg-names = "pll_base", "phy_base", "ln_tx0_base",
"ln_tx1_base", "gdsc_base";
I guess the DP_PLL lives inside the qmp combo phy? That would match how the USB phy binding has been done there. This whole node should be combined with the DP phy node that will be placed as a child of the qmp phy wrapper (i.e. qcom,sc7180-qmp-usb3-phy compatible node). Might as well change that compatible from qcom,sc7180-qmp-usb3-phy to be qcom,sc7180-qmp-usb3-dp-phy too so that it can create the DP phy bits too.
Done. Removed whole dp_pll node from here and added PLL as module of DP driver. This required hard coding of few register bases in driver for now.
clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>,
<&gcc GCC_USB3_PRIM_CLKREF_CLK>,
<&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>,
<&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>;
clock-names = "iface_clk", "ref_clk",
"cfg_ahb_clk", "pipe_clk";
- };
diff --git a/Documentation/devicetree/bindings/display/msm/dpu.txt b/Documentation/devicetree/bindings/display/msm/dpu.txt index 551ae26..7e99e45 100644 --- a/Documentation/devicetree/bindings/display/msm/dpu.txt +++ b/Documentation/devicetree/bindings/display/msm/dpu.txt @@ -63,8 +63,9 @@ Required properties: Documentation/devicetree/bindings/graph.txt Documentation/devicetree/bindings/media/video-interfaces.txt
Port 0 -> DPU_INTF1 (DSI1)
Port 1 -> DPU_INTF2 (DSI2)
Port 0 -> DPU_INTF0 (DP)
Port 1 -> DPU_INTF1 (DSI1)
Port 2 -> DPU_INTF2 (DSI2)
DP should come last so that the port mapping doesn't have to change.
Done. Reverted Port mapping to old one i.e. Port0->DSI1, Port1->DSI2 and Added Port2->DP mapping.
Optional properties:
- assigned-clocks: list of clock specifiers for clocks needing rate
assignment