2020-05-04 10:11:39

by Sameer Pujar

[permalink] [raw]
Subject: [PATCH 0/3] Tegra194 HW Fixes

This series proposes SW workarounds for Tegra194 HDA HW bugs.
Following are the two issues seen:
1. GCAP register does not reflect true capability.
The actual number of SDO lines is "4", where as it reflects "2".
2. With 4 SDO line configuration playback fails for,
44.1K/48K, 2-channel, 16-bps audio stream.

After fixing [1], issue [2] is uncovered.
As per recommendation by Tegra HW team the workarounds are pushed.

Testing done
============
* Verify GCAP register after registering HDA sound card
* Verify audio playback for 44.1K/48K, 2-channel, 16-bps.

Sameer Pujar (3):
ALSA: hda/tegra: correct number of SDO lines for Tegra194
ALSA: hda: add member to store ratio for stripe control
ALSA: hda/tegra: workaround playback failure on Tegra194

include/sound/hdaudio.h | 3 +++
sound/hda/hdac_controller.c | 11 ++++++++++
sound/hda/hdac_stream.c | 2 +-
sound/pci/hda/hda_tegra.c | 50 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 65 insertions(+), 1 deletion(-)

--
2.7.4


2020-05-04 10:12:09

by Sameer Pujar

[permalink] [raw]
Subject: [PATCH 2/3] ALSA: hda: add member to store ratio for stripe control

Stripe control programming is governed by following formula, which is
referenced from the HD Audio specification(Revision 1.0a).
{ ((num_channels * bits_per_sample) / number of SDOs) >= 8 }

Currently above is implemented in snd_hdac_get_stream_stripe_ctl().
This patch introduces a structure member to store the default factor
of '8'. If any HW wants to use a different value, this member can be
easily updated.

Signed-off-by: Sameer Pujar <[email protected]>
---
include/sound/hdaudio.h | 3 +++
sound/hda/hdac_controller.c | 12 ++++++++++++
sound/hda/hdac_stream.c | 2 +-
3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
index affedc2..d365297 100644
--- a/include/sound/hdaudio.h
+++ b/include/sound/hdaudio.h
@@ -364,6 +364,9 @@ struct hdac_bus {
/* link management */
struct list_head hlink_list;
bool cmd_dma_state;
+
+ /* factor used to derive STRIPE control value */
+ unsigned int sdo_limit;
};

int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
index bc4a8b6..ac15aa3 100644
--- a/sound/hda/hdac_controller.c
+++ b/sound/hda/hdac_controller.c
@@ -527,6 +527,18 @@ bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset)
}

bus->chip_init = true;
+
+ /*
+ * Default value of '8' is as per the HD audio specification (Rev 1.0a).
+ * Following relation is used to derive STRIPE control value.
+ * For sample rate <= 48K:
+ * { ((num_channels * bits_per_sample) / number of SDOs) >= 8 }
+ * For sample rate > 48K:
+ * { ((num_channels * bits_per_sample * rate/48000) /
+ * number of SDOs) >= 8 }
+ */
+ bus->sdo_limit = 8;
+
return true;
}
EXPORT_SYMBOL_GPL(snd_hdac_bus_init_chip);
diff --git a/sound/hda/hdac_stream.c b/sound/hda/hdac_stream.c
index a314b03..a38a2af 100644
--- a/sound/hda/hdac_stream.c
+++ b/sound/hda/hdac_stream.c
@@ -38,7 +38,7 @@ int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus,
else
value = (channels * bits_per_sample) / sdo_line;

- if (value >= 8)
+ if (value >= bus->sdo_limit)
break;
}

--
2.7.4