* [PATCH v3 00/15] Add eDP support for RK3588 @ 2024-12-19 8:05 Damon Ding 2024-12-19 8:05 ` [PATCH v3 01/15] drm/rockchip: analogix_dp: Use formalized struct definition for grf field Damon Ding ` (14 more replies) 0 siblings, 15 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding These patchs have been tested with a 1536x2048p60 eDP panel on RK3588S EVB1 board, and HDMI 1080P/4K display also has been verified on RK3588 EVB1 board. Patch 1~3 are the RK3588 eDP support of Rockchip analogix_dp driver. Patch 4~5 are the eDP mode support of samsung hdptx phy driver. Patch 6~7 are the RK3588 eDP support of Aanalogix DP driver. Add phy interfaces is to configure the HDMI/eDP TX Combo PHY. Patch 8~10 are to support to get panel from the DP AUX bus. Patch 11~12 are the renaming of hdptxphy node. It is not only used by HDMI display but also for the eDP display. Patch 13 is the addition of RK3588 eDP0 node. Patch 14 is to enable the eDP0 display on RK3588S EVB1 board. Patch 15 is to add the eDP1 related nodes for RK3588 SoC. Damon Ding (15): drm/rockchip: analogix_dp: Use formalized struct definition for grf field dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 drm/rockchip: analogix_dp: Add support for RK3588 phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP phy: phy-rockchip-samsung-hdptx: Add support for eDP mode drm/bridge: analogix_dp: Add support for RK3588 drm/bridge: analogix_dp: Add support for phy configuration. drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus drm/bridge: analogix_dp: Add support to get panel from the DP AUX bus dt-bindings: display: rockchip: analogix-dp: Add support to get panel from the DP AUX bus dt-bindings: display: rockchip: Fix label name of hdptxphy for RK3588 HDMI TX Controller arm64: dts: rockchip: Fix label name of hdptxphy for RK3588 arm64: dts: rockchip: Add eDP0 node for RK3588 arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board arm64: dts: rockchip: Add eDP1 node for RK3588 .../rockchip/rockchip,analogix-dp.yaml | 17 +- .../rockchip/rockchip,rk3588-dw-hdmi-qp.yaml | 2 +- arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 32 +- .../dts/rockchip/rk3588-coolpi-cm5-evb.dts | 2 +- .../rockchip/rk3588-coolpi-cm5-genbook.dts | 2 +- .../boot/dts/rockchip/rk3588-evb1-v10.dts | 2 +- .../arm64/boot/dts/rockchip/rk3588-extra.dtsi | 49 + .../rk3588-friendlyelec-cm3588-nas.dts | 2 +- .../arm64/boot/dts/rockchip/rk3588-jaguar.dts | 2 +- .../boot/dts/rockchip/rk3588-nanopc-t6.dtsi | 2 +- .../dts/rockchip/rk3588-orangepi-5-plus.dts | 2 +- .../boot/dts/rockchip/rk3588-rock-5b.dts | 2 +- .../boot/dts/rockchip/rk3588-tiger-haikou.dts | 2 +- .../boot/dts/rockchip/rk3588s-coolpi-4b.dts | 2 +- .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 + .../dts/rockchip/rk3588s-indiedroid-nova.dts | 2 +- .../boot/dts/rockchip/rk3588s-nanopi-r6.dtsi | 2 +- .../boot/dts/rockchip/rk3588s-odroid-m2.dts | 2 +- .../boot/dts/rockchip/rk3588s-orangepi-5.dtsi | 2 +- .../boot/dts/rockchip/rk3588s-rock-5a.dts | 2 +- .../boot/dts/rockchip/rk3588s-rock-5c.dts | 2 +- .../drm/bridge/analogix/analogix_dp_core.c | 24 + .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 56 + .../gpu/drm/rockchip/analogix_dp-rockchip.c | 182 +++- .../phy/rockchip/phy-rockchip-samsung-hdptx.c | 954 +++++++++++++++++- include/drm/bridge/analogix_dp.h | 3 +- 26 files changed, 1302 insertions(+), 101 deletions(-) -- 2.34.1 ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 01/15] drm/rockchip: analogix_dp: Use formalized struct definition for grf field 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 Damon Ding ` (13 subsequent siblings) 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding The formalized struct definition will makes grf field operations more concise and easier to extend. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v2: - Initialize struct rockchip_dp_chip_data rk3399_edp/rk3288_dp in order of its members --- .../gpu/drm/rockchip/analogix_dp-rockchip.c | 77 +++++++++++-------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 546d13f19f9b..05699615b4fc 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -32,26 +32,29 @@ #include "rockchip_drm_drv.h" -#define RK3288_GRF_SOC_CON6 0x25c -#define RK3288_EDP_LCDC_SEL BIT(5) -#define RK3399_GRF_SOC_CON20 0x6250 -#define RK3399_EDP_LCDC_SEL BIT(5) - -#define HIWORD_UPDATE(val, mask) (val | (mask) << 16) - #define PSR_WAIT_LINE_FLAG_TIMEOUT_MS 100 +#define GRF_REG_FIELD(_reg, _lsb, _msb) { \ + .reg = _reg, \ + .lsb = _lsb, \ + .msb = _msb, \ + .valid = true, \ + } + +struct rockchip_grf_reg_field { + u32 reg; + u32 lsb; + u32 msb; + bool valid; +}; + /** * struct rockchip_dp_chip_data - splite the grf setting of kind of chips - * @lcdsel_grf_reg: grf register offset of lcdc select - * @lcdsel_big: reg value of selecting vop big for eDP - * @lcdsel_lit: reg value of selecting vop little for eDP + * @lcdc_sel: grf register field of lcdc_sel * @chip_type: specific chip type */ struct rockchip_dp_chip_data { - u32 lcdsel_grf_reg; - u32 lcdsel_big; - u32 lcdsel_lit; + const struct rockchip_grf_reg_field lcdc_sel; u32 chip_type; }; @@ -84,6 +87,26 @@ static struct rockchip_dp_device *pdata_encoder_to_dp(struct analogix_dp_plat_da return container_of(plat_data, struct rockchip_dp_device, plat_data); } +static int rockchip_grf_write(struct regmap *grf, u32 reg, u32 mask, u32 val) +{ + return regmap_write(grf, reg, (mask << 16) | (val & mask)); +} + +static int rockchip_grf_field_write(struct regmap *grf, + const struct rockchip_grf_reg_field *field, + u32 val) +{ + u32 mask; + + if (!field->valid) + return 0; + + mask = GENMASK(field->msb, field->lsb); + val <<= field->lsb; + + return rockchip_grf_write(grf, field->reg, mask, val); +} + static int rockchip_dp_pre_init(struct rockchip_dp_device *dp) { reset_control_assert(dp->rst); @@ -181,7 +204,6 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder, struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; int ret; - u32 val; crtc = rockchip_dp_drm_get_new_crtc(encoder, state); if (!crtc) @@ -192,24 +214,19 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder, if (old_crtc_state && old_crtc_state->self_refresh_active) return; - ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); - if (ret < 0) - return; - - if (ret) - val = dp->data->lcdsel_lit; - else - val = dp->data->lcdsel_big; - - DRM_DEV_DEBUG(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); - ret = clk_prepare_enable(dp->grfclk); if (ret < 0) { DRM_DEV_ERROR(dp->dev, "failed to enable grfclk %d\n", ret); return; } - ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val); + ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); + if (ret < 0) + return; + + DRM_DEV_DEBUG(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); + + ret = rockchip_grf_field_write(dp->grf, &dp->data->lcdc_sel, ret); if (ret != 0) DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret); @@ -448,16 +465,12 @@ static DEFINE_RUNTIME_DEV_PM_OPS(rockchip_dp_pm_ops, rockchip_dp_suspend, rockchip_dp_resume, NULL); static const struct rockchip_dp_chip_data rk3399_edp = { - .lcdsel_grf_reg = RK3399_GRF_SOC_CON20, - .lcdsel_big = HIWORD_UPDATE(0, RK3399_EDP_LCDC_SEL), - .lcdsel_lit = HIWORD_UPDATE(RK3399_EDP_LCDC_SEL, RK3399_EDP_LCDC_SEL), + .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5), .chip_type = RK3399_EDP, }; static const struct rockchip_dp_chip_data rk3288_dp = { - .lcdsel_grf_reg = RK3288_GRF_SOC_CON6, - .lcdsel_big = HIWORD_UPDATE(0, RK3288_EDP_LCDC_SEL), - .lcdsel_lit = HIWORD_UPDATE(RK3288_EDP_LCDC_SEL, RK3288_EDP_LCDC_SEL), + .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5), .chip_type = RK3288_DP, }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding 2024-12-19 8:05 ` [PATCH v3 01/15] drm/rockchip: analogix_dp: Use formalized struct definition for grf field Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-19 8:28 ` Krzysztof Kozlowski 2024-12-19 8:05 ` [PATCH v3 03/15] drm/rockchip: analogix_dp: " Damon Ding ` (12 subsequent siblings) 14 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding, Krzysztof Kozlowski Compared with RK3288/RK3399, the HBR2 link rate support is the main improvement of RK3588 eDP TX controller, and there are also two independent eDP display interfaces on RK3588 Soc. Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v2: - Add the main defferences of the RK3588 eDP and the previous versions in commit message Changes in v3: - expand the property clock-names, resets and reset-names --- .../display/rockchip/rockchip,analogix-dp.yaml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml index 60dedf9b2be7..4f84e8849876 100644 --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml @@ -15,6 +15,7 @@ properties: enum: - rockchip,rk3288-dp - rockchip,rk3399-edp + - rockchip,rk3588-edp clocks: minItems: 2 @@ -25,16 +26,23 @@ properties: items: - const: dp - const: pclk - - const: grf + - enum: + - grf + - spdif power-domains: maxItems: 1 resets: - maxItems: 1 + minItems: 1 + maxItems: 2 reset-names: - const: dp + minItems: 1 + items: + - const: dp + - enum: + - apb rockchip,grf: $ref: /schemas/types.yaml#/definitions/phandle -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 2024-12-19 8:05 ` [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 Damon Ding @ 2024-12-19 8:28 ` Krzysztof Kozlowski 2024-12-26 2:10 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Krzysztof Kozlowski @ 2024-12-19 8:28 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:51PM +0800, Damon Ding wrote: > Compared with RK3288/RK3399, the HBR2 link rate support is the main > improvement of RK3588 eDP TX controller, and there are also two > independent eDP display interfaces on RK3588 Soc. > > Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Drop, patch was very different. > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > > --- > > Changes in v2: > - Add the main defferences of the RK3588 eDP and the previous versions > in commit message > > Changes in v3: > - expand the property clock-names, resets and reset-names Adding new properties invalidates reviews. The patch is entirely, really significantly different so keeping the review is not acceptable. > --- > .../display/rockchip/rockchip,analogix-dp.yaml | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml > index 60dedf9b2be7..4f84e8849876 100644 > --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml > +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml > @@ -15,6 +15,7 @@ properties: > enum: > - rockchip,rk3288-dp > - rockchip,rk3399-edp > + - rockchip,rk3588-edp > > clocks: > minItems: 2 > @@ -25,16 +26,23 @@ properties: > items: > - const: dp > - const: pclk > - - const: grf > + - enum: > + - grf > + - spdif No, this cannot be flexible for existing variants. > > power-domains: > maxItems: 1 > > resets: > - maxItems: 1 > + minItems: 1 > + maxItems: 2 No, you must list the items. > > reset-names: > - const: dp > + minItems: 1 > + items: > + - const: dp > + - enum: > + - apb I don't understand what happened here but all this is NAK. Why suddenly existing variants became different/changed? Nothing in commit msg explains this. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 2024-12-19 8:28 ` Krzysztof Kozlowski @ 2024-12-26 2:10 ` Damon Ding 0 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-26 2:10 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Krzysztof, On 2024/12/19 16:28, Krzysztof Kozlowski wrote: > On Thu, Dec 19, 2024 at 04:05:51PM +0800, Damon Ding wrote: >> Compared with RK3288/RK3399, the HBR2 link rate support is the main >> improvement of RK3588 eDP TX controller, and there are also two >> independent eDP display interfaces on RK3588 Soc. >> >> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > > Drop, patch was very different. > >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >> >> --- >> >> Changes in v2: >> - Add the main defferences of the RK3588 eDP and the previous versions >> in commit message >> >> Changes in v3: >> - expand the property clock-names, resets and reset-names > > Adding new properties invalidates reviews. The patch is entirely, really > significantly different so keeping the review is not acceptable. > >> --- >> .../display/rockchip/rockchip,analogix-dp.yaml | 14 +++++++++++--- >> 1 file changed, 11 insertions(+), 3 deletions(-) >> >> diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml >> index 60dedf9b2be7..4f84e8849876 100644 >> --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml >> +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml >> @@ -15,6 +15,7 @@ properties: >> enum: >> - rockchip,rk3288-dp >> - rockchip,rk3399-edp >> + - rockchip,rk3588-edp >> >> clocks: >> minItems: 2 >> @@ -25,16 +26,23 @@ properties: >> items: >> - const: dp >> - const: pclk >> - - const: grf >> + - enum: >> + - grf >> + - spdif > > No, this cannot be flexible for existing variants. I will drop the 'spdif' because the audio feature has not been added to the analogix-dp driver in this patch series. > >> >> power-domains: >> maxItems: 1 >> >> resets: >> - maxItems: 1 >> + minItems: 1 >> + maxItems: 2 > > No, you must list the items. > >> >> reset-names: >> - const: dp >> + minItems: 1 >> + items: >> + - const: dp >> + - enum: >> + - apb > > I don't understand what happened here but all this is NAK. Why suddenly > existing variants became different/changed? Nothing in commit msg > explains this. The newly added 'apb' reset is to ensure the APB bus of eDP controller works well on the RK3588 SoC. I will mention it in commit message in the next version. The fixed patch will be like: @@ -31,10 +32,12 @@ properties: maxItems: 1 resets: - maxItems: 1 + maxItems: 2 reset-names: - const: dp + items: + - const: dp + - const: apb rockchip,grf: $ref: /schemas/types.yaml#/definitions/phandle And I will add the APB reset operation in Rockchip analogix-dp driver, which was forgotten in the [PATCH v3 03/15]. Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 03/15] drm/rockchip: analogix_dp: Add support for RK3588 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding 2024-12-19 8:05 ` [PATCH v3 01/15] drm/rockchip: analogix_dp: Use formalized struct definition for grf field Damon Ding 2024-12-19 8:05 ` [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP Damon Ding ` (11 subsequent siblings) 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding RK3588 integrates the Analogix eDP 1.3 TX controller IP and the HDMI/eDP TX Combo PHY based on a Samsung IP block. There are also two independent eDP display interface on RK3588 Soc, so add 'u32 reg' to struct rockchip_dp_chip_data in order to distinguish between two different eDP devices. What's more, the reg configurations for RK3399 and RK3288 have also been set. The patch currently adds only the basic support, specifically RGB output up to 4K@60Hz, without the tests for audio, PSR and other eDP 1.3 specific features. In additon, the above Analogix IP has always been utilized as eDP on Rockchip platform, despite its capability to also support the DP v1.2. Therefore, the newly added logs will contain the term 'edp' rather than 'dp'. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v2: - Add support for the other eDP output edp1 Changes in v3: - Fix the unexpected use of alias - Add more details in commit message --- .../gpu/drm/rockchip/analogix_dp-rockchip.c | 91 +++++++++++++++++-- include/drm/bridge/analogix_dp.h | 3 +- 2 files changed, 83 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 05699615b4fc..ba5263f85ee2 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -51,11 +51,14 @@ struct rockchip_grf_reg_field { /** * struct rockchip_dp_chip_data - splite the grf setting of kind of chips * @lcdc_sel: grf register field of lcdc_sel + * @edp_mode: grf register field of edp_mode * @chip_type: specific chip type */ struct rockchip_dp_chip_data { const struct rockchip_grf_reg_field lcdc_sel; + const struct rockchip_grf_reg_field edp_mode; u32 chip_type; + u32 reg; }; struct rockchip_dp_device { @@ -134,12 +137,21 @@ static int rockchip_dp_poweron(struct analogix_dp_plat_data *plat_data) return ret; } + ret = rockchip_grf_field_write(dp->grf, &dp->data->edp_mode, 1); + if (ret != 0) + DRM_DEV_ERROR(dp->dev, "failed to set edp mode %d\n", ret); + return ret; } static int rockchip_dp_powerdown(struct analogix_dp_plat_data *plat_data) { struct rockchip_dp_device *dp = pdata_encoder_to_dp(plat_data); + int ret; + + ret = rockchip_grf_field_write(dp->grf, &dp->data->edp_mode, 0); + if (ret != 0) + DRM_DEV_ERROR(dp->dev, "failed to set edp mode %d\n", ret); clk_disable_unprepare(dp->pclk); @@ -203,6 +215,10 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder, struct rockchip_dp_device *dp = encoder_to_dp(encoder); struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; + struct of_endpoint endpoint; + struct device_node *remote_port, *remote_port_parent; + char name[32]; + u32 port_id; int ret; crtc = rockchip_dp_drm_get_new_crtc(encoder, state); @@ -220,13 +236,27 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder, return; } - ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); + ret = drm_of_encoder_active_endpoint(dp->dev->of_node, encoder, &endpoint); if (ret < 0) return; - DRM_DEV_DEBUG(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); + remote_port_parent = of_graph_get_remote_port_parent(endpoint.local_node); + if (remote_port_parent) { + if (of_get_child_by_name(remote_port_parent, "ports")) { + remote_port = of_graph_get_remote_port(endpoint.local_node); + of_property_read_u32(remote_port, "reg", &port_id); + of_node_put(remote_port); + sprintf(name, "%s vp%d", remote_port_parent->full_name, port_id); + } else { + sprintf(name, "%s %s", + remote_port_parent->full_name, endpoint.id ? "vopl" : "vopb"); + } + of_node_put(remote_port_parent); + + DRM_DEV_DEBUG(dp->dev, "%s output to edp\n", name); + } - ret = rockchip_grf_field_write(dp->grf, &dp->data->lcdc_sel, ret); + ret = rockchip_grf_field_write(dp->grf, &dp->data->lcdc_sel, endpoint.id); if (ret != 0) DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret); @@ -396,6 +426,8 @@ static int rockchip_dp_probe(struct platform_device *pdev) const struct rockchip_dp_chip_data *dp_data; struct drm_panel *panel = NULL; struct rockchip_dp_device *dp; + struct resource *res; + int i; int ret; dp_data = of_device_get_match_data(dev); @@ -410,9 +442,25 @@ static int rockchip_dp_probe(struct platform_device *pdev) if (!dp) return -ENOMEM; + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + i = 0; + while (dp_data[i].reg) { + if (dp_data[i].reg == res->start) { + dp->data = &dp_data[i]; + break; + } + + i++; + } + + if (!dp->data) { + DRM_DEV_ERROR(dev, "no chip-data for %s node\n", dev->of_node->name); + return -ENODEV; + } + dp->dev = dev; dp->adp = ERR_PTR(-ENODEV); - dp->data = dp_data; dp->plat_data.panel = panel; dp->plat_data.dev_type = dp->data->chip_type; dp->plat_data.power_on = rockchip_dp_poweron; @@ -464,19 +512,42 @@ static int rockchip_dp_resume(struct device *dev) static DEFINE_RUNTIME_DEV_PM_OPS(rockchip_dp_pm_ops, rockchip_dp_suspend, rockchip_dp_resume, NULL); -static const struct rockchip_dp_chip_data rk3399_edp = { - .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5), - .chip_type = RK3399_EDP, +static const struct rockchip_dp_chip_data rk3399_edp[] = { + { + .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5), + .chip_type = RK3399_EDP, + .reg = 0xff970000, + }, + { /* sentinel */ } }; -static const struct rockchip_dp_chip_data rk3288_dp = { - .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5), - .chip_type = RK3288_DP, +static const struct rockchip_dp_chip_data rk3288_dp[] = { + { + .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5), + .chip_type = RK3288_DP, + .reg = 0xff970000, + }, + { /* sentinel */ } +}; + +static const struct rockchip_dp_chip_data rk3588_edp[] = { + { + .edp_mode = GRF_REG_FIELD(0x0000, 0, 0), + .chip_type = RK3588_EDP, + .reg = 0xfdec0000, + }, + { + .edp_mode = GRF_REG_FIELD(0x0004, 0, 0), + .chip_type = RK3588_EDP, + .reg = 0xfded0000, + }, + { /* sentinel */ } }; static const struct of_device_id rockchip_dp_dt_ids[] = { {.compatible = "rockchip,rk3288-dp", .data = &rk3288_dp }, {.compatible = "rockchip,rk3399-edp", .data = &rk3399_edp }, + {.compatible = "rockchip,rk3588-edp", .data = &rk3588_edp }, {} }; MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids); diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h index 6002c5666031..54086cb2d97d 100644 --- a/include/drm/bridge/analogix_dp.h +++ b/include/drm/bridge/analogix_dp.h @@ -15,11 +15,12 @@ enum analogix_dp_devtype { EXYNOS_DP, RK3288_DP, RK3399_EDP, + RK3588_EDP, }; static inline bool is_rockchip(enum analogix_dp_devtype type) { - return type == RK3288_DP || type == RK3399_EDP; + return type == RK3288_DP || type == RK3399_EDP || type == RK3588_EDP; } struct analogix_dp_plat_data { -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (2 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 03/15] drm/rockchip: analogix_dp: " Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-20 0:22 ` Dmitry Baryshkov 2024-12-19 8:05 ` [PATCH v3 05/15] phy: phy-rockchip-samsung-hdptx: Add support for eDP mode Damon Ding ` (10 subsequent siblings) 14 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding The modifications of DP register names are as follows: - Add the '_MASK' suffix to some registers to ensure consistency. - Complete the names of some register to their full names. - Swap the definitions of LCPLL_REF and ROPLL_REF. Fixes: 553be2830c5f ("phy: rockchip: Add Samsung HDMI/eDP Combo PHY driver") Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- .../phy/rockchip/phy-rockchip-samsung-hdptx.c | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index ceab9c71d3b5..c1b9c73f5f9f 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -69,41 +69,41 @@ #define ROPLL_PMS_IQDIV_RSTN BIT(5) /* CMN_REG(005e) */ #define ROPLL_SDM_EN_MASK BIT(6) -#define ROPLL_SDM_FRAC_EN_RBR BIT(3) -#define ROPLL_SDM_FRAC_EN_HBR BIT(2) -#define ROPLL_SDM_FRAC_EN_HBR2 BIT(1) -#define ROPLL_SDM_FRAC_EN_HBR3 BIT(0) +#define ROPLL_SDC_FRAC_EN_RBR_MASK BIT(3) +#define ROPLL_SDC_FRAC_EN_HBR_MASK BIT(2) +#define ROPLL_SDC_FRAC_EN_HBR2_MASK BIT(1) +#define ROPLL_SDM_FRAC_EN_HBR3_MASK BIT(0) /* CMN_REG(0064) */ #define ROPLL_SDM_NUM_SIGN_RBR_MASK BIT(3) /* CMN_REG(0069) */ #define ROPLL_SDC_N_RBR_MASK GENMASK(2, 0) /* CMN_REG(0074) */ -#define ROPLL_SDC_NDIV_RSTN BIT(2) -#define ROPLL_SSC_EN BIT(0) +#define ROPLL_SDC_NDIV_RSTN_MASK BIT(2) +#define ROPLL_SSC_EN_MASK BIT(0) /* CMN_REG(0081) */ -#define OVRD_PLL_CD_CLK_EN BIT(8) -#define PLL_CD_HSCLK_EAST_EN BIT(0) +#define OVRD_PLL_CD_CLK_EN_MASK BIT(8) +#define ANA_PLL_CD_HSCLK_EAST_EN_MASK BIT(0) /* CMN_REG(0086) */ #define PLL_PCG_POSTDIV_SEL_MASK GENMASK(7, 4) #define PLL_PCG_CLK_SEL_MASK GENMASK(3, 1) #define PLL_PCG_CLK_EN BIT(0) /* CMN_REG(0087) */ -#define PLL_FRL_MODE_EN BIT(3) -#define PLL_TX_HS_CLK_EN BIT(2) +#define ANA_PLL_FRL_MODE_EN_MASK BIT(3) +#define ANA_PLL_TX_HS_CLK_EN_MASK BIT(2) /* CMN_REG(0089) */ #define LCPLL_ALONE_MODE BIT(1) /* CMN_REG(0097) */ -#define DIG_CLK_SEL BIT(1) -#define ROPLL_REF BIT(1) -#define LCPLL_REF 0 +#define DIG_CLK_SEL_MASK BIT(1) +#define LCPLL_REF BIT(1) +#define ROPLL_REF 0 /* CMN_REG(0099) */ #define CMN_ROPLL_ALONE_MODE BIT(2) #define ROPLL_ALONE_MODE BIT(2) /* CMN_REG(009a) */ -#define HS_SPEED_SEL BIT(0) +#define HS_SPEED_SEL_MASK BIT(0) #define DIV_10_CLOCK BIT(0) /* CMN_REG(009b) */ -#define IS_SPEED_SEL BIT(4) +#define LS_SPEED_SEL_MASK BIT(4) #define LINK_SYMBOL_CLOCK BIT(4) #define LINK_SYMBOL_CLOCK1_2 0 @@ -165,32 +165,32 @@ #define HDMI_MODE BIT(2) #define HDMI_TMDS_FRL_SEL BIT(1) /* LNTOP_REG(0206) */ -#define DATA_BUS_SEL BIT(0) +#define DATA_BUS_WIDTH_SEL_MASK BIT(0) #define DATA_BUS_36_40 BIT(0) /* LNTOP_REG(0207) */ #define LANE_EN 0xf #define ALL_LANE_EN 0xf /* LANE_REG(0312) */ -#define LN0_TX_SER_RATE_SEL_RBR BIT(5) -#define LN0_TX_SER_RATE_SEL_HBR BIT(4) -#define LN0_TX_SER_RATE_SEL_HBR2 BIT(3) -#define LN0_TX_SER_RATE_SEL_HBR3 BIT(2) +#define LN0_TX_SER_RATE_SEL_RBR_MASK BIT(5) +#define LN0_TX_SER_RATE_SEL_HBR_MASK BIT(4) +#define LN0_TX_SER_RATE_SEL_HBR2_MASK BIT(3) +#define LN0_TX_SER_RATE_SEL_HBR3_MASK BIT(2) /* LANE_REG(0412) */ -#define LN1_TX_SER_RATE_SEL_RBR BIT(5) -#define LN1_TX_SER_RATE_SEL_HBR BIT(4) -#define LN1_TX_SER_RATE_SEL_HBR2 BIT(3) -#define LN1_TX_SER_RATE_SEL_HBR3 BIT(2) +#define LN1_TX_SER_RATE_SEL_RBR_MASK BIT(5) +#define LN1_TX_SER_RATE_SEL_HBR_MASK BIT(4) +#define LN1_TX_SER_RATE_SEL_HBR2_MASK BIT(3) +#define LN1_TX_SER_RATE_SEL_HBR3_MASK BIT(2) /* LANE_REG(0512) */ -#define LN2_TX_SER_RATE_SEL_RBR BIT(5) -#define LN2_TX_SER_RATE_SEL_HBR BIT(4) -#define LN2_TX_SER_RATE_SEL_HBR2 BIT(3) -#define LN2_TX_SER_RATE_SEL_HBR3 BIT(2) +#define LN2_TX_SER_RATE_SEL_RBR_MASK BIT(5) +#define LN2_TX_SER_RATE_SEL_HBR_MASK BIT(4) +#define LN2_TX_SER_RATE_SEL_HBR2_MASK BIT(3) +#define LN2_TX_SER_RATE_SEL_HBR3_MASK BIT(2) /* LANE_REG(0612) */ -#define LN3_TX_SER_RATE_SEL_RBR BIT(5) -#define LN3_TX_SER_RATE_SEL_HBR BIT(4) -#define LN3_TX_SER_RATE_SEL_HBR2 BIT(3) -#define LN3_TX_SER_RATE_SEL_HBR3 BIT(2) +#define LN3_TX_SER_RATE_SEL_RBR_MASK BIT(5) +#define LN3_TX_SER_RATE_SEL_HBR_MASK BIT(4) +#define LN3_TX_SER_RATE_SEL_HBR2_MASK BIT(3) +#define LN3_TX_SER_RATE_SEL_HBR3_MASK BIT(2) #define HDMI20_MAX_RATE 600000000 -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP 2024-12-19 8:05 ` [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP Damon Ding @ 2024-12-20 0:22 ` Dmitry Baryshkov 2024-12-20 1:46 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 0:22 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:53PM +0800, Damon Ding wrote: > The modifications of DP register names are as follows: > - Add the '_MASK' suffix to some registers to ensure consistency. > - Complete the names of some register to their full names. > - Swap the definitions of LCPLL_REF and ROPLL_REF. Three unrelated changes, ideally means three commits (I won't insist on that though). Also please mention that LCPLL_REF and ROPLL_REF were not used by the existing driver, so it's not a bug and there is no need to backport it. > > Fixes: 553be2830c5f ("phy: rockchip: Add Samsung HDMI/eDP Combo PHY driver") > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > --- > .../phy/rockchip/phy-rockchip-samsung-hdptx.c | 64 +++++++++---------- > 1 file changed, 32 insertions(+), 32 deletions(-) > > diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c > index ceab9c71d3b5..c1b9c73f5f9f 100644 > --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c > +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c > @@ -69,41 +69,41 @@ > #define ROPLL_PMS_IQDIV_RSTN BIT(5) > /* CMN_REG(005e) */ > #define ROPLL_SDM_EN_MASK BIT(6) > -#define ROPLL_SDM_FRAC_EN_RBR BIT(3) > -#define ROPLL_SDM_FRAC_EN_HBR BIT(2) > -#define ROPLL_SDM_FRAC_EN_HBR2 BIT(1) > -#define ROPLL_SDM_FRAC_EN_HBR3 BIT(0) > +#define ROPLL_SDC_FRAC_EN_RBR_MASK BIT(3) > +#define ROPLL_SDC_FRAC_EN_HBR_MASK BIT(2) > +#define ROPLL_SDC_FRAC_EN_HBR2_MASK BIT(1) > +#define ROPLL_SDM_FRAC_EN_HBR3_MASK BIT(0) > /* CMN_REG(0064) */ > #define ROPLL_SDM_NUM_SIGN_RBR_MASK BIT(3) > /* CMN_REG(0069) */ > #define ROPLL_SDC_N_RBR_MASK GENMASK(2, 0) > /* CMN_REG(0074) */ > -#define ROPLL_SDC_NDIV_RSTN BIT(2) > -#define ROPLL_SSC_EN BIT(0) > +#define ROPLL_SDC_NDIV_RSTN_MASK BIT(2) > +#define ROPLL_SSC_EN_MASK BIT(0) > /* CMN_REG(0081) */ > -#define OVRD_PLL_CD_CLK_EN BIT(8) > -#define PLL_CD_HSCLK_EAST_EN BIT(0) > +#define OVRD_PLL_CD_CLK_EN_MASK BIT(8) > +#define ANA_PLL_CD_HSCLK_EAST_EN_MASK BIT(0) > /* CMN_REG(0086) */ > #define PLL_PCG_POSTDIV_SEL_MASK GENMASK(7, 4) > #define PLL_PCG_CLK_SEL_MASK GENMASK(3, 1) > #define PLL_PCG_CLK_EN BIT(0) > /* CMN_REG(0087) */ > -#define PLL_FRL_MODE_EN BIT(3) > -#define PLL_TX_HS_CLK_EN BIT(2) > +#define ANA_PLL_FRL_MODE_EN_MASK BIT(3) > +#define ANA_PLL_TX_HS_CLK_EN_MASK BIT(2) > /* CMN_REG(0089) */ > #define LCPLL_ALONE_MODE BIT(1) > /* CMN_REG(0097) */ > -#define DIG_CLK_SEL BIT(1) > -#define ROPLL_REF BIT(1) > -#define LCPLL_REF 0 > +#define DIG_CLK_SEL_MASK BIT(1) > +#define LCPLL_REF BIT(1) > +#define ROPLL_REF 0 > /* CMN_REG(0099) */ > #define CMN_ROPLL_ALONE_MODE BIT(2) > #define ROPLL_ALONE_MODE BIT(2) > /* CMN_REG(009a) */ > -#define HS_SPEED_SEL BIT(0) > +#define HS_SPEED_SEL_MASK BIT(0) > #define DIV_10_CLOCK BIT(0) > /* CMN_REG(009b) */ > -#define IS_SPEED_SEL BIT(4) > +#define LS_SPEED_SEL_MASK BIT(4) > #define LINK_SYMBOL_CLOCK BIT(4) > #define LINK_SYMBOL_CLOCK1_2 0 > > @@ -165,32 +165,32 @@ > #define HDMI_MODE BIT(2) > #define HDMI_TMDS_FRL_SEL BIT(1) > /* LNTOP_REG(0206) */ > -#define DATA_BUS_SEL BIT(0) > +#define DATA_BUS_WIDTH_SEL_MASK BIT(0) > #define DATA_BUS_36_40 BIT(0) > /* LNTOP_REG(0207) */ > #define LANE_EN 0xf > #define ALL_LANE_EN 0xf > > /* LANE_REG(0312) */ > -#define LN0_TX_SER_RATE_SEL_RBR BIT(5) > -#define LN0_TX_SER_RATE_SEL_HBR BIT(4) > -#define LN0_TX_SER_RATE_SEL_HBR2 BIT(3) > -#define LN0_TX_SER_RATE_SEL_HBR3 BIT(2) > +#define LN0_TX_SER_RATE_SEL_RBR_MASK BIT(5) > +#define LN0_TX_SER_RATE_SEL_HBR_MASK BIT(4) > +#define LN0_TX_SER_RATE_SEL_HBR2_MASK BIT(3) > +#define LN0_TX_SER_RATE_SEL_HBR3_MASK BIT(2) > /* LANE_REG(0412) */ > -#define LN1_TX_SER_RATE_SEL_RBR BIT(5) > -#define LN1_TX_SER_RATE_SEL_HBR BIT(4) > -#define LN1_TX_SER_RATE_SEL_HBR2 BIT(3) > -#define LN1_TX_SER_RATE_SEL_HBR3 BIT(2) > +#define LN1_TX_SER_RATE_SEL_RBR_MASK BIT(5) > +#define LN1_TX_SER_RATE_SEL_HBR_MASK BIT(4) > +#define LN1_TX_SER_RATE_SEL_HBR2_MASK BIT(3) > +#define LN1_TX_SER_RATE_SEL_HBR3_MASK BIT(2) > /* LANE_REG(0512) */ > -#define LN2_TX_SER_RATE_SEL_RBR BIT(5) > -#define LN2_TX_SER_RATE_SEL_HBR BIT(4) > -#define LN2_TX_SER_RATE_SEL_HBR2 BIT(3) > -#define LN2_TX_SER_RATE_SEL_HBR3 BIT(2) > +#define LN2_TX_SER_RATE_SEL_RBR_MASK BIT(5) > +#define LN2_TX_SER_RATE_SEL_HBR_MASK BIT(4) > +#define LN2_TX_SER_RATE_SEL_HBR2_MASK BIT(3) > +#define LN2_TX_SER_RATE_SEL_HBR3_MASK BIT(2) > /* LANE_REG(0612) */ > -#define LN3_TX_SER_RATE_SEL_RBR BIT(5) > -#define LN3_TX_SER_RATE_SEL_HBR BIT(4) > -#define LN3_TX_SER_RATE_SEL_HBR2 BIT(3) > -#define LN3_TX_SER_RATE_SEL_HBR3 BIT(2) > +#define LN3_TX_SER_RATE_SEL_RBR_MASK BIT(5) > +#define LN3_TX_SER_RATE_SEL_HBR_MASK BIT(4) > +#define LN3_TX_SER_RATE_SEL_HBR2_MASK BIT(3) > +#define LN3_TX_SER_RATE_SEL_HBR3_MASK BIT(2) > > #define HDMI20_MAX_RATE 600000000 > > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP 2024-12-20 0:22 ` Dmitry Baryshkov @ 2024-12-20 1:46 ` Damon Ding 2024-12-20 2:01 ` Dmitry Baryshkov 0 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-20 1:46 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 8:22, Dmitry Baryshkov wrote: > On Thu, Dec 19, 2024 at 04:05:53PM +0800, Damon Ding wrote: >> The modifications of DP register names are as follows: >> - Add the '_MASK' suffix to some registers to ensure consistency. >> - Complete the names of some register to their full names. >> - Swap the definitions of LCPLL_REF and ROPLL_REF. > > Three unrelated changes, ideally means three commits (I won't insist on > that though). Also please mention that LCPLL_REF and ROPLL_REF were not > used by the existing driver, so it's not a bug and there is no need to > backport it. > Indeed, it would be better to split this patch into three different commits. However, I still want to keep the fixes for LCPLL_REF and ROPLL_REF because, according to the datasheet, they are indeed incorrect. And I will describe the suggestions you mentioned in the commit message. >> >> Fixes: 553be2830c5f ("phy: rockchip: Add Samsung HDMI/eDP Combo PHY driver") >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >> --- >> .../phy/rockchip/phy-rockchip-samsung-hdptx.c | 64 +++++++++---------- >> 1 file changed, 32 insertions(+), 32 deletions(-) >> >> diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c >> index ceab9c71d3b5..c1b9c73f5f9f 100644 >> --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c >> +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c >> @@ -69,41 +69,41 @@ >> #define ROPLL_PMS_IQDIV_RSTN BIT(5) >> /* CMN_REG(005e) */ >> #define ROPLL_SDM_EN_MASK BIT(6) >> -#define ROPLL_SDM_FRAC_EN_RBR BIT(3) >> -#define ROPLL_SDM_FRAC_EN_HBR BIT(2) >> -#define ROPLL_SDM_FRAC_EN_HBR2 BIT(1) >> -#define ROPLL_SDM_FRAC_EN_HBR3 BIT(0) >> +#define ROPLL_SDC_FRAC_EN_RBR_MASK BIT(3) >> +#define ROPLL_SDC_FRAC_EN_HBR_MASK BIT(2) >> +#define ROPLL_SDC_FRAC_EN_HBR2_MASK BIT(1) >> +#define ROPLL_SDM_FRAC_EN_HBR3_MASK BIT(0) >> /* CMN_REG(0064) */ >> #define ROPLL_SDM_NUM_SIGN_RBR_MASK BIT(3) >> /* CMN_REG(0069) */ >> #define ROPLL_SDC_N_RBR_MASK GENMASK(2, 0) >> /* CMN_REG(0074) */ >> -#define ROPLL_SDC_NDIV_RSTN BIT(2) >> -#define ROPLL_SSC_EN BIT(0) >> +#define ROPLL_SDC_NDIV_RSTN_MASK BIT(2) >> +#define ROPLL_SSC_EN_MASK BIT(0) >> /* CMN_REG(0081) */ >> -#define OVRD_PLL_CD_CLK_EN BIT(8) >> -#define PLL_CD_HSCLK_EAST_EN BIT(0) >> +#define OVRD_PLL_CD_CLK_EN_MASK BIT(8) >> +#define ANA_PLL_CD_HSCLK_EAST_EN_MASK BIT(0) >> /* CMN_REG(0086) */ >> #define PLL_PCG_POSTDIV_SEL_MASK GENMASK(7, 4) >> #define PLL_PCG_CLK_SEL_MASK GENMASK(3, 1) > > #define PLL_PCG_CLK_EN BIT(0) >> /* CMN_REG(0087) */ >> -#define PLL_FRL_MODE_EN BIT(3) >> -#define PLL_TX_HS_CLK_EN BIT(2) >> +#define ANA_PLL_FRL_MODE_EN_MASK BIT(3) >> +#define ANA_PLL_TX_HS_CLK_EN_MASK BIT(2) >> /* CMN_REG(0089) */ >> #define LCPLL_ALONE_MODE BIT(1) >> /* CMN_REG(0097) */ >> -#define DIG_CLK_SEL BIT(1) >> -#define ROPLL_REF BIT(1) >> -#define LCPLL_REF 0 >> +#define DIG_CLK_SEL_MASK BIT(1) >> +#define LCPLL_REF BIT(1) >> +#define ROPLL_REF 0 >> /* CMN_REG(0099) */ >> #define CMN_ROPLL_ALONE_MODE BIT(2) >> #define ROPLL_ALONE_MODE BIT(2) >> /* CMN_REG(009a) */ >> -#define HS_SPEED_SEL BIT(0) >> +#define HS_SPEED_SEL_MASK BIT(0) >> #define DIV_10_CLOCK BIT(0) >> /* CMN_REG(009b) */ >> -#define IS_SPEED_SEL BIT(4) >> +#define LS_SPEED_SEL_MASK BIT(4) >> #define LINK_SYMBOL_CLOCK BIT(4) >> #define LINK_SYMBOL_CLOCK1_2 0 >> >> @@ -165,32 +165,32 @@ >> #define HDMI_MODE BIT(2) >> #define HDMI_TMDS_FRL_SEL BIT(1) >> /* LNTOP_REG(0206) */ >> -#define DATA_BUS_SEL BIT(0) >> +#define DATA_BUS_WIDTH_SEL_MASK BIT(0) >> #define DATA_BUS_36_40 BIT(0) >> /* LNTOP_REG(0207) */ >> #define LANE_EN 0xf >> #define ALL_LANE_EN 0xf >> >> /* LANE_REG(0312) */ >> -#define LN0_TX_SER_RATE_SEL_RBR BIT(5) >> -#define LN0_TX_SER_RATE_SEL_HBR BIT(4) >> -#define LN0_TX_SER_RATE_SEL_HBR2 BIT(3) >> -#define LN0_TX_SER_RATE_SEL_HBR3 BIT(2) >> +#define LN0_TX_SER_RATE_SEL_RBR_MASK BIT(5) >> +#define LN0_TX_SER_RATE_SEL_HBR_MASK BIT(4) >> +#define LN0_TX_SER_RATE_SEL_HBR2_MASK BIT(3) >> +#define LN0_TX_SER_RATE_SEL_HBR3_MASK BIT(2) >> /* LANE_REG(0412) */ >> -#define LN1_TX_SER_RATE_SEL_RBR BIT(5) >> -#define LN1_TX_SER_RATE_SEL_HBR BIT(4) >> -#define LN1_TX_SER_RATE_SEL_HBR2 BIT(3) >> -#define LN1_TX_SER_RATE_SEL_HBR3 BIT(2) >> +#define LN1_TX_SER_RATE_SEL_RBR_MASK BIT(5) >> +#define LN1_TX_SER_RATE_SEL_HBR_MASK BIT(4) >> +#define LN1_TX_SER_RATE_SEL_HBR2_MASK BIT(3) >> +#define LN1_TX_SER_RATE_SEL_HBR3_MASK BIT(2) >> /* LANE_REG(0512) */ >> -#define LN2_TX_SER_RATE_SEL_RBR BIT(5) >> -#define LN2_TX_SER_RATE_SEL_HBR BIT(4) >> -#define LN2_TX_SER_RATE_SEL_HBR2 BIT(3) >> -#define LN2_TX_SER_RATE_SEL_HBR3 BIT(2) >> +#define LN2_TX_SER_RATE_SEL_RBR_MASK BIT(5) >> +#define LN2_TX_SER_RATE_SEL_HBR_MASK BIT(4) >> +#define LN2_TX_SER_RATE_SEL_HBR2_MASK BIT(3) >> +#define LN2_TX_SER_RATE_SEL_HBR3_MASK BIT(2) >> /* LANE_REG(0612) */ >> -#define LN3_TX_SER_RATE_SEL_RBR BIT(5) >> -#define LN3_TX_SER_RATE_SEL_HBR BIT(4) >> -#define LN3_TX_SER_RATE_SEL_HBR2 BIT(3) >> -#define LN3_TX_SER_RATE_SEL_HBR3 BIT(2) >> +#define LN3_TX_SER_RATE_SEL_RBR_MASK BIT(5) >> +#define LN3_TX_SER_RATE_SEL_HBR_MASK BIT(4) >> +#define LN3_TX_SER_RATE_SEL_HBR2_MASK BIT(3) >> +#define LN3_TX_SER_RATE_SEL_HBR3_MASK BIT(2) >> >> #define HDMI20_MAX_RATE 600000000 >> >> -- >> 2.34.1 >> > Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP 2024-12-20 1:46 ` Damon Ding @ 2024-12-20 2:01 ` Dmitry Baryshkov 0 siblings, 0 replies; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 2:01 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Fri, Dec 20, 2024 at 09:46:24AM +0800, Damon Ding wrote: > Hi Dmitry, > > On 2024/12/20 8:22, Dmitry Baryshkov wrote: > > On Thu, Dec 19, 2024 at 04:05:53PM +0800, Damon Ding wrote: > > > The modifications of DP register names are as follows: > > > - Add the '_MASK' suffix to some registers to ensure consistency. > > > - Complete the names of some register to their full names. > > > - Swap the definitions of LCPLL_REF and ROPLL_REF. > > > > Three unrelated changes, ideally means three commits (I won't insist on > > that though). Also please mention that LCPLL_REF and ROPLL_REF were not > > used by the existing driver, so it's not a bug and there is no need to > > backport it. > > > > Indeed, it would be better to split this patch into three different commits. > However, I still want to keep the fixes for LCPLL_REF and ROPLL_REF because, > according to the datasheet, they are indeed incorrect. And I will describe > the suggestions you mentioned in the commit message. I meant that the issue with those defines doesn't affect existing code, so there is no need for Fixes:, etc. -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 05/15] phy: phy-rockchip-samsung-hdptx: Add support for eDP mode 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (3 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 06/15] drm/bridge: analogix_dp: Add support for RK3588 Damon Ding ` (9 subsequent siblings) 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding Add basic support for RBR/HBR/HBR2 link rates, and the voltage swing and pre-emphasis configurations of each link rate have been verified according to the eDP 1.3 requirements. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v2: - Add the module author Changes in v3: - Split this patch into two, one for correction and the other for extension --- .../phy/rockchip/phy-rockchip-samsung-hdptx.c | 890 +++++++++++++++++- 1 file changed, 883 insertions(+), 7 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index c1b9c73f5f9f..52fc121ff7de 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -25,6 +25,7 @@ #define HDPTX_I_PLL_EN BIT(7) #define HDPTX_I_BIAS_EN BIT(6) #define HDPTX_I_BGR_EN BIT(5) +#define HDPTX_MODE_SEL BIT(0) #define GRF_HDPTX_STATUS 0x80 #define HDPTX_O_PLL_LOCK_DONE BIT(3) #define HDPTX_O_PHY_CLK_RDY BIT(2) @@ -44,6 +45,7 @@ #define LANE_REG(n) HDTPX_REG(n, 0300, 062d) /* CMN_REG(0008) */ +#define OVRD_LCPLL_EN_MASK BIT(7) #define LCPLL_EN_MASK BIT(6) #define LCPLL_LCVCO_MODE_EN_MASK BIT(4) /* CMN_REG(001e) */ @@ -61,28 +63,88 @@ /* CMN_REG(002f) */ #define LCPLL_SDC_DENOMINATOR_MASK GENMASK(7, 2) #define LCPLL_SDC_NDIV_RSTN BIT(0) +/* CMN_REG(003c) */ +#define ANA_LCPLL_RESERVED7_MASK BIT(7) /* CMN_REG(003d) */ +#define OVRD_ROPLL_EN_MASK BIT(7) +#define ROPLL_EN_MASK BIT(6) #define ROPLL_LCVCO_EN BIT(4) +/* CMN_REG(0046) */ +#define ROPLL_ANA_CPP_CTRL_COARSE_MASK GENMASK(7, 4) +#define ROPLL_ANA_CPP_CTRL_FINE_MASK GENMASK(3, 0) +/* CMN_REG(0047) */ +#define ROPLL_ANA_LPF_C_SEL_COARSE_MASK GENMASK(5, 3) +#define ROPLL_ANA_LPF_C_SEL_FINE_MASK GENMASK(2, 0) /* CMN_REG(004e) */ #define ROPLL_PI_EN BIT(5) +/* CMN_REG(0051) */ +#define ROPLL_PMS_MDIV_MASK GENMASK(7, 0) +/* CMN_REG(0055) */ +#define ROPLL_PMS_MDIV_AFC_MASK GENMASK(7, 0) +/* CMN_REG(0059) */ +#define ANA_ROPLL_PMS_PDIV_MASK GENMASK(7, 4) +#define ANA_ROPLL_PMS_REFDIV_MASK GENMASK(3, 0) +/* CMN_REG(005a) */ +#define ROPLL_PMS_SDIV_RBR_MASK GENMASK(7, 4) +#define ROPLL_PMS_SDIV_HBR_MASK GENMASK(3, 0) +/* CMN_REG(005b) */ +#define ROPLL_PMS_SDIV_HBR2_MASK GENMASK(7, 4) /* CMN_REG(005c) */ #define ROPLL_PMS_IQDIV_RSTN BIT(5) /* CMN_REG(005e) */ #define ROPLL_SDM_EN_MASK BIT(6) +#define OVRD_ROPLL_SDM_RSTN_MASK BIT(5) +#define ROPLL_SDM_RSTN_MASK BIT(4) #define ROPLL_SDC_FRAC_EN_RBR_MASK BIT(3) #define ROPLL_SDC_FRAC_EN_HBR_MASK BIT(2) #define ROPLL_SDC_FRAC_EN_HBR2_MASK BIT(1) #define ROPLL_SDM_FRAC_EN_HBR3_MASK BIT(0) +/* CMN_REG(005f) */ +#define OVRD_ROPLL_SDC_RSTN_MASK BIT(5) +#define ROPLL_SDC_RSTN_MASK BIT(4) +/* CMN_REG(0060) */ +#define ROPLL_SDM_DENOMINATOR_MASK GENMASK(7, 0) /* CMN_REG(0064) */ #define ROPLL_SDM_NUM_SIGN_RBR_MASK BIT(3) +#define ROPLL_SDM_NUM_SIGN_HBR_MASK BIT(2) +#define ROPLL_SDM_NUM_SIGN_HBR2_MASK BIT(1) +/* CMN_REG(0065) */ +#define ROPLL_SDM_NUM_MASK GENMASK(7, 0) /* CMN_REG(0069) */ #define ROPLL_SDC_N_RBR_MASK GENMASK(2, 0) +/* CMN_REG(006a) */ +#define ROPLL_SDC_N_HBR_MASK GENMASK(5, 3) +#define ROPLL_SDC_N_HBR2_MASK GENMASK(2, 0) +/* CMN_REG(006b) */ +#define ROPLL_SDC_N_HBR3_MASK GENMASK(3, 1) +/* CMN_REG(006c) */ +#define ROPLL_SDC_NUM_MASK GENMASK(5, 0) +/* cmn_reg0070 */ +#define ROPLL_SDC_DENO_MASK GENMASK(5, 0) /* CMN_REG(0074) */ +#define OVRD_ROPLL_SDC_NDIV_RSTN_MASK BIT(3) #define ROPLL_SDC_NDIV_RSTN_MASK BIT(2) +#define OVRD_ROPLL_SSC_EN_MASK BIT(1) #define ROPLL_SSC_EN_MASK BIT(0) +/* CMN_REG(0075) */ +#define ANA_ROPLL_SSC_FM_DEVIATION_MASK GENMASK(5, 0) +/* CMN_REG(0076) */ +#define ANA_ROPLL_SSC_FM_FREQ_MASK GENMASK(6, 2) +/* CMN_REG(0077) */ +#define ANA_ROPLL_SSC_CLK_DIV_SEL_MASK GENMASK(6, 3) /* CMN_REG(0081) */ #define OVRD_PLL_CD_CLK_EN_MASK BIT(8) +#define ANA_PLL_CD_TX_SER_RATE_SEL_MASK BIT(3) +#define ANA_PLL_CD_HSCLK_WEST_EN_MASK BIT(1) #define ANA_PLL_CD_HSCLK_EAST_EN_MASK BIT(0) +/* CMN_REG(0082) */ +#define ANA_PLL_CD_VREG_GAIN_CTRL_MASK GENMASK(3, 0) +/* CMN_REG(0083) */ +#define ANA_PLL_CD_VREG_ICTRL_MASK GENMASK(6, 5) +/* CMN_REG(0084) */ +#define PLL_LCRO_CLK_SEL_MASK BIT(5) +/* CMN_REG(0085) */ +#define ANA_PLL_SYNC_LOSS_DET_MODE_MASK GENMASK(1, 0) /* CMN_REG(0086) */ #define PLL_PCG_POSTDIV_SEL_MASK GENMASK(7, 4) #define PLL_PCG_CLK_SEL_MASK GENMASK(3, 1) @@ -92,11 +154,14 @@ #define ANA_PLL_TX_HS_CLK_EN_MASK BIT(2) /* CMN_REG(0089) */ #define LCPLL_ALONE_MODE BIT(1) +/* CMN_REG(0095) */ +#define DP_TX_LINK_BW_MASK GENMASK(1, 0) /* CMN_REG(0097) */ #define DIG_CLK_SEL_MASK BIT(1) #define LCPLL_REF BIT(1) #define ROPLL_REF 0 /* CMN_REG(0099) */ +#define SSC_EN_MASK GENMASK(7, 6) #define CMN_ROPLL_ALONE_MODE BIT(2) #define ROPLL_ALONE_MODE BIT(2) /* CMN_REG(009a) */ @@ -118,6 +183,8 @@ /* SB_REG(0104) */ #define OVRD_SB_EN_MASK BIT(5) #define SB_EN_MASK BIT(4) +#define OVRD_SB_AUX_EN_MASK BIT(1) +#define SB_AUX_EN_MASK BIT(0) /* SB_REG(0105) */ #define OVRD_SB_EARC_CMDC_EN_MASK BIT(6) #define SB_EARC_CMDC_EN_MASK BIT(5) @@ -126,6 +193,8 @@ #define ANA_SB_TX_LLVL_PROG_MASK GENMASK(6, 4) /* SB_REG(0109) */ #define ANA_SB_DMRX_AFC_DIV_RATIO_MASK GENMASK(2, 0) +/* SB_REG(010d) */ +#define ANA_SB_DMRX_LPBK_DATA_MASK BIT(4) /* SB_REG(010f) */ #define OVRD_SB_VREG_EN_MASK BIT(7) #define SB_VREG_EN_MASK BIT(6) @@ -133,6 +202,7 @@ #define SB_VREG_LPF_BYPASS_MASK BIT(4) #define ANA_SB_VREG_GAIN_CTRL_MASK GENMASK(3, 0) /* SB_REG(0110) */ +#define ANA_SB_VREG_OUT_SEL_MASK BIT(1) #define ANA_SB_VREG_REF_SEL_MASK BIT(0) /* SB_REG(0113) */ #define SB_RX_RCAL_OPT_CODE_MASK GENMASK(5, 4) @@ -147,13 +217,24 @@ #define AFC_RSTN_DELAY_TIME_MASK GENMASK(6, 4) /* SB_REG(0117) */ #define FAST_PULSE_TIME_MASK GENMASK(3, 0) +/* SB_REG(0118) */ +#define SB_TG_EARC_DMRX_RECVRD_CLK_CNT_MASK GENMASK(7, 0) +/* SB_REG(011a) */ +#define SB_TG_CNT_RUN_NO_7_0_MASK GENMASK(7, 0) /* SB_REG(011b) */ #define SB_EARC_SIG_DET_BYPASS_MASK BIT(4) #define SB_AFC_TOL_MASK GENMASK(3, 0) +/* SB_REG(011c) */ +#define SB_AFC_STB_NUM_MASK GENMASK(3, 0) +/* SB_REG(011d) */ +#define SB_TG_OSC_CNT_MIN_MASK GENMASK(7, 0) +/* SB_REG(011e) */ +#define SB_TG_OSC_CNT_MAX_MASK GENMASK(7, 0) /* SB_REG(011f) */ #define SB_PWM_AFC_CTRL_MASK GENMASK(7, 2) #define SB_RCAL_RSTN_MASK BIT(1) /* SB_REG(0120) */ +#define SB_AUX_EN_IN_MASK BIT(7) #define SB_EARC_EN_MASK BIT(1) #define SB_EARC_AFC_EN_MASK BIT(2) /* SB_REG(0123) */ @@ -165,27 +246,74 @@ #define HDMI_MODE BIT(2) #define HDMI_TMDS_FRL_SEL BIT(1) /* LNTOP_REG(0206) */ +#define DATA_BUS_WIDTH_MASK GENMASK(2, 1) #define DATA_BUS_WIDTH_SEL_MASK BIT(0) #define DATA_BUS_36_40 BIT(0) /* LNTOP_REG(0207) */ #define LANE_EN 0xf #define ALL_LANE_EN 0xf +/* LANE_REG(0301) */ +#define OVRD_LN_TX_DRV_EI_EN_MASK BIT(7) +#define LN_TX_DRV_EI_EN_MASK BIT(6) +/* LANE_REG(0303) */ +#define OVRD_LN_TX_DRV_LVL_CTRL_MASK BIT(5) +#define LN_TX_DRV_LVL_CTRL_MASK GENMASK(4, 0) +/* LANE_REG(0304) */ +#define OVRD_LN_TX_DRV_POST_LVL_CTRL_MASK BIT(4) +#define LN_TX_DRV_POST_LVL_CTRL_MASK GENMASK(3, 0) +/* LANE_REG(0305) */ +#define OVRD_LN_TX_DRV_PRE_LVL_CTRL_MASK BIT(6) +#define LN_TX_DRV_PRE_LVL_CTRL_MASK GENMASK(5, 2) +/* LANE_REG(0306) */ +#define LN_ANA_TX_DRV_IDRV_IDN_CTRL_MASK GENMASK(7, 5) +#define LN_ANA_TX_DRV_IDRV_IUP_CTRL_MASK GENMASK(4, 2) +#define LN_ANA_TX_DRV_ACCDRV_EN_MASK BIT(0) +/* LANE_REG(0307) */ +#define LN_ANA_TX_DRV_ACCDRV_POL_SEL_MASK BIT(6) +#define LN_ANA_TX_DRV_ACCDRV_CTRL_MASK GENMASK(5, 3) +/* LANE_REG(030a) */ +#define LN_ANA_TX_JEQ_EN_MASK BIT(4) +#define LN_TX_JEQ_EVEN_CTRL_RBR_MASK GENMASK(3, 0) +/* LANE_REG(030b) */ +#define LN_TX_JEQ_EVEN_CTRL_HBR_MASK GENMASK(7, 4) +#define LN_TX_JEQ_EVEN_CTRL_HBR2_MASK GENMASK(3, 0) +/* LANE_REG(030c) */ +#define LN_TX_JEQ_ODD_CTRL_RBR_MASK GENMASK(3, 0) +/* LANE_REG(030d) */ +#define LN_TX_JEQ_ODD_CTRL_HBR_MASK GENMASK(7, 4) +#define LN_TX_JEQ_ODD_CTRL_HBR2_MASK GENMASK(3, 0) +/* LANE_REG(0310) */ +#define LN_ANA_TX_SYNC_LOSS_DET_MODE_MASK GENMASK(1, 0) +/* LANE_REG(0311) */ +#define LN_TX_SER_40BIT_EN_RBR_MASK BIT(3) +#define LN_TX_SER_40BIT_EN_HBR_MASK BIT(2) +#define LN_TX_SER_40BIT_EN_HBR2_MASK BIT(1) /* LANE_REG(0312) */ #define LN0_TX_SER_RATE_SEL_RBR_MASK BIT(5) #define LN0_TX_SER_RATE_SEL_HBR_MASK BIT(4) #define LN0_TX_SER_RATE_SEL_HBR2_MASK BIT(3) #define LN0_TX_SER_RATE_SEL_HBR3_MASK BIT(2) +/* LANE_REG(0316) */ +#define LN_ANA_TX_SER_VREG_GAIN_CTRL_MASK GENMASK(3, 0) +/* LANE_REG(031B) */ +#define LN_ANA_TX_RESERVED_MASK GENMASK(7, 0) +/* LANE_REG(031e) */ +#define LN_POLARITY_INV_MASK BIT(2) +#define LN_LANE_MODE_MASK BIT(1) + /* LANE_REG(0412) */ #define LN1_TX_SER_RATE_SEL_RBR_MASK BIT(5) #define LN1_TX_SER_RATE_SEL_HBR_MASK BIT(4) #define LN1_TX_SER_RATE_SEL_HBR2_MASK BIT(3) #define LN1_TX_SER_RATE_SEL_HBR3_MASK BIT(2) + /* LANE_REG(0512) */ #define LN2_TX_SER_RATE_SEL_RBR_MASK BIT(5) #define LN2_TX_SER_RATE_SEL_HBR_MASK BIT(4) #define LN2_TX_SER_RATE_SEL_HBR2_MASK BIT(3) #define LN2_TX_SER_RATE_SEL_HBR3_MASK BIT(2) + /* LANE_REG(0612) */ #define LN3_TX_SER_RATE_SEL_RBR_MASK BIT(5) #define LN3_TX_SER_RATE_SEL_HBR_MASK BIT(4) @@ -194,6 +322,12 @@ #define HDMI20_MAX_RATE 600000000 +enum dp_link_rate { + DP_BW_RBR, + DP_BW_HBR, + DP_BW_HBR2, +}; + struct lcpll_config { u32 bit_rate; u8 lcvco_mode_en; @@ -255,6 +389,19 @@ struct ropll_config { u8 cd_tx_ser_rate_sel; }; +struct tx_drv_ctrl { + u8 tx_drv_lvl_ctrl; + u8 tx_drv_post_lvl_ctrl; + u8 ana_tx_drv_idrv_idn_ctrl; + u8 ana_tx_drv_idrv_iup_ctrl; + u8 ana_tx_drv_accdrv_en; + u8 ana_tx_drv_accdrv_ctrl; + u8 tx_drv_pre_lvl_ctrl; + u8 ana_tx_jeq_en; + u8 tx_jeq_even_ctrl; + u8 tx_jeq_odd_ctrl; +}; + enum rk_hdptx_reset { RST_APB = 0, RST_INIT, @@ -557,6 +704,90 @@ static const struct reg_sequence rk_hdtpx_tmds_lane_init_seq[] = { REG_SEQ0(LANE_REG(0606), 0x1c), }; +static struct tx_drv_ctrl tx_drv_ctrl_rbr[4][4] = { + /* voltage swing 0, pre-emphasis 0->3 */ + { + { 0x2, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0x4, 0x3, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0x7, 0x6, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0xd, 0xc, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 1, pre-emphasis 0->2 */ + { + { 0x4, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0x9, 0x5, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0xc, 0x8, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 2, pre-emphasis 0->1 */ + { + { 0x8, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0xc, 0x5, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 3, pre-emphasis 0 */ + { + { 0xb, 0x0, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 }, + } +}; + +static struct tx_drv_ctrl tx_drv_ctrl_hbr[4][4] = { + /* voltage swing 0, pre-emphasis 0->3 */ + { + { 0x2, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0x9, 0x8, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0xd, 0xc, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 1, pre-emphasis 0->2 */ + { + { 0x6, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0xa, 0x6, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0xc, 0x8, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 2, pre-emphasis 0->1 */ + { + { 0x9, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0xd, 0x6, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 3, pre-emphasis 0 */ + { + { 0xc, 0x1, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 }, + } +}; + +static struct tx_drv_ctrl tx_drv_ctrl_hbr2[4][4] = { + /* voltage swing 0, pre-emphasis 0->3 */ + { + { 0x2, 0x1, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0x9, 0x8, 0x4, 0x6, 0x1, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0xd, 0xc, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 1, pre-emphasis 0->2 */ + { + { 0x6, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0xb, 0x7, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 }, + { 0xd, 0x9, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 2, pre-emphasis 0->1 */ + { + { 0x8, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 }, + { 0xc, 0x6, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 }, + }, + + /* voltage swing 3, pre-emphasis 0 */ + { + { 0xb, 0x0, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 }, + } +}; + static bool rk_hdptx_phy_is_rw_reg(struct device *dev, unsigned int reg) { switch (reg) { @@ -899,11 +1130,297 @@ static int rk_hdptx_phy_consumer_put(struct rk_hdptx_phy *hdptx, bool force) return ret; } +static void rk_hdptx_dp_reset(struct rk_hdptx_phy *hdptx) +{ + reset_control_assert(hdptx->rsts[RST_LANE].rstc); + reset_control_assert(hdptx->rsts[RST_CMN].rstc); + reset_control_assert(hdptx->rsts[RST_INIT].rstc); + + reset_control_assert(hdptx->rsts[RST_APB].rstc); + udelay(10); + reset_control_deassert(hdptx->rsts[RST_APB].rstc); + + regmap_update_bits(hdptx->regmap, LANE_REG(0301), + OVRD_LN_TX_DRV_EI_EN_MASK | LN_TX_DRV_EI_EN_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_EI_EN_MASK, 1) | + FIELD_PREP(LN_TX_DRV_EI_EN_MASK, 0)); + regmap_update_bits(hdptx->regmap, LANE_REG(0401), + OVRD_LN_TX_DRV_EI_EN_MASK | LN_TX_DRV_EI_EN_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_EI_EN_MASK, 1) | + FIELD_PREP(LN_TX_DRV_EI_EN_MASK, 0)); + regmap_update_bits(hdptx->regmap, LANE_REG(0501), + OVRD_LN_TX_DRV_EI_EN_MASK | LN_TX_DRV_EI_EN_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_EI_EN_MASK, 1) | + FIELD_PREP(LN_TX_DRV_EI_EN_MASK, 0)); + regmap_update_bits(hdptx->regmap, LANE_REG(0601), + OVRD_LN_TX_DRV_EI_EN_MASK | LN_TX_DRV_EI_EN_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_EI_EN_MASK, 1) | + FIELD_PREP(LN_TX_DRV_EI_EN_MASK, 0)); + + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_PLL_EN << 16 | FIELD_PREP(HDPTX_I_PLL_EN, 0x0)); + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_BIAS_EN << 16 | FIELD_PREP(HDPTX_I_BIAS_EN, 0x0)); + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_BGR_EN << 16 | FIELD_PREP(HDPTX_I_BGR_EN, 0x0)); +} + +static void rk_hdptx_dp_pll_init(struct rk_hdptx_phy *hdptx) +{ + regmap_update_bits(hdptx->regmap, CMN_REG(003c), ANA_LCPLL_RESERVED7_MASK, + FIELD_PREP(ANA_LCPLL_RESERVED7_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0046), + ROPLL_ANA_CPP_CTRL_COARSE_MASK | ROPLL_ANA_CPP_CTRL_FINE_MASK, + FIELD_PREP(ROPLL_ANA_CPP_CTRL_COARSE_MASK, 0xe) | + FIELD_PREP(ROPLL_ANA_CPP_CTRL_FINE_MASK, 0xe)); + regmap_update_bits(hdptx->regmap, CMN_REG(0047), + ROPLL_ANA_LPF_C_SEL_COARSE_MASK | + ROPLL_ANA_LPF_C_SEL_FINE_MASK, + FIELD_PREP(ROPLL_ANA_LPF_C_SEL_COARSE_MASK, 0x4) | + FIELD_PREP(ROPLL_ANA_LPF_C_SEL_FINE_MASK, 0x4)); + + regmap_write(hdptx->regmap, CMN_REG(0051), FIELD_PREP(ROPLL_PMS_MDIV_MASK, 0x87)); + regmap_write(hdptx->regmap, CMN_REG(0052), FIELD_PREP(ROPLL_PMS_MDIV_MASK, 0x71)); + regmap_write(hdptx->regmap, CMN_REG(0053), FIELD_PREP(ROPLL_PMS_MDIV_MASK, 0x71)); + + regmap_write(hdptx->regmap, CMN_REG(0055), + FIELD_PREP(ROPLL_PMS_MDIV_AFC_MASK, 0x87)); + regmap_write(hdptx->regmap, CMN_REG(0056), + FIELD_PREP(ROPLL_PMS_MDIV_AFC_MASK, 0x71)); + regmap_write(hdptx->regmap, CMN_REG(0057), + FIELD_PREP(ROPLL_PMS_MDIV_AFC_MASK, 0x71)); + + regmap_write(hdptx->regmap, CMN_REG(0059), + FIELD_PREP(ANA_ROPLL_PMS_PDIV_MASK, 0x1) | + FIELD_PREP(ANA_ROPLL_PMS_REFDIV_MASK, 0x1)); + regmap_write(hdptx->regmap, CMN_REG(005a), + FIELD_PREP(ROPLL_PMS_SDIV_RBR_MASK, 0x3) | + FIELD_PREP(ROPLL_PMS_SDIV_HBR_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(005b), ROPLL_PMS_SDIV_HBR2_MASK, + FIELD_PREP(ROPLL_PMS_SDIV_HBR2_MASK, 0x0)); + + regmap_update_bits(hdptx->regmap, CMN_REG(005e), ROPLL_SDM_EN_MASK, + FIELD_PREP(ROPLL_SDM_EN_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(005e), + OVRD_ROPLL_SDM_RSTN_MASK | ROPLL_SDM_RSTN_MASK, + FIELD_PREP(OVRD_ROPLL_SDM_RSTN_MASK, 0x1) | + FIELD_PREP(ROPLL_SDM_RSTN_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(005e), ROPLL_SDC_FRAC_EN_RBR_MASK, + FIELD_PREP(ROPLL_SDC_FRAC_EN_RBR_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(005e), ROPLL_SDC_FRAC_EN_HBR_MASK, + FIELD_PREP(ROPLL_SDC_FRAC_EN_HBR_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(005e), ROPLL_SDC_FRAC_EN_HBR2_MASK, + FIELD_PREP(ROPLL_SDC_FRAC_EN_HBR2_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, CMN_REG(005f), + OVRD_ROPLL_SDC_RSTN_MASK | ROPLL_SDC_RSTN_MASK, + FIELD_PREP(OVRD_ROPLL_SDC_RSTN_MASK, 0x1) | + FIELD_PREP(ROPLL_SDC_RSTN_MASK, 0x1)); + regmap_write(hdptx->regmap, CMN_REG(0060), + FIELD_PREP(ROPLL_SDM_DENOMINATOR_MASK, 0x21)); + regmap_write(hdptx->regmap, CMN_REG(0061), + FIELD_PREP(ROPLL_SDM_DENOMINATOR_MASK, 0x27)); + regmap_write(hdptx->regmap, CMN_REG(0062), + FIELD_PREP(ROPLL_SDM_DENOMINATOR_MASK, 0x27)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0064), + ROPLL_SDM_NUM_SIGN_RBR_MASK | + ROPLL_SDM_NUM_SIGN_HBR_MASK | + ROPLL_SDM_NUM_SIGN_HBR2_MASK, + FIELD_PREP(ROPLL_SDM_NUM_SIGN_RBR_MASK, 0x0) | + FIELD_PREP(ROPLL_SDM_NUM_SIGN_HBR_MASK, 0x1) | + FIELD_PREP(ROPLL_SDM_NUM_SIGN_HBR2_MASK, 0x1)); + regmap_write(hdptx->regmap, CMN_REG(0065), + FIELD_PREP(ROPLL_SDM_NUM_MASK, 0x0)); + regmap_write(hdptx->regmap, CMN_REG(0066), + FIELD_PREP(ROPLL_SDM_NUM_MASK, 0xd)); + regmap_write(hdptx->regmap, CMN_REG(0067), + FIELD_PREP(ROPLL_SDM_NUM_MASK, 0xd)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0069), ROPLL_SDC_N_RBR_MASK, + FIELD_PREP(ROPLL_SDC_N_RBR_MASK, 0x2)); + + regmap_update_bits(hdptx->regmap, CMN_REG(006a), + ROPLL_SDC_N_HBR_MASK | ROPLL_SDC_N_HBR2_MASK, + FIELD_PREP(ROPLL_SDC_N_HBR_MASK, 0x1) | + FIELD_PREP(ROPLL_SDC_N_HBR2_MASK, 0x1)); + + regmap_write(hdptx->regmap, CMN_REG(006c), + FIELD_PREP(ROPLL_SDC_NUM_MASK, 0x3)); + regmap_write(hdptx->regmap, CMN_REG(006d), + FIELD_PREP(ROPLL_SDC_NUM_MASK, 0x7)); + regmap_write(hdptx->regmap, CMN_REG(006e), + FIELD_PREP(ROPLL_SDC_NUM_MASK, 0x7)); + + regmap_write(hdptx->regmap, CMN_REG(0070), + FIELD_PREP(ROPLL_SDC_DENO_MASK, 0x8)); + regmap_write(hdptx->regmap, CMN_REG(0071), + FIELD_PREP(ROPLL_SDC_DENO_MASK, 0x18)); + regmap_write(hdptx->regmap, CMN_REG(0072), + FIELD_PREP(ROPLL_SDC_DENO_MASK, 0x18)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0074), + OVRD_ROPLL_SDC_NDIV_RSTN_MASK | ROPLL_SDC_NDIV_RSTN_MASK, + FIELD_PREP(OVRD_ROPLL_SDC_NDIV_RSTN_MASK, 0x1) | + FIELD_PREP(ROPLL_SDC_NDIV_RSTN_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0077), ANA_ROPLL_SSC_CLK_DIV_SEL_MASK, + FIELD_PREP(ANA_ROPLL_SSC_CLK_DIV_SEL_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0081), ANA_PLL_CD_TX_SER_RATE_SEL_MASK, + FIELD_PREP(ANA_PLL_CD_TX_SER_RATE_SEL_MASK, 0x0)); + regmap_update_bits(hdptx->regmap, CMN_REG(0081), + ANA_PLL_CD_HSCLK_EAST_EN_MASK | ANA_PLL_CD_HSCLK_WEST_EN_MASK, + FIELD_PREP(ANA_PLL_CD_HSCLK_EAST_EN_MASK, 0x1) | + FIELD_PREP(ANA_PLL_CD_HSCLK_WEST_EN_MASK, 0x0)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0082), ANA_PLL_CD_VREG_GAIN_CTRL_MASK, + FIELD_PREP(ANA_PLL_CD_VREG_GAIN_CTRL_MASK, 0x4)); + regmap_update_bits(hdptx->regmap, CMN_REG(0083), ANA_PLL_CD_VREG_ICTRL_MASK, + FIELD_PREP(ANA_PLL_CD_VREG_ICTRL_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(0084), PLL_LCRO_CLK_SEL_MASK, + FIELD_PREP(PLL_LCRO_CLK_SEL_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(0085), ANA_PLL_SYNC_LOSS_DET_MODE_MASK, + FIELD_PREP(ANA_PLL_SYNC_LOSS_DET_MODE_MASK, 0x3)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0087), ANA_PLL_TX_HS_CLK_EN_MASK, + FIELD_PREP(ANA_PLL_TX_HS_CLK_EN_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0097), DIG_CLK_SEL_MASK, + FIELD_PREP(DIG_CLK_SEL_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0099), CMN_ROPLL_ALONE_MODE, + FIELD_PREP(CMN_ROPLL_ALONE_MODE, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(009a), HS_SPEED_SEL_MASK, + FIELD_PREP(HS_SPEED_SEL_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, CMN_REG(009b), LS_SPEED_SEL_MASK, + FIELD_PREP(LS_SPEED_SEL_MASK, 0x1)); +} + +static int rk_hdptx_dp_aux_init(struct rk_hdptx_phy *hdptx) +{ + u32 status; + int ret; + + regmap_update_bits(hdptx->regmap, SB_REG(0102), ANA_SB_RXTERM_OFFSP_MASK, + FIELD_PREP(ANA_SB_RXTERM_OFFSP_MASK, 0x3)); + regmap_update_bits(hdptx->regmap, SB_REG(0103), ANA_SB_RXTERM_OFFSN_MASK, + FIELD_PREP(ANA_SB_RXTERM_OFFSN_MASK, 0x3)); + regmap_update_bits(hdptx->regmap, SB_REG(0104), SB_AUX_EN_MASK, + FIELD_PREP(SB_AUX_EN_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, SB_REG(0105), ANA_SB_TX_HLVL_PROG_MASK, + FIELD_PREP(ANA_SB_TX_HLVL_PROG_MASK, 0x7)); + regmap_update_bits(hdptx->regmap, SB_REG(0106), ANA_SB_TX_LLVL_PROG_MASK, + FIELD_PREP(ANA_SB_TX_LLVL_PROG_MASK, 0x7)); + + regmap_update_bits(hdptx->regmap, SB_REG(010d), ANA_SB_DMRX_LPBK_DATA_MASK, + FIELD_PREP(ANA_SB_DMRX_LPBK_DATA_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, SB_REG(010f), ANA_SB_VREG_GAIN_CTRL_MASK, + FIELD_PREP(ANA_SB_VREG_GAIN_CTRL_MASK, 0x0)); + regmap_update_bits(hdptx->regmap, SB_REG(0110), + ANA_SB_VREG_OUT_SEL_MASK | ANA_SB_VREG_REF_SEL_MASK, + FIELD_PREP(ANA_SB_VREG_OUT_SEL_MASK, 0x1) | + FIELD_PREP(ANA_SB_VREG_REF_SEL_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, SB_REG(0113), + SB_RX_RCAL_OPT_CODE_MASK | SB_RX_RTERM_CTRL_MASK, + FIELD_PREP(SB_RX_RCAL_OPT_CODE_MASK, 0x1) | + FIELD_PREP(SB_RX_RTERM_CTRL_MASK, 0x3)); + regmap_update_bits(hdptx->regmap, SB_REG(0114), + SB_TG_SB_EN_DELAY_TIME_MASK | SB_TG_RXTERM_EN_DELAY_TIME_MASK, + FIELD_PREP(SB_TG_SB_EN_DELAY_TIME_MASK, 0x2) | + FIELD_PREP(SB_TG_RXTERM_EN_DELAY_TIME_MASK, 0x2)); + regmap_update_bits(hdptx->regmap, SB_REG(0115), + SB_READY_DELAY_TIME_MASK | SB_TG_OSC_EN_DELAY_TIME_MASK, + FIELD_PREP(SB_READY_DELAY_TIME_MASK, 0x2) | + FIELD_PREP(SB_TG_OSC_EN_DELAY_TIME_MASK, 0x2)); + regmap_update_bits(hdptx->regmap, SB_REG(0116), + AFC_RSTN_DELAY_TIME_MASK, + FIELD_PREP(AFC_RSTN_DELAY_TIME_MASK, 0x2)); + regmap_update_bits(hdptx->regmap, SB_REG(0117), + FAST_PULSE_TIME_MASK, + FIELD_PREP(FAST_PULSE_TIME_MASK, 0x4)); + regmap_update_bits(hdptx->regmap, SB_REG(0118), + SB_TG_EARC_DMRX_RECVRD_CLK_CNT_MASK, + FIELD_PREP(SB_TG_EARC_DMRX_RECVRD_CLK_CNT_MASK, 0xa)); + + regmap_update_bits(hdptx->regmap, SB_REG(011a), SB_TG_CNT_RUN_NO_7_0_MASK, + FIELD_PREP(SB_TG_CNT_RUN_NO_7_0_MASK, 0x3)); + regmap_update_bits(hdptx->regmap, SB_REG(011b), + SB_EARC_SIG_DET_BYPASS_MASK | SB_AFC_TOL_MASK, + FIELD_PREP(SB_EARC_SIG_DET_BYPASS_MASK, 0x1) | + FIELD_PREP(SB_AFC_TOL_MASK, 0x3)); + regmap_update_bits(hdptx->regmap, SB_REG(011c), SB_AFC_STB_NUM_MASK, + FIELD_PREP(SB_AFC_STB_NUM_MASK, 0x4)); + regmap_update_bits(hdptx->regmap, SB_REG(011d), SB_TG_OSC_CNT_MIN_MASK, + FIELD_PREP(SB_TG_OSC_CNT_MIN_MASK, 0x67)); + regmap_update_bits(hdptx->regmap, SB_REG(011e), SB_TG_OSC_CNT_MAX_MASK, + FIELD_PREP(SB_TG_OSC_CNT_MAX_MASK, 0x6a)); + regmap_update_bits(hdptx->regmap, SB_REG(011f), SB_PWM_AFC_CTRL_MASK, + FIELD_PREP(SB_PWM_AFC_CTRL_MASK, 0x5)); + regmap_update_bits(hdptx->regmap, SB_REG(011f), SB_RCAL_RSTN_MASK, + FIELD_PREP(SB_RCAL_RSTN_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, SB_REG(0120), SB_AUX_EN_IN_MASK, + FIELD_PREP(SB_AUX_EN_IN_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, SB_REG(0102), OVRD_SB_RXTERM_EN_MASK, + FIELD_PREP(OVRD_SB_RXTERM_EN_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, SB_REG(0103), OVRD_SB_RX_RESCAL_DONE_MASK, + FIELD_PREP(OVRD_SB_RX_RESCAL_DONE_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, SB_REG(0104), OVRD_SB_EN_MASK, + FIELD_PREP(OVRD_SB_EN_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, SB_REG(0104), OVRD_SB_AUX_EN_MASK, + FIELD_PREP(OVRD_SB_AUX_EN_MASK, 0x1)); + + regmap_update_bits(hdptx->regmap, SB_REG(010f), OVRD_SB_VREG_EN_MASK, + FIELD_PREP(OVRD_SB_VREG_EN_MASK, 0x1)); + + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_BGR_EN << 16 | FIELD_PREP(HDPTX_I_BGR_EN, 0x1)); + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_BIAS_EN << 16 | FIELD_PREP(HDPTX_I_BIAS_EN, 0x1)); + usleep_range(20, 25); + + reset_control_deassert(hdptx->rsts[RST_INIT].rstc); + usleep_range(20, 25); + reset_control_deassert(hdptx->rsts[RST_CMN].rstc); + usleep_range(20, 25); + + regmap_update_bits(hdptx->regmap, SB_REG(0103), OVRD_SB_RX_RESCAL_DONE_MASK, + FIELD_PREP(OVRD_SB_RX_RESCAL_DONE_MASK, 0x1)); + usleep_range(100, 110); + regmap_update_bits(hdptx->regmap, SB_REG(0104), SB_EN_MASK, + FIELD_PREP(SB_EN_MASK, 0x1)); + usleep_range(100, 110); + regmap_update_bits(hdptx->regmap, SB_REG(0102), SB_RXTERM_EN_MASK, + FIELD_PREP(SB_RXTERM_EN_MASK, 0x1)); + usleep_range(20, 25); + regmap_update_bits(hdptx->regmap, SB_REG(010f), SB_VREG_EN_MASK, + FIELD_PREP(SB_VREG_EN_MASK, 0x1)); + usleep_range(20, 25); + regmap_update_bits(hdptx->regmap, SB_REG(0104), SB_AUX_EN_MASK, + FIELD_PREP(SB_AUX_EN_MASK, 0x1)); + usleep_range(100, 110); + + ret = regmap_read_poll_timeout(hdptx->grf, GRF_HDPTX_STATUS, + status, FIELD_GET(HDPTX_O_SB_RDY, status), + 50, 1000); + if (ret) { + dev_err(hdptx->dev, "Failed to get phy sb ready: %d\n", ret); + return ret; + } + + return 0; +} + static int rk_hdptx_phy_power_on(struct phy *phy) { struct rk_hdptx_phy *hdptx = phy_get_drvdata(phy); int bus_width = phy_get_bus_width(hdptx->phy); - int ret; + enum phy_mode mode = phy_get_mode(phy); + int ret, lane; /* * FIXME: Temporary workaround to pass pixel_clk_rate @@ -915,13 +1432,43 @@ static int rk_hdptx_phy_power_on(struct phy *phy) dev_dbg(hdptx->dev, "%s bus_width=%x rate=%u\n", __func__, bus_width, rate); - ret = rk_hdptx_phy_consumer_get(hdptx, rate); - if (ret) - return ret; + if (mode == PHY_MODE_DP) { + rk_hdptx_dp_reset(hdptx); - ret = rk_hdptx_ropll_tmds_mode_config(hdptx, rate); - if (ret) - rk_hdptx_phy_consumer_put(hdptx, true); + for (lane = 0; lane < 4; lane++) { + regmap_update_bits(hdptx->regmap, LANE_REG(031e) + 0x400 * lane, + LN_POLARITY_INV_MASK | LN_LANE_MODE_MASK, + FIELD_PREP(LN_POLARITY_INV_MASK, 0) | + FIELD_PREP(LN_LANE_MODE_MASK, 1)); + } + + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_MODE_SEL << 16 | FIELD_PREP(HDPTX_MODE_SEL, 0x1)); + + regmap_update_bits(hdptx->regmap, LNTOP_REG(0200), PROTOCOL_SEL, + FIELD_PREP(PROTOCOL_SEL, 0x0)); + regmap_update_bits(hdptx->regmap, LNTOP_REG(0206), DATA_BUS_WIDTH_MASK, + FIELD_PREP(DATA_BUS_WIDTH_MASK, 0x1)); + regmap_update_bits(hdptx->regmap, LNTOP_REG(0206), DATA_BUS_WIDTH_SEL_MASK, + FIELD_PREP(DATA_BUS_WIDTH_SEL_MASK, 0x0)); + + rk_hdptx_dp_pll_init(hdptx); + + ret = rk_hdptx_dp_aux_init(hdptx); + if (ret) + pm_runtime_put(hdptx->dev); + } else { + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_MODE_SEL << 16 | FIELD_PREP(HDPTX_MODE_SEL, 0x0)); + + ret = rk_hdptx_phy_consumer_get(hdptx, rate); + if (ret) + return ret; + + ret = rk_hdptx_ropll_tmds_mode_config(hdptx, rate); + if (ret) + rk_hdptx_phy_consumer_put(hdptx, true); + } return ret; } @@ -933,9 +1480,337 @@ static int rk_hdptx_phy_power_off(struct phy *phy) return rk_hdptx_phy_consumer_put(hdptx, false); } +static int rk_hdptx_phy_set_mode(struct phy *phy, enum phy_mode mode, + int submode) +{ + return 0; +} + +static int rk_hdptx_phy_verify_config(struct rk_hdptx_phy *hdptx, + struct phy_configure_opts_dp *dp) +{ + int i; + + if (dp->set_rate) { + switch (dp->link_rate) { + case 1620: + case 2700: + case 5400: + break; + default: + return -EINVAL; + } + } + + if (dp->set_lanes) { + switch (dp->lanes) { + case 0: + case 1: + case 2: + case 4: + break; + default: + return -EINVAL; + } + } + + if (dp->set_voltages) { + for (i = 0; i < dp->lanes; i++) { + if (dp->voltage[i] > 3 || dp->pre[i] > 3) + return -EINVAL; + + if (dp->voltage[i] + dp->pre[i] > 3) + return -EINVAL; + } + } + + return 0; +} + +static int rk_hdptx_phy_set_rate(struct rk_hdptx_phy *hdptx, + struct phy_configure_opts_dp *dp) +{ + u32 bw, status; + int ret; + + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_PLL_EN << 16 | FIELD_PREP(HDPTX_I_PLL_EN, 0x0)); + + switch (dp->link_rate) { + case 1620: + bw = DP_BW_RBR; + break; + case 2700: + bw = DP_BW_HBR; + break; + case 5400: + bw = DP_BW_HBR2; + break; + default: + return -EINVAL; + } + + regmap_update_bits(hdptx->regmap, CMN_REG(0008), OVRD_LCPLL_EN_MASK | LCPLL_EN_MASK, + FIELD_PREP(OVRD_LCPLL_EN_MASK, 0x1) | + FIELD_PREP(LCPLL_EN_MASK, 0x0)); + + regmap_update_bits(hdptx->regmap, CMN_REG(003d), OVRD_ROPLL_EN_MASK | ROPLL_EN_MASK, + FIELD_PREP(OVRD_ROPLL_EN_MASK, 0x1) | + FIELD_PREP(ROPLL_EN_MASK, 0x1)); + + if (dp->ssc) { + regmap_update_bits(hdptx->regmap, CMN_REG(0074), + OVRD_ROPLL_SSC_EN_MASK | ROPLL_SSC_EN_MASK, + FIELD_PREP(OVRD_ROPLL_SSC_EN_MASK, 0x1) | + FIELD_PREP(ROPLL_SSC_EN_MASK, 0x1)); + regmap_write(hdptx->regmap, CMN_REG(0075), + FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION_MASK, 0xc)); + regmap_update_bits(hdptx->regmap, CMN_REG(0076), + ANA_ROPLL_SSC_FM_FREQ_MASK, + FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ_MASK, 0x1f)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0099), SSC_EN_MASK, + FIELD_PREP(SSC_EN_MASK, 0x2)); + } else { + regmap_update_bits(hdptx->regmap, CMN_REG(0074), + OVRD_ROPLL_SSC_EN_MASK | ROPLL_SSC_EN_MASK, + FIELD_PREP(OVRD_ROPLL_SSC_EN_MASK, 0x1) | + FIELD_PREP(ROPLL_SSC_EN_MASK, 0x0)); + regmap_write(hdptx->regmap, CMN_REG(0075), + FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION_MASK, 0x20)); + regmap_update_bits(hdptx->regmap, CMN_REG(0076), + ANA_ROPLL_SSC_FM_FREQ_MASK, + FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ_MASK, 0xc)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0099), SSC_EN_MASK, + FIELD_PREP(SSC_EN_MASK, 0x0)); + } + + regmap_update_bits(hdptx->regmap, CMN_REG(0095), DP_TX_LINK_BW_MASK, + FIELD_PREP(DP_TX_LINK_BW_MASK, bw)); + + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_PLL_EN << 16 | FIELD_PREP(HDPTX_I_PLL_EN, 0x1)); + + ret = regmap_read_poll_timeout(hdptx->grf, GRF_HDPTX_STATUS, + status, FIELD_GET(HDPTX_O_PLL_LOCK_DONE, status), + 50, 1000); + if (ret) { + dev_err(hdptx->dev, "Failed to get phy pll lock: %d\n", ret); + return ret; + } + + return 0; +} + +static void rk_hdptx_phy_lane_disable(struct rk_hdptx_phy *hdptx) +{ + reset_control_assert(hdptx->rsts[RST_LANE].rstc); + + regmap_update_bits(hdptx->regmap, LNTOP_REG(0207), LANE_EN, + FIELD_PREP(LANE_EN, 0x0)); + + regmap_write(hdptx->grf, GRF_HDPTX_CON0, + HDPTX_I_PLL_EN << 16 | FIELD_PREP(HDPTX_I_PLL_EN, 0x0)); + + regmap_update_bits(hdptx->regmap, CMN_REG(0008), OVRD_LCPLL_EN_MASK | LCPLL_EN_MASK, + FIELD_PREP(OVRD_LCPLL_EN_MASK, 0x1) | + FIELD_PREP(LCPLL_EN_MASK, 0x0)); + + regmap_update_bits(hdptx->regmap, CMN_REG(003d), OVRD_ROPLL_EN_MASK | ROPLL_EN_MASK, + FIELD_PREP(OVRD_ROPLL_EN_MASK, 0x1) | + FIELD_PREP(ROPLL_EN_MASK, 0x0)); +} + +static int rk_hdptx_phy_set_lanes(struct rk_hdptx_phy *hdptx, + struct phy_configure_opts_dp *dp) +{ + if (!dp->lanes) { + rk_hdptx_phy_lane_disable(hdptx); + return 0; + } + + regmap_update_bits(hdptx->regmap, LNTOP_REG(0207), LANE_EN, + FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0))); + + return 0; +} + +static void rk_hdptx_phy_set_voltage(struct rk_hdptx_phy *hdptx, + struct phy_configure_opts_dp *dp, + u8 lane) +{ + const struct tx_drv_ctrl *ctrl; + u32 offset = lane * 0x400; + + switch (dp->link_rate) { + case 1620: + ctrl = &tx_drv_ctrl_rbr[dp->voltage[lane]][dp->pre[lane]]; + regmap_update_bits(hdptx->regmap, LANE_REG(030a) + offset, + LN_TX_JEQ_EVEN_CTRL_RBR_MASK, + FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_RBR_MASK, + ctrl->tx_jeq_even_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(030c) + offset, + LN_TX_JEQ_ODD_CTRL_RBR_MASK, + FIELD_PREP(LN_TX_JEQ_ODD_CTRL_RBR_MASK, + ctrl->tx_jeq_odd_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(0311) + offset, + LN_TX_SER_40BIT_EN_RBR_MASK, + FIELD_PREP(LN_TX_SER_40BIT_EN_RBR_MASK, 0x1)); + break; + case 2700: + ctrl = &tx_drv_ctrl_hbr[dp->voltage[lane]][dp->pre[lane]]; + regmap_update_bits(hdptx->regmap, LANE_REG(030b) + offset, + LN_TX_JEQ_EVEN_CTRL_HBR_MASK, + FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR_MASK, + ctrl->tx_jeq_even_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(030d) + offset, + LN_TX_JEQ_ODD_CTRL_HBR_MASK, + FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR_MASK, + ctrl->tx_jeq_odd_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(0311) + offset, + LN_TX_SER_40BIT_EN_HBR_MASK, + FIELD_PREP(LN_TX_SER_40BIT_EN_HBR_MASK, 0x1)); + break; + case 5400: + default: + ctrl = &tx_drv_ctrl_hbr2[dp->voltage[lane]][dp->pre[lane]]; + regmap_update_bits(hdptx->regmap, LANE_REG(030b) + offset, + LN_TX_JEQ_EVEN_CTRL_HBR2_MASK, + FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR2_MASK, + ctrl->tx_jeq_even_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(030d) + offset, + LN_TX_JEQ_ODD_CTRL_HBR2_MASK, + FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR2_MASK, + ctrl->tx_jeq_odd_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(0311) + offset, + LN_TX_SER_40BIT_EN_HBR2_MASK, + FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2_MASK, 0x1)); + break; + } + + regmap_update_bits(hdptx->regmap, LANE_REG(0303) + offset, + OVRD_LN_TX_DRV_LVL_CTRL_MASK | LN_TX_DRV_LVL_CTRL_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_LVL_CTRL_MASK, 0x1) | + FIELD_PREP(LN_TX_DRV_LVL_CTRL_MASK, + ctrl->tx_drv_lvl_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(0304) + offset, + OVRD_LN_TX_DRV_POST_LVL_CTRL_MASK | + LN_TX_DRV_POST_LVL_CTRL_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_POST_LVL_CTRL_MASK, 0x1) | + FIELD_PREP(LN_TX_DRV_POST_LVL_CTRL_MASK, + ctrl->tx_drv_post_lvl_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(0305) + offset, + OVRD_LN_TX_DRV_PRE_LVL_CTRL_MASK | + LN_TX_DRV_PRE_LVL_CTRL_MASK, + FIELD_PREP(OVRD_LN_TX_DRV_PRE_LVL_CTRL_MASK, 0x1) | + FIELD_PREP(LN_TX_DRV_PRE_LVL_CTRL_MASK, + ctrl->tx_drv_pre_lvl_ctrl)); + regmap_update_bits(hdptx->regmap, LANE_REG(0306) + offset, + LN_ANA_TX_DRV_IDRV_IDN_CTRL_MASK | + LN_ANA_TX_DRV_IDRV_IUP_CTRL_MASK | + LN_ANA_TX_DRV_ACCDRV_EN_MASK, + FIELD_PREP(LN_ANA_TX_DRV_IDRV_IDN_CTRL_MASK, + ctrl->ana_tx_drv_idrv_idn_ctrl) | + FIELD_PREP(LN_ANA_TX_DRV_IDRV_IUP_CTRL_MASK, + ctrl->ana_tx_drv_idrv_iup_ctrl) | + FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_EN_MASK, + ctrl->ana_tx_drv_accdrv_en)); + regmap_update_bits(hdptx->regmap, LANE_REG(0307) + offset, + LN_ANA_TX_DRV_ACCDRV_POL_SEL_MASK | + LN_ANA_TX_DRV_ACCDRV_CTRL_MASK, + FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_POL_SEL_MASK, 0x1) | + FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_CTRL_MASK, + ctrl->ana_tx_drv_accdrv_ctrl)); + + regmap_update_bits(hdptx->regmap, LANE_REG(030a) + offset, + LN_ANA_TX_JEQ_EN_MASK, + FIELD_PREP(LN_ANA_TX_JEQ_EN_MASK, ctrl->ana_tx_jeq_en)); + + regmap_update_bits(hdptx->regmap, LANE_REG(0310) + offset, + LN_ANA_TX_SYNC_LOSS_DET_MODE_MASK, + FIELD_PREP(LN_ANA_TX_SYNC_LOSS_DET_MODE_MASK, 0x3)); + + regmap_update_bits(hdptx->regmap, LANE_REG(0316) + offset, + LN_ANA_TX_SER_VREG_GAIN_CTRL_MASK, + FIELD_PREP(LN_ANA_TX_SER_VREG_GAIN_CTRL_MASK, 0x2)); + + regmap_update_bits(hdptx->regmap, LANE_REG(031b) + offset, + LN_ANA_TX_RESERVED_MASK, + FIELD_PREP(LN_ANA_TX_RESERVED_MASK, 0x1)); +} + +static int rk_hdptx_phy_set_voltages(struct rk_hdptx_phy *hdptx, + struct phy_configure_opts_dp *dp) +{ + u8 lane; + u32 status; + int ret; + + for (lane = 0; lane < dp->lanes; lane++) + rk_hdptx_phy_set_voltage(hdptx, dp, lane); + + reset_control_deassert(hdptx->rsts[RST_LANE].rstc); + + ret = regmap_read_poll_timeout(hdptx->grf, GRF_HDPTX_STATUS, + status, FIELD_GET(HDPTX_O_PHY_RDY, status), + 50, 5000); + if (ret) { + dev_err(hdptx->dev, "Failed to get phy ready: %d\n", ret); + return ret; + } + + return 0; +} + +static int rk_hdptx_phy_configure(struct phy *phy, union phy_configure_opts *opts) +{ + struct rk_hdptx_phy *hdptx = phy_get_drvdata(phy); + enum phy_mode mode = phy_get_mode(phy); + int ret; + + if (mode != PHY_MODE_DP) + return -EINVAL; + + ret = rk_hdptx_phy_verify_config(hdptx, &opts->dp); + if (ret) { + dev_err(hdptx->dev, "invalid params for phy configure\n"); + return ret; + } + + if (opts->dp.set_rate) { + ret = rk_hdptx_phy_set_rate(hdptx, &opts->dp); + if (ret) { + dev_err(hdptx->dev, "failed to set rate: %d\n", ret); + return ret; + } + } + + if (opts->dp.set_lanes) { + ret = rk_hdptx_phy_set_lanes(hdptx, &opts->dp); + if (ret) { + dev_err(hdptx->dev, "failed to set lanes: %d\n", ret); + return ret; + } + } + + if (opts->dp.set_voltages) { + ret = rk_hdptx_phy_set_voltages(hdptx, &opts->dp); + if (ret) { + dev_err(hdptx->dev, "failed to set voltages: %d\n", + ret); + return ret; + } + } + + return 0; +} + static const struct phy_ops rk_hdptx_phy_ops = { .power_on = rk_hdptx_phy_power_on, .power_off = rk_hdptx_phy_power_off, + .set_mode = rk_hdptx_phy_set_mode, + .configure = rk_hdptx_phy_configure, .owner = THIS_MODULE, }; @@ -1149,5 +2024,6 @@ module_platform_driver(rk_hdptx_phy_driver); MODULE_AUTHOR("Algea Cao <algea.cao@rock-chips.com>"); MODULE_AUTHOR("Cristian Ciocaltea <cristian.ciocaltea@collabora.com>"); +MODULE_AUTHOR("Damon Ding <damon.ding@rock-chips.com>"); MODULE_DESCRIPTION("Samsung HDMI/eDP Transmitter Combo PHY Driver"); MODULE_LICENSE("GPL"); -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 06/15] drm/bridge: analogix_dp: Add support for RK3588 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (4 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 05/15] phy: phy-rockchip-samsung-hdptx: Add support for eDP mode Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration Damon Ding ` (8 subsequent siblings) 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding Add max_link_rate and max_lane_count configs for RK3588. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index bfa88409a7ff..6f10d88a34c5 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -1513,6 +1513,10 @@ static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) video_info->max_link_rate = 0x0A; video_info->max_lane_count = 0x04; break; + case RK3588_EDP: + video_info->max_link_rate = 0x14; + video_info->max_lane_count = 0x04; + break; case EXYNOS_DP: /* * NOTE: those property parseing code is used for -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration. 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (5 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 06/15] drm/bridge: analogix_dp: Add support for RK3588 Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-20 0:13 ` Dmitry Baryshkov 2024-12-19 8:05 ` [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus Damon Ding ` (7 subsequent siblings) 14 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding Add support to configurate link rate, lane count, voltage swing and pre-emphasis with phy_configure(). It is helpful in application scenarios where analogix controller is mixed with the phy of other vendors. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v2: - remove needless assignments for phy_configure() - remove unnecessary changes for phy_power_on()/phy_power_off() --- .../drm/bridge/analogix/analogix_dp_core.c | 1 + .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index 6f10d88a34c5..9429c50cc1bc 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -1696,6 +1696,7 @@ int analogix_dp_resume(struct analogix_dp_device *dp) if (dp->plat_data->power_on) dp->plat_data->power_on(dp->plat_data); + phy_set_mode(dp->phy, PHY_MODE_DP); phy_power_on(dp->phy); analogix_dp_init_dp(dp); diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c index 3afc73c858c4..613ce504bea6 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -11,6 +11,7 @@ #include <linux/gpio/consumer.h> #include <linux/io.h> #include <linux/iopoll.h> +#include <linux/phy/phy.h> #include <drm/bridge/analogix_dp.h> @@ -513,10 +514,25 @@ void analogix_dp_enable_sw_function(struct analogix_dp_device *dp) void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype) { u32 reg; + int ret; reg = bwtype; if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62)) writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET); + + if (dp->phy) { + union phy_configure_opts phy_cfg = {0}; + + phy_cfg.dp.lanes = dp->link_train.lane_count; + phy_cfg.dp.link_rate = + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; + phy_cfg.dp.set_rate = true; + ret = phy_configure(dp->phy, &phy_cfg); + if (ret && ret != -EOPNOTSUPP) { + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); + return; + } + } } void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) @@ -530,9 +546,22 @@ void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count) { u32 reg; + int ret; reg = count; writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET); + + if (dp->phy) { + union phy_configure_opts phy_cfg = {0}; + + phy_cfg.dp.lanes = dp->link_train.lane_count; + phy_cfg.dp.set_lanes = true; + ret = phy_configure(dp->phy, &phy_cfg); + if (ret && ret != -EOPNOTSUPP) { + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); + return; + } + } } void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) @@ -546,10 +575,37 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp) { u8 lane; + int ret; for (lane = 0; lane < dp->link_train.lane_count; lane++) writel(dp->link_train.training_lane[lane], dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane); + + if (dp->phy) { + union phy_configure_opts phy_cfg = {0}; + + for (lane = 0; lane < dp->link_train.lane_count; lane++) { + u8 training_lane = dp->link_train.training_lane[lane]; + u8 vs, pe; + + vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> + DP_TRAIN_VOLTAGE_SWING_SHIFT; + pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> + DP_TRAIN_PRE_EMPHASIS_SHIFT; + phy_cfg.dp.voltage[lane] = vs; + phy_cfg.dp.pre[lane] = pe; + } + + phy_cfg.dp.lanes = dp->link_train.lane_count; + phy_cfg.dp.link_rate = + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; + phy_cfg.dp.set_voltages = true; + ret = phy_configure(dp->phy, &phy_cfg); + if (ret && ret != -EOPNOTSUPP) { + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); + return; + } + } } u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane) -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration. 2024-12-19 8:05 ` [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration Damon Ding @ 2024-12-20 0:13 ` Dmitry Baryshkov 2024-12-20 0:17 ` Diederik de Haas 2024-12-20 3:37 ` Damon Ding 0 siblings, 2 replies; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 0:13 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:56PM +0800, Damon Ding wrote: > Add support to configurate link rate, lane count, voltage swing and > pre-emphasis with phy_configure(). It is helpful in application scenarios > where analogix controller is mixed with the phy of other vendors. > > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > > --- > > Changes in v2: > - remove needless assignments for phy_configure() > - remove unnecessary changes for phy_power_on()/phy_power_off() > --- > .../drm/bridge/analogix/analogix_dp_core.c | 1 + > .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 56 +++++++++++++++++++ > 2 files changed, 57 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > index 6f10d88a34c5..9429c50cc1bc 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > @@ -1696,6 +1696,7 @@ int analogix_dp_resume(struct analogix_dp_device *dp) > if (dp->plat_data->power_on) > dp->plat_data->power_on(dp->plat_data); > > + phy_set_mode(dp->phy, PHY_MODE_DP); > phy_power_on(dp->phy); > > analogix_dp_init_dp(dp); > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > index 3afc73c858c4..613ce504bea6 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > @@ -11,6 +11,7 @@ > #include <linux/gpio/consumer.h> > #include <linux/io.h> > #include <linux/iopoll.h> > +#include <linux/phy/phy.h> > > #include <drm/bridge/analogix_dp.h> > > @@ -513,10 +514,25 @@ void analogix_dp_enable_sw_function(struct analogix_dp_device *dp) > void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype) > { > u32 reg; > + int ret; > > reg = bwtype; > if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62)) > writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET); > + > + if (dp->phy) { > + union phy_configure_opts phy_cfg = {0}; > + > + phy_cfg.dp.lanes = dp->link_train.lane_count; Should not be necessary, you are only setting the .set_rate. > + phy_cfg.dp.link_rate = > + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; > + phy_cfg.dp.set_rate = true; > + ret = phy_configure(dp->phy, &phy_cfg); > + if (ret && ret != -EOPNOTSUPP) { > + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > + return; > + } > + } > } > > void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) > @@ -530,9 +546,22 @@ void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) > void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count) > { > u32 reg; > + int ret; > > reg = count; > writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET); > + > + if (dp->phy) { > + union phy_configure_opts phy_cfg = {0}; > + > + phy_cfg.dp.lanes = dp->link_train.lane_count; > + phy_cfg.dp.set_lanes = true; > + ret = phy_configure(dp->phy, &phy_cfg); > + if (ret && ret != -EOPNOTSUPP) { > + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > + return; > + } > + } > } > > void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) > @@ -546,10 +575,37 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) > void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp) > { > u8 lane; > + int ret; > > for (lane = 0; lane < dp->link_train.lane_count; lane++) > writel(dp->link_train.training_lane[lane], > dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane); > + > + if (dp->phy) { > + union phy_configure_opts phy_cfg = {0}; > + > + for (lane = 0; lane < dp->link_train.lane_count; lane++) { > + u8 training_lane = dp->link_train.training_lane[lane]; > + u8 vs, pe; > + > + vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> > + DP_TRAIN_VOLTAGE_SWING_SHIFT; > + pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> > + DP_TRAIN_PRE_EMPHASIS_SHIFT; > + phy_cfg.dp.voltage[lane] = vs; > + phy_cfg.dp.pre[lane] = pe; > + } > + > + phy_cfg.dp.lanes = dp->link_train.lane_count; > + phy_cfg.dp.link_rate = > + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; This two should not be necessary, please drop them. > + phy_cfg.dp.set_voltages = true; > + ret = phy_configure(dp->phy, &phy_cfg); > + if (ret && ret != -EOPNOTSUPP) { > + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > + return; > + } > + } > } > > u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane) > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration. 2024-12-20 0:13 ` Dmitry Baryshkov @ 2024-12-20 0:17 ` Diederik de Haas 2024-12-20 3:37 ` Damon Ding 1 sibling, 0 replies; 38+ messages in thread From: Diederik de Haas @ 2024-12-20 0:17 UTC (permalink / raw) To: Dmitry Baryshkov, Damon Ding Cc: robh, conor+dt, algea.cao, rfoss, heiko, devicetree, linux-phy, linux-kernel, sebastian.reichel, dri-devel, hjc, kever.yang, linux-rockchip, vkoul, andy.yan, krzk+dt, linux-arm-kernel, l.stach [-- Attachment #1: Type: text/plain, Size: 1796 bytes --] On Fri Dec 20, 2024 at 1:13 AM CET, Dmitry Baryshkov wrote: > On Thu, Dec 19, 2024 at 04:05:56PM +0800, Damon Ding wrote: > > void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) > > @@ -546,10 +575,37 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) > > void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp) > > { > > u8 lane; > > + int ret; > > > > for (lane = 0; lane < dp->link_train.lane_count; lane++) > > writel(dp->link_train.training_lane[lane], > > dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane); > > + > > + if (dp->phy) { > > + union phy_configure_opts phy_cfg = {0}; > > + > > + for (lane = 0; lane < dp->link_train.lane_count; lane++) { > > + u8 training_lane = dp->link_train.training_lane[lane]; > > + u8 vs, pe; > > + > > + vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> > > + DP_TRAIN_VOLTAGE_SWING_SHIFT; > > + pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> > > + DP_TRAIN_PRE_EMPHASIS_SHIFT; > > + phy_cfg.dp.voltage[lane] = vs; > > + phy_cfg.dp.pre[lane] = pe; > > + } > > + > > + phy_cfg.dp.lanes = dp->link_train.lane_count; > > + phy_cfg.dp.link_rate = > > + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; > > This two should not be necessary, please drop them. This too or These two (statements)? > > + phy_cfg.dp.set_voltages = true; > > + ret = phy_configure(dp->phy, &phy_cfg); > > + if (ret && ret != -EOPNOTSUPP) { > > + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > > + return; > > + } > > + } > > } > > > > u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane) > > -- > > 2.34.1 > > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration. 2024-12-20 0:13 ` Dmitry Baryshkov 2024-12-20 0:17 ` Diederik de Haas @ 2024-12-20 3:37 ` Damon Ding 2024-12-20 5:37 ` Dmitry Baryshkov 1 sibling, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-20 3:37 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 8:13, Dmitry Baryshkov wrote: > On Thu, Dec 19, 2024 at 04:05:56PM +0800, Damon Ding wrote: >> Add support to configurate link rate, lane count, voltage swing and >> pre-emphasis with phy_configure(). It is helpful in application scenarios >> where analogix controller is mixed with the phy of other vendors. >> >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >> >> --- >> >> Changes in v2: >> - remove needless assignments for phy_configure() >> - remove unnecessary changes for phy_power_on()/phy_power_off() >> --- >> .../drm/bridge/analogix/analogix_dp_core.c | 1 + >> .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 56 +++++++++++++++++++ >> 2 files changed, 57 insertions(+) >> >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> index 6f10d88a34c5..9429c50cc1bc 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> @@ -1696,6 +1696,7 @@ int analogix_dp_resume(struct analogix_dp_device *dp) >> if (dp->plat_data->power_on) >> dp->plat_data->power_on(dp->plat_data); >> >> + phy_set_mode(dp->phy, PHY_MODE_DP); >> phy_power_on(dp->phy); >> >> analogix_dp_init_dp(dp); >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> index 3afc73c858c4..613ce504bea6 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> @@ -11,6 +11,7 @@ >> #include <linux/gpio/consumer.h> >> #include <linux/io.h> >> #include <linux/iopoll.h> >> +#include <linux/phy/phy.h> >> >> #include <drm/bridge/analogix_dp.h> >> >> @@ -513,10 +514,25 @@ void analogix_dp_enable_sw_function(struct analogix_dp_device *dp) >> void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype) >> { >> u32 reg; >> + int ret; >> >> reg = bwtype; >> if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62)) >> writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET); >> + >> + if (dp->phy) { >> + union phy_configure_opts phy_cfg = {0}; >> + >> + phy_cfg.dp.lanes = dp->link_train.lane_count; > > Should not be necessary, you are only setting the .set_rate. Indeed, this can be dropped. > >> + phy_cfg.dp.link_rate = >> + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; >> + phy_cfg.dp.set_rate = true; >> + ret = phy_configure(dp->phy, &phy_cfg); >> + if (ret && ret != -EOPNOTSUPP) { >> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); >> + return; >> + } >> + } >> } >> >> void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) >> @@ -530,9 +546,22 @@ void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) >> void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count) >> { >> u32 reg; >> + int ret; >> >> reg = count; >> writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET); >> + >> + if (dp->phy) { >> + union phy_configure_opts phy_cfg = {0}; >> + >> + phy_cfg.dp.lanes = dp->link_train.lane_count; >> + phy_cfg.dp.set_lanes = true; >> + ret = phy_configure(dp->phy, &phy_cfg); >> + if (ret && ret != -EOPNOTSUPP) { >> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); >> + return; >> + } >> + } >> } >> >> void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) >> @@ -546,10 +575,37 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) >> void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp) >> { >> u8 lane; >> + int ret; >> >> for (lane = 0; lane < dp->link_train.lane_count; lane++) >> writel(dp->link_train.training_lane[lane], >> dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane); >> + >> + if (dp->phy) { >> + union phy_configure_opts phy_cfg = {0}; >> + >> + for (lane = 0; lane < dp->link_train.lane_count; lane++) { >> + u8 training_lane = dp->link_train.training_lane[lane]; >> + u8 vs, pe; >> + >> + vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> >> + DP_TRAIN_VOLTAGE_SWING_SHIFT; >> + pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> >> + DP_TRAIN_PRE_EMPHASIS_SHIFT; >> + phy_cfg.dp.voltage[lane] = vs; >> + phy_cfg.dp.pre[lane] = pe; >> + } >> + >> + phy_cfg.dp.lanes = dp->link_train.lane_count; >> + phy_cfg.dp.link_rate = >> + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; > > This two should not be necessary, please drop them. These two are necessary for rk_hdptx_phy_set_voltage(), so they cannot be dropped. > >> + phy_cfg.dp.set_voltages = true; >> + ret = phy_configure(dp->phy, &phy_cfg); >> + if (ret && ret != -EOPNOTSUPP) { >> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); >> + return; >> + } >> + } >> } >> >> u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane) >> -- >> 2.34.1 >> > Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration. 2024-12-20 3:37 ` Damon Ding @ 2024-12-20 5:37 ` Dmitry Baryshkov 2024-12-25 8:27 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 5:37 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Fri, 20 Dec 2024 at 05:37, Damon Ding <damon.ding@rock-chips.com> wrote: > > Hi Dmitry, > > On 2024/12/20 8:13, Dmitry Baryshkov wrote: > > On Thu, Dec 19, 2024 at 04:05:56PM +0800, Damon Ding wrote: > >> Add support to configurate link rate, lane count, voltage swing and > >> pre-emphasis with phy_configure(). It is helpful in application scenarios > >> where analogix controller is mixed with the phy of other vendors. > >> > >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > >> > >> --- > >> > >> Changes in v2: > >> - remove needless assignments for phy_configure() > >> - remove unnecessary changes for phy_power_on()/phy_power_off() > >> --- > >> .../drm/bridge/analogix/analogix_dp_core.c | 1 + > >> .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 56 +++++++++++++++++++ > >> 2 files changed, 57 insertions(+) > >> > >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > >> index 6f10d88a34c5..9429c50cc1bc 100644 > >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > >> @@ -1696,6 +1696,7 @@ int analogix_dp_resume(struct analogix_dp_device *dp) > >> if (dp->plat_data->power_on) > >> dp->plat_data->power_on(dp->plat_data); > >> > >> + phy_set_mode(dp->phy, PHY_MODE_DP); > >> phy_power_on(dp->phy); > >> > >> analogix_dp_init_dp(dp); > >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > >> index 3afc73c858c4..613ce504bea6 100644 > >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > >> @@ -11,6 +11,7 @@ > >> #include <linux/gpio/consumer.h> > >> #include <linux/io.h> > >> #include <linux/iopoll.h> > >> +#include <linux/phy/phy.h> > >> > >> #include <drm/bridge/analogix_dp.h> > >> > >> @@ -513,10 +514,25 @@ void analogix_dp_enable_sw_function(struct analogix_dp_device *dp) > >> void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype) > >> { > >> u32 reg; > >> + int ret; > >> > >> reg = bwtype; > >> if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62)) > >> writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET); > >> + > >> + if (dp->phy) { > >> + union phy_configure_opts phy_cfg = {0}; > >> + > >> + phy_cfg.dp.lanes = dp->link_train.lane_count; > > > > Should not be necessary, you are only setting the .set_rate. > > Indeed, this can be dropped. > > > > >> + phy_cfg.dp.link_rate = > >> + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; > >> + phy_cfg.dp.set_rate = true; > >> + ret = phy_configure(dp->phy, &phy_cfg); > >> + if (ret && ret != -EOPNOTSUPP) { > >> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > >> + return; > >> + } > >> + } > >> } > >> > >> void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) > >> @@ -530,9 +546,22 @@ void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) > >> void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count) > >> { > >> u32 reg; > >> + int ret; > >> > >> reg = count; > >> writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET); > >> + > >> + if (dp->phy) { > >> + union phy_configure_opts phy_cfg = {0}; > >> + > >> + phy_cfg.dp.lanes = dp->link_train.lane_count; > >> + phy_cfg.dp.set_lanes = true; > >> + ret = phy_configure(dp->phy, &phy_cfg); > >> + if (ret && ret != -EOPNOTSUPP) { > >> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > >> + return; > >> + } > >> + } > >> } > >> > >> void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) > >> @@ -546,10 +575,37 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) > >> void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp) > >> { > >> u8 lane; > >> + int ret; > >> > >> for (lane = 0; lane < dp->link_train.lane_count; lane++) > >> writel(dp->link_train.training_lane[lane], > >> dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane); > >> + > >> + if (dp->phy) { > >> + union phy_configure_opts phy_cfg = {0}; > >> + > >> + for (lane = 0; lane < dp->link_train.lane_count; lane++) { > >> + u8 training_lane = dp->link_train.training_lane[lane]; > >> + u8 vs, pe; > >> + > >> + vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> > >> + DP_TRAIN_VOLTAGE_SWING_SHIFT; > >> + pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> > >> + DP_TRAIN_PRE_EMPHASIS_SHIFT; > >> + phy_cfg.dp.voltage[lane] = vs; > >> + phy_cfg.dp.pre[lane] = pe; > >> + } > >> + > >> + phy_cfg.dp.lanes = dp->link_train.lane_count; > >> + phy_cfg.dp.link_rate = > >> + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; > > > > This two should not be necessary, please drop them. > > These two are necessary for rk_hdptx_phy_set_voltage(), so they cannot > be dropped. Please review the documentation for struct phy_configure_opts_dp and fix your PHY driver to skip the values for which the .set_foo isn't set. Then you might have to change this part. You are setting just .set_voltages. It means that the rate and .lanes shouldn't be changed and can be used as they were set by the previous calls to phy_configure(). > > > > >> + phy_cfg.dp.set_voltages = true; > >> + ret = phy_configure(dp->phy, &phy_cfg); > >> + if (ret && ret != -EOPNOTSUPP) { > >> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); > >> + return; > >> + } > >> + } > >> } > >> > >> u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane) > >> -- > >> 2.34.1 > >> > > > > Best regards, > Damon > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration. 2024-12-20 5:37 ` Dmitry Baryshkov @ 2024-12-25 8:27 ` Damon Ding 0 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-25 8:27 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 13:37, Dmitry Baryshkov wrote: > On Fri, 20 Dec 2024 at 05:37, Damon Ding <damon.ding@rock-chips.com> wrote: >> >> Hi Dmitry, >> >> On 2024/12/20 8:13, Dmitry Baryshkov wrote: >>> On Thu, Dec 19, 2024 at 04:05:56PM +0800, Damon Ding wrote: >>>> Add support to configurate link rate, lane count, voltage swing and >>>> pre-emphasis with phy_configure(). It is helpful in application scenarios >>>> where analogix controller is mixed with the phy of other vendors. >>>> >>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >>>> >>>> --- >>>> >>>> Changes in v2: >>>> - remove needless assignments for phy_configure() >>>> - remove unnecessary changes for phy_power_on()/phy_power_off() >>>> --- >>>> .../drm/bridge/analogix/analogix_dp_core.c | 1 + >>>> .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 56 +++++++++++++++++++ >>>> 2 files changed, 57 insertions(+) >>>> >>>> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >>>> index 6f10d88a34c5..9429c50cc1bc 100644 >>>> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >>>> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >>>> @@ -1696,6 +1696,7 @@ int analogix_dp_resume(struct analogix_dp_device *dp) >>>> if (dp->plat_data->power_on) >>>> dp->plat_data->power_on(dp->plat_data); >>>> >>>> + phy_set_mode(dp->phy, PHY_MODE_DP); >>>> phy_power_on(dp->phy); >>>> >>>> analogix_dp_init_dp(dp); >>>> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >>>> index 3afc73c858c4..613ce504bea6 100644 >>>> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >>>> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >>>> @@ -11,6 +11,7 @@ >>>> #include <linux/gpio/consumer.h> >>>> #include <linux/io.h> >>>> #include <linux/iopoll.h> >>>> +#include <linux/phy/phy.h> >>>> >>>> #include <drm/bridge/analogix_dp.h> >>>> >>>> @@ -513,10 +514,25 @@ void analogix_dp_enable_sw_function(struct analogix_dp_device *dp) >>>> void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype) >>>> { >>>> u32 reg; >>>> + int ret; >>>> >>>> reg = bwtype; >>>> if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62)) >>>> writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET); >>>> + >>>> + if (dp->phy) { >>>> + union phy_configure_opts phy_cfg = {0}; >>>> + >>>> + phy_cfg.dp.lanes = dp->link_train.lane_count; >>> >>> Should not be necessary, you are only setting the .set_rate. >> >> Indeed, this can be dropped. >> >>> >>>> + phy_cfg.dp.link_rate = >>>> + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; >>>> + phy_cfg.dp.set_rate = true; >>>> + ret = phy_configure(dp->phy, &phy_cfg); >>>> + if (ret && ret != -EOPNOTSUPP) { >>>> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); >>>> + return; >>>> + } >>>> + } >>>> } >>>> >>>> void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) >>>> @@ -530,9 +546,22 @@ void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype) >>>> void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count) >>>> { >>>> u32 reg; >>>> + int ret; >>>> >>>> reg = count; >>>> writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET); >>>> + >>>> + if (dp->phy) { >>>> + union phy_configure_opts phy_cfg = {0}; >>>> + >>>> + phy_cfg.dp.lanes = dp->link_train.lane_count; >>>> + phy_cfg.dp.set_lanes = true; >>>> + ret = phy_configure(dp->phy, &phy_cfg); >>>> + if (ret && ret != -EOPNOTSUPP) { >>>> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); >>>> + return; >>>> + } >>>> + } >>>> } >>>> >>>> void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) >>>> @@ -546,10 +575,37 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) >>>> void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp) >>>> { >>>> u8 lane; >>>> + int ret; >>>> >>>> for (lane = 0; lane < dp->link_train.lane_count; lane++) >>>> writel(dp->link_train.training_lane[lane], >>>> dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane); >>>> + >>>> + if (dp->phy) { >>>> + union phy_configure_opts phy_cfg = {0}; >>>> + >>>> + for (lane = 0; lane < dp->link_train.lane_count; lane++) { >>>> + u8 training_lane = dp->link_train.training_lane[lane]; >>>> + u8 vs, pe; >>>> + >>>> + vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> >>>> + DP_TRAIN_VOLTAGE_SWING_SHIFT; >>>> + pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> >>>> + DP_TRAIN_PRE_EMPHASIS_SHIFT; >>>> + phy_cfg.dp.voltage[lane] = vs; >>>> + phy_cfg.dp.pre[lane] = pe; >>>> + } >>>> + >>>> + phy_cfg.dp.lanes = dp->link_train.lane_count; >>>> + phy_cfg.dp.link_rate = >>>> + drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100; >>> >>> This two should not be necessary, please drop them. >> >> These two are necessary for rk_hdptx_phy_set_voltage(), so they cannot >> be dropped. > > Please review the documentation for struct phy_configure_opts_dp and > fix your PHY driver to skip the values for which the .set_foo isn't > set. Then you might have to change this part. > You are setting just .set_voltages. It means that the rate and .lanes > shouldn't be changed and can be used as they were set by the previous > calls to phy_configure(). > Indeed, I will store the previous &phy_configure_opts.dp.link_rate and &phy_configure_opts.dp.lanes in the struct rk_hdptx_phy, and will not use both of them during the configuration process of the &phy_cfg.dp.voltage[] and &phy_cfg.dp.pre[] in next version. >> >>> >>>> + phy_cfg.dp.set_voltages = true; >>>> + ret = phy_configure(dp->phy, &phy_cfg); >>>> + if (ret && ret != -EOPNOTSUPP) { >>>> + dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret); >>>> + return; >>>> + } >>>> + } >>>> } >>>> >>>> u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane) >>>> -- >>>> 2.34.1 >>>> >>> Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (6 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-20 0:16 ` Dmitry Baryshkov 2024-12-19 8:05 ` [PATCH v3 09/15] drm/bridge: " Damon Ding ` (6 subsequent siblings) 14 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding The rockchip_dp_of_panel_on_aux_bus() helps to check whether the DT configurations related to the DP AUX bus are correct or not. If failed to get the panel from the platform bus, it is good to try the DP AUX bus. Then, the probing process will continue until it enters the analogix_dp_bind(), where devm_of_dp_aux_populate_bus() is called after &analogix_dp_device.aux has been initialized. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- .../gpu/drm/rockchip/analogix_dp-rockchip.c | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index ba5263f85ee2..60c902abf40b 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -317,6 +317,24 @@ static const struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = .atomic_check = rockchip_dp_drm_encoder_atomic_check, }; +static bool rockchip_dp_of_panel_on_aux_bus(const struct device_node *np) +{ + struct device_node *bus_node, *panel_node; + + bus_node = of_get_child_by_name(np, "aux-bus"); + if (!bus_node) + return false; + + panel_node = of_get_child_by_name(bus_node, "panel"); + of_node_put(bus_node); + if (!panel_node) + return false; + + of_node_put(panel_node); + + return true; +} + static int rockchip_dp_of_probe(struct rockchip_dp_device *dp) { struct device *dev = dp->dev; @@ -435,8 +453,10 @@ static int rockchip_dp_probe(struct platform_device *pdev) return -ENODEV; ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL); - if (ret < 0) - return ret; + if (ret < 0) { + if (!rockchip_dp_of_panel_on_aux_bus(dev->of_node)) + return ret; + } dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (!dp) -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 ` [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus Damon Ding @ 2024-12-20 0:16 ` Dmitry Baryshkov 2024-12-20 8:29 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 0:16 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:57PM +0800, Damon Ding wrote: > The rockchip_dp_of_panel_on_aux_bus() helps to check whether the DT > configurations related to the DP AUX bus are correct or not. > > If failed to get the panel from the platform bus, it is good to try > the DP AUX bus. Then, the probing process will continue until it enters > the analogix_dp_bind(), where devm_of_dp_aux_populate_bus() is called > after &analogix_dp_device.aux has been initialized. No. devm_of_dp_aux_populate_bus() should be called before bind(). And bind should only be called from the done_probing() callback. The reason is very simple: the panel driver might be built as a module and might be not available when the analogix driver is being probed. Also, please invert the logic of the commit message (and the driver). The platform bus should be a fallback if there is no AUX bus panel, not other way around. > > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > --- > .../gpu/drm/rockchip/analogix_dp-rockchip.c | 24 +++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > index ba5263f85ee2..60c902abf40b 100644 > --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > @@ -317,6 +317,24 @@ static const struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = > .atomic_check = rockchip_dp_drm_encoder_atomic_check, > }; > > +static bool rockchip_dp_of_panel_on_aux_bus(const struct device_node *np) > +{ > + struct device_node *bus_node, *panel_node; > + > + bus_node = of_get_child_by_name(np, "aux-bus"); > + if (!bus_node) > + return false; > + > + panel_node = of_get_child_by_name(bus_node, "panel"); > + of_node_put(bus_node); > + if (!panel_node) > + return false; > + > + of_node_put(panel_node); > + > + return true; > +} > + > static int rockchip_dp_of_probe(struct rockchip_dp_device *dp) > { > struct device *dev = dp->dev; > @@ -435,8 +453,10 @@ static int rockchip_dp_probe(struct platform_device *pdev) > return -ENODEV; > > ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL); > - if (ret < 0) > - return ret; > + if (ret < 0) { > + if (!rockchip_dp_of_panel_on_aux_bus(dev->of_node)) > + return ret; > + } > > dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); > if (!dp) > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus 2024-12-20 0:16 ` Dmitry Baryshkov @ 2024-12-20 8:29 ` Damon Ding 0 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-20 8:29 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 8:16, Dmitry Baryshkov wrote: > On Thu, Dec 19, 2024 at 04:05:57PM +0800, Damon Ding wrote: >> The rockchip_dp_of_panel_on_aux_bus() helps to check whether the DT >> configurations related to the DP AUX bus are correct or not. >> >> If failed to get the panel from the platform bus, it is good to try >> the DP AUX bus. Then, the probing process will continue until it enters >> the analogix_dp_bind(), where devm_of_dp_aux_populate_bus() is called >> after &analogix_dp_device.aux has been initialized. > > No. devm_of_dp_aux_populate_bus() should be called before bind(). And > bind should only be called from the done_probing() callback. The reason > is very simple: the panel driver might be built as a module and might be > not available when the analogix driver is being probed. > > Also, please invert the logic of the commit message (and the driver). > The platform bus should be a fallback if there is no AUX bus panel, not > other way around. > I have tried the logic as you recommanded, and it is really a good way. I will fix this in the next version. >> >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >> --- >> .../gpu/drm/rockchip/analogix_dp-rockchip.c | 24 +++++++++++++++++-- >> 1 file changed, 22 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c >> index ba5263f85ee2..60c902abf40b 100644 >> --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c >> +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c >> @@ -317,6 +317,24 @@ static const struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = >> .atomic_check = rockchip_dp_drm_encoder_atomic_check, >> }; >> >> +static bool rockchip_dp_of_panel_on_aux_bus(const struct device_node *np) >> +{ >> + struct device_node *bus_node, *panel_node; >> + >> + bus_node = of_get_child_by_name(np, "aux-bus"); >> + if (!bus_node) >> + return false; >> + >> + panel_node = of_get_child_by_name(bus_node, "panel"); >> + of_node_put(bus_node); >> + if (!panel_node) >> + return false; >> + >> + of_node_put(panel_node); >> + >> + return true; >> +} >> + >> static int rockchip_dp_of_probe(struct rockchip_dp_device *dp) >> { >> struct device *dev = dp->dev; >> @@ -435,8 +453,10 @@ static int rockchip_dp_probe(struct platform_device *pdev) >> return -ENODEV; >> >> ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL); >> - if (ret < 0) >> - return ret; >> + if (ret < 0) { >> + if (!rockchip_dp_of_panel_on_aux_bus(dev->of_node)) >> + return ret; >> + } >> >> dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); >> if (!dp) >> -- >> 2.34.1 >> > Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 09/15] drm/bridge: analogix_dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (7 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-20 0:17 ` Dmitry Baryshkov 2024-12-19 8:05 ` [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: " Damon Ding ` (5 subsequent siblings) 14 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding If the panel can not be found in the beginning of rockchip_dp_probe() using the platform bus, we can still try to find it in analogix_dp_bind() through the DP AUX bus after the &analogix_dp_device.aux has been initialized. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- .../drm/bridge/analogix/analogix_dp_core.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index 9429c50cc1bc..eae02819e3bb 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -19,12 +19,14 @@ #include <linux/platform_device.h> #include <drm/bridge/analogix_dp.h> +#include <drm/display/drm_dp_aux_bus.h> #include <drm/drm_atomic.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_bridge.h> #include <drm/drm_crtc.h> #include <drm/drm_device.h> #include <drm/drm_edid.h> +#include <drm/drm_of.h> #include <drm/drm_panel.h> #include <drm/drm_print.h> #include <drm/drm_probe_helper.h> @@ -1733,6 +1735,23 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev) goto err_disable_pm_runtime; } + if (!dp->plat_data->panel) { + /* + * If the edp-panel module has not yet been initialized, the + * devm_of_dp_aux_populate_bus() function will return 0 and + * the done_probing() callback will not be called either. + * Consequently, the panel will never be found. + * + * This is the reason why we do not use the done_probing() + * callback and do not check the reture value here. + */ + devm_of_dp_aux_populate_bus(&dp->aux, NULL); + ret = drm_of_find_panel_or_bridge(dp->dev->of_node, 1, 0, + &dp->plat_data->panel, NULL); + if (ret) + goto err_unregister_aux; + } + ret = analogix_dp_create_bridge(drm_dev, dp); if (ret) { DRM_ERROR("failed to create bridge (%d)\n", ret); -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 09/15] drm/bridge: analogix_dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 ` [PATCH v3 09/15] drm/bridge: " Damon Ding @ 2024-12-20 0:17 ` Dmitry Baryshkov 0 siblings, 0 replies; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 0:17 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:58PM +0800, Damon Ding wrote: > If the panel can not be found in the beginning of rockchip_dp_probe() > using the platform bus, we can still try to find it in analogix_dp_bind() > through the DP AUX bus after the &analogix_dp_device.aux has been > initialized. > > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > --- > .../drm/bridge/analogix/analogix_dp_core.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > index 9429c50cc1bc..eae02819e3bb 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > @@ -19,12 +19,14 @@ > #include <linux/platform_device.h> > > #include <drm/bridge/analogix_dp.h> > +#include <drm/display/drm_dp_aux_bus.h> > #include <drm/drm_atomic.h> > #include <drm/drm_atomic_helper.h> > #include <drm/drm_bridge.h> > #include <drm/drm_crtc.h> > #include <drm/drm_device.h> > #include <drm/drm_edid.h> > +#include <drm/drm_of.h> > #include <drm/drm_panel.h> > #include <drm/drm_print.h> > #include <drm/drm_probe_helper.h> > @@ -1733,6 +1735,23 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev) > goto err_disable_pm_runtime; > } > > + if (!dp->plat_data->panel) { > + /* > + * If the edp-panel module has not yet been initialized, the > + * devm_of_dp_aux_populate_bus() function will return 0 and > + * the done_probing() callback will not be called either. > + * Consequently, the panel will never be found. > + * > + * This is the reason why we do not use the done_probing() > + * callback and do not check the reture value here. NAK. It is there for exactly this reason, to account for the panel driver being not present yet. Please make a use of the done_probing() callback. > + */ > + devm_of_dp_aux_populate_bus(&dp->aux, NULL); > + ret = drm_of_find_panel_or_bridge(dp->dev->of_node, 1, 0, > + &dp->plat_data->panel, NULL); > + if (ret) > + goto err_unregister_aux; > + } > + > ret = analogix_dp_create_bridge(drm_dev, dp); > if (ret) { > DRM_ERROR("failed to create bridge (%d)\n", ret); > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (8 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 09/15] drm/bridge: " Damon Ding @ 2024-12-19 8:05 ` Damon Ding 2024-12-20 0:18 ` Dmitry Baryshkov 2024-12-24 9:36 ` Krzysztof Kozlowski 2024-12-19 8:06 ` [PATCH v3 11/15] dt-bindings: display: rockchip: Fix label name of hdptxphy for RK3588 HDMI TX Controller Damon Ding ` (4 subsequent siblings) 14 siblings, 2 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:05 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding According to Documentation/devicetree/bindings/display/dp-aux-bus.yaml, it is a good way to get panel through the DP AUX bus. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- .../bindings/display/rockchip/rockchip,analogix-dp.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml index 4f84e8849876..c45d92a2d901 100644 --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml @@ -49,6 +49,9 @@ properties: description: This SoC makes use of GRF regs. + aux-bus: + $ref: /schemas/display/dp-aux-bus.yaml# + required: - compatible - clocks -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 ` [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: " Damon Ding @ 2024-12-20 0:18 ` Dmitry Baryshkov 2024-12-20 2:48 ` Damon Ding 2024-12-24 9:36 ` Krzysztof Kozlowski 1 sibling, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 0:18 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:59PM +0800, Damon Ding wrote: > According to Documentation/devicetree/bindings/display/dp-aux-bus.yaml, > it is a good way to get panel through the DP AUX bus. > > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > --- > .../bindings/display/rockchip/rockchip,analogix-dp.yaml | 3 +++ > 1 file changed, 3 insertions(+) Business before pleasure.^W^W^W Bindings before the driver. > > diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml > index 4f84e8849876..c45d92a2d901 100644 > --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml > +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml > @@ -49,6 +49,9 @@ properties: > description: > This SoC makes use of GRF regs. > > + aux-bus: > + $ref: /schemas/display/dp-aux-bus.yaml# > + > required: > - compatible > - clocks > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: Add support to get panel from the DP AUX bus 2024-12-20 0:18 ` Dmitry Baryshkov @ 2024-12-20 2:48 ` Damon Ding 0 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-20 2:48 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 8:18, Dmitry Baryshkov wrote: > On Thu, Dec 19, 2024 at 04:05:59PM +0800, Damon Ding wrote: >> According to Documentation/devicetree/bindings/display/dp-aux-bus.yaml, >> it is a good way to get panel through the DP AUX bus. >> >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >> --- >> .../bindings/display/rockchip/rockchip,analogix-dp.yaml | 3 +++ >> 1 file changed, 3 insertions(+) > > Business before pleasure.^W^W^W Bindings before the driver. I couldn't agree more. ;-) > >> >> diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml >> index 4f84e8849876..c45d92a2d901 100644 >> --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml >> +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml >> @@ -49,6 +49,9 @@ properties: >> description: >> This SoC makes use of GRF regs. >> >> + aux-bus: >> + $ref: /schemas/display/dp-aux-bus.yaml# >> + >> required: >> - compatible >> - clocks >> -- >> 2.34.1 >> > Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: Add support to get panel from the DP AUX bus 2024-12-19 8:05 ` [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: " Damon Ding 2024-12-20 0:18 ` Dmitry Baryshkov @ 2024-12-24 9:36 ` Krzysztof Kozlowski 1 sibling, 0 replies; 38+ messages in thread From: Krzysztof Kozlowski @ 2024-12-24 9:36 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:05:59PM +0800, Damon Ding wrote: > According to Documentation/devicetree/bindings/display/dp-aux-bus.yaml, > it is a good way to get panel through the DP AUX bus. > > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > --- > .../bindings/display/rockchip/rockchip,analogix-dp.yaml | 3 +++ > 1 file changed, 3 insertions(+) Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 11/15] dt-bindings: display: rockchip: Fix label name of hdptxphy for RK3588 HDMI TX Controller 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (9 preceding siblings ...) 2024-12-19 8:05 ` [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: " Damon Ding @ 2024-12-19 8:06 ` Damon Ding 2024-12-19 8:06 ` [PATCH v3 12/15] arm64: dts: rockchip: Fix label name of hdptxphy for RK3588 Damon Ding ` (3 subsequent siblings) 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:06 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding The hdptxphy is a combo transmit-PHY for HDMI2.1 TMDS Link, FRL Link, DP and eDP Link. Therefore, it is better to name it hdptxphy0 other than hdptxphy_hdmi0, which will be referenced by both hdmi0 and edp0 nodes. Acked-by: Rob Herring (Arm) <robh@kernel.org> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- .../bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml index d8e761865f27..7a1ae31cc535 100644 --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml @@ -156,7 +156,7 @@ examples: <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH 0>, <GIC_SPI 360 IRQ_TYPE_LEVEL_HIGH 0>; interrupt-names = "avp", "cec", "earc", "main", "hpd"; - phys = <&hdptxphy_hdmi0>; + phys = <&hdptxphy0>; power-domains = <&power RK3588_PD_VO1>; resets = <&cru SRST_HDMITX0_REF>, <&cru SRST_HDMIHDP0>; reset-names = "ref", "hdp"; -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 12/15] arm64: dts: rockchip: Fix label name of hdptxphy for RK3588 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (10 preceding siblings ...) 2024-12-19 8:06 ` [PATCH v3 11/15] dt-bindings: display: rockchip: Fix label name of hdptxphy for RK3588 HDMI TX Controller Damon Ding @ 2024-12-19 8:06 ` Damon Ding 2024-12-19 8:06 ` [PATCH v3 13/15] arm64: dts: rockchip: Add eDP0 node " Damon Ding ` (2 subsequent siblings) 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:06 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding The hdptxphy is a combo transmit-PHY for HDMI2.1 TMDS Link, FRL Link, DP and eDP Link. Therefore, it is better to name it hdptxphy0 other than hdptxphy_hdmi0, which will be referenced by both hdmi0 and edp0 nodes. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 4 ++-- arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-evb.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-genbook.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts | 2 +- .../boot/dts/rockchip/rk3588-friendlyelec-cm3588-nas.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3588s-rock-5c.dts | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi index a337f3fb8377..7e125897b0cd 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi @@ -1386,7 +1386,7 @@ hdmi0: hdmi@fde80000 { <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH 0>, <GIC_SPI 360 IRQ_TYPE_LEVEL_HIGH 0>; interrupt-names = "avp", "cec", "earc", "main", "hpd"; - phys = <&hdptxphy_hdmi0>; + phys = <&hdptxphy0>; pinctrl-names = "default"; pinctrl-0 = <&hdmim0_tx0_cec &hdmim0_tx0_hpd &hdmim0_tx0_scl &hdmim0_tx0_sda>; @@ -2806,7 +2806,7 @@ dmac2: dma-controller@fed10000 { #dma-cells = <1>; }; - hdptxphy_hdmi0: phy@fed60000 { + hdptxphy0: phy@fed60000 { compatible = "rockchip,rk3588-hdptx-phy"; reg = <0x0 0xfed60000 0x0 0x2000>; clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>, <&cru PCLK_HDPTX0>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-evb.dts b/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-evb.dts index 9d525c8ff725..9eda69722665 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-evb.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-evb.dts @@ -129,7 +129,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-genbook.dts b/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-genbook.dts index 92f0ed83c990..d1be72eb63a4 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-genbook.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-genbook.dts @@ -166,7 +166,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts index d6e464cdc536..094235d22cd1 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts @@ -328,7 +328,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588-nas.dts b/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588-nas.dts index b3a04ca370bb..8171fbfd819a 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588-nas.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588-nas.dts @@ -335,7 +335,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts index 90f823b2c219..ef56380530f9 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts @@ -303,7 +303,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi index cb350727d116..0d9b5020acc0 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi @@ -360,7 +360,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts b/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts index 9f5a38b290bf..f14e96d96207 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts @@ -296,7 +296,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts index c44d001da169..a047c579c93d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts @@ -220,7 +220,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts index 3187b4918a30..795d8175e654 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts @@ -189,7 +189,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts b/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts index 9c394f733bbf..f471baca6d31 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts @@ -236,7 +236,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts b/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts index 4a3aa80f2226..74a4f03e05e3 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts @@ -278,7 +278,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6.dtsi index 76a6e8e517e9..482f5917043f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6.dtsi @@ -251,7 +251,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts b/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts index 8f034c6d494c..1463bd36b1b2 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts @@ -264,7 +264,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dtsi index d86aeacca238..9e16960b8705 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dtsi @@ -197,7 +197,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts b/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts index 70a43432bdc5..676cc4fec269 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts @@ -334,7 +334,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-rock-5c.dts b/arch/arm64/boot/dts/rockchip/rk3588s-rock-5c.dts index 9b14d5383cdc..bf74789e3f51 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-rock-5c.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-rock-5c.dts @@ -278,7 +278,7 @@ hdmi0_out_con: endpoint { }; }; -&hdptxphy_hdmi0 { +&hdptxphy0 { status = "okay"; }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 13/15] arm64: dts: rockchip: Add eDP0 node for RK3588 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (11 preceding siblings ...) 2024-12-19 8:06 ` [PATCH v3 12/15] arm64: dts: rockchip: Fix label name of hdptxphy for RK3588 Damon Ding @ 2024-12-19 8:06 ` Damon Ding 2024-12-19 8:06 ` [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board Damon Ding 2024-12-19 8:06 ` [PATCH v3 15/15] arm64: dts: rockchip: Add eDP1 node for RK3588 Damon Ding 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:06 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding Add support for the eDP0 output on RK3588 SoC. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v3: - Remove currently unsupported property '#sound-dai-cells' --- arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi index 7e125897b0cd..2a7b8e6074b8 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi @@ -1411,6 +1411,34 @@ hdmi0_out: port@1 { }; }; + edp0: edp@fdec0000 { + compatible = "rockchip,rk3588-edp"; + reg = <0x0 0xfdec0000 0x0 0x1000>; + clocks = <&cru CLK_EDP0_24M>, <&cru PCLK_EDP0>, <&cru CLK_EDP0_200M>; + clock-names = "dp", "pclk", "spdif"; + interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH 0>; + phys = <&hdptxphy0>; + phy-names = "dp"; + power-domains = <&power RK3588_PD_VO1>; + resets = <&cru SRST_EDP0_24M>, <&cru SRST_P_EDP0>; + reset-names = "dp", "apb"; + rockchip,grf = <&vo1_grf>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + edp0_in: port@0 { + reg = <0>; + }; + + edp0_out: port@1 { + reg = <1>; + }; + }; + }; + qos_gpu_m0: qos@fdf35000 { compatible = "rockchip,rk3588-qos", "syscon"; reg = <0x0 0xfdf35000 0x0 0x20>; -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (12 preceding siblings ...) 2024-12-19 8:06 ` [PATCH v3 13/15] arm64: dts: rockchip: Add eDP0 node " Damon Ding @ 2024-12-19 8:06 ` Damon Ding 2024-12-20 0:20 ` Dmitry Baryshkov 2024-12-19 8:06 ` [PATCH v3 15/15] arm64: dts: rockchip: Add eDP1 node for RK3588 Damon Ding 14 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:06 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: - Add edp-panel node - Set pinctrl of pwm12 for backlight - Enable edp0/hdptxphy0/vp2 Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v2: - Remove brightness-levels and default-brightness-level properties in backlight node. - Add the detail DT changes to commit message. Changes in v3: - Use aux-bus instead of platform bus for edp-panel. --- .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts index bc4077575beb..9547ab18e596 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts @@ -9,6 +9,7 @@ #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/input/input.h> #include <dt-bindings/pinctrl/rockchip.h> +#include <dt-bindings/soc/rockchip,vop2.h> #include <dt-bindings/usb/pd.h> #include "rk3588s.dtsi" @@ -238,6 +239,41 @@ &combphy2_psu { status = "okay"; }; +&edp0 { + force-hpd; + status = "okay"; + + aux-bus { + panel { + compatible = "lg,lp079qx1-sp0v"; + backlight = <&backlight>; + power-supply = <&vcc3v3_lcd_edp>; + + port { + panel_in_edp: endpoint { + remote-endpoint = <&edp_out_panel>; + }; + }; + }; + }; +}; + +&edp0_in { + edp0_in_vp2: endpoint { + remote-endpoint = <&vp2_out_edp0>; + }; +}; + +&edp0_out { + edp_out_panel: endpoint { + remote-endpoint = <&panel_in_edp>; + }; +}; + +&hdptxphy0 { + status = "okay"; +}; + &i2c3 { status = "okay"; @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { }; &pwm12 { + pinctrl-0 = <&pwm12m1_pins>; status = "okay"; }; @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { }; }; }; + +&vop_mmu { + status = "okay"; +}; + +&vop { + status = "okay"; +}; + +&vp2 { + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { + reg = <ROCKCHIP_VOP2_EP_EDP0>; + remote-endpoint = <&edp0_in_vp2>; + }; +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-19 8:06 ` [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board Damon Ding @ 2024-12-20 0:20 ` Dmitry Baryshkov 2024-12-20 2:38 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 0:20 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Thu, Dec 19, 2024 at 04:06:03PM +0800, Damon Ding wrote: > Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: > - Add edp-panel node > - Set pinctrl of pwm12 for backlight > - Enable edp0/hdptxphy0/vp2 > > Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > > --- > > Changes in v2: > - Remove brightness-levels and default-brightness-level properties in > backlight node. > - Add the detail DT changes to commit message. > > Changes in v3: > - Use aux-bus instead of platform bus for edp-panel. > --- > .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > index bc4077575beb..9547ab18e596 100644 > --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > @@ -9,6 +9,7 @@ > #include <dt-bindings/gpio/gpio.h> > #include <dt-bindings/input/input.h> > #include <dt-bindings/pinctrl/rockchip.h> > +#include <dt-bindings/soc/rockchip,vop2.h> > #include <dt-bindings/usb/pd.h> > #include "rk3588s.dtsi" > > @@ -238,6 +239,41 @@ &combphy2_psu { > status = "okay"; > }; > > +&edp0 { > + force-hpd; > + status = "okay"; > + > + aux-bus { > + panel { > + compatible = "lg,lp079qx1-sp0v"; Why do you need the particular compat string here? Can you use the generic "edp-panel" instead? What if the user swaps the panel? > + backlight = <&backlight>; > + power-supply = <&vcc3v3_lcd_edp>; > + > + port { > + panel_in_edp: endpoint { > + remote-endpoint = <&edp_out_panel>; > + }; > + }; > + }; > + }; > +}; > + > +&edp0_in { > + edp0_in_vp2: endpoint { > + remote-endpoint = <&vp2_out_edp0>; > + }; > +}; > + > +&edp0_out { > + edp_out_panel: endpoint { > + remote-endpoint = <&panel_in_edp>; > + }; > +}; > + > +&hdptxphy0 { > + status = "okay"; > +}; > + > &i2c3 { > status = "okay"; > > @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { > }; > > &pwm12 { > + pinctrl-0 = <&pwm12m1_pins>; > status = "okay"; > }; > > @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { > }; > }; > }; > + > +&vop_mmu { > + status = "okay"; > +}; > + > +&vop { > + status = "okay"; > +}; > + > +&vp2 { > + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { > + reg = <ROCKCHIP_VOP2_EP_EDP0>; > + remote-endpoint = <&edp0_in_vp2>; > + }; > +}; > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-20 0:20 ` Dmitry Baryshkov @ 2024-12-20 2:38 ` Damon Ding 2024-12-20 5:38 ` Dmitry Baryshkov 0 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-20 2:38 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 8:20, Dmitry Baryshkov wrote: > On Thu, Dec 19, 2024 at 04:06:03PM +0800, Damon Ding wrote: >> Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: >> - Add edp-panel node >> - Set pinctrl of pwm12 for backlight >> - Enable edp0/hdptxphy0/vp2 >> >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >> >> --- >> >> Changes in v2: >> - Remove brightness-levels and default-brightness-level properties in >> backlight node. >> - Add the detail DT changes to commit message. >> >> Changes in v3: >> - Use aux-bus instead of platform bus for edp-panel. >> --- >> .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ >> 1 file changed, 52 insertions(+) >> >> diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >> index bc4077575beb..9547ab18e596 100644 >> --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >> +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >> @@ -9,6 +9,7 @@ >> #include <dt-bindings/gpio/gpio.h> >> #include <dt-bindings/input/input.h> >> #include <dt-bindings/pinctrl/rockchip.h> >> +#include <dt-bindings/soc/rockchip,vop2.h> >> #include <dt-bindings/usb/pd.h> >> #include "rk3588s.dtsi" >> >> @@ -238,6 +239,41 @@ &combphy2_psu { >> status = "okay"; >> }; >> >> +&edp0 { >> + force-hpd; >> + status = "okay"; >> + >> + aux-bus { >> + panel { >> + compatible = "lg,lp079qx1-sp0v"; > > Why do you need the particular compat string here? Can you use the > generic "edp-panel" instead? What if the user swaps the panel? > The eDP panels used in conjunction with the RK3588S EVB1 have broken identification, which is one of the valid reasons for using a particular compat string. So the generic_edp_panel_probe() can not return success when using the "edp-panel". >> + backlight = <&backlight>; >> + power-supply = <&vcc3v3_lcd_edp>; >> + >> + port { >> + panel_in_edp: endpoint { >> + remote-endpoint = <&edp_out_panel>; >> + }; >> + }; >> + }; >> + }; >> +}; >> + >> +&edp0_in { >> + edp0_in_vp2: endpoint { >> + remote-endpoint = <&vp2_out_edp0>; >> + }; >> +}; >> + >> +&edp0_out { >> + edp_out_panel: endpoint { >> + remote-endpoint = <&panel_in_edp>; >> + }; >> +}; >> + >> +&hdptxphy0 { >> + status = "okay"; >> +}; >> + >> &i2c3 { >> status = "okay"; >> >> @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { >> }; >> >> &pwm12 { >> + pinctrl-0 = <&pwm12m1_pins>; >> status = "okay"; >> }; >> >> @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { >> }; >> }; >> }; >> + >> +&vop_mmu { >> + status = "okay"; >> +}; >> + >> +&vop { >> + status = "okay"; >> +}; >> + >> +&vp2 { >> + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { >> + reg = <ROCKCHIP_VOP2_EP_EDP0>; >> + remote-endpoint = <&edp0_in_vp2>; >> + }; >> +}; >> -- >> 2.34.1 >> > Best regards, Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-20 2:38 ` Damon Ding @ 2024-12-20 5:38 ` Dmitry Baryshkov 2024-12-25 9:34 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-20 5:38 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Fri, 20 Dec 2024 at 04:38, Damon Ding <damon.ding@rock-chips.com> wrote: > > Hi Dmitry, > > On 2024/12/20 8:20, Dmitry Baryshkov wrote: > > On Thu, Dec 19, 2024 at 04:06:03PM +0800, Damon Ding wrote: > >> Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: > >> - Add edp-panel node > >> - Set pinctrl of pwm12 for backlight > >> - Enable edp0/hdptxphy0/vp2 > >> > >> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > >> > >> --- > >> > >> Changes in v2: > >> - Remove brightness-levels and default-brightness-level properties in > >> backlight node. > >> - Add the detail DT changes to commit message. > >> > >> Changes in v3: > >> - Use aux-bus instead of platform bus for edp-panel. > >> --- > >> .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ > >> 1 file changed, 52 insertions(+) > >> > >> diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > >> index bc4077575beb..9547ab18e596 100644 > >> --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > >> +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > >> @@ -9,6 +9,7 @@ > >> #include <dt-bindings/gpio/gpio.h> > >> #include <dt-bindings/input/input.h> > >> #include <dt-bindings/pinctrl/rockchip.h> > >> +#include <dt-bindings/soc/rockchip,vop2.h> > >> #include <dt-bindings/usb/pd.h> > >> #include "rk3588s.dtsi" > >> > >> @@ -238,6 +239,41 @@ &combphy2_psu { > >> status = "okay"; > >> }; > >> > >> +&edp0 { > >> + force-hpd; > >> + status = "okay"; > >> + > >> + aux-bus { > >> + panel { > >> + compatible = "lg,lp079qx1-sp0v"; > > > > Why do you need the particular compat string here? Can you use the > > generic "edp-panel" instead? What if the user swaps the panel? > > > > The eDP panels used in conjunction with the RK3588S EVB1 have broken > identification, which is one of the valid reasons for using a particular > compat string. So the generic_edp_panel_probe() can not return success > when using the "edp-panel". Broken how? I don't see such info in the commit message. > > >> + backlight = <&backlight>; > >> + power-supply = <&vcc3v3_lcd_edp>; > >> + > >> + port { > >> + panel_in_edp: endpoint { > >> + remote-endpoint = <&edp_out_panel>; > >> + }; > >> + }; > >> + }; > >> + }; > >> +}; > >> + > >> +&edp0_in { > >> + edp0_in_vp2: endpoint { > >> + remote-endpoint = <&vp2_out_edp0>; > >> + }; > >> +}; > >> + > >> +&edp0_out { > >> + edp_out_panel: endpoint { > >> + remote-endpoint = <&panel_in_edp>; > >> + }; > >> +}; > >> + > >> +&hdptxphy0 { > >> + status = "okay"; > >> +}; > >> + > >> &i2c3 { > >> status = "okay"; > >> > >> @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { > >> }; > >> > >> &pwm12 { > >> + pinctrl-0 = <&pwm12m1_pins>; > >> status = "okay"; > >> }; > >> > >> @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { > >> }; > >> }; > >> }; > >> + > >> +&vop_mmu { > >> + status = "okay"; > >> +}; > >> + > >> +&vop { > >> + status = "okay"; > >> +}; > >> + > >> +&vp2 { > >> + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { > >> + reg = <ROCKCHIP_VOP2_EP_EDP0>; > >> + remote-endpoint = <&edp0_in_vp2>; > >> + }; > >> +}; > >> -- > >> 2.34.1 > >> > > > Best regards, > Damon -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-20 5:38 ` Dmitry Baryshkov @ 2024-12-25 9:34 ` Damon Ding 2024-12-26 20:26 ` Dmitry Baryshkov 0 siblings, 1 reply; 38+ messages in thread From: Damon Ding @ 2024-12-25 9:34 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/20 13:38, Dmitry Baryshkov wrote: > On Fri, 20 Dec 2024 at 04:38, Damon Ding <damon.ding@rock-chips.com> wrote: >> >> Hi Dmitry, >> >> On 2024/12/20 8:20, Dmitry Baryshkov wrote: >>> On Thu, Dec 19, 2024 at 04:06:03PM +0800, Damon Ding wrote: >>>> Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: >>>> - Add edp-panel node >>>> - Set pinctrl of pwm12 for backlight >>>> - Enable edp0/hdptxphy0/vp2 >>>> >>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >>>> >>>> --- >>>> >>>> Changes in v2: >>>> - Remove brightness-levels and default-brightness-level properties in >>>> backlight node. >>>> - Add the detail DT changes to commit message. >>>> >>>> Changes in v3: >>>> - Use aux-bus instead of platform bus for edp-panel. >>>> --- >>>> .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ >>>> 1 file changed, 52 insertions(+) >>>> >>>> diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >>>> index bc4077575beb..9547ab18e596 100644 >>>> --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >>>> +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >>>> @@ -9,6 +9,7 @@ >>>> #include <dt-bindings/gpio/gpio.h> >>>> #include <dt-bindings/input/input.h> >>>> #include <dt-bindings/pinctrl/rockchip.h> >>>> +#include <dt-bindings/soc/rockchip,vop2.h> >>>> #include <dt-bindings/usb/pd.h> >>>> #include "rk3588s.dtsi" >>>> >>>> @@ -238,6 +239,41 @@ &combphy2_psu { >>>> status = "okay"; >>>> }; >>>> >>>> +&edp0 { >>>> + force-hpd; >>>> + status = "okay"; >>>> + >>>> + aux-bus { >>>> + panel { >>>> + compatible = "lg,lp079qx1-sp0v"; >>> >>> Why do you need the particular compat string here? Can you use the >>> generic "edp-panel" instead? What if the user swaps the panel? >>> >> >> The eDP panels used in conjunction with the RK3588S EVB1 have broken >> identification, which is one of the valid reasons for using a particular >> compat string. So the generic_edp_panel_probe() can not return success >> when using the "edp-panel". > > Broken how? I don't see such info in the commit message. > The log related to the broken identification may be like: [ 0.623793] panel-simple-dp-aux aux-fdec0000.edp: Unknown panel ETC 0x0000, using conservative timings The eDP panel used in RK3588S EVB1 is indeed the LP079QX1_SP0V model, it should be also reasonable to use the "lg,lp079qx1-sp0v". And I will mention all of the above in the commit message for the next version. >> >>>> + backlight = <&backlight>; >>>> + power-supply = <&vcc3v3_lcd_edp>; >>>> + >>>> + port { >>>> + panel_in_edp: endpoint { >>>> + remote-endpoint = <&edp_out_panel>; >>>> + }; >>>> + }; >>>> + }; >>>> + }; >>>> +}; >>>> + >>>> +&edp0_in { >>>> + edp0_in_vp2: endpoint { >>>> + remote-endpoint = <&vp2_out_edp0>; >>>> + }; >>>> +}; >>>> + >>>> +&edp0_out { >>>> + edp_out_panel: endpoint { >>>> + remote-endpoint = <&panel_in_edp>; >>>> + }; >>>> +}; >>>> + >>>> +&hdptxphy0 { >>>> + status = "okay"; >>>> +}; >>>> + >>>> &i2c3 { >>>> status = "okay"; >>>> >>>> @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { >>>> }; >>>> >>>> &pwm12 { >>>> + pinctrl-0 = <&pwm12m1_pins>; >>>> status = "okay"; >>>> }; >>>> >>>> @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { >>>> }; >>>> }; >>>> }; >>>> + >>>> +&vop_mmu { >>>> + status = "okay"; >>>> +}; >>>> + >>>> +&vop { >>>> + status = "okay"; >>>> +}; >>>> + >>>> +&vp2 { >>>> + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { >>>> + reg = <ROCKCHIP_VOP2_EP_EDP0>; >>>> + remote-endpoint = <&edp0_in_vp2>; >>>> + }; >>>> +}; >>>> -- >>>> 2.34.1 >>>> Best regards Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-25 9:34 ` Damon Ding @ 2024-12-26 20:26 ` Dmitry Baryshkov 2024-12-27 8:54 ` Damon Ding 0 siblings, 1 reply; 38+ messages in thread From: Dmitry Baryshkov @ 2024-12-26 20:26 UTC (permalink / raw) To: Damon Ding Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy On Wed, 25 Dec 2024 at 11:34, Damon Ding <damon.ding@rock-chips.com> wrote: > > Hi Dmitry, > > On 2024/12/20 13:38, Dmitry Baryshkov wrote: > > On Fri, 20 Dec 2024 at 04:38, Damon Ding <damon.ding@rock-chips.com> wrote: > >> > >> Hi Dmitry, > >> > >> On 2024/12/20 8:20, Dmitry Baryshkov wrote: > >>> On Thu, Dec 19, 2024 at 04:06:03PM +0800, Damon Ding wrote: > >>>> Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: > >>>> - Add edp-panel node > >>>> - Set pinctrl of pwm12 for backlight > >>>> - Enable edp0/hdptxphy0/vp2 > >>>> > >>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> > >>>> > >>>> --- > >>>> > >>>> Changes in v2: > >>>> - Remove brightness-levels and default-brightness-level properties in > >>>> backlight node. > >>>> - Add the detail DT changes to commit message. > >>>> > >>>> Changes in v3: > >>>> - Use aux-bus instead of platform bus for edp-panel. > >>>> --- > >>>> .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ > >>>> 1 file changed, 52 insertions(+) > >>>> > >>>> diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > >>>> index bc4077575beb..9547ab18e596 100644 > >>>> --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > >>>> +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts > >>>> @@ -9,6 +9,7 @@ > >>>> #include <dt-bindings/gpio/gpio.h> > >>>> #include <dt-bindings/input/input.h> > >>>> #include <dt-bindings/pinctrl/rockchip.h> > >>>> +#include <dt-bindings/soc/rockchip,vop2.h> > >>>> #include <dt-bindings/usb/pd.h> > >>>> #include "rk3588s.dtsi" > >>>> > >>>> @@ -238,6 +239,41 @@ &combphy2_psu { > >>>> status = "okay"; > >>>> }; > >>>> > >>>> +&edp0 { > >>>> + force-hpd; > >>>> + status = "okay"; > >>>> + > >>>> + aux-bus { > >>>> + panel { > >>>> + compatible = "lg,lp079qx1-sp0v"; > >>> > >>> Why do you need the particular compat string here? Can you use the > >>> generic "edp-panel" instead? What if the user swaps the panel? > >>> > >> > >> The eDP panels used in conjunction with the RK3588S EVB1 have broken > >> identification, which is one of the valid reasons for using a particular > >> compat string. So the generic_edp_panel_probe() can not return success > >> when using the "edp-panel". > > > > Broken how? I don't see such info in the commit message. > > > > The log related to the broken identification may be like: > > [ 0.623793] panel-simple-dp-aux aux-fdec0000.edp: Unknown panel ETC > 0x0000, using conservative timings According to [1] the ETC / 0x0000 is a correct identification for that panel. I'd suggest adding the timings to the driver instead. [1] https://www.elecok.com/data_sheet/107657/LP079QX1-SP0V_7.9%22_a-Si_TFT-LCD%2CPanel_for_LG_Display(EN).pdf?download=true > > The eDP panel used in RK3588S EVB1 is indeed the LP079QX1_SP0V model, it > should be also reasonable to use the "lg,lp079qx1-sp0v". > > And I will mention all of the above in the commit message for the next > version. > > >> > >>>> + backlight = <&backlight>; > >>>> + power-supply = <&vcc3v3_lcd_edp>; > >>>> + > >>>> + port { > >>>> + panel_in_edp: endpoint { > >>>> + remote-endpoint = <&edp_out_panel>; > >>>> + }; > >>>> + }; > >>>> + }; > >>>> + }; > >>>> +}; > >>>> + > >>>> +&edp0_in { > >>>> + edp0_in_vp2: endpoint { > >>>> + remote-endpoint = <&vp2_out_edp0>; > >>>> + }; > >>>> +}; > >>>> + > >>>> +&edp0_out { > >>>> + edp_out_panel: endpoint { > >>>> + remote-endpoint = <&panel_in_edp>; > >>>> + }; > >>>> +}; > >>>> + > >>>> +&hdptxphy0 { > >>>> + status = "okay"; > >>>> +}; > >>>> + > >>>> &i2c3 { > >>>> status = "okay"; > >>>> > >>>> @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { > >>>> }; > >>>> > >>>> &pwm12 { > >>>> + pinctrl-0 = <&pwm12m1_pins>; > >>>> status = "okay"; > >>>> }; > >>>> > >>>> @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { > >>>> }; > >>>> }; > >>>> }; > >>>> + > >>>> +&vop_mmu { > >>>> + status = "okay"; > >>>> +}; > >>>> + > >>>> +&vop { > >>>> + status = "okay"; > >>>> +}; > >>>> + > >>>> +&vp2 { > >>>> + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { > >>>> + reg = <ROCKCHIP_VOP2_EP_EDP0>; > >>>> + remote-endpoint = <&edp0_in_vp2>; > >>>> + }; > >>>> +}; > >>>> -- > >>>> 2.34.1 > >>>> > > Best regards > Damon > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board 2024-12-26 20:26 ` Dmitry Baryshkov @ 2024-12-27 8:54 ` Damon Ding 0 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-27 8:54 UTC (permalink / raw) To: Dmitry Baryshkov Cc: heiko, robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy Hi Dmitry, On 2024/12/27 4:26, Dmitry Baryshkov wrote: > On Wed, 25 Dec 2024 at 11:34, Damon Ding <damon.ding@rock-chips.com> wrote: >> >> Hi Dmitry, >> >> On 2024/12/20 13:38, Dmitry Baryshkov wrote: >>> On Fri, 20 Dec 2024 at 04:38, Damon Ding <damon.ding@rock-chips.com> wrote: >>>> >>>> Hi Dmitry, >>>> >>>> On 2024/12/20 8:20, Dmitry Baryshkov wrote: >>>>> On Thu, Dec 19, 2024 at 04:06:03PM +0800, Damon Ding wrote: >>>>>> Add the necessary DT changes to enable eDP0 on RK3588S EVB1 board: >>>>>> - Add edp-panel node >>>>>> - Set pinctrl of pwm12 for backlight >>>>>> - Enable edp0/hdptxphy0/vp2 >>>>>> >>>>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com> >>>>>> >>>>>> --- >>>>>> >>>>>> Changes in v2: >>>>>> - Remove brightness-levels and default-brightness-level properties in >>>>>> backlight node. >>>>>> - Add the detail DT changes to commit message. >>>>>> >>>>>> Changes in v3: >>>>>> - Use aux-bus instead of platform bus for edp-panel. >>>>>> --- >>>>>> .../boot/dts/rockchip/rk3588s-evb1-v10.dts | 52 +++++++++++++++++++ >>>>>> 1 file changed, 52 insertions(+) >>>>>> >>>>>> diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >>>>>> index bc4077575beb..9547ab18e596 100644 >>>>>> --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >>>>>> +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts >>>>>> @@ -9,6 +9,7 @@ >>>>>> #include <dt-bindings/gpio/gpio.h> >>>>>> #include <dt-bindings/input/input.h> >>>>>> #include <dt-bindings/pinctrl/rockchip.h> >>>>>> +#include <dt-bindings/soc/rockchip,vop2.h> >>>>>> #include <dt-bindings/usb/pd.h> >>>>>> #include "rk3588s.dtsi" >>>>>> >>>>>> @@ -238,6 +239,41 @@ &combphy2_psu { >>>>>> status = "okay"; >>>>>> }; >>>>>> >>>>>> +&edp0 { >>>>>> + force-hpd; >>>>>> + status = "okay"; >>>>>> + >>>>>> + aux-bus { >>>>>> + panel { >>>>>> + compatible = "lg,lp079qx1-sp0v"; >>>>> >>>>> Why do you need the particular compat string here? Can you use the >>>>> generic "edp-panel" instead? What if the user swaps the panel? >>>>> >>>> >>>> The eDP panels used in conjunction with the RK3588S EVB1 have broken >>>> identification, which is one of the valid reasons for using a particular >>>> compat string. So the generic_edp_panel_probe() can not return success >>>> when using the "edp-panel". >>> >>> Broken how? I don't see such info in the commit message. >>> >> >> The log related to the broken identification may be like: >> >> [ 0.623793] panel-simple-dp-aux aux-fdec0000.edp: Unknown panel ETC >> 0x0000, using conservative timings > > According to [1] the ETC / 0x0000 is a correct identification for that > panel. I'd suggest adding the timings to the driver instead. > > [1] https://www.elecok.com/data_sheet/107657/LP079QX1-SP0V_7.9%22_a-Si_TFT-LCD%2CPanel_for_LG_Display(EN).pdf?download=true > Do you mean adding the LP079QX1-SP0V to the struct edp_panel_entry edp_panels[]? While verifying the 'edp-panel'compatible, I have found some bugs related to the process of getting edp panel from the DP AUX bus in PATCH v4 series. Consequently, the commits concerning the analogix dp drivers are not good. I will fix the unexpected bugs in the next version(v5). >> >> The eDP panel used in RK3588S EVB1 is indeed the LP079QX1_SP0V model, it >> should be also reasonable to use the "lg,lp079qx1-sp0v". >> >> And I will mention all of the above in the commit message for the next >> version. >> >>>> >>>>>> + backlight = <&backlight>; >>>>>> + power-supply = <&vcc3v3_lcd_edp>; >>>>>> + >>>>>> + port { >>>>>> + panel_in_edp: endpoint { >>>>>> + remote-endpoint = <&edp_out_panel>; >>>>>> + }; >>>>>> + }; >>>>>> + }; >>>>>> + }; >>>>>> +}; >>>>>> + >>>>>> +&edp0_in { >>>>>> + edp0_in_vp2: endpoint { >>>>>> + remote-endpoint = <&vp2_out_edp0>; >>>>>> + }; >>>>>> +}; >>>>>> + >>>>>> +&edp0_out { >>>>>> + edp_out_panel: endpoint { >>>>>> + remote-endpoint = <&panel_in_edp>; >>>>>> + }; >>>>>> +}; >>>>>> + >>>>>> +&hdptxphy0 { >>>>>> + status = "okay"; >>>>>> +}; >>>>>> + >>>>>> &i2c3 { >>>>>> status = "okay"; >>>>>> >>>>>> @@ -399,6 +435,7 @@ usbc0_int: usbc0-int { >>>>>> }; >>>>>> >>>>>> &pwm12 { >>>>>> + pinctrl-0 = <&pwm12m1_pins>; >>>>>> status = "okay"; >>>>>> }; >>>>>> >>>>>> @@ -1168,3 +1205,18 @@ usbdp_phy0_dp_altmode_mux: endpoint@1 { >>>>>> }; >>>>>> }; >>>>>> }; >>>>>> + >>>>>> +&vop_mmu { >>>>>> + status = "okay"; >>>>>> +}; >>>>>> + >>>>>> +&vop { >>>>>> + status = "okay"; >>>>>> +}; >>>>>> + >>>>>> +&vp2 { >>>>>> + vp2_out_edp0: endpoint@ROCKCHIP_VOP2_EP_EDP0 { >>>>>> + reg = <ROCKCHIP_VOP2_EP_EDP0>; >>>>>> + remote-endpoint = <&edp0_in_vp2>; >>>>>> + }; >>>>>> +}; >>>>>> -- >>>>>> 2.34.1 >>>>>> Best regards Damon ^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v3 15/15] arm64: dts: rockchip: Add eDP1 node for RK3588 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding ` (13 preceding siblings ...) 2024-12-19 8:06 ` [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board Damon Ding @ 2024-12-19 8:06 ` Damon Ding 14 siblings, 0 replies; 38+ messages in thread From: Damon Ding @ 2024-12-19 8:06 UTC (permalink / raw) To: heiko Cc: robh, krzk+dt, conor+dt, rfoss, vkoul, sebastian.reichel, cristian.ciocaltea, l.stach, andy.yan, hjc, algea.cao, kever.yang, dri-devel, devicetree, linux-arm-kernel, linux-rockchip, linux-kernel, linux-phy, Damon Ding Add support for the eDP1 output on RK3588 SoC. Signed-off-by: Damon Ding <damon.ding@rock-chips.com> --- Changes in v3: - remove unexpected alias/hdptxphy1_grf/hdptxphy1 configurations - remove currently unsupported property '#sound-dai-cells' --- .../arm64/boot/dts/rockchip/rk3588-extra.dtsi | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi index 0ce0934ec6b7..ad96fe25814e 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi @@ -67,6 +67,11 @@ u2phy1_otg: otg-port { }; }; + hdptxphy1_grf: syscon@fd5e4000 { + compatible = "rockchip,rk3588-hdptxphy-grf", "syscon"; + reg = <0x0 0xfd5e4000 0x0 0x100>; + }; + i2s8_8ch: i2s@fddc8000 { compatible = "rockchip,rk3588-i2s-tdm"; reg = <0x0 0xfddc8000 0x0 0x1000>; @@ -135,6 +140,34 @@ i2s10_8ch: i2s@fde00000 { status = "disabled"; }; + edp1: edp@fded0000 { + compatible = "rockchip,rk3588-edp"; + reg = <0x0 0xfded0000 0x0 0x1000>; + clocks = <&cru CLK_EDP1_24M>, <&cru PCLK_EDP1>, <&cru CLK_EDP1_200M>; + clock-names = "dp", "pclk", "spdif"; + interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH 0>; + phys = <&hdptxphy1>; + phy-names = "dp"; + power-domains = <&power RK3588_PD_VO1>; + resets = <&cru SRST_EDP1_24M>, <&cru SRST_P_EDP1>; + reset-names = "dp", "apb"; + rockchip,grf = <&vo1_grf>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + edp1_in: port@0 { + reg = <0>; + }; + + edp1_out: port@1 { + reg = <1>; + }; + }; + }; + pcie3x4: pcie@fe150000 { compatible = "rockchip,rk3588-pcie", "rockchip,rk3568-pcie"; #address-cells = <3>; @@ -395,6 +428,22 @@ sata-port@0 { }; }; + hdptxphy1: phy@fed70000 { + compatible = "rockchip,rk3588-hdptx-phy"; + reg = <0x0 0xfed70000 0x0 0x2000>; + clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>, <&cru PCLK_HDPTX1>; + clock-names = "ref", "apb"; + #phy-cells = <0>; + resets = <&cru SRST_HDPTX1>, <&cru SRST_P_HDPTX1>, + <&cru SRST_HDPTX1_INIT>, <&cru SRST_HDPTX1_CMN>, + <&cru SRST_HDPTX1_LANE>, <&cru SRST_HDPTX1_ROPLL>, + <&cru SRST_HDPTX1_LCPLL>; + reset-names = "phy", "apb", "init", "cmn", "lane", "ropll", + "lcpll"; + rockchip,grf = <&hdptxphy1_grf>; + status = "disabled"; + }; + usbdp_phy1: phy@fed90000 { compatible = "rockchip,rk3588-usbdp-phy"; reg = <0x0 0xfed90000 0x0 0x10000>; -- 2.34.1 ^ permalink raw reply related [flat|nested] 38+ messages in thread
end of thread, other threads:[~2024-12-27 8:55 UTC | newest] Thread overview: 38+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-12-19 8:05 [PATCH v3 00/15] Add eDP support for RK3588 Damon Ding 2024-12-19 8:05 ` [PATCH v3 01/15] drm/rockchip: analogix_dp: Use formalized struct definition for grf field Damon Ding 2024-12-19 8:05 ` [PATCH v3 02/15] dt-bindings: display: rockchip: analogix-dp: Add support for RK3588 Damon Ding 2024-12-19 8:28 ` Krzysztof Kozlowski 2024-12-26 2:10 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 03/15] drm/rockchip: analogix_dp: " Damon Ding 2024-12-19 8:05 ` [PATCH v3 04/15] phy: phy-rockchip-samsung-hdptx: Rename some register names related to DP Damon Ding 2024-12-20 0:22 ` Dmitry Baryshkov 2024-12-20 1:46 ` Damon Ding 2024-12-20 2:01 ` Dmitry Baryshkov 2024-12-19 8:05 ` [PATCH v3 05/15] phy: phy-rockchip-samsung-hdptx: Add support for eDP mode Damon Ding 2024-12-19 8:05 ` [PATCH v3 06/15] drm/bridge: analogix_dp: Add support for RK3588 Damon Ding 2024-12-19 8:05 ` [PATCH v3 07/15] drm/bridge: analogix_dp: Add support for phy configuration Damon Ding 2024-12-20 0:13 ` Dmitry Baryshkov 2024-12-20 0:17 ` Diederik de Haas 2024-12-20 3:37 ` Damon Ding 2024-12-20 5:37 ` Dmitry Baryshkov 2024-12-25 8:27 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 08/15] drm/rockchip: analogix_dp: Add support to get panel from the DP AUX bus Damon Ding 2024-12-20 0:16 ` Dmitry Baryshkov 2024-12-20 8:29 ` Damon Ding 2024-12-19 8:05 ` [PATCH v3 09/15] drm/bridge: " Damon Ding 2024-12-20 0:17 ` Dmitry Baryshkov 2024-12-19 8:05 ` [PATCH v3 10/15] dt-bindings: display: rockchip: analogix-dp: " Damon Ding 2024-12-20 0:18 ` Dmitry Baryshkov 2024-12-20 2:48 ` Damon Ding 2024-12-24 9:36 ` Krzysztof Kozlowski 2024-12-19 8:06 ` [PATCH v3 11/15] dt-bindings: display: rockchip: Fix label name of hdptxphy for RK3588 HDMI TX Controller Damon Ding 2024-12-19 8:06 ` [PATCH v3 12/15] arm64: dts: rockchip: Fix label name of hdptxphy for RK3588 Damon Ding 2024-12-19 8:06 ` [PATCH v3 13/15] arm64: dts: rockchip: Add eDP0 node " Damon Ding 2024-12-19 8:06 ` [PATCH v3 14/15] arm64: dts: rockchip: Enable eDP0 display on RK3588S EVB1 board Damon Ding 2024-12-20 0:20 ` Dmitry Baryshkov 2024-12-20 2:38 ` Damon Ding 2024-12-20 5:38 ` Dmitry Baryshkov 2024-12-25 9:34 ` Damon Ding 2024-12-26 20:26 ` Dmitry Baryshkov 2024-12-27 8:54 ` Damon Ding 2024-12-19 8:06 ` [PATCH v3 15/15] arm64: dts: rockchip: Add eDP1 node for RK3588 Damon Ding
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).