Add MIPI rx DPI support
Subsystems (4)
v9 cover Add MIPI rx DPI support
Hi all, this patch series implement MIPI rx DPI feature. Please help to review.
This is the v9 version, rebase all patches on the latest code. Any mistakes, please let me know, I'll fix it in the next series.
Change history:
v9: Fix Neil Amstrong comment
- use macro define 'V4L2_FWNODE_BUS_TYPE_PARALLEL' instead of fixing value.
v8: Fix Laurent Pinchart comment
- Expand the commit message
v7:
- Rebase DT on the latest branch 'drm-misc-next'.
- Remove HDCP patch.
v6: Fix kernel robot compile warning
v5: Fix Rob Herring, Hsin-Yi, Robert Foss comments
- Rebase code on the branch 'drm-misc-next', refer video-interfaces.yaml
- Seprate HDCP function to a new patch
- Fix driver not correctly get 'bus-type' 'data-lanes'
- Add audio HDMI codec function support
v4: Fix Rob Herring comment
- Rebase code on the branch 'drm-misc-next'
- Change 'analogix,hdcp-support' type to boolean
v3: Fix Rob Herring, Dan Carpenter, Nicolas comment
- Split the patch, fix not correct return data
- Fix several coding format
- Split DP tx swing register setting to two property
- Add HDCP support vender flag
- remove 'analogix,swing-setting' and 'analogix,mipi-dpi-in' property
v2: Fix Rob Herring comment
- Fix yamllint warnings/errors in analogix,anx7625.yaml
- Fix kernel robot compile warning
v1: initial MIPI rx DPI feature support
*** BLURB HERE ***
Xin Ji (4):
dt-bindings:drm/bridge:anx7625:add vendor define flags drm/bridge: anx7625: fix not correct return value drm/bridge: anx7625: add MIPI DPI input feature drm/bridge: anx7625: add HDMI audio function
.../display/bridge/analogix,anx7625.yaml | 57 ++- drivers/gpu/drm/bridge/analogix/anx7625.c | 458 ++++++++++++++++-- drivers/gpu/drm/bridge/analogix/anx7625.h | 23 +- 3 files changed, 484 insertions(+), 54 deletions(-)
Signature · 1 line
2.25.1
PATCH v9 1/4 dt-bindings:drm/bridge:anx7625:add vendor define flags
Add 'bus-type' and 'data-lanes' define for port0. Define DP tx lane0, lane1 swing register array define, and audio enable flag.
--- .../display/bridge/analogix,anx7625.yaml | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +56 -1
@@ -43,6 +43,26 @@ properties: vdd33-supply: description: Regulator that provides the supply 3.3V power. + analogix,lane0-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane0 PHY, please don't + add this property, or contact vendor. + + analogix,lane1-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane1 PHY, please don't + add this property, or contact vendor. + + analogix,audio-enable: + type: boolean + description: let the driver enable audio HDMI codec function or not. + ports: $ref: /schemas/graph.yaml#/properties/ports
@@ -50,13 +70,43 @@ properties: port@0: $ref: /schemas/graph.yaml#/properties/port description: - Video port for MIPI DSI input. + MIPI DSI/DPI input. + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + bus-type: true + data-lanes: true + + required: + - remote-endpoint + + required: + - endpoint + port@1: $ref: /schemas/graph.yaml#/properties/port description: Video port for panel or connector. + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + + required: + - remote-endpoint + required: - port@0 - port@1
@@ -87,6 +137,9 @@ examples: vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; vdd33-supply = <&pp3300_mipibrdg>; + analogix,audio-enable; + analogix,lane0-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; + analogix,lane1-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; ports { #address-cells = <1>;
@@ -96,6 +149,8 @@ examples: reg = <0>; anx7625_in: endpoint { remote-endpoint = <&mipi_dsi>; + bus-type = <5>; + data-lanes = <0 1 2 3>; }; };
Signature · 1 line
2.25.1
A message that is not in the archive (sent off-list or not yet received): CAG3jFys6D=-L-Aez4aWuE4nM7qJCtn4wPws3TKxbkRzcAoFR0A@mail.gmail.com
Re: [PATCH v9 1/4] dt-bindings:drm/bridge:anx7625:add vendor define flags
Quoted 7 lines · Robert Foss
Hey Xin,
I would like to merge this series now, but this patch needs a review first. Maybe Laurent/Rob Herring are good candidates.
Rob.
Hi Rob, I get Laurent/Rob comments before, and explained why we needs these DT properties, so far, I didn't get any response.
Hi Rob Herring and Laurent, for the DT property lane0/1-swing, Google engineer has strong demond for them, they don't want to move DP swing adjusting to kernel, thus may cause change the driver code in each project, so config them in DT is a best option.
Thanks,
Xin
Quoted 109 lines · Xin Ji
Quoted 107 lines
Add 'bus-type' and 'data-lanes' define for port0. Define DP tx lane0, lane1 swing register array define, and audio enable flag.
Signed-off-by Xin Ji <[email protected]>--- .../display/bridge/analogix,anx7625.yaml | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +56
-2@@ -43,6 +43,26 @@ properties: vdd33-supply: description: Regulator that provides the supply 3.3V power. + analogix,lane0-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane0 PHY, please don't + add this property, or contact vendor. + + analogix,lane1-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane1 PHY, please don't + add this property, or contact vendor. + + analogix,audio-enable: + type: boolean + description: let the driver enable audio HDMI codec function or not. + ports: $ref: /schemas/graph.yaml#/properties/ports@@ -50,13 +70,43 @@ properties: port@0: $ref: /schemas/graph.yaml#/properties/port description: - Video port for MIPI DSI input. + MIPI DSI/DPI input. + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + bus-type: true + data-lanes: true + + required: + - remote-endpoint + + required: + - endpoint + port@1: $ref: /schemas/graph.yaml#/properties/port description: Video port for panel or connector. + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + + required: + - remote-endpoint + required: - port@0 - port@1@@ -87,6 +137,9 @@ examples: vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; vdd33-supply = <&pp3300_mipibrdg>; + analogix,audio-enable; + analogix,lane0-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; + analogix,lane1-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; ports { #address-cells = <1>;@@ -96,6 +149,8 @@ examples: reg = <0>; anx7625_in: endpoint { remote-endpoint = <&mipi_dsi>; + bus-type = <5>; + data-lanes = <0 1 2 3>; }; }; --2.25.1
Rob Herring
maintainerRe: [PATCH v9 1/4] dt-bindings:drm/bridge:anx7625:add vendor define flags
Quoted 10 lines · Xin Ji
Quoted 7 lines · Robert Foss
Hey Xin,
I would like to merge this series now, but this patch needs a review first. Maybe Laurent/Rob Herring are good candidates.
Rob.
Hi Rob, I get Laurent/Rob comments before, and explained why we needs these DT properties, so far, I didn't get any response.
Do I have to go dig that up? If it was more than a week ago, assume I don't remember. This is 1 of 100 bindings a week.
Justify why this is needed in your commit message.
Quoted 4 lines
Hi Rob Herring and Laurent, for the DT property lane0/1-swing, Google engineer has strong demond for them, they don't want to move DP swing adjusting to kernel, thus may cause change the driver code in each project, so config them in DT is a best option.
Where's the ack from a Google engineer?
Quoted 22 lines
Thanks,
XinQuoted 19 lines · Xin Ji
Quoted 17 lines
Add 'bus-type' and 'data-lanes' define for port0. Define DP tx lane0, lane1 swing register array define, and audio enable flag.
Signed-off-by Xin Ji <[email protected]>--- .../display/bridge/analogix,anx7625.yaml | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +0
-0@@ -43,6 +43,26 @@ properties: vdd33-supply: description: Regulator that provides the supply 3.3V power.
Quoted 7 lines
Quoted 7 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 52
Quoted 7 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +7
-0+ analogix,lane0-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane0 PHY, please don't + add this property, or contact vendor.
Why do we have the property if we're not supposed to add it.
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +4
-0+ + analogix,lane1-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1
Quoted 8 lines
Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 64
Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +8
-0+ maxItems: 20 + description: + an array of swing register setting for DP tx lane1 PHY, please don't + add this property, or contact vendor. + + analogix,audio-enable: + type: boolean + description: let the driver enable audio HDMI codec function or not.
Wouldn't we have a 'port' node if audio is to be enabled?
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +1
-0+ ports: $ref: /schemas/graph.yaml#/properties/ports
Quoted 12 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +0
-0@@ -50,13 +70,43 @@ properties: port@0: $ref: /schemas/graph.yaml#/properties/port description:Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 79
Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +7
-1- Video port for MIPI DSI input. + MIPI DSI/DPI input. + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false
Use 'unevaluatedProperties: false' instead...
Quoted 3 lines
Quoted 3 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 82
Quoted 3 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +3
-0+ + properties: + remote-endpoint: true
...And drop this.
Quoted 1 line
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 83
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +1
-0+ bus-type: true
This device supports all the possible bus types? What's the default as it is not required?
Quoted 1 line
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 84
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +1
-0+ data-lanes: true
And up to 8 lanes?
Quoted 6 lines
Quoted 6 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 90
Quoted 6 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +6
-0+ + required: + - remote-endpoint + + required: + - endpoint
You can drop both 'required'.
Quoted 10 lines
Quoted 10 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 100
Quoted 10 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +4
-0+ port@1: $ref: /schemas/graph.yaml#/properties/port description: Video port for panel or connector. + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml#
Doesn't look like anything from video-interfaces.yaml is used. This whole chunk is not needed.
Quoted 35 lines
Quoted 34 lines
Quoted 34 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +14
-1+ type: object + additionalProperties: false + + properties: + remote-endpoint: true + + required: + - remote-endpoint + required: - port@0 - port@1@@ -87,6 +137,9 @@ examples: vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; vdd33-supply = <&pp3300_mipibrdg>; + analogix,audio-enable; + analogix,lane0-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; + analogix,lane1-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; ports { #address-cells = <1>;@@ -96,6 +149,8 @@ examples: reg = <0>; anx7625_in: endpoint { remote-endpoint = <&mipi_dsi>; + bus-type = <5>; + data-lanes = <0 1 2 3>; }; }; --2.25.1
Re: [PATCH v9 1/4] dt-bindings:drm/bridge:anx7625:add vendor define flags
Quoted 8 lines · Rob Herring
Quoted 7 lines · Xin Ji
Quoted 6 lines · Robert Foss
Hey Xin,
I would like to merge this series now, but this patch needs a review first. Maybe Laurent/Rob Herring are good candidates.
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
Rob.
Hi Rob, I get Laurent/Rob comments before, and explained why we needs these DT properties, so far, I didn't get any response.
Do I have to go dig that up? If it was more than a week ago, assume I don't remember. This is 1 of 100 bindings a week.
Justify why this is needed in your commit message.
Hi Rob, I'll give more detail description in commit message.
Quoted 7 lines
Quoted 5 lines
Hi Rob Herring and Laurent, for the DT property lane0/1-swing, Google engineer has strong demond for them, they don't want to move DP swing adjusting to kernel, thus may cause change the driver code in each project, so config them in DT is a best option.
Where's the ack from a Google engineer?
They didn't give the review ack, but we discussed it offline. Nicolas Boichat known this.
Thanks,
Xin
Quoted 140 lines
Quoted 23 lines
Thanks,
XinQuoted 19 lines · Xin Ji
Quoted 17 lines
Add 'bus-type' and 'data-lanes' define for port0. Define DP tx lane0, lane1 swing register array define, and audio enable flag.
Signed-off-by Xin Ji <[email protected]>--- .../display/bridge/analogix,anx7625.yaml | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +0
-0@@ -43,6 +43,26 @@ properties: vdd33-supply: description: Regulator that provides the supply 3.3V power.Quoted 7 lines
Quoted 7 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 52
Quoted 7 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +7
-0+ analogix,lane0-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane0 PHY, please don't + add this property, or contact vendor.Why do we have the property if we're not supposed to add it.
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +4
-0+ + analogix,lane1-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1Quoted 8 lines
Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 64
Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +8
-0+ maxItems: 20 + description: + an array of swing register setting for DP tx lane1 PHY, please don't + add this property, or contact vendor. + + analogix,audio-enable: + type: boolean + description: let the driver enable audio HDMI codec function or not.Wouldn't we have a 'port' node if audio is to be enabled?
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +1
-0+ ports: $ref: /schemas/graph.yaml#/properties/portsQuoted 12 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +0
-0@@ -50,13 +70,43 @@ properties: port@0: $ref: /schemas/graph.yaml#/properties/port description:Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 79
Quoted 8 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +7
-1- Video port for MIPI DSI input. + MIPI DSI/DPI input. + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: falseUse 'unevaluatedProperties: false' instead...
Quoted 3 lines
Quoted 3 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 82
Quoted 3 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +3
-0+ + properties: + remote-endpoint: true...And drop this.
Quoted 1 line
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 83
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +1
-0+ bus-type: trueThis device supports all the possible bus types? What's the default as it is not required?
Quoted 1 line
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 84
Quoted 1 line
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +1
-0+ data-lanes: trueAnd up to 8 lanes?
Quoted 6 lines
Quoted 6 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 90
Quoted 6 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +6
-0+ + required: + - remote-endpoint + + required: + - endpointYou can drop both 'required'.
Quoted 10 lines
Quoted 10 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml properties: · line 100
Quoted 10 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +4
-0+ port@1: $ref: /schemas/graph.yaml#/properties/port description: Video port for panel or connector. + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml#Doesn't look like anything from
video-interfaces.yamlis used. This whole chunk is not needed.Quoted 35 lines
Quoted 34 lines
Quoted 34 lines
Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +14
-1+ type: object + additionalProperties: false + + properties: + remote-endpoint: true + + required: + - remote-endpoint + required: - port@0 - port@1@@ -87,6 +137,9 @@ examples: vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; vdd33-supply = <&pp3300_mipibrdg>; + analogix,audio-enable; + analogix,lane0-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; + analogix,lane1-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; ports { #address-cells = <1>;@@ -96,6 +149,8 @@ examples: reg = <0>; anx7625_in: endpoint { remote-endpoint = <&mipi_dsi>; + bus-type = <5>; + data-lanes = <0 1 2 3>; }; }; --2.25.1
Re: [PATCH v9 1/4] dt-bindings:drm/bridge:anx7625:add vendor define flags
Quoted 20 lines · Xin Ji
Quoted 8 lines · Rob Herring
Quoted 7 lines · Xin Ji
Quoted 6 lines · Robert Foss
Hey Xin,
I would like to merge this series now, but this patch needs a review first. Maybe Laurent/Rob Herring are good candidates.
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
Rob.
Hi Rob, I get Laurent/Rob comments before, and explained why we needs these DT properties, so far, I didn't get any response.
Do I have to go dig that up? If it was more than a week ago, assume I don't remember. This is 1 of 100 bindings a week.
Justify why this is needed in your commit message.
Hi Rob, I'll give more detail description in commit message.
Quoted 1 line
Quoted 8 lines
Quoted 6 lines
Quoted 4 lines
Hi Rob Herring and Laurent, for the DT property lane0/1-swing, Google engineer has strong demond for them, they don't want to move DP swing adjusting to kernel, thus may cause change the driver code in each project, so config them in DT is a best option.
Where's the ack from a Google engineer?
They didn't give the review ack, but we discussed it offline. Nicolas Boichat known this.
Yeah I suggested this here:
https://lore.kernel.org/patchwork/patch/1359670/#1564682 .
I also looked at the ANX7625 datasheet at the time and it was pretty clear to me that this was not something customers could tune without ANX's help, but it'd be great if Xin Ji can describe a bit more.
Quoted 4 lines
Thanks,
Xin
[snip]
Laurent Pinchart
reviewerRe: [PATCH v9 1/4] dt-bindings:drm/bridge:anx7625:add vendor define flags
In reply to Xin JiHi Xin,
Quoted 6 lines · Xin Ji
Quoted 4 lines · Robert Foss
Hey Xin,
I would like to merge this series now, but this patch needs a review first. Maybe Laurent/Rob Herring are good candidates.
Quoted 7 lines
Hi Rob, I get Laurent/Rob comments before, and explained why we needs these DT properties, so far, I didn't get any response.
Hi Rob Herring and Laurent, for the DT property lane0/1-swing, Google engineer has strong demond for them, they don't want to move DP swing adjusting to kernel, thus may cause change the driver code in each project, so config them in DT is a best option.
Hardcoding it in the driver is certainly not a good option, but hardcoding it in DT isn't either unless you can explain how the value should be computed. "Contact the vendor" isn't good enough.
Quoted 105 lines
Quoted 105 lines · Xin Ji
Quoted 104 lines
Add 'bus-type' and 'data-lanes' define for port0. Define DP tx lane0, lane1 swing register array define, and audio enable flag.
Signed-off-by Xin Ji <[email protected]>--- .../display/bridge/analogix,anx7625.yaml | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +56
-1@@ -43,6 +43,26 @@ properties: vdd33-supply: description: Regulator that provides the supply 3.3V power. + analogix,lane0-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane0 PHY, please don't + add this property, or contact vendor. + + analogix,lane1-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane1 PHY, please don't + add this property, or contact vendor. + + analogix,audio-enable: + type: boolean + description: let the driver enable audio HDMI codec function or not. + ports: $ref: /schemas/graph.yaml#/properties/ports@@ -50,13 +70,43 @@ properties: port@0: $ref: /schemas/graph.yaml#/properties/port description: - Video port for MIPI DSI input. + MIPI DSI/DPI input. + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + bus-type: true + data-lanes: true + + required: + - remote-endpoint + + required: + - endpoint + port@1: $ref: /schemas/graph.yaml#/properties/port description: Video port for panel or connector. + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + + required: + - remote-endpoint + required: - port@0 - port@1@@ -87,6 +137,9 @@ examples: vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; vdd33-supply = <&pp3300_mipibrdg>; + analogix,audio-enable; + analogix,lane0-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; + analogix,lane1-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; ports { #address-cells = <1>;@@ -96,6 +149,8 @@ examples: reg = <0>; anx7625_in: endpoint { remote-endpoint = <&mipi_dsi>; + bus-type = <5>; + data-lanes = <0 1 2 3>; }; };
Signature · 3 lines
Regards, Laurent Pinchart
Re: [PATCH v9 1/4] dt-bindings:drm/bridge:anx7625:add vendor define flags
Quoted 12 lines · Laurent Pinchart
Hi Xin,
Quoted 9 lines · Xin Ji
Quoted 4 lines · Robert Foss
Hey Xin,
I would like to merge this series now, but this patch needs a review first. Maybe Laurent/Rob Herring are good candidates.
Hi Rob, I get Laurent/Rob comments before, and explained why we needs these DT properties, so far, I didn't get any response.
Quoted 8 lines
Quoted 4 lines
Hi Rob Herring and Laurent, for the DT property lane0/1-swing, Google engineer has strong demond for them, they don't want to move DP swing adjusting to kernel, thus may cause change the driver code in each project, so config them in DT is a best option.
Hardcoding it in the driver is certainly not a good option, but hardcoding it in DT isn't either unless you can explain how the value should be computed. "Contact the vendor" isn't good enough.
Hi Laurent Pinchart, thanks for the coment, I'll add more detail explain about the value means.
Thanks,
Xin
Quoted 111 lines
Quoted 106 lines
Quoted 106 lines · Xin Ji
Quoted 104 lines
Add 'bus-type' and 'data-lanes' define for port0. Define DP tx lane0, lane1 swing register array define, and audio enable flag.
Signed-off-by Xin Ji <[email protected]>--- .../display/bridge/analogix,anx7625.yaml | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-)Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +56
-1@@ -43,6 +43,26 @@ properties: vdd33-supply: description: Regulator that provides the supply 3.3V power. + analogix,lane0-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane0 PHY, please don't + add this property, or contact vendor. + + analogix,lane1-swing: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 1 + maxItems: 20 + description: + an array of swing register setting for DP tx lane1 PHY, please don't + add this property, or contact vendor. + + analogix,audio-enable: + type: boolean + description: let the driver enable audio HDMI codec function or not. + ports: $ref: /schemas/graph.yaml#/properties/ports@@ -50,13 +70,43 @@ properties: port@0: $ref: /schemas/graph.yaml#/properties/port description: - Video port for MIPI DSI input. + MIPI DSI/DPI input. + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + bus-type: true + data-lanes: true + + required: + - remote-endpoint + + required: + - endpoint + port@1: $ref: /schemas/graph.yaml#/properties/port description: Video port for panel or connector. + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + type: object + additionalProperties: false + + properties: + remote-endpoint: true + + required: + - remote-endpoint + required: - port@0 - port@1@@ -87,6 +137,9 @@ examples: vdd10-supply = <&pp1000_mipibrdg>; vdd18-supply = <&pp1800_mipibrdg>; vdd33-supply = <&pp3300_mipibrdg>; + analogix,audio-enable; + analogix,lane0-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; + analogix,lane1-swing = <0x14 0x54 0x64 0x74 0x29 0x7b 0x77 0x5b>; ports { #address-cells = <1>;@@ -96,6 +149,8 @@ examples: reg = <0>; anx7625_in: endpoint { remote-endpoint = <&mipi_dsi>; + bus-type = <5>; + data-lanes = <0 1 2 3>; }; };Signature · 3 lines
Regards, Laurent Pinchart
PATCH v9 2/4 drm/bridge: anx7625: fix not correct return value
In reply to Xin JiAt some time, the original code may return non zero value, force return 0 if operation finished.
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/analogix/anx7625.c +2 -2
@@ -191,10 +191,10 @@ static int wait_aux_op_finish(struct anx7625_data *ctx) AP_AUX_CTRL_STATUS);if (val <0 || (val &0x0F )) {DRM_DEV_ERROR (dev,"aux status %02x\n" , val); - val = -EIO ; +return -EIO ; } -return val; +return 0 ; } static int anx7625_video_mute_control(struct anx7625_data *ctx,
Signature · 1 line
2.25.1
PATCH v9 3/4 drm/bridge: anx7625: add MIPI DPI input feature
In reply to Xin JiThe basic anx7625 driver only support MIPI DSI rx signal input. This patch add MIPI DPI rx input configuration support, after apply this patch, the driver can support DSI rx or DPI rx by adding 'bus-type' in DT.
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 246 ++++++++++++++++------ drivers/gpu/drm/bridge/analogix/anx7625.h | 18 +- 2 files changed, 204 insertions(+), 60 deletions(-)
drivers/gpu/drm/bridge/analogix/anx7625.c +187 -59
@@ -32,6 +32,7 @@#include <drm/drm_print.h> #include <drm/drm_probe_helper.h> +#include <media/v4l2-fwnode.h> #include <video/display_timing.h> #include "anx7625.h"
@@ -152,18 +153,18 @@ static int anx7625_write_and(struct anx7625_data *ctx,return anx7625_reg_write (ctx, client, offset, (val & (mask))); } -static int anx7625_write_and_or (struct anx7625_data *ctx, -struct i2c_client *client, -u8 offset,u8 and_mask,u8 or_mask) +static int anx7625_config_bit_matrix (struct anx7625_data *ctx) { -int val; +int i, ret; - val =anx7625_reg_read (ctx, client, offset); -if (val <0 ) -return val; + ret =anx7625_write_or (ctx, ctx->i2c.tx_p2_client, +AUDIO_CONTROL_REGISTER ,0x80 ); +for (i =0 ; i <13 ; i++) + ret |=anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, +VIDEO_BIT_MATRIX_12 + i, +0x18 + i); -return anx7625_reg_write (ctx, client, - offset, (val & and_mask) | (or_mask)); +return ret; }static int anx7625_read_ctrl_status_p0 (struct anx7625_data *ctx)
@@ -221,38 +222,6 @@ static int anx7625_video_mute_control(struct anx7625_data *ctx,return ret; } -static int anx7625_config_audio_input (struct anx7625_data *ctx) -{ -struct device *dev = &ctx->client->dev; -int ret; - -/* Channel num */ - ret =anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, -AUDIO_CHANNEL_STATUS_6 ,I2S_CH_2 <<5 ); - -/* FS */ - ret |=anx7625_write_and_or (ctx, ctx->i2c.tx_p2_client, -AUDIO_CHANNEL_STATUS_4 , -0xf0 ,AUDIO_FS_48K ); -/* Word length */ - ret |=anx7625_write_and_or (ctx, ctx->i2c.tx_p2_client, -AUDIO_CHANNEL_STATUS_5 , -0xf0 ,AUDIO_W_LEN_24_24MAX ); -/* I2S */ - ret |=anx7625_write_or (ctx, ctx->i2c.tx_p2_client, -AUDIO_CHANNEL_STATUS_6 ,I2S_SLAVE_MODE ); - ret |=anx7625_write_and (ctx, ctx->i2c.tx_p2_client, -AUDIO_CONTROL_REGISTER , ~TDM_TIMING_MODE ); -/* Audio change flag */ - ret |=anx7625_write_or (ctx, ctx->i2c.rx_p0_client, -AP_AV_STATUS ,AP_AUDIO_CHG ); - -if (ret <0 ) -DRM_DEV_ERROR (dev,"fail to config audio.\n" ); - -return ret; -} -/* Reduction of fraction a/b */ static void anx7625_reduction_of_a_fraction (unsigned long *a,unsigned long *b) {
@@ -412,7 +381,7 @@ static int anx7625_dsi_video_timing_config(struct anx7625_data *ctx) ret |=anx7625_write_and (ctx, ctx->i2c.rx_p1_client,MIPI_LANE_CTRL_0 ,0xfc ); ret |=anx7625_write_or (ctx, ctx->i2c.rx_p1_client, -MIPI_LANE_CTRL_0 ,3 ); +MIPI_LANE_CTRL_0 , ctx->pdata.mipi_lanes -1 );/* Htotal */ htotal = ctx->dt.hactive.min + ctx->dt.hfront_porch.min +
@@ -597,6 +566,76 @@ static int anx7625_dsi_config(struct anx7625_data *ctx)return ret; } +static int anx7625_api_dpi_config (struct anx7625_data *ctx) +{ +struct device *dev = &ctx->client->dev; +u16 freq = ctx->dt.pixelclock.min /1000 ; +int ret; + +/* configure pixel clock */ + ret =anx7625_reg_write (ctx, ctx->i2c.rx_p0_client, +PIXEL_CLOCK_L , freq &0xFF ); + ret |=anx7625_reg_write (ctx, ctx->i2c.rx_p0_client, +PIXEL_CLOCK_H , (freq >>8 )); + +/* set DPI mode */ +/* set to DPI PLL module sel */ + ret |=anx7625_reg_write (ctx, ctx->i2c.rx_p1_client, +MIPI_DIGITAL_PLL_9 ,0x20 ); +/* power down MIPI */ + ret |=anx7625_reg_write (ctx, ctx->i2c.rx_p1_client, +MIPI_LANE_CTRL_10 ,0x08 ); +/* enable DPI mode */ + ret |=anx7625_reg_write (ctx, ctx->i2c.rx_p1_client, +MIPI_DIGITAL_PLL_18 ,0x1C ); +/* set first edge */ + ret |=anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, +VIDEO_CONTROL_0 ,0x06 ); +if (ret <0 ) +DRM_DEV_ERROR (dev,"IO error : dpi phy set failed.\n" ); + +return ret; +} + +static int anx7625_dpi_config (struct anx7625_data *ctx) +{ +struct device *dev = &ctx->client->dev; +int ret; + +DRM_DEV_DEBUG_DRIVER (dev,"config dpi\n" ); + +/* DSC disable */ + ret =anx7625_write_and (ctx, ctx->i2c.rx_p0_client, +R_DSC_CTRL_0 , ~DSC_EN ); +if (ret <0 ) { +DRM_DEV_ERROR (dev,"IO error : disable dsc failed.\n" ); +return ret; + } + + ret =anx7625_config_bit_matrix (ctx); +if (ret <0 ) { +DRM_DEV_ERROR (dev,"config bit matrix failed.\n" ); +return ret; + } + + ret =anx7625_api_dpi_config (ctx); +if (ret <0 ) { +DRM_DEV_ERROR (dev,"mipi phy(dpi) setup failed.\n" ); +return ret; + } + +/* set MIPI RX EN */ + ret =anx7625_write_or (ctx, ctx->i2c.rx_p0_client, +AP_AV_STATUS ,AP_MIPI_RX_EN ); +/* clear mute flag */ + ret |=anx7625_write_and (ctx, ctx->i2c.rx_p0_client, +AP_AV_STATUS , (u8 )~AP_MIPI_MUTE ); +if (ret <0 ) +DRM_DEV_ERROR (dev,"IO error : enable mipi rx failed.\n" ); + +return ret; +} +static void anx7625_dp_start (struct anx7625_data *ctx) {int ret;
@@ -607,9 +646,10 @@ static void anx7625_dp_start(struct anx7625_data *ctx)return ; } -anx7625_config_audio_input (ctx); - - ret =anx7625_dsi_config (ctx); +if (ctx->pdata.is_dpi) + ret =anx7625_dpi_config (ctx); +else + ret =anx7625_dsi_config (ctx);if (ret <0 )DRM_DEV_ERROR (dev,"MIPI phy setup error.\n" );
@@ -1047,6 +1087,7 @@ static void anx7625_start_dp_work(struct anx7625_data *ctx)return ; } + ctx->hpd_status =1 ; ctx->hpd_high_cnt++;/* Not support HDCP */
@@ -1056,8 +1097,10 @@ static void anx7625_start_dp_work(struct anx7625_data *ctx) ret |=anx7625_write_or (ctx, ctx->i2c.rx_p1_client,0xec ,0x10 );/* Interrupt for DRM */ ret |=anx7625_write_or (ctx, ctx->i2c.rx_p1_client,0xff ,0x01 ); -if (ret <0 ) +if (ret <0 ) { +DRM_DEV_ERROR (dev,"fail to setting HDCP/auth\n" );return ; + } ret =anx7625_reg_read (ctx, ctx->i2c.rx_p1_client,0x86 );if (ret <0 )
@@ -1076,6 +1119,10 @@ static void anx7625_hpd_polling(struct anx7625_data *ctx)int ret, val;struct device *dev = &ctx->client->dev; +/* Interrupt mode, no need poll HPD status, just return */ +if (ctx->pdata.intp_irq) +return ; + ret = readx_poll_timeout(anx7625_read_hpd_status_p0, ctx, val, ((val & HPD_STATUS) || (val < 0)),
@@ -1103,6 +1150,21 @@ static void anx7625_remove_edid(struct anx7625_data *ctx) ctx->slimport_edid_p.edid_block_num =-1 ; } +static void anx7625_dp_adjust_swing (struct anx7625_data *ctx) +{ +int i; + +for (i =0 ; i < ctx->pdata.dp_lane0_swing_reg_cnt; i++) +anx7625_reg_write (ctx, ctx->i2c.tx_p1_client, +DP_TX_LANE0_SWING_REG0 + i, + ctx->pdata.lane0_reg_data[i] &0xFF ); + +for (i =0 ; i < ctx->pdata.dp_lane1_swing_reg_cnt; i++) +anx7625_reg_write (ctx, ctx->i2c.tx_p1_client, +DP_TX_LANE1_SWING_REG0 + i, + ctx->pdata.lane1_reg_data[i] &0xFF ); +} +static void dp_hpd_change_handler (struct anx7625_data *ctx,bool on) {struct device *dev = &ctx->client->dev;
@@ -1118,9 +1180,8 @@ static void dp_hpd_change_handler(struct anx7625_data *ctx, bool on) }else {DRM_DEV_DEBUG_DRIVER (dev," HPD high\n" );anx7625_start_dp_work (ctx); +anx7625_dp_adjust_swing (ctx); } - - ctx->hpd_status =1 ; }static int anx7625_hpd_change_detect (struct anx7625_data *ctx)
@@ -1197,20 +1258,72 @@ static irqreturn_t anx7625_intr_hpd_isr(int irq, void *data)return IRQ_HANDLED ; } +static int anx7625_get_swing_setting (struct device *dev, +struct anx7625_platform_data *pdata) +{ +int num_regs; + +if (of_get_property (dev->of_node, +"analogix,lane0-swing" , &num_regs)) { +if (num_regs >DP_TX_SWING_REG_CNT ) + num_regs =DP_TX_SWING_REG_CNT ; + + pdata->dp_lane0_swing_reg_cnt = num_regs; +of_property_read_u32_array (dev->of_node,"analogix,lane0-swing" , + pdata->lane0_reg_data, num_regs); + } + +if (of_get_property (dev->of_node, +"analogix,lane1-swing" , &num_regs)) { +if (num_regs >DP_TX_SWING_REG_CNT ) + num_regs =DP_TX_SWING_REG_CNT ; + + pdata->dp_lane1_swing_reg_cnt = num_regs; +of_property_read_u32_array (dev->of_node,"analogix,lane1-swing" , + pdata->lane1_reg_data, num_regs); + } + +return 0 ; +} +static int anx7625_parse_dt (struct device *dev,struct anx7625_platform_data *pdata) { -struct device_node *np = dev->of_node; +struct device_node *np = dev->of_node, *ep0;struct drm_panel *panel;int ret; +int bus_type, mipi_lanes; +anx7625_get_swing_setting (dev, pdata); + + pdata->is_dpi =1 ;/* default dpi mode */ pdata->mipi_host_node =of_graph_get_remote_node (np,0 ,0 );if (!pdata->mipi_host_node) {DRM_DEV_ERROR (dev,"fail to get internal panel.\n" );return -ENODEV ; } -DRM_DEV_DEBUG_DRIVER (dev,"found dsi host node.\n" ); + bus_type =V4L2_FWNODE_BUS_TYPE_PARALLEL ; + mipi_lanes =MAX_LANES_SUPPORT ; + ep0 =of_graph_get_endpoint_by_regs (np,0 ,0 ); +if (ep0) { +if (of_property_read_u32 (ep0,"bus-type" , &bus_type)) + bus_type =0 ; + + mipi_lanes =of_property_count_u32_elems (ep0,"data-lanes" ); + } + +if (bus_type ==V4L2_FWNODE_BUS_TYPE_PARALLEL )/* bus type is Parallel(DSI) */ + pdata->is_dpi =0 ; + + pdata->mipi_lanes = mipi_lanes; +if (pdata->mipi_lanes >MAX_LANES_SUPPORT || pdata->mipi_lanes <=0 ) + pdata->mipi_lanes =MAX_LANES_SUPPORT ; + +if (pdata->is_dpi) +DRM_DEV_DEBUG_DRIVER (dev,"found MIPI DPI host node.\n" ); +else +DRM_DEV_DEBUG_DRIVER (dev,"found MIPI DSI host node.\n" ); ret =drm_of_find_panel_or_bridge (np,1 ,0 , &panel,NULL );if (ret <0 ) {
@@ -1273,9 +1386,13 @@ static enum drm_connector_status anx7625_sink_detect(struct anx7625_data *ctx) {struct device *dev = &ctx->client->dev; -DRM_DEV_DEBUG_DRIVER (dev,"sink detect, return connected\n" ); +DRM_DEV_DEBUG_DRIVER (dev,"sink detect\n" ); + +if (ctx->pdata.panel_bridge) +return connector_status_connected; -return connector_status_connected; +return ctx->hpd_status ? connector_status_connected : + connector_status_disconnected; }static int anx7625_attach_dsi (struct anx7625_data *ctx)
@@ -1303,7 +1420,7 @@ static int anx7625_attach_dsi(struct anx7625_data *ctx)return -EINVAL ; } - dsi->lanes =4 ; + dsi->lanes = ctx->pdata.mipi_lanes; dsi->format =MIPI_DSI_FMT_RGB888 ; dsi->mode_flags =MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
@@ -1349,10 +1466,12 @@ static int anx7625_bridge_attach(struct drm_bridge *bridge,return -ENODEV ; } - err =anx7625_attach_dsi (ctx); -if (err) { -DRM_DEV_ERROR (dev,"Fail to attach to dsi : %d\n" , err); -return err; +if (!ctx->pdata.is_dpi) { + err =anx7625_attach_dsi (ctx); +if (err) { +DRM_DEV_ERROR (dev,"Fail to attach to dsi : %d\n" , err); +return err; + } }if (ctx->pdata.panel_bridge) {
@@ -1451,6 +1570,10 @@ static bool anx7625_bridge_mode_fixup(struct drm_bridge *bridge,DRM_DEV_DEBUG_DRIVER (dev,"drm mode fixup set\n" ); +/* No need fixup for external monitor */ +if (!ctx->pdata.panel_bridge) +return true; + hsync = mode->hsync_end - mode->hsync_start; hfp = mode->hsync_start - mode->hdisplay; hbp = mode->htotal - mode->hsync_end;
@@ -1827,8 +1950,13 @@ static int anx7625_i2c_probe(struct i2c_client *client, platform->bridge.funcs = &anx7625_bridge_funcs; platform->bridge.of_node = client->dev.of_node; - platform->bridge.ops =DRM_BRIDGE_OP_EDID |DRM_BRIDGE_OP_HPD ; - platform->bridge.type = DRM_MODE_CONNECTOR_eDP; + platform->bridge.ops =DRM_BRIDGE_OP_EDID ; +if (!platform->pdata.panel_bridge) + platform->bridge.ops |=DRM_BRIDGE_OP_HPD | +DRM_BRIDGE_OP_DETECT ; + platform->bridge.type = platform->pdata.panel_bridge ? + DRM_MODE_CONNECTOR_eDP : + DRM_MODE_CONNECTOR_DisplayPort;drm_bridge_add (&platform->bridge);DRM_DEV_DEBUG_DRIVER (dev,"probe done\n" );
drivers/gpu/drm/bridge/analogix/anx7625.h +17 -1
@@ -141,12 +141,20 @@#define HORIZONTAL_BACK_PORCH_H 0x22/* Bit[7:4] are reserved */ /******** END of I2C Address 0x72 *********/ + +/***************************************************************/ +/* Register definition of device address 0x7a */ +#define DP_TX_SWING_REG_CNT 0x14 +#define DP_TX_LANE0_SWING_REG0 0x00 +#define DP_TX_LANE1_SWING_REG0 0x14 +/******** END of I2C Address 0x7a *********/ +/***************************************************************/ /* Register definition of device address 0x7e */ #define I2C_ADDR_7E_FLASH_CONTROLLER 0x7E -#define FLASH_LOAD_STA 0x05 +#define FLASH_LOAD_STA 0x05#define FLASH_LOAD_STA_CHK BIT(7)#define XTAL_FRQ_SEL 0x3F
@@ -347,12 +355,20 @@ struct s_edid_data {/***************** Display End *****************/ +#define MAX_LANES_SUPPORT 4 +struct anx7625_platform_data {struct gpio_desc *gpio_p_on;struct gpio_desc *gpio_reset;struct regulator_bulk_data supplies[3 ];struct drm_bridge *panel_bridge;int intp_irq; +int is_dpi; +int mipi_lanes; +int dp_lane0_swing_reg_cnt; +int lane0_reg_data[DP_TX_SWING_REG_CNT ]; +int dp_lane1_swing_reg_cnt; +int lane1_reg_data[DP_TX_SWING_REG_CNT ];u32 low_power_mode;struct device_node *mipi_host_node; };
Signature · 1 line
2.25.1
PATCH v9 4/4 drm/bridge: anx7625: add HDMI audio function
In reply to Xin JiAdd audio HDMI codec function support, enable it through device true flag "analogix,audio-enable".
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 226 ++++++++++++++++++++++ drivers/gpu/drm/bridge/analogix/anx7625.h | 5 + 2 files changed, 231 insertions(+)
drivers/gpu/drm/bridge/analogix/anx7625.c +226 -0
@@ -33,6 +33,7 @@#include <drm/drm_probe_helper.h> #include <media/v4l2-fwnode.h> +#include <sound/hdmi-codec.h> #include <video/display_timing.h> #include "anx7625.h"
@@ -153,6 +154,20 @@ static int anx7625_write_and(struct anx7625_data *ctx,return anx7625_reg_write (ctx, client, offset, (val & (mask))); } +static int anx7625_write_and_or (struct anx7625_data *ctx, +struct i2c_client *client, +u8 offset,u8 and_mask,u8 or_mask) +{ +int val; + + val =anx7625_reg_read (ctx, client, offset); +if (val <0 ) +return val; + +return anx7625_reg_write (ctx, client, + offset, (val & and_mask) | (or_mask)); +} +static int anx7625_config_bit_matrix (struct anx7625_data *ctx) {int i, ret;
@@ -1325,6 +1340,9 @@ static int anx7625_parse_dt(struct device *dev,else DRM_DEV_DEBUG_DRIVER (dev,"found MIPI DSI host node.\n" ); +if (of_property_read_bool (np,"analogix,audio-enable" )) + pdata->audio_en =1 ; + ret =drm_of_find_panel_or_bridge (np,1 ,0 , &panel,NULL );if (ret <0 ) {if (ret == -ENODEV )
@@ -1395,6 +1413,208 @@ static enum drm_connector_status anx7625_sink_detect(struct anx7625_data *ctx) connector_status_disconnected; } +static int anx7625_audio_hw_params (struct device *dev,void *data, +struct hdmi_codec_daifmt *fmt, +struct hdmi_codec_params *params) +{ +struct anx7625_data *ctx =dev_get_drvdata (dev); +int wl, ch, rate; +int ret =0 ; + +if (fmt->fmt !=HDMI_DSP_A ) { +DRM_DEV_ERROR (dev,"only supports DSP_A\n" ); +return -EINVAL ; + } + +DRM_DEV_DEBUG_DRIVER (dev,"setting %d Hz, %d bit, %d channels\n" , + params->sample_rate, params->sample_width, + params->cea.channels); + + ret |=anx7625_write_and_or (ctx, ctx->i2c.tx_p2_client, +AUDIO_CHANNEL_STATUS_6 , + ~I2S_SLAVE_MODE , +TDM_SLAVE_MODE ); + +/* Word length */ +switch (params->sample_width) { +case 16 : + wl =AUDIO_W_LEN_16_20MAX ; +break ; +case 18 : + wl =AUDIO_W_LEN_18_20MAX ; +break ; +case 20 : + wl =AUDIO_W_LEN_20_20MAX ; +break ; +case 24 : + wl =AUDIO_W_LEN_24_24MAX ; +break ; +default : +DRM_DEV_DEBUG_DRIVER (dev,"wordlength: %d bit not support" , + params->sample_width); +return -EINVAL ; + } + ret |=anx7625_write_and_or (ctx, ctx->i2c.tx_p2_client, +AUDIO_CHANNEL_STATUS_5 , +0xf0 , wl); + +/* Channel num */ +switch (params->cea.channels) { +case 2 : + ch =I2S_CH_2 ; +break ; +case 4 : + ch =TDM_CH_4 ; +break ; +case 6 : + ch =TDM_CH_6 ; +break ; +case 8 : + ch =TDM_CH_8 ; +break ; +default : +DRM_DEV_DEBUG_DRIVER (dev,"channel number: %d not support" , + params->cea.channels); +return -EINVAL ; + } + ret |=anx7625_write_and_or (ctx, ctx->i2c.tx_p2_client, +AUDIO_CHANNEL_STATUS_6 ,0x1f , ch <<5 ); +if (ch >I2S_CH_2 ) + ret |=anx7625_write_or (ctx, ctx->i2c.tx_p2_client, +AUDIO_CHANNEL_STATUS_6 ,AUDIO_LAYOUT ); +else + ret |=anx7625_write_and (ctx, ctx->i2c.tx_p2_client, +AUDIO_CHANNEL_STATUS_6 , ~AUDIO_LAYOUT ); + +/* FS */ +switch (params->sample_rate) { +case 32000 : + rate =AUDIO_FS_32K ; +break ; +case 44100 : + rate =AUDIO_FS_441K ; +break ; +case 48000 : + rate =AUDIO_FS_48K ; +break ; +case 88200 : + rate =AUDIO_FS_882K ; +break ; +case 96000 : + rate =AUDIO_FS_96K ; +break ; +case 176400 : + rate =AUDIO_FS_1764K ; +break ; +case 192000 : + rate =AUDIO_FS_192K ; +break ; +default : +DRM_DEV_DEBUG_DRIVER (dev,"sample rate: %d not support" , + params->sample_rate); +return -EINVAL ; + } + ret |=anx7625_write_and_or (ctx, ctx->i2c.tx_p2_client, +AUDIO_CHANNEL_STATUS_4 , +0xf0 , rate); + ret |=anx7625_write_or (ctx, ctx->i2c.rx_p0_client, +AP_AV_STATUS ,AP_AUDIO_CHG ); +if (ret <0 ) { +DRM_DEV_ERROR (dev,"IO error : config audio.\n" ); +return -EIO ; + } + +return 0 ; +} + +static void anx7625_audio_shutdown (struct device *dev,void *data) +{ +DRM_DEV_DEBUG_DRIVER (dev,"stop audio\n" ); +} + +static int anx7625_hdmi_i2s_get_dai_id (struct snd_soc_component *component, +struct device_node *endpoint) +{ +struct of_endpoint of_ep; +int ret; + + ret =of_graph_parse_endpoint (endpoint, &of_ep); +if (ret <0 ) +return ret; + +/* +* HDMI sound should be located at external DPI port +* Didn't have good way to check where is internal(DSI) +* or external(DPI) bridge +*/ +return 0 ; +} + +static void +anx7625_audio_update_connector_status (struct anx7625_data *ctx, +enum drm_connector_status status) +{ +if (ctx->plugged_cb && ctx->codec_dev) { + ctx->plugged_cb (ctx->codec_dev, + status == connector_status_connected); + } +} + +static int anx7625_audio_hook_plugged_cb (struct device *dev,void *data, +hdmi_codec_plugged_cb fn, +struct device *codec_dev) +{ +struct anx7625_data *ctx = data; + + ctx->plugged_cb = fn; + ctx->codec_dev = codec_dev; +anx7625_audio_update_connector_status (ctx,anx7625_sink_detect (ctx)); + +return 0 ; +} + +static const struct hdmi_codec_ops anx7625_codec_ops = { + .hw_params = anx7625_audio_hw_params, + .audio_shutdown = anx7625_audio_shutdown, + .get_dai_id = anx7625_hdmi_i2s_get_dai_id, + .hook_plugged_cb = anx7625_audio_hook_plugged_cb, +}; + +static void anx7625_unregister_audio (struct anx7625_data *ctx) +{ +struct device *dev = &ctx->client->dev; + +if (ctx->audio_pdev) { +platform_device_unregister (ctx->audio_pdev); + ctx->audio_pdev =NULL ; + } + +DRM_DEV_DEBUG_DRIVER (dev,"unbound to %s" ,HDMI_CODEC_DRV_NAME ); +} + +static int anx7625_register_audio (struct device *dev,struct anx7625_data *ctx) +{ +struct hdmi_codec_pdata codec_data = { + .ops = &anx7625_codec_ops, + .max_i2s_channels =8 , + .i2s =1 , + .data = ctx, + }; + + ctx->audio_pdev =platform_device_register_data (dev, +HDMI_CODEC_DRV_NAME , +PLATFORM_DEVID_AUTO , + &codec_data, +sizeof (codec_data)); + +if (IS_ERR (ctx->audio_pdev)) +return IS_ERR (ctx->audio_pdev); + +DRM_DEV_DEBUG_DRIVER (dev,"bound to %s" ,HDMI_CODEC_DRV_NAME ); + +return 0 ; +} +static int anx7625_attach_dsi (struct anx7625_data *ctx) {struct mipi_dsi_device *dsi;
@@ -1959,6 +2179,9 @@ static int anx7625_i2c_probe(struct i2c_client *client, DRM_MODE_CONNECTOR_DisplayPort;drm_bridge_add (&platform->bridge); +if (platform->pdata.audio_en) +anx7625_register_audio (dev, platform); +DRM_DEV_DEBUG_DRIVER (dev,"probe done\n" );return 0 ;
@@ -1987,6 +2210,9 @@ static int anx7625_i2c_remove(struct i2c_client *client)anx7625_unregister_i2c_dummy_clients (platform); +if (platform->pdata.audio_en) +anx7625_unregister_audio (platform); +kfree (platform);return 0 ; }
drivers/gpu/drm/bridge/analogix/anx7625.h +5 -0
@@ -111,6 +111,7 @@#define AUDIO_CHANNEL_STATUS_6 0xd5#define TDM_SLAVE_MODE 0x10#define I2S_SLAVE_MODE 0x08 +#define AUDIO_LAYOUT 0x01#define AUDIO_CONTROL_REGISTER 0xe6#define TDM_TIMING_MODE 0x08
@@ -365,6 +366,7 @@ struct anx7625_platform_data {int intp_irq;int is_dpi;int mipi_lanes; +int audio_en;int dp_lane0_swing_reg_cnt;int lane0_reg_data[DP_TX_SWING_REG_CNT ];int dp_lane1_swing_reg_cnt;
@@ -385,6 +387,7 @@ struct anx7625_i2c_client {struct anx7625_data {struct anx7625_platform_data pdata; +struct platform_device *audio_pdev;int hpd_status;int hpd_high_cnt;/* Lock for work queue */
@@ -393,6 +396,8 @@ struct anx7625_data {struct anx7625_i2c_client i2c;struct i2c_client *last_client;struct s_edid_data slimport_edid_p; +struct device *codec_dev; +hdmi_codec_plugged_cb plugged_cb;struct work_struct work;struct workqueue_struct *workqueue;char edid_block;
Signature · 1 line
2.25.1