Skip to contentSkip to conversation

HDA: Add Tegra264 support

PATCH Applied Sheetal . 3 participants 9 messages May 12, 2025 – May 15, 2025

Subsystems (4)
lore
Share & tools
lore

Sheetal .

author
#0 lore raw

cover HDA: Add Tegra264 support

From: Sheetal <[email protected]>

The patch series is to add support for Tegra264 in HDA driver.

Mohan Kumar D (1):
ALSA: hda/tegra: Add Tegra264 support

Sheetal (2):
dt-bindings: hda: Update Tegra compatible requirements
dt-bindings: Document Tegra264 HDA Support

 .../bindings/sound/nvidia,tegra30-hda.yaml    | 108 +++++++++++++++---
 sound/pci/hda/hda_tegra.c                     |  51 ++++++++-
 sound/pci/hda/patch_hdmi.c                    |   1 +
 3 files changed, 141 insertions(+), 19 deletions(-)
Signature · 1 line
2.17.1
author
#1 lore raw

PATCH 1/3 dt-bindings: Update Tegra194 and Tegra234 HDA bindings

From: Sheetal <[email protected]>

- Tegra194 and Tegra234 HDA is not compatible with Tegra30, hence update them as standalone compatibles. Also, add necessary logic to the binding doc as HDA clocks and resets for Tegra194 and Tegra234 are different from Tegra30. This fixes below dtbs_check errors:
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra194-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra234-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- hda@3510000: clock-names:1: 'hda2hdmi' was expected
- hda@3510000: reset-names:1: 'hda2hdmi' was expected

---
 .../bindings/sound/nvidia,tegra30-hda.yaml    | 83 ++++++++++++++++---
 1 file changed, 72 insertions(+), 11 deletions(-)
Documentation/devicetree/bindings/sound/nvidia,tegra30-hda.yaml +72 -11
index 3ca9affb79a2..703f009862a4 100644
@@ -20,11 +20,12 @@ properties:
 
   compatible:
     oneOf:
-      - const: nvidia,tegra30-hda
+      - enum:
+          - nvidia,tegra30-hda
+          - nvidia,tegra194-hda
+          - nvidia,tegra234-hda
       - items:
           - enum:
-              - nvidia,tegra234-hda
-              - nvidia,tegra194-hda
               - nvidia,tegra186-hda
               - nvidia,tegra210-hda
               - nvidia,tegra124-hda
@@ -48,10 +49,7 @@ properties:
 
   clock-names:
     minItems: 2
-    items:
-      - const: hda
-      - const: hda2hdmi
-      - const: hda2codec_2x
+    maxItems: 3
 
   resets:
     minItems: 2
@@ -59,10 +57,7 @@ properties:
 
   reset-names:
     minItems: 2
-    items:
-      - const: hda
-      - const: hda2hdmi
-      - const: hda2codec_2x
+    maxItems: 3
 
   power-domains:
     maxItems: 1
@@ -93,6 +88,72 @@ required:
 
 additionalProperties: false
 
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra30-hda
+    then:
+      properties:
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+        resets:
+          minItems: 3
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra194-hda
+    then:
+      properties:
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra234-hda
+    then:
+      properties:
+        clocks:
+          minItems: 2
+          maxItems: 2
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+
 examples:
   - |
     #include<dt-bindings/clock/tegra124-car-common.h>
Signature · 1 line
2.17.1
maintainer
#2 lore raw

Re: [PATCH 1/3] dt-bindings: Update Tegra194 and Tegra234 HDA bindings

Quoted 1 line · Sheetal .

From: Sheetal <[email protected]>

Needs a 'ASoC' subject prefix on both patches.

Quoted 141 lines

- Tegra194 and Tegra234 HDA is not compatible with Tegra30, hence update them as standalone compatibles. Also, add necessary logic to the binding doc as HDA clocks and resets for Tegra194 and Tegra234 are different from Tegra30. This fixes below dtbs_check errors:
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra194-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra234-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- hda@3510000: clock-names:1: 'hda2hdmi' was expected
- hda@3510000: reset-names:1: 'hda2hdmi' was expected

---
 .../bindings/sound/nvidia,tegra30-hda.yaml    | 83 ++++++++++++++++---
 1 file changed, 72 insertions(+), 11 deletions(-)
Documentation/devicetree/bindings/sound/nvidia,tegra30-hda.yaml +72 -11
index 3ca9affb79a2..703f009862a4 100644
@@ -20,11 +20,12 @@ properties:
 
   compatible:
     oneOf:
-      - const: nvidia,tegra30-hda
+      - enum:
+          - nvidia,tegra30-hda
+          - nvidia,tegra194-hda
+          - nvidia,tegra234-hda
       - items:
           - enum:
-              - nvidia,tegra234-hda
-              - nvidia,tegra194-hda
               - nvidia,tegra186-hda
               - nvidia,tegra210-hda
               - nvidia,tegra124-hda
@@ -48,10 +49,7 @@ properties:
 
   clock-names:
     minItems: 2
-    items:
-      - const: hda
-      - const: hda2hdmi
-      - const: hda2codec_2x
+    maxItems: 3
 
   resets:
     minItems: 2
@@ -59,10 +57,7 @@ properties:
 
   reset-names:
     minItems: 2
-    items:
-      - const: hda
-      - const: hda2hdmi
-      - const: hda2codec_2x
+    maxItems: 3
 
   power-domains:
     maxItems: 1
@@ -93,6 +88,72 @@ required:
 
 additionalProperties: false
 
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra30-hda
+    then:
+      properties:
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+        resets:
+          minItems: 3
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra194-hda
+    then:
+      properties:
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra234-hda
+    then:
+      properties:
+        clocks:
+          minItems: 2
+          maxItems: 2
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+
 examples:
   - |
     #include<dt-bindings/clock/tegra124-car-common.h>
Signature · 1 line
2.17.1
author
#3 lore raw

Re: [PATCH 1/3] dt-bindings: Update Tegra194 and Tegra234 HDA bindings

Quoted 7 lines · Rob Herring

External email: Use caution opening links or attachments

Quoted 1 line · Sheetal .

From: Sheetal <[email protected]>

Needs a 'ASoC' subject prefix on both patches.

ASoC prefix shouldn't be used here as HDA driver is not under sound/soc.

Quoted 142 lines
Quoted 142 lines

- Tegra194 and Tegra234 HDA is not compatible with Tegra30, hence update them as standalone compatibles. Also, add necessary logic to the binding doc as HDA clocks and resets for Tegra194 and Tegra234 are different from Tegra30. This fixes below dtbs_check errors:
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra194-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra234-hda'] is too short
'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- hda@3510000: clock-names:1: 'hda2hdmi' was expected
- hda@3510000: reset-names:1: 'hda2hdmi' was expected

---
  .../bindings/sound/nvidia,tegra30-hda.yaml    | 83 ++++++++++++++++---
  1 file changed, 72 insertions(+), 11 deletions(-)
Documentation/devicetree/bindings/sound/nvidia,tegra30-hda.yaml +72 -12
index 3ca9affb79a2..703f009862a4 100644
@@ -20,11 +20,12 @@ properties:
 
    compatible:
      oneOf:
-      - const: nvidia,tegra30-hda
+      - enum:
+          - nvidia,tegra30-hda
+          - nvidia,tegra194-hda
+          - nvidia,tegra234-hda
        - items:
            - enum:
-              - nvidia,tegra234-hda
-              - nvidia,tegra194-hda
                - nvidia,tegra186-hda
                - nvidia,tegra210-hda
                - nvidia,tegra124-hda
@@ -48,10 +49,7 @@ properties:
 
    clock-names:
      minItems: 2
-    items:
-      - const: hda
-      - const: hda2hdmi
-      - const: hda2codec_2x
+    maxItems: 3
 
    resets:
      minItems: 2
@@ -59,10 +57,7 @@ properties:
 
    reset-names:
      minItems: 2
-    items:
-      - const: hda
-      - const: hda2hdmi
-      - const: hda2codec_2x
+    maxItems: 3
 
    power-domains:
      maxItems: 1
@@ -93,6 +88,72 @@ required:
 
  additionalProperties: false
 
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra30-hda
+    then:
+      properties:
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+        resets:
+          minItems: 3
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra194-hda
+    then:
+      properties:
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+            - const: hda2codec_2x
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2hdmi
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra234-hda
+    then:
+      properties:
+        clocks:
+          minItems: 2
+          maxItems: 2
+        clock-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+
  examples:
    - |
      #include<dt-bindings/clock/tegra124-car-common.h>
--

2.17.1

maintainer Reviewed-by on v1 1/3
#4 lore raw

Re: [PATCH 1/3] dt-bindings: Update Tegra194 and Tegra234 HDA bindings

In reply to Sheetal .
Quoted 17 lines · Sheetal .

From: Sheetal <[email protected]>

- Tegra194 and Tegra234 HDA is not compatible with Tegra30, hence update them as standalone compatibles. Also, add necessary logic to the binding doc as HDA clocks and resets for Tegra194 and Tegra234 are different from Tegra30. This fixes below dtbs_check errors:
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra194-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- compatible: 'oneOf' conditional failed, one must be fixed:
['nvidia,tegra234-hda'] is too short 'nvidia,tegra30-hda' was expected
'nvidia,tegra132-hda' was expected
- hda@3510000: clock-names:1: 'hda2hdmi' was expected
- hda@3510000: reset-names:1: 'hda2hdmi' was expected

Quoted 5 lines
---
 .../bindings/sound/nvidia,tegra30-hda.yaml    | 83 ++++++++++++++++---
 1 file changed, 72 insertions(+), 11 deletions(-)
author
#5 lore raw

PATCH 2/3 dt-bindings: Document Tegra264 HDA Support

In reply to Sheetal .

From: Sheetal <[email protected]>

For Tegra264 device there is one clock, two resets and no power-domain. Add the Tegra264 compatible and necessary logic to the binding doc to determine appropriate clocks, resets and power-domain properties based on the compatible string.

---
 .../bindings/sound/nvidia,tegra30-hda.yaml    | 25 +++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/sound/nvidia,tegra30-hda.yaml +23 -2
index 703f009862a4..8a8767589ee0 100644
@@ -24,6 +24,7 @@ properties:
           - nvidia,tegra30-hda
           - nvidia,tegra194-hda
           - nvidia,tegra234-hda
+          - nvidia,tegra264-hda
       - items:
           - enum:
               - nvidia,tegra186-hda
@@ -44,11 +45,11 @@ properties:
     maxItems: 1
 
   clocks:
-    minItems: 2
+    minItems: 1
     maxItems: 3
 
   clock-names:
-    minItems: 2
+    minItems: 1
     maxItems: 3
 
   resets:
@@ -153,6 +154,26 @@ allOf:
           items:
             - const: hda
             - const: hda2codec_2x
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - nvidia,tegra264-hda
+    then:
+      properties:
+        clocks:
+          maxItems: 1
+        clock-names:
+          items:
+            - const: hda
+        resets:
+          maxItems: 2
+        reset-names:
+          items:
+            - const: hda
+            - const: hda2codec_2x
+        power-domains: false
 
 examples:
   - |
Signature · 1 line
2.17.1
maintainer Reviewed-by on v1 2/3
#6 lore raw

Re: [PATCH 2/3] dt-bindings: Document Tegra264 HDA Support

Quoted 7 lines · Sheetal .

From: Sheetal <[email protected]>

For Tegra264 device there is one clock, two resets and no power-domain. Add the Tegra264 compatible and necessary logic to the binding doc to determine appropriate clocks, resets and power-domain properties based on the compatible string.

Quoted 5 lines
---
 .../bindings/sound/nvidia,tegra30-hda.yaml    | 25 +++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)
author
#7 lore raw

PATCH 3/3 ALSA: hda/tegra: Add Tegra264 support

In reply to Sheetal .

From: Mohan Kumar D <[email protected]>

Update HDA driver to support Tegra264 differences from legacy HDA, which includes: clocks/resets, always power on, and hardware-managed FPCI/IPFS initialization. The driver retrieves this chip-specific information from soc_data.

---
 sound/pci/hda/hda_tegra.c  | 51 +++++++++++++++++++++++++++++++++-----
 sound/pci/hda/patch_hdmi.c |  1 +
 2 files changed, 46 insertions(+), 6 deletions(-)
sound/pci/hda/hda_tegra.c +45 -6
index a590d431c5ff..8c0dd439f5a5 100644
@@ -72,6 +72,10 @@
 struct hda_tegra_soc {
 	bool has_hda2codec_2x_reset;
 	bool has_hda2hdmi;
+	bool has_hda2codec_2x;
+	bool input_stream;
+	bool always_on;
+	bool requires_init;
 };
 
 struct hda_tegra {
@@ -187,7 +191,9 @@ static int hda_tegra_runtime_resume(struct device *dev)
 	if (rc != 0)
 		return rc;
 	if (chip->running) {
-		hda_tegra_init(hda);
+		if (hda->soc->requires_init)
+			hda_tegra_init(hda);
+
 		azx_init_chip(chip, 1);
 		/* disable controller wake up event*/
 		azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
@@ -250,7 +256,8 @@ static int hda_tegra_init_chip(struct azx *chip, struct platform_device *pdev)
 	bus->remap_addr = hda->regs + HDA_BAR0;
 	bus->addr = res->start + HDA_BAR0;
 
-	hda_tegra_init(hda);
+	if (hda->soc->requires_init)
+		hda_tegra_init(hda);
 
 	return 0;
 }
@@ -323,7 +330,7 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
 	 * starts with offset 0 which is wrong as HW register for output stream
 	 * offset starts with 4.
 	 */
-	if (of_device_is_compatible(np, "nvidia,tegra234-hda"))
+	if (!hda->soc->input_stream)
 		chip->capture_streams = 4;
 
 	chip->playback_streams = (gcap >> 12) & 0x0f;
@@ -419,7 +426,6 @@ static int hda_tegra_create(struct snd_card *card,
 	chip->driver_caps = driver_caps;
 	chip->driver_type = driver_caps & 0xff;
 	chip->dev_index = 0;
-	chip->jackpoll_interval = msecs_to_jiffies(5000);
 	INIT_LIST_HEAD(&chip->pcm_list);
 
 	chip->codec_probe_mask = -1;
@@ -436,7 +442,16 @@ static int hda_tegra_create(struct snd_card *card,
 	chip->bus.core.sync_write = 0;
 	chip->bus.core.needs_damn_long_delay = 1;
 	chip->bus.core.aligned_mmio = 1;
-	chip->bus.jackpoll_in_suspend = 1;
+
+	/*
+	 * HDA power domain and clocks are always on for Tegra264 and
+	 * the jack detection logic would work always, so no need of
+	 * jack polling mechanism running.
+	 */
+	if (!hda->soc->always_on) {
+		chip->jackpoll_interval = msecs_to_jiffies(5000);
+		chip->bus.jackpoll_in_suspend = 1;
+	}
 
 	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
 	if (err < 0) {
@@ -450,22 +465,44 @@ static int hda_tegra_create(struct snd_card *card,
 static const struct hda_tegra_soc tegra30_data = {
 	.has_hda2codec_2x_reset = true,
 	.has_hda2hdmi = true,
+	.has_hda2codec_2x = true,
+	.input_stream = true,
+	.always_on = false,
+	.requires_init = true,
 };
 
 static const struct hda_tegra_soc tegra194_data = {
 	.has_hda2codec_2x_reset = false,
 	.has_hda2hdmi = true,
+	.has_hda2codec_2x = true,
+	.input_stream = true,
+	.always_on = false,
+	.requires_init = true,
 };
 
 static const struct hda_tegra_soc tegra234_data = {
 	.has_hda2codec_2x_reset = true,
 	.has_hda2hdmi = false,
+	.has_hda2codec_2x = true,
+	.input_stream = false,
+	.always_on = false,
+	.requires_init = true,
+};
+
+static const struct hda_tegra_soc tegra264_data = {
+	.has_hda2codec_2x_reset = true,
+	.has_hda2hdmi = false,
+	.has_hda2codec_2x = false,
+	.input_stream = false,
+	.always_on = true,
+	.requires_init = false,
 };
 
 static const struct of_device_id hda_tegra_match[] = {
 	{ .compatible = "nvidia,tegra30-hda", .data = &tegra30_data },
 	{ .compatible = "nvidia,tegra194-hda", .data = &tegra194_data },
 	{ .compatible = "nvidia,tegra234-hda", .data = &tegra234_data },
+	{ .compatible = "nvidia,tegra264-hda", .data = &tegra264_data },
 	{},
 };
 MODULE_DEVICE_TABLE(of, hda_tegra_match);
@@ -520,7 +557,9 @@ static int hda_tegra_probe(struct platform_device *pdev)
 	hda->clocks[hda->nclocks++].id = "hda";
 	if (hda->soc->has_hda2hdmi)
 		hda->clocks[hda->nclocks++].id = "hda2hdmi";
-	hda->clocks[hda->nclocks++].id = "hda2codec_2x";
+
+	if (hda->soc->has_hda2codec_2x)
+		hda->clocks[hda->nclocks++].id = "hda2codec_2x";
 
 	err = devm_clk_bulk_get(&pdev->dev, hda->nclocks, hda->clocks);
 	if (err < 0)
sound/pci/hda/patch_hdmi.c +1 -0
index 7167989a8d86..6c860fda6648 100644
@@ -4551,6 +4551,7 @@ HDA_CODEC_ENTRY(0x10de002e, "Tegra186 HDMI/DP1", patch_tegra_hdmi),
 HDA_CODEC_ENTRY(0x10de002f, "Tegra194 HDMI/DP2", patch_tegra_hdmi),
 HDA_CODEC_ENTRY(0x10de0030, "Tegra194 HDMI/DP3", patch_tegra_hdmi),
 HDA_CODEC_ENTRY(0x10de0031, "Tegra234 HDMI/DP", patch_tegra234_hdmi),
+HDA_CODEC_ENTRY(0x10de0034, "Tegra264 HDMI/DP",	patch_tegra234_hdmi),
 HDA_CODEC_ENTRY(0x10de0040, "GPU 40 HDMI/DP",	patch_nvhdmi),
 HDA_CODEC_ENTRY(0x10de0041, "GPU 41 HDMI/DP",	patch_nvhdmi),
 HDA_CODEC_ENTRY(0x10de0042, "GPU 42 HDMI/DP",	patch_nvhdmi),
Signature · 1 line
2.17.1
Applied
#8 lore raw
In reply to Sheetal .
Quoted 11 lines · Sheetal .

From: Sheetal <[email protected]>

The patch series is to add support for Tegra264 in HDA driver.

Mohan Kumar D (1):
ALSA: hda/tegra: Add Tegra264 support

Sheetal (2):
dt-bindings: hda: Update Tegra compatible requirements
dt-bindings: Document Tegra264 HDA Support

Applied all patches now to for-next branch.

thanks,

Takashi