Alsa-devel
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
October 2023
- 142 participants
- 287 discussions
This commit uses the ack() callback to determine when a buffer has been
updated, then exposes it to guest.
The current mechanism splits a dma buffer into descriptors that are
exposed to the device. This dma buffer is shared with the user
application. When the device consumes a buffer, the driver moves the
request from the used ring to available ring.
The driver exposes the buffer to the device without knowing if the
content has been updated from the user. The section 2.8.21.1 of the
virtio spec states that: "The device MAY access the descriptor chains
the driver created and the memory they refer to immediately". If the
device picks up buffers from the available ring just after it is
notified, it happens that the content may be old.
When the ack() callback is invoked, the driver exposes only the buffers
that have already been updated, i.e., enqueued in the available ring.
Thus, the device always picks up a buffer that is updated.
For capturing, the driver starts by exposing all the available buffers
to device. After device updates the content of a buffer, it enqueues it
in the used ring. It is only after the ack() for capturing is issued
that the driver re-enqueues the buffer in the available ring.
Co-developed-by: Anton Yakovlev <anton.yakovlev(a)opensynergy.com>
Signed-off-by: Anton Yakovlev <anton.yakovlev(a)opensynergy.com>
Signed-off-by: Matias Ezequiel Vara Larsen <mvaralar(a)redhat.com>
---
Changelog:
v3 -> v4:
* Disable rewinds
* Add SNDRV_PCM_INFO_SYNC_APPLPTR flag
* Use pcm indirect API for pointer() and ack() callbacks
v2 -> v3:
* Use ack() callback instead of copy()/fill_silence()
* Change commit name
* Rewrite commit message
* Remove virtsnd_pcm_msg_send_locked()
* Use single callback for both capture and playback
* Fix kernel test robot warnings regarding documentation
* v2 patch at:
https://lore.kernel.org/lkml/87y1fzkq8c.wl-tiwai@suse.de/T/
v1 -> v2:
* Use snd_pcm_set_managed_buffer_all()for buffer allocation/freeing.
* Make virtsnd_pcm_msg_send() generic by specifying the offset and size
for the modified part of the buffer; this way no assumptions need to
be made.
* Disable SNDRV_PCM_INFO_NO_REWINDS since now only sequential
reading/writing of frames is supported.
* Correct comment at virtsnd_pcm_msg_send().
* v1 patch at:
https://lore.kernel.org/lkml/20231016151000.GE119987@fedora/t/
sound/virtio/virtio_pcm.c | 6 +-
sound/virtio/virtio_pcm.h | 9 ++-
sound/virtio/virtio_pcm_msg.c | 79 ++++++++++++---------
sound/virtio/virtio_pcm_ops.c | 125 +++++++++++++++++++++++++++-------
4 files changed, 158 insertions(+), 61 deletions(-)
diff --git a/sound/virtio/virtio_pcm.c b/sound/virtio/virtio_pcm.c
index c10d91fff2fb..967e4c45be9b 100644
--- a/sound/virtio/virtio_pcm.c
+++ b/sound/virtio/virtio_pcm.c
@@ -109,7 +109,9 @@ static int virtsnd_pcm_build_hw(struct virtio_pcm_substream *vss,
SNDRV_PCM_INFO_BATCH |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
SNDRV_PCM_INFO_INTERLEAVED |
- SNDRV_PCM_INFO_PAUSE;
+ SNDRV_PCM_INFO_PAUSE |
+ SNDRV_PCM_INFO_NO_REWINDS |
+ SNDRV_PCM_INFO_SYNC_APPLPTR;
if (!info->channels_min || info->channels_min > info->channels_max) {
dev_err(&vdev->dev,
@@ -471,7 +473,7 @@ int virtsnd_pcm_build_devs(struct virtio_snd *snd)
for (kss = ks->substream; kss; kss = kss->next)
vs->substreams[kss->number]->substream = kss;
- snd_pcm_set_ops(vpcm->pcm, i, &virtsnd_pcm_ops);
+ snd_pcm_set_ops(vpcm->pcm, i, &virtsnd_pcm_ops[i]);
}
snd_pcm_set_managed_buffer_all(vpcm->pcm,
diff --git a/sound/virtio/virtio_pcm.h b/sound/virtio/virtio_pcm.h
index 062eb8e8f2cf..5dd1b43b9493 100644
--- a/sound/virtio/virtio_pcm.h
+++ b/sound/virtio/virtio_pcm.h
@@ -9,6 +9,7 @@
#include <linux/atomic.h>
#include <linux/virtio_config.h>
#include <sound/pcm.h>
+#include <sound/pcm-indirect.h>
struct virtio_pcm;
struct virtio_pcm_msg;
@@ -21,6 +22,7 @@ struct virtio_pcm_msg;
* @direction: Stream data flow direction (SNDRV_PCM_STREAM_XXX).
* @features: Stream VirtIO feature bit map (1 << VIRTIO_SND_PCM_F_XXX).
* @substream: Kernel ALSA substream.
+ * @pcm_indirect: Kernel indirect pcm structure.
* @hw: Kernel ALSA substream hardware descriptor.
* @elapsed_period: Kernel work to handle the elapsed period state.
* @lock: Spinlock that protects fields shared by interrupt handlers and
@@ -46,6 +48,7 @@ struct virtio_pcm_substream {
u32 direction;
u32 features;
struct snd_pcm_substream *substream;
+ struct snd_pcm_indirect pcm_indirect;
struct snd_pcm_hardware hw;
struct work_struct elapsed_period;
spinlock_t lock;
@@ -57,7 +60,6 @@ struct virtio_pcm_substream {
bool suspended;
struct virtio_pcm_msg **msgs;
unsigned int nmsgs;
- int msg_last_enqueued;
unsigned int msg_count;
wait_queue_head_t msg_empty;
};
@@ -90,7 +92,7 @@ struct virtio_pcm {
struct virtio_pcm_stream streams[SNDRV_PCM_STREAM_LAST + 1];
};
-extern const struct snd_pcm_ops virtsnd_pcm_ops;
+extern const struct snd_pcm_ops virtsnd_pcm_ops[];
int virtsnd_pcm_validate(struct virtio_device *vdev);
@@ -117,7 +119,8 @@ int virtsnd_pcm_msg_alloc(struct virtio_pcm_substream *vss,
void virtsnd_pcm_msg_free(struct virtio_pcm_substream *vss);
-int virtsnd_pcm_msg_send(struct virtio_pcm_substream *vss);
+int virtsnd_pcm_msg_send(struct virtio_pcm_substream *vss, unsigned long offset,
+ unsigned long bytes);
unsigned int virtsnd_pcm_msg_pending_num(struct virtio_pcm_substream *vss);
diff --git a/sound/virtio/virtio_pcm_msg.c b/sound/virtio/virtio_pcm_msg.c
index aca2dc1989ba..542446c4c7ba 100644
--- a/sound/virtio/virtio_pcm_msg.c
+++ b/sound/virtio/virtio_pcm_msg.c
@@ -155,7 +155,6 @@ int virtsnd_pcm_msg_alloc(struct virtio_pcm_substream *vss,
sizeof(msg->xfer));
sg_init_one(&msg->sgs[PCM_MSG_SG_STATUS], &msg->status,
sizeof(msg->status));
- msg->length = period_bytes;
virtsnd_pcm_sg_from(&msg->sgs[PCM_MSG_SG_DATA], sg_num, data,
period_bytes);
@@ -186,61 +185,75 @@ void virtsnd_pcm_msg_free(struct virtio_pcm_substream *vss)
/**
* virtsnd_pcm_msg_send() - Send asynchronous I/O messages.
* @vss: VirtIO PCM substream.
+ * @offset: starting position that has been updated
+ * @bytes: number of bytes that has been updated
*
* All messages are organized in an ordered circular list. Each time the
* function is called, all currently non-enqueued messages are added to the
- * virtqueue. For this, the function keeps track of two values:
- *
- * msg_last_enqueued = index of the last enqueued message,
- * msg_count = # of pending messages in the virtqueue.
+ * virtqueue. For this, the function uses offset and bytes to calculate the
+ * messages that need to be added.
*
* Context: Any context. Expects the tx/rx queue and the VirtIO substream
* spinlocks to be held by caller.
* Return: 0 on success, -errno on failure.
*/
-int virtsnd_pcm_msg_send(struct virtio_pcm_substream *vss)
+int virtsnd_pcm_msg_send(struct virtio_pcm_substream *vss, unsigned long offset,
+ unsigned long bytes)
{
- struct snd_pcm_runtime *runtime = vss->substream->runtime;
struct virtio_snd *snd = vss->snd;
struct virtio_device *vdev = snd->vdev;
struct virtqueue *vqueue = virtsnd_pcm_queue(vss)->vqueue;
- int i;
- int n;
+ unsigned long period_bytes = snd_pcm_lib_period_bytes(vss->substream);
+ unsigned long start, end, i;
+ unsigned int msg_count = vss->msg_count;
bool notify = false;
+ int rc;
- i = (vss->msg_last_enqueued + 1) % runtime->periods;
- n = runtime->periods - vss->msg_count;
+ start = offset / period_bytes;
+ end = (offset + bytes - 1) / period_bytes;
- for (; n; --n, i = (i + 1) % runtime->periods) {
+ for (i = start; i <= end; i++) {
struct virtio_pcm_msg *msg = vss->msgs[i];
struct scatterlist *psgs[] = {
&msg->sgs[PCM_MSG_SG_XFER],
&msg->sgs[PCM_MSG_SG_DATA],
&msg->sgs[PCM_MSG_SG_STATUS]
};
- int rc;
-
- msg->xfer.stream_id = cpu_to_le32(vss->sid);
- memset(&msg->status, 0, sizeof(msg->status));
-
- if (vss->direction == SNDRV_PCM_STREAM_PLAYBACK)
- rc = virtqueue_add_sgs(vqueue, psgs, 2, 1, msg,
- GFP_ATOMIC);
- else
- rc = virtqueue_add_sgs(vqueue, psgs, 1, 2, msg,
- GFP_ATOMIC);
-
- if (rc) {
- dev_err(&vdev->dev,
- "SID %u: failed to send I/O message\n",
- vss->sid);
- return rc;
+ unsigned long n;
+
+ n = period_bytes - (offset % period_bytes);
+ if (n > bytes)
+ n = bytes;
+
+ msg->length += n;
+ if (msg->length == period_bytes) {
+ msg->xfer.stream_id = cpu_to_le32(vss->sid);
+ memset(&msg->status, 0, sizeof(msg->status));
+
+ if (vss->direction == SNDRV_PCM_STREAM_PLAYBACK)
+ rc = virtqueue_add_sgs(vqueue, psgs, 2, 1, msg,
+ GFP_ATOMIC);
+ else
+ rc = virtqueue_add_sgs(vqueue, psgs, 1, 2, msg,
+ GFP_ATOMIC);
+
+ if (rc) {
+ dev_err(&vdev->dev,
+ "SID %u: failed to send I/O message\n",
+ vss->sid);
+ return rc;
+ }
+
+ vss->msg_count++;
}
- vss->msg_last_enqueued = i;
- vss->msg_count++;
+ offset = 0;
+ bytes -= n;
}
+ if (msg_count == vss->msg_count)
+ return 0;
+
if (!(vss->features & (1U << VIRTIO_SND_PCM_F_MSG_POLLING)))
notify = virtqueue_kick_prepare(vqueue);
@@ -309,6 +322,8 @@ static void virtsnd_pcm_msg_complete(struct virtio_pcm_msg *msg,
if (vss->hw_ptr >= vss->buffer_bytes)
vss->hw_ptr -= vss->buffer_bytes;
+ msg->length = 0;
+
vss->xfer_xrun = false;
vss->msg_count--;
@@ -320,8 +335,6 @@ static void virtsnd_pcm_msg_complete(struct virtio_pcm_msg *msg,
le32_to_cpu(msg->status.latency_bytes));
schedule_work(&vss->elapsed_period);
-
- virtsnd_pcm_msg_send(vss);
} else if (!vss->msg_count) {
wake_up_all(&vss->msg_empty);
}
diff --git a/sound/virtio/virtio_pcm_ops.c b/sound/virtio/virtio_pcm_ops.c
index f8bfb87624be..ad12aae52fc3 100644
--- a/sound/virtio/virtio_pcm_ops.c
+++ b/sound/virtio/virtio_pcm_ops.c
@@ -282,7 +282,6 @@ static int virtsnd_pcm_prepare(struct snd_pcm_substream *substream)
vss->buffer_bytes = snd_pcm_lib_buffer_bytes(substream);
vss->hw_ptr = 0;
- vss->msg_last_enqueued = -1;
} else {
struct snd_pcm_runtime *runtime = substream->runtime;
unsigned int buffer_bytes = snd_pcm_lib_buffer_bytes(substream);
@@ -300,6 +299,11 @@ static int virtsnd_pcm_prepare(struct snd_pcm_substream *substream)
vss->suspended = false;
vss->msg_count = 0;
+ memset(&vss->pcm_indirect, 0, sizeof(vss->pcm_indirect));
+ vss->pcm_indirect.sw_buffer_size =
+ vss->pcm_indirect.hw_buffer_size =
+ snd_pcm_lib_buffer_bytes(substream);
+
msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_PREPARE,
GFP_KERNEL);
if (!msg)
@@ -324,7 +328,7 @@ static int virtsnd_pcm_trigger(struct snd_pcm_substream *substream, int command)
struct virtio_snd_queue *queue;
struct virtio_snd_msg *msg;
unsigned long flags;
- int rc;
+ int rc = 0;
switch (command) {
case SNDRV_PCM_TRIGGER_START:
@@ -333,7 +337,8 @@ static int virtsnd_pcm_trigger(struct snd_pcm_substream *substream, int command)
spin_lock_irqsave(&queue->lock, flags);
spin_lock(&vss->lock);
- rc = virtsnd_pcm_msg_send(vss);
+ if (vss->direction == SNDRV_PCM_STREAM_CAPTURE)
+ rc = virtsnd_pcm_msg_send(vss, 0, vss->buffer_bytes);
if (!rc)
vss->xfer_enabled = true;
spin_unlock(&vss->lock);
@@ -428,37 +433,111 @@ static int virtsnd_pcm_sync_stop(struct snd_pcm_substream *substream)
}
/**
- * virtsnd_pcm_pointer() - Get the current hardware position for the PCM
- * substream.
+ * virtsnd_pcm_pb_pointer() - Get the current hardware position for the PCM
+ * substream for playback.
* @substream: Kernel ALSA substream.
*
- * Context: Any context. Takes and releases the VirtIO substream spinlock.
+ * Context: Any context.
* Return: Hardware position in frames inside [0 ... buffer_size) range.
*/
static snd_pcm_uframes_t
-virtsnd_pcm_pointer(struct snd_pcm_substream *substream)
+virtsnd_pcm_pb_pointer(struct snd_pcm_substream *substream)
+{
+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream);
+
+ return snd_pcm_indirect_playback_pointer(substream,
+ &vss->pcm_indirect,
+ vss->hw_ptr);
+}
+
+/**
+ * virtsnd_pcm_cp_pointer() - Get the current hardware position for the PCM
+ * substream for capture.
+ * @substream: Kernel ALSA substream.
+ *
+ * Context: Any context.
+ * Return: Hardware position in frames inside [0 ... buffer_size) range.
+ */
+static snd_pcm_uframes_t
+virtsnd_pcm_cp_pointer(struct snd_pcm_substream *substream)
+{
+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream);
+
+ return snd_pcm_indirect_capture_pointer(substream,
+ &vss->pcm_indirect,
+ vss->hw_ptr);
+}
+
+static void virtsnd_pcm_trans_copy(struct snd_pcm_substream *substream,
+ struct snd_pcm_indirect *rec, size_t bytes)
{
struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream);
- snd_pcm_uframes_t hw_ptr = SNDRV_PCM_POS_XRUN;
+
+ virtsnd_pcm_msg_send(vss, rec->sw_data, bytes);
+}
+
+static int virtsnd_pcm_pb_ack(struct snd_pcm_substream *substream)
+{
+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream);
+ struct virtio_snd_queue *queue = virtsnd_pcm_queue(vss);
+ unsigned long flags;
+ int rc;
+
+ spin_lock_irqsave(&queue->lock, flags);
+ spin_lock(&vss->lock);
+
+ rc = snd_pcm_indirect_playback_transfer(substream, &vss->pcm_indirect,
+ virtsnd_pcm_trans_copy);
+
+ spin_unlock(&vss->lock);
+ spin_unlock_irqrestore(&queue->lock, flags);
+
+ return rc;
+}
+
+static int virtsnd_pcm_cp_ack(struct snd_pcm_substream *substream)
+{
+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream);
+ struct virtio_snd_queue *queue = virtsnd_pcm_queue(vss);
unsigned long flags;
+ int rc;
+
+ spin_lock_irqsave(&queue->lock, flags);
+ spin_lock(&vss->lock);
+
+ rc = snd_pcm_indirect_capture_transfer(substream, &vss->pcm_indirect,
+ virtsnd_pcm_trans_copy);
- spin_lock_irqsave(&vss->lock, flags);
- if (!vss->xfer_xrun)
- hw_ptr = bytes_to_frames(substream->runtime, vss->hw_ptr);
- spin_unlock_irqrestore(&vss->lock, flags);
+ spin_unlock(&vss->lock);
+ spin_unlock_irqrestore(&queue->lock, flags);
- return hw_ptr;
+ return rc;
}
/* PCM substream operators map. */
-const struct snd_pcm_ops virtsnd_pcm_ops = {
- .open = virtsnd_pcm_open,
- .close = virtsnd_pcm_close,
- .ioctl = snd_pcm_lib_ioctl,
- .hw_params = virtsnd_pcm_hw_params,
- .hw_free = virtsnd_pcm_hw_free,
- .prepare = virtsnd_pcm_prepare,
- .trigger = virtsnd_pcm_trigger,
- .sync_stop = virtsnd_pcm_sync_stop,
- .pointer = virtsnd_pcm_pointer,
+const struct snd_pcm_ops virtsnd_pcm_ops[] = {
+ {
+ .open = virtsnd_pcm_open,
+ .close = virtsnd_pcm_close,
+ .ioctl = snd_pcm_lib_ioctl,
+ .hw_params = virtsnd_pcm_hw_params,
+ .hw_free = virtsnd_pcm_hw_free,
+ .prepare = virtsnd_pcm_prepare,
+ .trigger = virtsnd_pcm_trigger,
+ .sync_stop = virtsnd_pcm_sync_stop,
+ .pointer = virtsnd_pcm_pb_pointer,
+ .ack = virtsnd_pcm_pb_ack,
+ },
+ {
+ .open = virtsnd_pcm_open,
+ .close = virtsnd_pcm_close,
+ .ioctl = snd_pcm_lib_ioctl,
+ .hw_params = virtsnd_pcm_hw_params,
+ .hw_free = virtsnd_pcm_hw_free,
+ .prepare = virtsnd_pcm_prepare,
+ .trigger = virtsnd_pcm_trigger,
+ .sync_stop = virtsnd_pcm_sync_stop,
+ .pointer = virtsnd_pcm_cp_pointer,
+ .ack = virtsnd_pcm_cp_ack,
+ },
};
base-commit: 8a749fd1a8720d4619c91c8b6e7528c0a355c0aa
--
2.41.0
4
4
[PATCH alsa-ucm-conf 1/2] bytcr-wm5102: Add support for speakers connected to HPOUT2
by Hans de Goede 31 Oct '23
by Hans de Goede 31 Oct '23
31 Oct '23
On the Lenovo Yoga Tab 3 YT3-X90 the speaker amplifiers are connected
to the HPOUT2 output pins instead of the the SPK output pins.
Check for "cfg-spk:hpout2" in the components string which indicates
this setup and add a ucm2/codecs/wm5102/HPOut2-Speaker.conf file
for this setup.
Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
---
ucm2/Intel/bytcr-wm5102/HiFi.conf | 11 ++++++++++-
ucm2/codecs/wm5102/EnableSeq.conf | 2 ++
ucm2/codecs/wm5102/HPOut2-Speaker.conf | 22 ++++++++++++++++++++++
3 files changed, 34 insertions(+), 1 deletion(-)
create mode 100644 ucm2/codecs/wm5102/HPOut2-Speaker.conf
diff --git a/ucm2/Intel/bytcr-wm5102/HiFi.conf b/ucm2/Intel/bytcr-wm5102/HiFi.conf
index 1269868..2afc757 100644
--- a/ucm2/Intel/bytcr-wm5102/HiFi.conf
+++ b/ucm2/Intel/bytcr-wm5102/HiFi.conf
@@ -21,7 +21,16 @@ SectionVerb {
}
}
-Include.spk.File "/codecs/wm5102/Speaker.conf"
+If.spk {
+ Condition {
+ Type String
+ Haystack "${CardComponents}"
+ Needle "cfg-spk:hpout2"
+ }
+ True.Include.hpout2.File "/codecs/wm5102/HPOut2-Speaker.conf"
+ False.Include.spk.File "/codecs/wm5102/Speaker.conf"
+}
+
Include.hp.File "/codecs/wm5102/HeadPhones.conf"
Include.mic.File "/codecs/wm5102/IN3-InternalMic.conf"
Include.headset.File "/codecs/wm5102/IN1-HeadsetMic.conf"
diff --git a/ucm2/codecs/wm5102/EnableSeq.conf b/ucm2/codecs/wm5102/EnableSeq.conf
index 6a857a2..87cb3bb 100644
--- a/ucm2/codecs/wm5102/EnableSeq.conf
+++ b/ucm2/codecs/wm5102/EnableSeq.conf
@@ -4,6 +4,8 @@ EnableSequence [
cset "name='SPKOUTR Input 1' AIF1RX2"
cset "name='HPOUT1L Input 1' AIF1RX1"
cset "name='HPOUT1R Input 1' AIF1RX2"
+ cset "name='HPOUT2L Input 1' AIF1RX1"
+ cset "name='HPOUT2R Input 1' AIF1RX2"
# Both mics are quite soft by default, boost then
cset "name='IN1L Volume' 28"
diff --git a/ucm2/codecs/wm5102/HPOut2-Speaker.conf b/ucm2/codecs/wm5102/HPOut2-Speaker.conf
new file mode 100644
index 0000000..375f9ba
--- /dev/null
+++ b/ucm2/codecs/wm5102/HPOut2-Speaker.conf
@@ -0,0 +1,22 @@
+SectionDevice."Speaker" {
+ Comment "Speakers"
+
+ Value {
+ PlaybackPriority 100
+ PlaybackPCM "hw:${CardId}"
+ }
+
+ ConflictingDevice [
+ "Headphones"
+ ]
+
+ EnableSequence [
+ cset "name='HPOUT2 Digital Switch' on"
+ cset "name='Speaker Switch' on"
+ ]
+
+ DisableSequence [
+ cset "name='HPOUT2 Digital Switch' off"
+ cset "name='Speaker Switch' off"
+ ]
+}
--
2.41.0
2
3
2 mono speaker setup fixes:
1. Use the kernel's components string to check for a mono-speaker device
when the board has a components string.
2. So far known nau8824 boards with a mono speaker where using the right
speaker channel, which is unusual. Normally mono speaker setups use
only the left speaker channel. The Cyberbook T116 tablet is a nau8824
based model, which indeed uses the left speaker channel for its single
speaker.
Modify ucm2/codecs/nau8824/MonoSpeaker.conf to send a left+right
channel mix to both speaker channels, so that things will work
independent of which speaker channel is used for a mono setup.
Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
---
ucm2/Intel/chtnau8824/HiFi.conf | 15 +++++++++++++++
ucm2/codecs/nau8824/MonoSpeaker.conf | 7 ++++---
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/ucm2/Intel/chtnau8824/HiFi.conf b/ucm2/Intel/chtnau8824/HiFi.conf
index c3d830d..1a1faf4 100644
--- a/ucm2/Intel/chtnau8824/HiFi.conf
+++ b/ucm2/Intel/chtnau8824/HiFi.conf
@@ -14,6 +14,21 @@ If.Controls {
}
}
+# Figure out which components are in use on the device, we check both the
+# components string (present on newer kernels) as well as checking for DMI
+# strings for compatibility with older kernels. Note DMI matches for new
+# models should only be added to the kernel, this UCM profile will then
+# automatically pick up the info from the components string.
+
+If.components-mono-spk {
+ Condition {
+ Type String
+ Haystack "${CardComponents}"
+ Needle "cfg-spk:1"
+ }
+ True.Define.Speaker "MonoSpeaker"
+}
+
If.cfg-mspk {
Condition {
Type RegexMatch
diff --git a/ucm2/codecs/nau8824/MonoSpeaker.conf b/ucm2/codecs/nau8824/MonoSpeaker.conf
index 6b4ef8a..5428133 100644
--- a/ucm2/codecs/nau8824/MonoSpeaker.conf
+++ b/ucm2/codecs/nau8824/MonoSpeaker.conf
@@ -11,9 +11,10 @@ SectionDevice."Speaker" {
]
EnableSequence [
- # nau8824 mono speaker boards have the speaker on the right chan
- cset "name='Speaker Left DACL Volume' 0"
- cset "name='Speaker Left DACR Volume' 0"
+ # Some nau8824 mono speaker boards have the speaker on the right chan
+ # others on the left, enable output of both channels on both speakers
+ cset "name='Speaker Left DACL Volume' 1"
+ cset "name='Speaker Left DACR Volume' 1"
cset "name='Speaker Right DACL Volume' 1"
cset "name='Speaker Right DACR Volume' 1"
cset "name='Ext Spk Switch' on"
--
2.41.0
2
1
[PATCH alsa-ucm-conf] codecs/es8316: Fix mono speaker settings from previous boot getting applied
by Hans de Goede 31 Oct '23
by Hans de Goede 31 Oct '23
31 Oct '23
When codecs/es8316/MonoSpeaker.conf's EnableSeq was run last before
shutdown the 'Playback Polarity' and 'DAC Mono Mix Switch' controls for
Mono Speaker output get saved and restored on the next boot.
These settings are undone by the MonoSpeaker DisableSeq, but that never
runs when an updated kernel switches from the default "cfg-spk:1" in
components to "cfg-spk:2" for devices which do actually have 2 speakers,
which causes the ucm profile to use codecs/es8316/Speaker.conf instead.
Set the 'Playback Polarity' and 'DAC Mono Mix Switch' controls to their
defaults in codecs/es8316/EnableSeq.conf to avoid them getting stuck
in Mono mix mode in this scenario.
Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
---
ucm2/codecs/es8316/EnableSeq.conf | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/ucm2/codecs/es8316/EnableSeq.conf b/ucm2/codecs/es8316/EnableSeq.conf
index b6c81d8..b75c4a7 100644
--- a/ucm2/codecs/es8316/EnableSeq.conf
+++ b/ucm2/codecs/es8316/EnableSeq.conf
@@ -22,4 +22,8 @@ EnableSequence [
# Setup muxes / switches
cset "name='Left Headphone Mixer Left DAC Switch' on"
cset "name='Right Headphone Mixer Right DAC Switch' on"
+
+ # Undo MonoSpeaker settings which may have been saved on shutdown
+ cset "name='Playback Polarity' 0"
+ cset "name='DAC Mono Mix Switch' off"
]
--
2.41.0
2
2
Add source file and header file for tas2783 soundwire driver.
Also update Kconfig and Makefile for tas2783 driver.
Signed-off-by: Baojun Xu <baojun.xu(a)ti.com>
---
Change in v3:
- change spelling for description in sound/soc/codecs/Kconfig.
- add select REGMAP_SOUNDWIRE for TAS2783 in Kconfig.
- remove delay.h, device.h, of_gpio.h, interrupt.h
- change array tas2783_cali_reg to fixed size.
- add data port registers area in tas2783_readable_register.
- add comments for volatile register(reset).
- change comment for volume get.
- change all private struct variable name to tas_priv.
- add description for why have calibration data in UEFI.
- remove firmware data save.
- add left, right channel setting after firmware load.
- move pm_runtime functions to driver from component probe.
- move firmware request to driver from component probe.
- change name to component from codec.
- change firmware binary name to tas2783-x.bin.
- remove start_addr in struct tas2783_firmware_node.
- remove firmware_node, codec in struct tasdevice_priv.
- remove TAS2783_MAX_NO_NODES define.
---
sound/soc/codecs/Kconfig | 14 +
sound/soc/codecs/Makefile | 2 +
sound/soc/codecs/tas2783-sdw.c | 857 +++++++++++++++++++++++++++++++++
sound/soc/codecs/tas2783.h | 100 ++++
4 files changed, 973 insertions(+)
create mode 100644 sound/soc/codecs/tas2783-sdw.c
create mode 100644 sound/soc/codecs/tas2783.h
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index f1e1dbc509f6..2973fe8975fd 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -244,6 +244,7 @@ config SND_SOC_ALL_CODECS
imply SND_SOC_TAS2781_COMLIB
imply SND_SOC_TAS2781_FMWLIB
imply SND_SOC_TAS2781_I2C
+ imply SND_SOC_TAS2783
imply SND_SOC_TAS5086
imply SND_SOC_TAS571X
imply SND_SOC_TAS5720
@@ -1803,6 +1804,19 @@ config SND_SOC_TAS2781_I2C
algo coefficient setting, for one, two or even multiple TAS2781
chips.
+config SND_SOC_TAS2783
+ tristate "Texas Instruments TAS2783 speaker amplifier (sdw)"
+ depends on SOUNDWIRE
+ select REGMAP
+ select REGMAP_SOUNDWIRE
+ select CRC32
+ help
+ Enable support for Texas Instruments TAS2783 Smart Amplifier
+ Digital input mono Class-D and DSP-inside audio power amplifiers.
+ Note the TAS2783 driver implements a flexible and configurable
+ algorithm cofficient setting, for one, two or multiple TAS2783
+ chips.
+
config SND_SOC_TAS5086
tristate "Texas Instruments TAS5086 speaker amplifier"
depends on I2C
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index a87e56938ce5..208f76a653fa 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -280,6 +280,7 @@ snd-soc-tas2770-objs := tas2770.o
snd-soc-tas2781-comlib-objs := tas2781-comlib.o
snd-soc-tas2781-fmwlib-objs := tas2781-fmwlib.o
snd-soc-tas2781-i2c-objs := tas2781-i2c.o
+snd-soc-tas2783-objs := tas2783-sdw.o
snd-soc-tfa9879-objs := tfa9879.o
snd-soc-tfa989x-objs := tfa989x.o
snd-soc-tlv320adc3xxx-objs := tlv320adc3xxx.o
@@ -656,6 +657,7 @@ obj-$(CONFIG_SND_SOC_TAS2780) += snd-soc-tas2780.o
obj-$(CONFIG_SND_SOC_TAS2781_COMLIB) += snd-soc-tas2781-comlib.o
obj-$(CONFIG_SND_SOC_TAS2781_FMWLIB) += snd-soc-tas2781-fmwlib.o
obj-$(CONFIG_SND_SOC_TAS2781_I2C) += snd-soc-tas2781-i2c.o
+obj-$(CONFIG_SND_SOC_TAS2783) += snd-soc-tas2783.o
obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o
obj-$(CONFIG_SND_SOC_TAS571X) += snd-soc-tas571x.o
obj-$(CONFIG_SND_SOC_TAS5720) += snd-soc-tas5720.o
diff --git a/sound/soc/codecs/tas2783-sdw.c b/sound/soc/codecs/tas2783-sdw.c
new file mode 100644
index 000000000000..d9719f15b17c
--- /dev/null
+++ b/sound/soc/codecs/tas2783-sdw.c
@@ -0,0 +1,856 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// ALSA SoC Texas Instruments TAS2783 Audio Smart Amplifier
+//
+// Copyright (C) 2023 Texas Instruments Incorporated
+// https://www.ti.com
+//
+// The TAS2783 driver implements a flexible and configurable
+// algo coefficient setting for single TAS2783 chips.
+//
+// Author: Baojun Xu <baojun.xu(a)ti.com>
+// Author: Kevin Lu <kevin-lu(a)ti.com>
+//
+
+#include <linux/crc32.h>
+#include <linux/efi.h>
+#include <linux/err.h>
+#include <linux/firmware.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <sound/pcm_params.h>
+#include <linux/pm.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+#include <linux/soundwire/sdw.h>
+#include <linux/soundwire/sdw_registers.h>
+#include <linux/soundwire/sdw_type.h>
+#include <sound/sdw.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
+#include <sound/tas2781-tlv.h>
+
+#include "tas2783.h"
+
+static const unsigned int tas2783_cali_reg[] = {
+ TAS2783_CALIBRATION_RE,
+ TAS2783_CALIBRATION_RE_LOW,
+ TAS2783_CALIBRATION_INV_RE,
+ TAS2783_CALIBRATION_POW,
+ TAS2783_CALIBRATION_TLIMIT
+};
+
+static const struct reg_default tas2783_reg_defaults[] = {
+ /* Default values for ROM mode. Activated. */
+ { 0x8002, 0x1a}, /* AMP inactive. */
+ { 0x8097, 0xc8},
+ { 0x80b5, 0x74},
+ { 0x8099, 0x20},
+ { 0xfe8d, 0x0d},
+ { 0xfebe, 0x4a},
+ { 0x8230, 0x00},
+ { 0x8231, 0x00},
+ { 0x8232, 0x00},
+ { 0x8233, 0x01},
+ { 0x8418, 0x00}, /* Set volume to 0 dB. */
+ { 0x8419, 0x00},
+ { 0x841a, 0x00},
+ { 0x841b, 0x00},
+ { 0x8428, 0x40}, /* Unmute channel */
+ { 0x8429, 0x00},
+ { 0x842a, 0x00},
+ { 0x842b, 0x00},
+ { 0x8548, 0x00}, /* Set volume to 0 dB. */
+ { 0x8549, 0x00},
+ { 0x854a, 0x00},
+ { 0x854b, 0x00},
+ { 0x8558, 0x40}, /* Unmute channel */
+ { 0x8559, 0x00},
+ { 0x855a, 0x00},
+ { 0x855b, 0x00},
+ { 0x800a, 0x3a}, /* Enable both channel */
+ { 0x800e, 0x44},
+ { 0x800f, 0x40},
+ { 0x805c, 0x99},
+ { 0x40400088, 0}, /* FUNC_1, FU21, SEL_1(Mute) */
+ { 0x40400090, 0}, /* FUNC_1, FU21, SEL_2(Channel volume) */
+ { 0x40400108, 0}, /* FUNC_1, FU23, MUTE */
+};
+
+static bool tas2783_readable_register(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case 0x000 ... 0x080: /* Data port 0. */
+ case 0x100 ... 0x140: /* Data port 1. */
+ case 0x200 ... 0x240: /* Data port 2. */
+ case 0x300 ... 0x340: /* Data port 3. */
+ case 0x400 ... 0x440: /* Data port 4. */
+ case 0x500 ... 0x540: /* Data port 5. */
+ case 0x8000 ... 0xc000: /* Page 0 ~ 127. */
+ case 0xfe80 ... 0xfeff: /* Page 253. */
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, TAS2783_SDCA_ENT_UDMPU21,
+ TAS2783_SDCA_CTL_UDMPU_CLUSTER, 0):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, TAS2783_SDCA_ENT_FU21,
+ TAS2783_SDCA_CTL_FU_MUTE, TAS2783_DEVICE_CHANNEL_LEFT):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, TAS2783_SDCA_ENT_FU21,
+ TAS2783_SDCA_CTL_FU_MUTE, TAS2783_DEVICE_CHANNEL_RIGHT):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, TAS2783_SDCA_ENT_PDE23,
+ TAS2783_SDCA_CTL_REQ_POWER_STATE, 0):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, TAS2783_SDCA_ENT_PDE22,
+ TAS2783_SDCA_CTL_REQ_POWER_STATE, 0):
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool tas2783_volatile_register(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case 0x8001:
+ /* Only reset register was volatiled.
+ * Write any value into this register, mean RESET device.
+ */
+ return true;
+ default:
+ return false;
+ }
+}
+
+static const struct regmap_config tasdevice_regmap = {
+ .reg_bits = 32,
+ .val_bits = 8,
+ .readable_reg = tas2783_readable_register,
+ .volatile_reg = tas2783_volatile_register,
+ .max_register = 0x41008000 + TASDEVICE_REG(0xa1, 0x60, 0x7f),
+ .reg_defaults = tas2783_reg_defaults,
+ .num_reg_defaults = ARRAY_SIZE(tas2783_reg_defaults),
+ .cache_type = REGCACHE_RBTREE,
+ .use_single_read = true,
+ .use_single_write = true,
+};
+
+static int tasdevice_clamp(int val, int max, unsigned int invert)
+{
+ /* Keep in valid area, out of range value don't care. */
+ if (val > max)
+ val = max;
+ if (invert)
+ val = max - val;
+ if (val < 0)
+ val = 0;
+ return val;
+}
+
+static int tas2783_digital_getvol(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component
+ = snd_soc_kcontrol_component(kcontrol);
+ struct tasdevice_priv *tas_dev =
+ snd_soc_component_get_drvdata(component);
+ struct soc_mixer_control *mc =
+ (struct soc_mixer_control *)kcontrol->private_value;
+ struct regmap *map = tas_dev->regmap;
+ int val = 0, ret;
+
+ if (!map || !ucontrol) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ return -EINVAL;
+ }
+ /* Read current volume from the device. */
+ ret = regmap_read(map, mc->reg, &val);
+ if (ret) {
+ dev_err(tas_dev->dev, "%s, get digital vol error %x.\n",
+ __func__, ret);
+ return ret;
+ }
+ ucontrol->value.integer.value[0] =
+ tasdevice_clamp(val, mc->max, mc->invert);
+
+ return ret;
+}
+
+static int tas2783_digital_putvol(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component
+ = snd_soc_kcontrol_component(kcontrol);
+ struct tasdevice_priv *tas_dev =
+ snd_soc_component_get_drvdata(component);
+ struct soc_mixer_control *mc =
+ (struct soc_mixer_control *)kcontrol->private_value;
+ struct regmap *map = tas_dev->regmap;
+ int val, ret;
+
+ if (!map || !ucontrol) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ return -EINVAL;
+ }
+ val = tasdevice_clamp(ucontrol->value.integer.value[0],
+ mc->max, mc->invert);
+
+ ret = regmap_write(map, mc->reg, val);
+ if (ret != 0) {
+ dev_dbg(tas_dev->dev, "%s, Put vol %d into %x %x.\n",
+ __func__, val, mc->reg, ret);
+ }
+
+ return ret;
+}
+
+static int tas2783_amp_getvol(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component
+ = snd_soc_kcontrol_component(kcontrol);
+ struct tasdevice_priv *tas_dev =
+ snd_soc_component_get_drvdata(component);
+ struct soc_mixer_control *mc =
+ (struct soc_mixer_control *)kcontrol->private_value;
+ struct regmap *map = tas_dev->regmap;
+ unsigned char mask = 0;
+ int ret = 0, val = 0;
+
+ if (!map || !ucontrol) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ return -EINVAL;
+ }
+ /* Read current volume from the device. */
+ ret = regmap_read(map, mc->reg, &val);
+ if (ret != 0) {
+ dev_err(tas_dev->dev, "%s get AMP vol from %x with %d.\n",
+ __func__, mc->reg, ret);
+ return ret;
+ }
+
+ mask = (1 << fls(mc->max)) - 1;
+ mask <<= mc->shift;
+ val = (val & mask) >> mc->shift;
+ ucontrol->value.integer.value[0] = tasdevice_clamp(val, mc->max,
+ mc->invert);
+
+ return ret;
+}
+
+static int tas2783_amp_putvol(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component
+ = snd_soc_kcontrol_component(kcontrol);
+ struct tasdevice_priv *tas_dev =
+ snd_soc_component_get_drvdata(component);
+ struct soc_mixer_control *mc =
+ (struct soc_mixer_control *)kcontrol->private_value;
+ struct regmap *map = tas_dev->regmap;
+ unsigned char mask;
+ int val, ret;
+
+ if (!map || !ucontrol) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ return -EINVAL;
+ }
+ mask = (1 << fls(mc->max)) - 1;
+ mask <<= mc->shift;
+ val = tasdevice_clamp(ucontrol->value.integer.value[0], mc->max,
+ mc->invert);
+ ret = regmap_update_bits(map, mc->reg, mask, val << mc->shift);
+ if (ret != 0) {
+ dev_err(tas_dev->dev, "Write @%#x..%#x:%d\n",
+ mc->reg, val, ret);
+ }
+
+ return ret;
+}
+
+static const struct snd_kcontrol_new tas2783_snd_controls[] = {
+ SOC_SINGLE_RANGE_EXT_TLV("Amp Gain Volume", TAS2783_AMP_LEVEL,
+ 1, 0, 20, 0, tas2783_amp_getvol,
+ tas2783_amp_putvol, amp_vol_tlv),
+ SOC_SINGLE_RANGE_EXT_TLV("Digital Volume", TAS2783_DVC_LVL,
+ 0, 0, 200, 1, tas2783_digital_getvol,
+ tas2783_digital_putvol, dvc_tlv),
+};
+
+static void tas2783_apply_calib(
+ struct tasdevice_priv *tas_dev, unsigned int *cali_data)
+{
+ struct regmap *map = tas_dev->regmap;
+ u8 *reg_start;
+ int ret;
+
+ if (!map) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ return;
+ }
+ if (!tas_dev->sdw_peripheral) {
+ dev_err(tas_dev->dev, "%s, slaver doesn't exist.\n",
+ __func__);
+ return;
+ }
+ if ((tas_dev->sdw_peripheral->id.unique_id < TAS2783_ID_MIN) ||
+ (tas_dev->sdw_peripheral->id.unique_id > TAS2783_ID_MAX))
+ return;
+ reg_start = (u8 *)(cali_data+(tas_dev->sdw_peripheral->id.unique_id
+ - TAS2783_ID_MIN)*sizeof(tas2783_cali_reg));
+ for (int i = 0; i < ARRAY_SIZE(tas2783_cali_reg); i++) {
+ ret = regmap_bulk_write(map, tas2783_cali_reg[i],
+ reg_start + i, 4);
+ if (ret != 0) {
+ dev_err(tas_dev->dev, "Cali failed %x:%d\n",
+ tas2783_cali_reg[i], ret);
+ break;
+ }
+ }
+}
+
+static int tas2783_calibration(struct tasdevice_priv *tas_dev)
+{
+ efi_guid_t efi_guid = EFI_GUID(0x1f52d2a1, 0xbb3a, 0x457d, 0xbc,
+ 0x09, 0x43, 0xa3, 0xf4, 0x31, 0x0a, 0x92);
+ static efi_char16_t efi_name[] = L"CALI_DATA";
+ struct tm *tm = &tas_dev->tm;
+ unsigned int attr = 0, crc;
+ unsigned int *tmp_val;
+ efi_status_t status;
+
+ tas_dev->cali_data.total_sz = 128;
+ /* Sometimes, calibration was performed from Windows,
+ * and data was saved in UEFI.
+ * So we can share it from linux, and data size is variable.
+ * Get real size and read it from UEFI.
+ */
+ status = efi.get_variable(efi_name, &efi_guid, &attr,
+ &tas_dev->cali_data.total_sz, tas_dev->cali_data.data);
+ if (status == EFI_BUFFER_TOO_SMALL) {
+ status = efi.get_variable(efi_name, &efi_guid, &attr,
+ &tas_dev->cali_data.total_sz,
+ tas_dev->cali_data.data);
+ dev_dbg(tas_dev->dev, "cali get %lx bytes result:%ld\n",
+ tas_dev->cali_data.total_sz, status);
+ }
+ if (status != 0) {
+ /* Failed got calibration data from EFI. */
+ dev_dbg(tas_dev->dev, "No calibration data in UEFI.");
+ return 0;
+ }
+
+ tmp_val = (unsigned int *)tas_dev->cali_data.data;
+
+ crc = crc32(~0, tas_dev->cali_data.data, 84) ^ ~0;
+
+ if (crc == tmp_val[21]) {
+ /* Date and time of calibration was done. */
+ time64_to_tm(tmp_val[20], 0, tm);
+ dev_dbg(tas_dev->dev, "%4ld-%2d-%2d, %2d:%2d:%2d\n",
+ tm->tm_year, tm->tm_mon, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+ tas2783_apply_calib(tas_dev, tmp_val);
+ } else {
+ dev_dbg(tas_dev->dev, "CRC 0x%08x not match 0x%08x\n",
+ crc, tmp_val[21]);
+ tas_dev->cali_data.total_sz = 0;
+ }
+
+ return 0;
+}
+
+static void tasdevice_rca_ready(const struct firmware *fmw, void *context)
+{
+ struct tasdevice_priv *tas_dev =
+ (struct tasdevice_priv *) context;
+ struct tas2783_firmware_node *p;
+ struct regmap *map = tas_dev->regmap;
+ unsigned char *buf = NULL;
+ int offset = 0, img_sz;
+ int ret, value_sdw;
+
+ mutex_lock(&tas_dev->codec_lock);
+
+ if (!map) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ ret = -EINVAL;
+ goto out;
+ }
+ if (!fmw || !fmw->data) {
+ /* No firmware binary, devices will work in ROM mode. */
+ dev_err(tas_dev->dev,
+ "Failed to read %s, no side-effect on driver running\n",
+ tas_dev->rca_binaryname);
+ ret = -EINVAL;
+ goto out;
+ }
+ buf = (unsigned char *)fmw->data;
+
+ img_sz = le32_to_cpup((__le32 *)&buf[offset]);
+ offset += sizeof(img_sz);
+ if (img_sz != fmw->size) {
+ dev_err(tas_dev->dev, "Size not matching, %d %u",
+ (int)fmw->size, img_sz);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ while (offset < img_sz) {
+ p = (struct tas2783_firmware_node *)(buf + offset);
+ if (p->length > 1) {
+ ret = regmap_bulk_write(map, p->download_addr,
+ buf + offset + sizeof(unsigned int)*5, p->length);
+ } else {
+ ret = regmap_write(map, p->download_addr,
+ *(buf + offset + sizeof(unsigned int)*5));
+ }
+ if (ret != 0) {
+ dev_dbg(tas_dev->dev, "Load FW fail: %d.\n", ret);
+ goto out;
+ }
+ offset += sizeof(unsigned int)*5 + p->length;
+ }
+ /* Select left-right channel based on unique id. */
+ value_sdw = 0x1a;
+ value_sdw += ((tas_dev->sdw_peripheral->id.unique_id & 1) << 4);
+ regmap_write(map, TASDEVICE_REG(0, 0, 0x0a), value_sdw);
+
+ tas2783_calibration(tas_dev);
+
+out:
+ mutex_unlock(&tas_dev->codec_lock);
+ if (fmw)
+ release_firmware(fmw);
+}
+
+static const struct snd_soc_dapm_widget tasdevice_dapm_widgets[] = {
+ SND_SOC_DAPM_AIF_IN("ASI", "ASI Playback", 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("ASI OUT", "ASI Capture", 0, SND_SOC_NOPM,
+ 0, 0),
+ SND_SOC_DAPM_SPK("SPK", NULL),
+ SND_SOC_DAPM_OUTPUT("OUT"),
+ SND_SOC_DAPM_INPUT("DMIC")
+};
+
+static const struct snd_soc_dapm_route tasdevice_audio_map[] = {
+ {"SPK", NULL, "ASI"},
+ {"OUT", NULL, "SPK"},
+ {"ASI OUT", NULL, "DMIC"}
+};
+
+static int tasdevice_set_sdw_stream(struct snd_soc_dai *dai,
+ void *sdw_stream, int direction)
+{
+ struct sdw_stream_data *stream;
+
+ if (!sdw_stream)
+ return 0;
+
+ stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+ if (!stream)
+ return -ENOMEM;
+
+ stream->sdw_stream = sdw_stream;
+
+ snd_soc_dai_dma_data_set(dai, direction, stream);
+
+ return 0;
+}
+
+static void tasdevice_sdw_shutdown(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct sdw_stream_data *stream;
+
+ stream = snd_soc_dai_get_dma_data(dai, substream);
+ snd_soc_dai_set_dma_data(dai, substream, NULL);
+ kfree(stream);
+}
+
+static int tasdevice_sdw_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
+{
+ struct snd_soc_component *component = dai->component;
+ struct tasdevice_priv *tas_priv =
+ snd_soc_component_get_drvdata(component);
+ struct sdw_stream_config stream_config = {0};
+ struct sdw_port_config port_config = {0};
+ struct sdw_stream_data *stream;
+ int ret;
+
+ dev_dbg(dai->dev, "%s %s", __func__, dai->name);
+ stream = snd_soc_dai_get_dma_data(dai, substream);
+
+ if (!stream)
+ return -EINVAL;
+
+ if (!tas_priv->sdw_peripheral)
+ return -EINVAL;
+
+ /* SoundWire specific configuration */
+ snd_sdw_params_to_config(substream, params,
+ &stream_config, &port_config);
+
+ /* port 1 for playback */
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ port_config.num = 1;
+ else
+ port_config.num = 2;
+
+ ret = sdw_stream_add_slave(tas_priv->sdw_peripheral,
+ &stream_config, &port_config, 1, stream->sdw_stream);
+ if (ret) {
+ dev_err(dai->dev, "Unable to configure port\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static int tasdevice_sdw_pcm_hw_free(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct snd_soc_component *component = dai->component;
+ struct tasdevice_priv *tas_priv =
+ snd_soc_component_get_drvdata(component);
+ struct sdw_stream_data *stream =
+ snd_soc_dai_get_dma_data(dai, substream);
+
+ if (!tas_priv->sdw_peripheral)
+ return -EINVAL;
+
+ sdw_stream_remove_slave(tas_priv->sdw_peripheral,
+ stream->sdw_stream);
+
+ return 0;
+}
+
+static int tasdevice_mute(struct snd_soc_dai *dai, int mute,
+ int direction)
+{
+ struct snd_soc_component *component = dai->component;
+ struct tasdevice_priv *tas_dev =
+ snd_soc_component_get_drvdata(component);
+ struct regmap *map = tas_dev->regmap;
+ int ret;
+
+ if (!map) {
+ dev_err(tas_dev->dev, "%s, wrong regmap.\n", __func__);
+ return -EINVAL;
+ }
+
+ if (mute == 0) {/* Unmute. */
+ /* FU23 Unmute, 0x40400108. */
+ ret = regmap_write(map, SDW_SDCA_CTL(1, 2, 1, 0), 0);
+ ret += regmap_write(map, TASDEVICE_REG(0, 0, 0x02), 0x0);
+ } else {/* Mute */
+ /* FU23 mute */
+ ret = regmap_write(map, SDW_SDCA_CTL(1, 2, 1, 0), 1);
+ ret += regmap_write(map, TASDEVICE_REG(0, 0, 0x02), 0x1a);
+ }
+ if (ret) {
+ dev_err(tas_dev->dev, "Mute or unmute %d failed %d.\n",
+ mute, ret);
+ }
+
+ return ret;
+}
+
+static const struct snd_soc_dai_ops tasdevice_dai_ops = {
+ .mute_stream = tasdevice_mute,
+ .hw_params = tasdevice_sdw_hw_params,
+ .hw_free = tasdevice_sdw_pcm_hw_free,
+ .set_stream = tasdevice_set_sdw_stream,
+ .shutdown = tasdevice_sdw_shutdown,
+};
+
+static struct snd_soc_dai_driver tasdevice_dai_driver[] = {
+ {
+ .name = "tas2783-codec",
+ .id = 0,
+ .playback = {
+ .stream_name = "Playback",
+ .channels_min = 1,
+ .channels_max = 4,
+ .rates = TAS2783_DEVICE_RATES,
+ .formats = TAS2783_DEVICE_FORMATS,
+ },
+ .capture = {
+ .stream_name = "Capture",
+ .channels_min = 1,
+ .channels_max = 4,
+ .rates = TAS2783_DEVICE_RATES,
+ .formats = TAS2783_DEVICE_FORMATS,
+ },
+ .ops = &tasdevice_dai_ops,
+ .symmetric_rate = 1,
+ },
+};
+
+static void tas2783_reset(struct tasdevice_priv *tas_dev)
+{
+ struct regmap *map = tas_dev->regmap;
+ int ret;
+
+ if (!map) {
+ dev_err(tas_dev->dev, "Failed to load regmap.\n");
+ return;
+ }
+ ret = regmap_write(map, TAS2873_REG_SWRESET, 1);
+ if (ret) {
+ dev_err(tas_dev->dev, "Reset failed.\n");
+ return;
+ }
+ usleep_range(1000, 1050);
+}
+
+static int tasdevice_component_probe(struct snd_soc_component *component)
+{
+ struct tasdevice_priv *tas_dev =
+ snd_soc_component_get_drvdata(component);
+
+ /* Codec Lock Hold */
+ mutex_lock(&tas_dev->codec_lock);
+
+ tas_dev->component = component;
+
+ /* Codec Lock Release*/
+ mutex_unlock(&tas_dev->codec_lock);
+
+ dev_dbg(tas_dev->dev, "%s was called.\n", __func__);
+
+ return 0;
+}
+
+static const struct snd_soc_component_driver
+ soc_codec_driver_tasdevice = {
+ .probe = tasdevice_component_probe,
+ .controls = tas2783_snd_controls,
+ .num_controls = ARRAY_SIZE(tas2783_snd_controls),
+ .dapm_widgets = tasdevice_dapm_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(tasdevice_dapm_widgets),
+ .dapm_routes = tasdevice_audio_map,
+ .num_dapm_routes = ARRAY_SIZE(tasdevice_audio_map),
+ .idle_bias_on = 1,
+ .endianness = 1,
+};
+
+static int tasdevice_init(struct tasdevice_priv *tas_dev)
+{
+ int ret;
+
+ dev_set_drvdata(tas_dev->dev, tas_dev);
+
+ mutex_init(&tas_dev->codec_lock);
+ ret = devm_snd_soc_register_component(tas_dev->dev,
+ &soc_codec_driver_tasdevice,
+ tasdevice_dai_driver, ARRAY_SIZE(tasdevice_dai_driver));
+ if (ret) {
+ dev_err(tas_dev->dev, "%s: codec register error:%d.\n",
+ __func__, ret);
+ }
+
+ tas2783_reset(tas_dev);
+ /* tas2783-8[9,...,f].bin was copied into /lib/firmware/ */
+ scnprintf(tas_dev->rca_binaryname, 64, "tas2783-%01x.bin",
+ tas_dev->sdw_peripheral->id.unique_id);
+
+ ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
+ tas_dev->rca_binaryname, tas_dev->dev, GFP_KERNEL,
+ tas_dev, tasdevice_rca_ready);
+ if (ret) {
+ dev_dbg(tas_dev->dev,
+ "%s: request_firmware %x open status: %d.\n",
+ __func__, tas_dev->sdw_peripheral->id.unique_id, ret);
+ }
+
+ /* set autosuspend parameters */
+ pm_runtime_set_autosuspend_delay(tas_dev->dev, 3000);
+ pm_runtime_use_autosuspend(tas_dev->dev);
+
+ /* make sure the device does not suspend immediately */
+ pm_runtime_mark_last_busy(tas_dev->dev);
+
+ pm_runtime_enable(tas_dev->dev);
+
+ dev_dbg(tas_dev->dev, "%s was called for TAS2783.\n", __func__);
+
+ return ret;
+}
+
+static int tasdevice_read_prop(struct sdw_slave *slave)
+{
+ struct sdw_slave_prop *prop = &slave->prop;
+ int nval;
+ int i, j;
+ u32 bit;
+ unsigned long addr;
+ struct sdw_dpn_prop *dpn;
+
+ prop->scp_int1_mask =
+ SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
+ prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
+
+ prop->paging_support = true;
+
+ /* first we need to allocate memory for set bits in port lists */
+ prop->source_ports = 0x04; /* BITMAP: 00000100 */
+ prop->sink_ports = 0x2; /* BITMAP: 00000010 */
+
+ nval = hweight32(prop->source_ports);
+ prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval,
+ sizeof(*prop->src_dpn_prop), GFP_KERNEL);
+ if (!prop->src_dpn_prop)
+ return -ENOMEM;
+
+ i = 0;
+ dpn = prop->src_dpn_prop;
+ addr = prop->source_ports;
+ for_each_set_bit(bit, &addr, 32) {
+ dpn[i].num = bit;
+ dpn[i].type = SDW_DPN_FULL;
+ dpn[i].simple_ch_prep_sm = true;
+ dpn[i].ch_prep_timeout = 10;
+ i++;
+ }
+
+ /* do this again for sink now */
+ nval = hweight32(prop->sink_ports);
+ prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval,
+ sizeof(*prop->sink_dpn_prop), GFP_KERNEL);
+ if (!prop->sink_dpn_prop)
+ return -ENOMEM;
+
+ j = 0;
+ dpn = prop->sink_dpn_prop;
+ addr = prop->sink_ports;
+ for_each_set_bit(bit, &addr, 32) {
+ dpn[j].num = bit;
+ dpn[j].type = SDW_DPN_FULL;
+ dpn[j].simple_ch_prep_sm = true;
+ dpn[j].ch_prep_timeout = 10;
+ j++;
+ }
+
+ /* set the timeout values */
+ prop->clk_stop_timeout = 20;
+
+ return 0;
+}
+
+static int tasdevice_io_init(struct device *dev, struct sdw_slave *slave)
+{
+ struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
+
+ if (tas_priv->hw_init)
+ return 0;
+
+ /* Mark Slave initialization complete */
+ tas_priv->hw_init = true;
+
+ return 0;
+}
+
+static int tasdevice_update_status(struct sdw_slave *slave,
+ enum sdw_slave_status status)
+{
+ struct tasdevice_priv *tas_priv = dev_get_drvdata(&slave->dev);
+
+ /* Update the status */
+ tas_priv->status = status;
+
+ if (status == SDW_SLAVE_UNATTACHED)
+ tas_priv->hw_init = false;
+
+ /* Perform initialization only if slave status
+ * is present and hw_init flag is false
+ */
+ if (tas_priv->hw_init || tas_priv->status != SDW_SLAVE_ATTACHED)
+ return 0;
+
+ /* perform I/O transfers required for Slave initialization */
+ return tasdevice_io_init(&slave->dev, slave);
+}
+
+/*
+ * slave_ops: callbacks for get_clock_stop_mode, clock_stop and
+ * port_prep are not defined for now
+ */
+static const struct sdw_slave_ops tasdevice_sdw_ops = {
+ .read_prop = tasdevice_read_prop,
+ .update_status = tasdevice_update_status,
+};
+
+static void tasdevice_remove(struct tasdevice_priv *tas_dev)
+{
+ snd_soc_unregister_component(tas_dev->dev);
+
+ mutex_destroy(&tas_dev->codec_lock);
+}
+
+static int tasdevice_sdw_probe(struct sdw_slave *peripheral,
+ const struct sdw_device_id *id)
+{
+ struct device *dev = &peripheral->dev;
+ struct tasdevice_priv *tas_dev;
+ int ret;
+
+ tas_dev = devm_kzalloc(dev, sizeof(*tas_dev), GFP_KERNEL);
+ if (!tas_dev) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ tas_dev->dev = dev;
+ tas_dev->chip_id = id->driver_data;
+ tas_dev->sdw_peripheral = peripheral;
+ tas_dev->hw_init = false;
+
+ dev_set_drvdata(dev, tas_dev);
+
+ tas_dev->regmap = devm_regmap_init_sdw(peripheral,
+ &tasdevice_regmap);
+ if (IS_ERR(tas_dev->regmap)) {
+ ret = PTR_ERR(tas_dev->regmap);
+ dev_err(dev, "Failed devm_regmap_init: %d\n", ret);
+ goto out;
+ }
+ ret = tasdevice_init(tas_dev);
+
+out:
+ if (ret < 0 && tas_dev != NULL)
+ tasdevice_remove(tas_dev);
+
+ return ret;
+}
+
+static int tasdevice_sdw_remove(struct sdw_slave *peripheral)
+{
+ struct tasdevice_priv *tas_dev = dev_get_drvdata(&peripheral->dev);
+
+ if (tas_dev) {
+ pm_runtime_disable(tas_dev->dev);
+ tasdevice_remove(tas_dev);
+ }
+
+ return 0;
+}
+
+static const struct sdw_device_id tasdevice_sdw_id[] = {
+ SDW_SLAVE_ENTRY(0x0102, 0x0000, 0),
+ {},
+};
+MODULE_DEVICE_TABLE(sdw, tasdevice_sdw_id);
+
+static struct sdw_driver tasdevice_sdw_driver = {
+ .driver = {
+ .name = "slave-tas2783",
+ },
+ .probe = tasdevice_sdw_probe,
+ .remove = tasdevice_sdw_remove,
+ .ops = &tasdevice_sdw_ops,
+ .id_table = tasdevice_sdw_id,
+};
+
+module_sdw_driver(tasdevice_sdw_driver);
+
+MODULE_AUTHOR("Baojun Xu <baojun.xu(a)ti.com>");
+MODULE_DESCRIPTION("ASoC TAS2783 SoundWire Driver");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/tas2783.h b/sound/soc/codecs/tas2783.h
new file mode 100644
index 000000000000..1fe56f05b9d9
--- /dev/null
+++ b/sound/soc/codecs/tas2783.h
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
+ *
+ * Copyright (C) 2023 Texas Instruments Incorporated
+ * https://www.ti.com
+ *
+ * The TAS2783 driver implements a flexible and configurable
+ * algo coff setting for single TAS2783 chips.
+ *
+ * Author: Baojun Xu <baojun.xu(a)ti.com>
+ */
+
+#ifndef __TAS2783_H__
+#define __TAS2783_H__
+
+#define TAS2783_DEVICE_RATES (SNDRV_PCM_RATE_44100 | \
+ SNDRV_PCM_RATE_48000 | \
+ SNDRV_PCM_RATE_96000 | \
+ SNDRV_PCM_RATE_88200)
+
+#define TAS2783_DEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
+ SNDRV_PCM_FMTBIT_S24_LE | \
+ SNDRV_PCM_FMTBIT_S32_LE)
+
+/* BOOK, PAGE Control Register */
+#define TASDEVICE_REG(book, page, reg) ((book * 256 * 256) + 0x8000 +\
+ (page * 128) + reg)
+
+/*Software Reset */
+#define TAS2873_REG_SWRESET TASDEVICE_REG(0x0, 0X0, 0x01)
+
+/* Volume control */
+#define TAS2783_DVC_LVL TASDEVICE_REG(0x0, 0x00, 0x1A)
+#define TAS2783_AMP_LEVEL TASDEVICE_REG(0x0, 0x00, 0x03)
+#define TAS2783_AMP_LEVEL_MASK GENMASK(5, 1)
+
+/* Calibration data */
+#define TAS2783_CALIBRATION_RE TASDEVICE_REG(0x0, 0x17, 0x74)
+#define TAS2783_CALIBRATION_RE_LOW TASDEVICE_REG(0x0, 0x18, 0x14)
+#define TAS2783_CALIBRATION_INV_RE TASDEVICE_REG(0x0, 0x18, 0x0c)
+#define TAS2783_CALIBRATION_POW TASDEVICE_REG(0x0, 0x0d, 0x3c)
+#define TAS2783_CALIBRATION_TLIMIT TASDEVICE_REG(0x0, 0x18, 0x7c)
+
+#define TAS2783_ID_MIN 0x08 // Unique id start
+#define TAS2783_ID_MAX 0x0F // Unique id end
+
+/* TAS2783 SDCA Control - function number */
+#define FUNC_NUM_SMART_AMP 0x01
+
+/* TAS2783 SDCA entity */
+#define TAS2783_SDCA_ENT_PDE23 0x0C
+#define TAS2783_SDCA_ENT_PDE22 0x0B
+#define TAS2783_SDCA_ENT_FU21 0x01
+#define TAS2783_SDCA_ENT_UDMPU21 0x10
+
+/* TAS2783 SDCA control */
+#define TAS2783_SDCA_CTL_REQ_POWER_STATE 0x01
+#define TAS2783_SDCA_CTL_FU_MUTE 0x01
+#define TAS2783_SDCA_CTL_UDMPU_CLUSTER 0x10
+
+#define TAS2783_DEVICE_CHANNEL_LEFT 1
+#define TAS2783_DEVICE_CHANNEL_RIGHT 2
+
+#define TAS2783_MAX_CALIDATA_SIZE 252
+
+struct tas2783_firmware_node {
+ unsigned int vendor_id;
+ unsigned int file_id;
+ unsigned int version_id;
+ unsigned int length;
+ unsigned int download_addr;
+};
+
+struct calibration_data {
+ unsigned long total_sz;
+ unsigned char data[TAS2783_MAX_CALIDATA_SIZE];
+};
+
+struct tasdevice_priv {
+ struct snd_soc_component *component;
+ struct calibration_data cali_data;
+ struct sdw_slave *sdw_peripheral;
+ enum sdw_slave_status status;
+ struct sdw_bus_params params;
+ struct mutex codec_lock;
+ struct regmap *regmap;
+ struct device *dev;
+ struct tm tm;
+ unsigned char rca_binaryname[64];
+ unsigned char dev_name[32];
+ unsigned int chip_id;
+ bool hw_init;
+};
+
+struct sdw_stream_data {
+ struct sdw_stream_runtime *sdw_stream;
+};
+
+#endif /*__TAS2783_H__ */
--
2.34.1
1
0
[PATCH v2] ALSA: hda: intel-dsp-cfg: Use AVS driver on SKL/KBL/APL Chromebooks
by Brady Norander 31 Oct '23
by Brady Norander 31 Oct '23
31 Oct '23
The legacy SKL driver no longer works properly on these Chromebook
platforms. Use the new AVS driver by default instead.
Signed-off-by: Brady Norander <bradynorander(a)gmail.com>
---
v2: Only use quirk if AVS is enabled
sound/hda/intel-dsp-config.c | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
index 756fa0aa69bb..e056aca01900 100644
--- a/sound/hda/intel-dsp-config.c
+++ b/sound/hda/intel-dsp-config.c
@@ -16,10 +16,11 @@
static int dsp_driver;
module_param(dsp_driver, int, 0444);
-MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP
(0=auto, 1=legacy, 2=SST, 3=SOF)");
+MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP
(0=auto, 1=legacy, 2=SST, 3=SOF, 4=AVS)");
#define FLAG_SST BIT(0)
#define FLAG_SOF BIT(1)
+#define FLAG_AVS BIT(2)
#define FLAG_SST_ONLY_IF_DMIC BIT(15)
#define FLAG_SOF_ONLY_IF_DMIC BIT(16)
#define FLAG_SOF_ONLY_IF_SOUNDWIRE BIT(17)
@@ -56,7 +57,7 @@ static const struct config_entry config_table[] = {
/*
* Apollolake (Broxton-P)
* the legacy HDAudio driver is used except on Up Squared (SOF) and
- * Chromebooks (SST), as well as devices based on the ES8336 codec
+ * Chromebooks (AVS), as well as devices based on the ES8336 codec
*/
#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
{
@@ -79,9 +80,9 @@ static const struct config_entry config_table[] = {
.codec_hid = &essx_83x6,
},
#endif
-#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
+#if IS_ENABLED(CONFIG_SND_SOC_INTEL_AVS)
{
- .flags = FLAG_SST,
+ .flags = FLAG_AVS,
.device = PCI_DEVICE_ID_INTEL_HDA_APL,
.dmi_table = (const struct dmi_system_id []) {
{
@@ -96,13 +97,13 @@ static const struct config_entry config_table[] = {
#endif
/*
* Skylake and Kabylake use legacy HDAudio driver except for Google
- * Chromebooks (SST)
+ * Chromebooks (AVS)
*/
/* Sunrise Point-LP */
-#if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKL)
+#if IS_ENABLED(CONFIG_SND_SOC_INTEL_AVS)
{
- .flags = FLAG_SST,
+ .flags = FLAG_AVS,
.device = PCI_DEVICE_ID_INTEL_HDA_SKL_LP,
.dmi_table = (const struct dmi_system_id []) {
{
@@ -114,15 +115,17 @@ static const struct config_entry config_table[] = {
{}
}
},
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKL)
{
.flags = FLAG_SST | FLAG_SST_ONLY_IF_DMIC,
.device = PCI_DEVICE_ID_INTEL_HDA_SKL_LP,
},
#endif
/* Kabylake-LP */
-#if IS_ENABLED(CONFIG_SND_SOC_INTEL_KBL)
+#if IS_ENABLED(CONFIG_SND_SOC_INTEL_AVS)
{
- .flags = FLAG_SST,
+ .flags = FLAG_AVS,
.device = PCI_DEVICE_ID_INTEL_HDA_KBL_LP,
.dmi_table = (const struct dmi_system_id []) {
{
@@ -134,6 +137,8 @@ static const struct config_entry config_table[] = {
{}
}
},
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_INTEL_KBL)
{
.flags = FLAG_SST | FLAG_SST_ONLY_IF_DMIC,
.device = PCI_DEVICE_ID_INTEL_HDA_KBL_LP,
@@ -667,6 +672,9 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
}
}
+ if (cfg->flags & FLAG_AVS)
+ return SND_INTEL_DSP_DRIVER_AVS;
+
return SND_INTEL_DSP_DRIVER_LEGACY;
}
EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
--
2.42.0
1
0
31 Oct '23
From: ChiYuan Huang <cy_huang(a)richtek.com>
This patch series fix several issues that comes from the real
application.
ChiYuan Huang (3):
ASoC: codecs: rtq9128: Fix string compare in DAPM event callback
ASoC: codecs: rtq9128: Fix TDM enable and DAI format control flow
ASoC: codecs: rtq9128: Fix TKA470B E1 version amp on sequence
sound/soc/codecs/rtq9128.c | 130 ++++++++++++++++++++++++++-----------
1 file changed, 93 insertions(+), 37 deletions(-)
base-commit: ca34c962d70ab42fb578a36103ba7b8bb01f1f9b
--
2.34.1
2
4
The following changes since commit 05d3ef8bba77c1b5f98d941d8b2d4aeab8118ef1:
Linux 6.6-rc7 (2023-10-22 12:11:21 -1000)
are available in the Git repository at:
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git tags/asoc-v6.7-2
for you to fetch changes up to bdb7e1922052b1e7fcce63e2cfa195958ff97e05:
ASoC: Merge up workaround for CODECs that play noise on stopped stream (2023-10-27 22:33:15 +0100)
----------------------------------------------------------------
ASoC: Updates for v6.7
More updates for v6,7 following the early merge request:
- Fixes for handling of component name prefixing when name prefixes
are used by the machine driver.
- Fixes for noise when stopping some Sounwire CODECs.
- Support for AMD ACP 6.3 and 7.0, Awinc AW88399, more Intel
platforms and more Qualcomm SC7180 platforms.
----------------------------------------------------------------
Amadeusz Sławiński (22):
ASoC: doc: Update codec to codec examples
ASoC: Intel: avs: Use generic size defines
ASoC: Intel: avs: Preallocate memory for module configuration
ASoC: Intel: avs: Remove unused variable
ASoC: Intel: avs: Only create SSP%d snd_soc_dai_driver when requested
ASoC: Intel: avs: Introduce helper functions for SSP and TDM handling
ASoC: Intel: avs: Improve topology parsing of dynamic strings
ASoC: Intel: avs: i2s_test: Validate machine board configuration
ASoC: Intel: avs: rt274: Validate machine board configuration
ASoC: Intel: avs: rt5682: Validate machine board configuration
ASoC: Intel: avs: max98357a: Validate machine board configuration
ASoC: Intel: avs: rt298: Validate machine board configuration
ASoC: Intel: avs: da7219: Validate machine board configuration
ASoC: Intel: avs: es8336: Validate machine board configuration
ASoC: Intel: avs: max98373: Validate machine board configuration
ASoC: Intel: avs: max98927: Validate machine board configuration
ASoC: Intel: avs: nau8825: Validate machine board configuration
ASoC: Intel: avs: rt286: Validate machine board configuration
ASoC: Intel: avs: rt5663: Validate machine board configuration
ASoC: Intel: avs: ssm4567: Validate machine board configuration
ASoC: Intel: avs: Add rt5514 machine board
ASoC: Intel: avs: Add rt5514 machine board
Andy Shevchenko (1):
ASoC: soc.h: replace custom COUNT_ARGS() & CONCATENATE() implementations
Arnd Bergmann (3):
ASoC: amd: acp: add ACPI dependency
ASoC: codecs: aw88399: fix typo in Kconfig select
ASoC: amd: acp: select SND_SOC_AMD_ACP_LEGACY_COMMON for ACP63
Arun T (2):
ASoC: Intel: common: add ACPI matching tables for Arrow Lake
ASoC: SOF: Intel: pci-mtl: use ARL specific firmware definitions
Balamurugan C (2):
ASoC: Intel: sof_rt5682: add HDMI_In capture feature support for RPL.
ASoC: Intel: MTL: Add entry for HDMI-In capture support to non-I2S codec boards.
Bard Liao (11):
ASoC: SOF: ipc4-topology: export sof_ipc4_copier_is_single_format
ASoC: SOF: ipc4-pcm: fixup dailink based on copier format
ASoC: intel: sof_sdw: Add CS42L43 CODEC support
ASoC: hdac_hda: add HDA patch loader support
ASoC: hdac_hda: fix HDA patch loader support
ASoC: Intel: soc-acpi-intel-rpl-match: add rt711-l0-rt1316-l12 support
ASoC: Intel: soc-acpi-intel-mtl-match: add rt713 rt1316 config
ASoC: Intel: sof_sdw_rt_sdca_jack_common: add rt713 support
ASoC: Intel: sof_sdw_rt712_sdca: construct cards->components by name_prefix
ASoC: rt715-sdca: reorder the argument in error log
ASoC: rt715: reorder the argument in error log
Biju Das (11):
ASoC: codec: tlv320aic32x4: Add enum aic32x4_type to aic32x4_probe()
ASoC: tlv320aic32x4-i2c: Simplify probe()
ASoC: tlv320aic32x4-spi: Simplify probe()
ASoC: wm8580: Simplify probe()
ASoC: wm8580: Remove trailing comma in the terminator entry
ASoC: wm8580: Move OF table
ASoC: ak4642: Minor cleanups in probe()
ASoC: ak4642: Simplify probe()
ASoC: wm8580: Simplify probe()
ASoC: cs42xx8-i2c: Simplify probe()
ASoC: tas571x: Simplify probe()
Bragatheswaran Manickavel (2):
ASoC: dt-bindings: tfa9879: Convert to dtschema
ASoC: dt-bindings: rt5616: Convert to dtschema
Brent Lu (38):
ASoC: Intel: sof_rt5682: cleanup unnecessary quirk flag
ASoC: Intel: ssp-common: support codec detection
ASoC: Intel: use ACPI HID definition in ssp-common
ASoC: Intel: sof_rt5682: use ssp-common module to detect codec
ASoC: Intel: sof_cs42l42: use ssp-common module to detect codec
ASoC: Intel: sof_ssp_amp: use ssp-common module to detect codec
ASoC: Intel: sof_nau8825: use ssp-common module to detect codec
ASoC: Intel: sof_rt5682: add adl_rt5650 board config
ASoC: Intel: sof_ssp_amp: do not create amp link for nocodec board
ASoC: Intel: nuvoton-common: support nau8318 amplifier
ASoC: Intel: sof_nau8825: use nuvoton-common module
ASoC: Intel: sof_nau8825: use realtek-common module
ASoC: Intel: sof_da7219: rename driver file and kernel option
ASoC: Intel: sof_da7219: use maxim-common module
ASoC: Intel: sof_da7219: add adl_mx98360_da7219 board config
ASoC: Intel: sof_da7219: use ssp-common module to detect codec
ASoC: Intel: sof_cs42l42: remove hdac-hdmi support
ASoC: Intel: sof_da7219: remove hdac-hdmi support
ASoC: Intel: sof_nau8825: remove hdac-hdmi support
ASoC: Intel: sof_rt5682: remove hdac-hdmi support
ASoC: Intel: sof_ssp_amp: remove hdac-hdmi support
ASoC: Intel: sof_hdmi: add common header for HDMI
ASoC: Intel: sof_cs42l42: use sof_hdmi_private to init HDMI
ASoC: Intel: sof_da7219: use sof_hdmi_private to init HDMI
ASoC: Intel: sof_nau8825: use sof_hdmi_private to init HDMI
ASoC: Intel: sof_rt5682: use sof_hdmi_private to init HDMI
ASoC: Intel: sof_sdw: use sof_hdmi_private to init HDMI
ASoC: Intel: sof_ssp_amp: use sof_hdmi_private to init HDMI
ASoC: Intel: board_helpers: new module for common functions
ASoC: Intel: sof_cs42l42: use common module for HDMI link
ASoC: Intel: sof_nau8825: use common module for HDMI link
ASoC: Intel: sof_rt5682: use common module for HDMI link
ASoC: Intel: sof_ssp_amp: use common module for HDMI link
ASoC: Intel: board_helpers: support dmic link initialization
ASoC: Intel: sof_cs42l42: use common module for DMIC links
ASoC: Intel: sof_nau8825: use common module for DMIC links
ASoC: Intel: sof_rt5682: use common module for DMIC links
ASoC: Intel: sof_ssp_amp: use common module for DMIC links
Cezary Rojewski (4):
ASoC: Intel: avs: Move IPC error messages one level down
ASoC: Intel: avs: Keep module refcount up when gathering traces
ASoC: Intel: avs: Drop superfluous stream decoupling
ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails
Chancel Liu (1):
ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes inactive
Chao Song (1):
ASoC: Intel: soc-acpi-intel-mtl-match: add acpi match table for cdb35l56-eight-c
Charles Keepax (13):
ASoC: intel: sof_sdw: Move sdw_pin_index into private struct
ASoC: intel: sof_sdw: Add simple DAI link creation helper
ASoC: intel: sof_sdw: Make create_sdw_dailink allocate link components
ASoC: intel: sof_sdw: Increment be_id in init_dai_link
ASoC: cs42l43: Lower default type detect time
ASoC: cs42l43: Enable bias sense by default
ASoC: cs42l43: Move headset bias sense enable earlier in process
ASoC: cs42l43: Extend timeout on bias sense timeout
ASoC: dt-bindings: ASoC: cirrus,cs42l43: Update a couple of default values
ASoC: intel: sof_sdw: Stop processing CODECs when enough are found
ASoC: intel: sof_sdw_cs42l43: Some trivial formatting clean ups
ASoC: intel: sof_sdw_cs42l43: Create separate jacks for hp and mic
ASoC: intel: sof_sdw: Move the builtin microphones to dataport 1
ChiYuan Huang (4):
ASoC: dt-bindings: Add Richtek rtq9128 audio amplifier
ASoC: codecs: Add Richtek rtq9128 audio amplifier support
ASoC: dt-bindings: rtq9128: Add TDM input source slect property
ASoC: codecs: rtq9128: Add TDM input source select
Chris Morgan (1):
ASoC: es8328: Use rounded rate for es8328_set_sysclk()
Christophe JAILLET (1):
ASoC: audio-iio-aux: Use flex array to simplify code
Colin Ian King (4):
ASoC: cs42l43: make const array controls static
ASoC: tas2781: make const read-only array magic_number static
ASoC: codecs: rt298: remove redundant assignment to d_len_code
ASoC: mediatek: mt8186: remove redundant assignments to variable tdm_con
Cristian Ciocaltea (11):
ASoC: cs35l41: Handle mdsync_down reg write errors
ASoC: cs35l41: Handle mdsync_up reg write errors
ASoC: cs35l41: Initialize completion object before requesting IRQ
ASoC: cs35l41: Fix broken shared boost activation
ASoC: cs35l41: Verify PM runtime resume errors in IRQ handler
ASoC: cs35l41: Undo runtime PM changes at driver exit time
ASoC: cs35l41: Make use of dev_err_probe()
ASoC: cs35l41: Use modern pm_ops
ALSA: hda: cs35l41: Fix unbalanced pm_runtime_get()
ALSA: hda: cs35l41: Undo runtime PM changes at driver exit time
ALSA: hda: cs35l41: Consistently use dev_err_probe()
David Rau (1):
ASoC: da7213: Add new kcontrol for tonegen
Geert Uytterhoeven (1):
ASoC: sh: dma-sh7760: Use %pad and %zu to format dma_addr_t and size_t
Gustavo A. R. Silva (2):
ASoC: SOF: ipc4-topology: Use size_add() in call to struct_size()
ASoC: sigmadsp: Add __counted_by for struct sigmadsp_data and use struct_size()
Hal Feng (2):
ASoC: dt-bindings: Add StarFive JH7110 PWM-DAC controller
ASoC: starfive: Add JH7110 PWM-DAC driver
Hans de Goede (6):
ASoC: Intel: soc-acpi-cht: Add Lenovo Yoga Tab 3 Pro YT3-X90 quirk
ASoC: Intel: bytcr_wm5102: Add support for Lenovo Yoga Tab 3 Pro YT3-X90
ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_SSP2 quirk
ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_MCLK_19_2MHZ quirk
ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_OUT_MAP quirk
ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_IN_MAP quirk
Hui Wang (1):
ASoC: fsl-asoc-card: Add comment for mclk in the codec_priv
Janusz Krzysztofik (1):
ASoC: ti: ams-delta: Allow it to be test compiled
Jerome Brunet (1):
ASoC: meson: axg: extend TDM maximum sample rate to 384kHz
Jiapeng Chong (1):
ASoC: cs42l43: Remove useless else
Joerg Schambacher (2):
ASoC: Adds support for TAS575x to the pcm512x driver
ASoC: pcm512x: Adds bindings for TAS575x devices
John Watts (3):
ASoC: wm8782: Constrain maximum audio rate at runtime
ASoC: wm8782: Use wlf,fsampen device tree property
ASoC: dt-bindings: wlf,wm8782: Add wlf,fsampen property
Kees Cook (4):
ASoC: soc-dapm: Annotate struct snd_soc_dapm_widget_list with __counted_by
MAINTAINERS: Include additional ASoC paths
MAINTAINERS: Include sof headers under ASoC
ASoC: apple: mca: Annotate struct mca_data with __counted_by
Konrad Dybcio (2):
ASoC: dt-bindings: qcom,lpass-tx-macro: Add SM6115
ASoC: codecs: lpass-tx-macro: Add SM6115 support
Krzysztof Kozlowski (22):
ASoC: qcom: explicitly include binding headers when used
ASoC: qcom: reduce number of binding headers includes
ASoC: codecs: wsa-macro: fix uninitialized stack variables with name prefix
ASoC: qcom: q6apm-lpass-dais: pass max number of channels to Audioreach
ASoC: codecs: wcd938x: use defines for entries in snd_soc_dai_driver array
ASoC: codecs: 88pm860x: Handle component name prefix
ASoC: codecs: adau1373: Handle component name prefix
ASoC: codecs: adav80x: Handle component name prefix
ASoC: codecs: lpass-rx-macro: Handle component name prefix
ASoC: codecs: max9867: Handle component name prefix
ASoC: codecs: rt5682s: Handle component name prefix
ASoC: codecs: rtq9128: Handle component name prefix
ASoC: codecs: wcd9335: Handle component name prefix
ASoC: codecs: wm8962: Handle component name prefix
ASoC: codecs: wm8994: Handle component name prefix
ASoC: codecs: wm8995: Handle component name prefix
ASoC: mediatek: mt8183: Handle component name prefix
ASoC: mediatek: mt8186: Handle component name prefix
ASoC: mediatek: mt8188: Handle component name prefix
ASoC: mediatek: mt8192: Handle component name prefix
ASoC: samsung: speyside: Handle component name prefix
ASoC: tegra: machine: Handle component name prefix
Kuninori Morimoto (62):
ASoC: rsnd: remove unneeded of_node_put()
ASoC: da7213: tidyup SND_SOC_DAIFMT_xxx
ASoC: da7213: add .auto_selectable_formats support
ASoC: soc.h: convert asoc_xxx() to snd_soc_xxx()
ASoC: simple_card_utils.h: convert not to use asoc_xxx()
ASoC: sh: convert not to use asoc_xxx()
ASoC: ti: convert not to use asoc_xxx()
ASoC: arm: convert not to use asoc_xxx()
ASoC: amd: convert not to use asoc_xxx()
ASoC: bcm: convert not to use asoc_xxx()
ASoC: dwc: convert not to use asoc_xxx()
ASoC: fsl: convert not to use asoc_xxx()
ASoC: img: convert not to use asoc_xxx()
ASoC: mxs: convert not to use asoc_xxx()
ASoC: pxa: convert not to use asoc_xxx()
ASoC: stm: convert not to use asoc_xxx()
ASoC: au1x: convert not to use asoc_xxx()
ASoC: qcom: convert not to use asoc_xxx()
ASoC: sprd: convert not to use asoc_xxx()
ASoC: apple: convert not to use asoc_xxx()
ASoC: atmel: convert not to use asoc_xxx()
ASoC: meson: convert not to use asoc_xxx()
ASoC: sunxi: convert not to use asoc_xxx()
ASoC: tegra: convert not to use asoc_xxx()
ASoC: ux500: convert not to use asoc_xxx()
ASoC: google: convert not to use asoc_xxx()
ASoC: cirrus: convert not to use asoc_xxx()
ASoC: generic: convert not to use asoc_xxx()
ASoC: samsung: convert not to use asoc_xxx()
ASoC: extensa: convert not to use asoc_xxx()
ASoC: kirkwood: convert not to use asoc_xxx()
ASoC: loongson: convert not to use asoc_xxx()
ASoC: rockchip: convert not to use asoc_xxx()
ASoC: starfive: convert not to use asoc_xxx()
ASoC: uniphier: convert not to use asoc_xxx()
ASoC: soundwire: convert not to use asoc_xxx()
ASoC: intel: avs: convert not to use asoc_xxx()
ASoC: codec: wm: convert not to use asoc_xxx()
ASoC: codec: rt5677: convert not to use asoc_xxx()
ASoC: codec: cs47lxx: convert not to use asoc_xxx()
ASoC: sof: amd: convert not to use asoc_xxx()
ASoC: sof: intel: convert not to use asoc_xxx()
ASoC: sof: mediatek: convert not to use asoc_xxx()
ASoC: soc-dai: convert not to use asoc_xxx()
ASoC: soc-pcm: convert not to use asoc_xxx()
ASoC: soc-core: convert not to use asoc_xxx()
ASoC: soc-dapm: convert not to use asoc_xxx()
ASoC: soc-link: convert not to use asoc_xxx()
ASoC: soc-utils: convert not to use asoc_xxx()
ASoC: soc-topology: convert not to use asoc_xxx()
ASoC: soc-compress: convert not to use asoc_xxx()
ASoC: soc-component: convert not to use asoc_xxx()
ASoC: soc-generic-dmaengine-pcm: convert not to use asoc_xxx()
ASoC: amd: convert not to use asoc_xxx()
ASoC: mediatek: convert not to use asoc_xxx()
ASoC: starfive: convert not to use asoc_xxx()
ASoC: intel: convert not to use asoc_xxx()
ASoC: sof: convert not to use asoc_xxx()
ASoC: remove asoc_xxx() compatible macro
sh: boards: Fix Sound Simple-Card struct name
ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described
ASoC: ams-delta.c: use component after check
Linus Walleij (31):
ASoC: max9768: Convert to use GPIO descriptors
ASoC: max98357a: Drop pointless include
ASoC: max98373: Convert to use GPIO descriptors
ASoC: max98388: Correct the includes
ASoC: max98396: Drop pointless include
ASoC: max98520: Drop pointless includes
ASoC: max98927: Drop pointless includes
ASoC: max9768: Convert to use GPIO descriptors
ASoC: max98357a: Drop pointless include
ASoC: max98373: Convert to use GPIO descriptors
ASoC: max98388: Correct the includes
ASoC: max98396: Drop pointless include
ASoC: max98520: Drop pointless includes
ASoC: max98927: Drop pointless includes
ASoC: ti: Convert RX51 to use exclusively GPIO descriptors
ASoC: ti: Convert N810 ASoC to GPIO descriptors
ASoC: ti: Convert TWL4030 to use GPIO descriptors
ASoC: ti: Convert Pandora ASoC to GPIO descriptors
ASoC: ti: osk5912: Drop unused include
ASoC: rockchip: Convert RK3288 HDMI to GPIO descriptors
ASoC: rockchip: Drop includes from RK3399
ASoC: rockchip: Drop includes from Rockchip MAX98090
ASoC: rockchip: Drop includes from Rockchip RT5645
gpiolib: of: Add quirk for mt2701-cs42448 ASoC sound
ASoC: mediatek: mt2701-cs42448: Convert to GPIO descriptors
ASoC: mt8173-max98090: Drop unused include
ASoC: mt8173-rt5650-rt5514: Drop unused includes
ASoC: mt8173-rt5650-rt5676: Drop unused includes
ASoC: mt8173-rt5650: Drop unused includes
ASoC: mt8186-mt6366-rt1019-rt5682s: Drop unused include
ASoC: mt8192-afe-gpio: Drop unused include
Luca Weiss (2):
ASoC: dt-bindings: awinic,aw88395: Remove reset-gpios from AW88261
ASoC: codecs: aw88261: Remove non-existing reset gpio
Marco Felsch (1):
ASoC: tlv320aic31xx: switch to gpiod_set_value_cansleep
Marian Postevca (6):
ASoC: es8316: Enable support for S32 LE format
ASoC: es8316: Replace NR_SUPPORTED_MCLK_LRCK_RATIOS with ARRAY_SIZE()
ASoC: es8316: Enable support for MCLK div by 2
ASoC: amd: acp: Add support for splitting the codec specific code from the ACP driver
ASoC: amd: acp: Add machine driver that enables sound for systems with a ES8336 codec
ASoC: amd: acp: Fix -Wmissing-prototypes warning
Mark Brown (53):
Add PWM-DAC audio support for StarFive JH7110
Improve CS35l41-based audio codec drivers
ASoC: amd: acp: Add sound support for a line of
Match data improvements for ak4642 driver
ASoC: mt8188-mt6359: add SOF support
ASoC: Convert some Maxim codecs to use GPIO
Match data improvements for tlv320aic32x4 driver
ASoC: Convert some Maxim codecs to use GPIO
Match data improvements for wm8580 driver
ASoC: Update jh7110 PWM DAC for ops move
SM6115 TX Macro
ASoC: Merge up fixes
ASoC: cs35l56: Use PCI SSID to select specific
ASoC: Intel: machine driver update
ASoC: cs35l56: Define and export I2C/SPI pm_ops only
ASoC: SOF: ipc4/Intel: Implement split fw library
ASoC: intel: sof_sdw: Remove large global CPUs array
ASoC: SOF: ipc4: Fixup dailink format based on copier
ASoC: da7213: add .auto_selectable_formats support
ASoC: SOF: Use generic IPC type identifiers
ASoC: intel: Add CS42L43 sdw machine driver support
ASoC: SOF: ipc4-control: Support for Switch and Enum
ASoC: SOF: ipc4/Intel: Support for firmware exception
Minor default jack pop performance updates
ASoC: Add rtq9128 audio amplifier
ASoC: convert asoc_xxx() to snd_soc_xxx()
ASoC: Merge up fixes
ASoC: codecs: rtq9128: Add TDM input source select
ASoC: codecs: Add aw87390 amplifier driver
GPIO descriptors for TI ASoC codecs
Remove reset GPIO for AW88261
ASoC: cs35l56: Update hibernate/wake sequences and
ASoC: SOF: ipc4: Take priority into cosideration when
Convert Rockchip ASoC drivers to GPIO descriptors
Convert Mediatek ASoC codecs to use GPIO descriptors
ASoC: DT matching and header cleanups
ASoC: Merge fixes for consistent cs42l43 schema
ASoC: mediatek: mt8188-mt6359: add rt5682s support
Harden SSP boards and add TDM support
ASoC: Intel: boards: updates for 6.7
ASoC: codecs: rt715*: update misleading error log
ASoC: SOF: misc updates for 6.7
ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: add
ASoC: Intel: more machine driver updates for 6.7
ASoc: Another series to convert to struct
ASoC: Merge up v6.6-rc7
ASoC: mediatek: Remove redundant code and add
ASoC: codecs: Add aw88399 amplifier driver
ASoC: fix widget name comparisons (consider DAI name
sc7180: Add qdsp based soundcard
ASoC: Intel: bytcr_wm5102: add various quirks
ASoC: Intel: avs: Add support for rt5514 codec
ASoC: Merge up workaround for CODECs that play noise on stopped stream
Mark Hasemeyer (1):
ASoC: SOF: sof-pci-dev: Fix community key quirk detection
Maso Huang (3):
ASoC: mediatek: mt7986: drop the remove callback of mt7986_wm8960
ASoC: mediatek: mt7986: remove the mt7986_wm8960_priv structure
ASoC: mediatek: mt7986: add sample rate checker
Nathan Chancellor (1):
ASoC: tegra: Fix -Wuninitialized in tegra210_amx_platform_probe()
Nikita Travkin (2):
ASoC: dt-bindings: qcom,sm8250: Add sc7180-qdsp6-sndcard
ASoC: qcom: sc7180: Add support for qdsp6 baked sound
Peter Ujfalusi (21):
ASoC: hdac_hdmi: Remove temporary string use in create_fill_jack_kcontrols
ASoC: SOF: ops.h: Change the error code for not supported to EOPNOTSUPP
ASoC: SOF: ipc4: Dump the payload also when set_get_data fails
ASoC: SOF: ipc4: Convert status code 2 and 15 to -EOPNOTSUPP
ASoC: SOF: Intel: hda: Add definition for SDxFIFOS.FIFOS mask
ASoC: SOF: ipc4: Add new message type: SOF_IPC4_GLB_LOAD_LIBRARY_PREPARE
ASoC: SOF: Intel: hda-loader: Add support for split library loading
ASoC: SOF: ipc4-topology: Add definition for generic switch/enum control
ASoC: SOF: ipc4-control: Add support for ALSA switch control
ASoC: SOF: ipc4-control: Add support for ALSA enum control
ASoC: SOF: Introduce generic names for IPC types
ASoC: SOF: sof-pci-dev: Update the ipc_type module parameter description
ASoC: SOF: Kconfig: Rename SND_SOC_SOF_INTEL_IPC4 to SND_SOC_SOF_IPC4
ASoC: SOF: Use generic names for IPC types
ASoC: SOF: amd: Use generic names for IPC types
ASoC: SOF: imx: Use generic names for IPC types
ASoC: SOF: Intel: Use generic names for IPC types
ASoC: SOF: mediatek: Use generic names for IPC types
ASoC: SOF: Drop unused IPC type defines
ASoC: SOF: Intel: hda-dsp: Make sure that no irq handler is pending before suspend
ASoC: SOF: ipc4: Dump the notification payload
Pierre-Louis Bossart (3):
ASoC: SOF: sof-client: fix build when only IPC4 is selected
ASoC: Intel: sof_sdw: update HP Omen match
ASoC: SOF: make .remove callback return void
Rander Wang (11):
ASoC: SOF: Xtensa: dump ar registers to restore call stack
ASoC: SOF: ipc4-mtrace: move debug slot related definitions to header.h
ASoC: SOF: ipc4: add a helper function to search debug slot
ASoC: SOF: ipc4: add definition of telemetry slot for exception handling
ASoC: SOF: ipc4: add exception node in sof debugfs directory
ASoC: SOF: Intel: add telemetry retrieval support on Intel platforms
ASoC: SOF: Intel: mtl: dump dsp stack
ASoC: SOF: Intel: hda: add ipc4 FW panic support on CAVS 2.5+ platforms
ASoC: SOF: ipc4: handle EXCEPTION_CAUGHT notification from firmware
ASoC: SOF: IPC4: get pipeline priority from topology
ASoC: SOF: IPC4: sort pipeline based on priority
Ricardo Rivera-Matos (1):
ASoC: cs35l45: Checks index of cs35l45_irqs[]
Richard Fitzgerald (8):
ASoC: soc-card: Add storage for PCI SSID
ASoC: SOF: Pass PCI SSID to machine driver
ASoC: Intel: sof_sdw: Copy PCI SSID to struct snd_soc_card
ASoC: cs35l56: Use PCI SSID as the firmware UID
ASoC: cs35l56: Use pm_ptr()
ASoC: cs35l56: Use new export macro for dev_pm_ops
ASoC: cs35l56: Omit cs35l56_pm_ops_i2c_spi if I2C/SPI not enabled
ASoC: cs35l56: Enable low-power hibernation mode on SPI
Rob Herring (8):
ASoC: dt-bindings: Add missing (unevaluated|additional)Properties on child node schemas
ASoC: dt-bindings: Simplify referencing dai-params.yaml
ASoC: Explicitly include correct DT includes
ASoC: Drop unnecessary of_match_device() calls
ASoC: da7218: Use i2c_get_match_data()
ASoC: qcom/lpass: Constify struct lpass_variant
ASoC: Use device_get_match_data()
ASoC: dt-bindings: tas5805m: Disallow undefined properties
Seven Lee (1):
ASoC: nau8821: Revise MICBIAS control for power saving.
Shenghao Ding (1):
ASoC: tas2781: fixed compiling issue in m68k
Shuming Fan (1):
ASoC: rt1015: fix the first word being cut off
Simon Trimmer (5):
ASoC: cs35l56: Remove unused hibernate wake constants
ASoC: cs35l56: Initialise a variable to silence possible static analysis error
ASoC: cs35l56: Change hibernate sequence to use allow auto hibernate
ASoC: cs35l56: Wake transactions need to be issued twice
ASoC: cs35l56: Enable low-power hibernation mode on i2c
Srinivas Kandagatla (2):
ASoC: soc-dai: add flag to mute and unmute stream during trigger
ASoC: codecs: wsa883x: make use of new mute_unmute_on_trigger flag
Su Hui (1):
ASoC: Intel: Skylake: add an error code check in skl_pcm_trigger
Syed Saba Kareem (13):
ASoC: amd: acp: Add acp6.3 pci legacy driver support
ASoC: amd: acp: refactor acp i2s clock generation code
ASoC: amd: acp: add i2s clock generation support for acp6.3 based platforms
ASoC: amd: acp: add machine driver support for acp6.3 platform
ASoC: amd: acp: add Kconfig options for acp6.3 based platform driver
ASoC: amd: acp: add code for scanning acp pdm controller
ASoC: amd: acp: add platform and flag data to acp data structure
ASoC: amd: acp: add condition check for i2s clock generation
ASoC: amd: acp: add machine driver support for pdm use case
ASoC: amd: acp: change acp-deinit function arguments
ASoC: amd: acp: change acp power on mask macro value
ASoC: amd: acp: Add pci legacy driver support for acp7.0 platform
ASoC: amd: acp: add machine driver support for acp7.0
Takashi Iwai (1):
ASoC: amd: ps: Fix -Wformat-truncation warning
Terry Cheong (1):
ASoC: Intel: sof_nau8825: add RPL support for MAX98360A amp
Trevor Wu (3):
ASoC: mediatek: mt8188-mt6359: support dynamic pinctrl
ASoC: mediatek: common: revise SOF common code
ASoC: mediatek: mt8188-mt6359: add SOF support
Uday M Bhat (2):
ASoC: Intel: sof_rt5682: Add support for Rex with discrete BT offload.
ASoC: Intel: sof_rt5682: Modify number of HDMI to 3 for MTL/Rex devices
Uwe Kleine-König (8):
ASoC: SOF: Convert to platform remove callback returning void
ASoC: rockchip: i2s_tdm: Convert to platform remove callback returning void
ASoC: cs42l43: Convert to platform remove callback returning void
ASoC: starfive/jh7110-pwmdac: Convert to platform remove callback returning void
ASoC: simple-card-utils: Make simple_util_remove() return void
ASoC: meson: Make meson_card_remove() return void
ASoC: qcom: lpass: Make asoc_qcom_lpass_cpu_platform_remove() return void
ASoC: uniphier: Make uniphier_aio_remove() return void
Vijendar Mukunda (6):
ASoC: amd: ps: enable wake capability for acp pci driver
ASoC: amd: Add acpi machine id for acp6.3 version based platform
ASoC: SOF: amd: add support for acp6.3 based platform
ASoC: SOF: amd: increase DSP cache window range
ASoC: SOF: amd: refactor acp dram usage for data bin loading
ASoC: SOF: amd: add option to use sram for data bin loading
Vlad Karpovich (3):
ASoC: cs35l45: Analog PCM Volume and Amplifier Mode controls
ASoC: cs35l45: Connect DSP to the monitoring signals
ASoC: cs35l45: Add AMP Enable Switch control
Weidong Wang (14):
ASoC: dt-bindings: awinic,aw88395: Add properties for multiple PA support
ASoC: dt-bindings: Add schema for "awinic,aw87390"
ASoC: codecs: Remove the "fade-enable property"
ASoC: codecs: Rename "sound-channel" to "awinic,audio-channel"
ASoC: codecs: Modify the transmission method of parameters
ASoC: codecs: Modify i2c driver name
ASoC: codecs: Add code for bin parsing compatible with aw87390
ASoC: codecs: Rename "sync-flag" to "awinic,sync-flag"
ASoC: codecs: Modify the transmission mode of function parameters
ASoC: codecs: Add aw87390 amplifier driver
ASoC: codecs: Modify max_register usage error
ASoC: dt-bindings: Add schema for "awinic,aw88399"
ASoC: codecs: Add code for bin parsing compatible with aw88399
ASoC: codecs: Add aw88399 amplifier driver
Wu Zhou (1):
ASoC: Intel: avs: Disable DSP before loading basefw
Yong Zhi (1):
ASoC: SOF: ipc4-topology: Add deep buffer size to debug prints
Zhang Shurong (1):
ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe
xiazhengqiao (4):
ASoC: dt-bindings: mediatek,mt8188-mt6359: add RT5682S support
ASoC: mediatek: mt8188-mt6359: add rt5682s support
ASoC: dt-bindings: mt8186-mt6366-rt1019-rt5682s: add RT5650 support
ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: add rt5650 support
.../bindings/sound/audio-graph-port.yaml | 20 +-
.../devicetree/bindings/sound/audio-graph.yaml | 9 +-
.../devicetree/bindings/sound/awinic,aw87390.yaml | 58 +
.../devicetree/bindings/sound/awinic,aw88395.yaml | 33 +-
.../devicetree/bindings/sound/cirrus,cs42l43.yaml | 4 +-
.../devicetree/bindings/sound/dai-params.yaml | 11 +-
.../devicetree/bindings/sound/dialog,da7219.yaml | 1 +
.../devicetree/bindings/sound/fsl,qmc-audio.yaml | 1 +
.../bindings/sound/mediatek,mt8188-mt6359.yaml | 1 +
.../sound/mt8186-mt6366-rt1019-rt5682s.yaml | 1 +
.../devicetree/bindings/sound/nxp,tfa9879.yaml | 44 +
.../devicetree/bindings/sound/pcm512x.txt | 9 +-
.../bindings/sound/qcom,lpass-tx-macro.yaml | 18 +
.../devicetree/bindings/sound/qcom,sm8250.yaml | 1 +
.../devicetree/bindings/sound/realtek,rt5616.yaml | 49 +
.../devicetree/bindings/sound/richtek,rtq9128.yaml | 61 +
Documentation/devicetree/bindings/sound/rt5616.txt | 32 -
.../bindings/sound/starfive,jh7110-pwmdac.yaml | 76 +
.../devicetree/bindings/sound/tas5805m.yaml | 5 +-
.../devicetree/bindings/sound/tfa9879.txt | 23 -
.../devicetree/bindings/sound/ti,pcm3168a.yaml | 1 +
Documentation/devicetree/bindings/sound/wm8782.txt | 7 +
Documentation/sound/soc/codec-to-codec.rst | 8 +-
Documentation/sound/soc/dpcm.rst | 3 +-
MAINTAINERS | 13 +-
arch/arm/mach-omap2/board-n8x0.c | 10 +
arch/arm/mach-omap2/pdata-quirks.c | 10 +
arch/sh/boards/mach-ecovec24/setup.c | 2 +-
arch/sh/boards/mach-se/7724/setup.c | 2 +-
drivers/gpio/gpiolib-of.c | 4 +
drivers/soundwire/intel.c | 2 +-
drivers/soundwire/intel_ace2x.c | 2 +-
drivers/soundwire/stream.c | 2 +-
include/linux/platform_data/omap-twl4030.h | 3 -
include/sound/cs35l41.h | 4 +-
include/sound/cs35l56.h | 3 +-
include/sound/graph_card.h | 16 +-
include/sound/max9768.h | 4 -
include/sound/simple_card.h | 6 +-
include/sound/simple_card_utils.h | 106 +-
include/sound/soc-acpi-intel-match.h | 2 +
include/sound/soc-acpi.h | 7 +
include/sound/soc-card.h | 41 +-
include/sound/soc-dai.h | 1 +
include/sound/soc-dapm.h | 2 +-
include/sound/soc.h | 47 +-
include/sound/sof.h | 12 +-
include/sound/sof/ipc4/header.h | 32 +-
include/sound/tas2781-dsp.h | 5 +
sound/arm/pxa2xx-pcm-lib.c | 8 +-
sound/pci/hda/cs35l41_hda.c | 23 +-
sound/soc/amd/acp-config.c | 82 +
sound/soc/amd/acp-da7219-max98357a.c | 28 +-
sound/soc/amd/acp-es8336.c | 6 +-
sound/soc/amd/acp-pcm-dma.c | 2 +-
sound/soc/amd/acp-rt5645.c | 6 +-
sound/soc/amd/acp/Kconfig | 18 +-
sound/soc/amd/acp/Makefile | 4 +-
sound/soc/amd/acp/acp-i2s.c | 45 +
sound/soc/amd/acp/acp-legacy-common.c | 79 +-
sound/soc/amd/acp/acp-legacy-mach.c | 114 +-
sound/soc/amd/acp/acp-mach-common.c | 86 +-
sound/soc/amd/acp/acp-mach.h | 69 +
sound/soc/amd/acp/acp-pci.c | 23 +-
sound/soc/amd/acp/acp-platform.c | 29 +-
sound/soc/amd/acp/acp-rembrandt.c | 17 +-
sound/soc/amd/acp/acp-renoir.c | 7 +
sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c | 444 +++++
sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h | 12 +
sound/soc/amd/acp/acp63.c | 322 ++++
sound/soc/amd/acp/acp70.c | 254 +++
sound/soc/amd/acp/amd.h | 71 +-
sound/soc/amd/acp/chip_offset_byte.h | 1 +
sound/soc/amd/acp3x-rt5682-max9836.c | 12 +-
sound/soc/amd/mach-config.h | 2 +
sound/soc/amd/ps/pci-ps.c | 3 +-
sound/soc/amd/ps/ps-sdw-dma.c | 2 +-
sound/soc/amd/raven/acp3x-i2s.c | 2 +-
sound/soc/amd/raven/acp3x-pcm-dma.c | 6 +-
sound/soc/amd/vangogh/acp5x-i2s.c | 2 +-
sound/soc/amd/vangogh/acp5x-mach.c | 12 +-
sound/soc/amd/vangogh/acp5x-pcm-dma.c | 6 +-
sound/soc/apple/mca.c | 28 +-
sound/soc/atmel/atmel-classd.c | 10 +-
sound/soc/atmel/atmel-pcm-dma.c | 8 +-
sound/soc/atmel/atmel-pcm-pdc.c | 4 +-
sound/soc/atmel/atmel-pdmic.c | 12 +-
sound/soc/atmel/atmel_wm8904.c | 5 +-
sound/soc/atmel/mchp-i2s-mcc.c | 2 +-
sound/soc/atmel/mikroe-proto.c | 2 +-
sound/soc/atmel/sam9g20_wm8731.c | 2 +-
sound/soc/atmel/sam9x5_wm8731.c | 2 +-
sound/soc/atmel/tse850-pcm5142.c | 1 -
sound/soc/au1x/db1200.c | 4 +-
sound/soc/au1x/dbdma2.c | 4 +-
sound/soc/au1x/dma.c | 4 +-
sound/soc/au1x/psc-ac97.c | 2 +-
sound/soc/bcm/bcm63xx-pcm-whistler.c | 28 +-
sound/soc/bcm/cygnus-pcm.c | 24 +-
sound/soc/bcm/cygnus-ssp.c | 2 +-
sound/soc/cirrus/edb93xx.c | 6 +-
sound/soc/codecs/88pm860x-codec.c | 4 +-
sound/soc/codecs/Kconfig | 44 +-
sound/soc/codecs/Makefile | 6 +
sound/soc/codecs/adau1373.c | 2 +-
sound/soc/codecs/adau1701.c | 1 -
sound/soc/codecs/adau1977-spi.c | 1 -
sound/soc/codecs/adav80x.c | 2 +-
sound/soc/codecs/ak4104.c | 2 +-
sound/soc/codecs/ak4118.c | 2 +-
sound/soc/codecs/ak4375.c | 2 +-
sound/soc/codecs/ak4458.c | 2 +-
sound/soc/codecs/ak4613.c | 2 +-
sound/soc/codecs/ak4642.c | 30 +-
sound/soc/codecs/ak5386.c | 7 +-
sound/soc/codecs/ak5558.c | 2 +-
sound/soc/codecs/audio-iio-aux.c | 17 +-
sound/soc/codecs/aw87390.c | 463 +++++
sound/soc/codecs/aw87390.h | 85 +
sound/soc/codecs/aw88261.c | 44 +-
sound/soc/codecs/aw88261.h | 4 +-
sound/soc/codecs/aw88395/aw88395.c | 9 +-
sound/soc/codecs/aw88395/aw88395.h | 2 +-
sound/soc/codecs/aw88395/aw88395_device.c | 47 +-
sound/soc/codecs/aw88395/aw88395_device.h | 6 +-
sound/soc/codecs/aw88395/aw88395_lib.c | 28 +-
sound/soc/codecs/aw88395/aw88395_reg.h | 2 +
sound/soc/codecs/aw88399.c | 1911 ++++++++++++++++++++
sound/soc/codecs/aw88399.h | 599 ++++++
sound/soc/codecs/cs35l32.c | 2 +-
sound/soc/codecs/cs35l33.c | 2 -
sound/soc/codecs/cs35l34.c | 2 +-
sound/soc/codecs/cs35l35.c | 3 +-
sound/soc/codecs/cs35l36.c | 3 +-
sound/soc/codecs/cs35l41-i2c.c | 13 +-
sound/soc/codecs/cs35l41-lib.c | 60 +-
sound/soc/codecs/cs35l41-spi.c | 11 +-
sound/soc/codecs/cs35l41.c | 94 +-
sound/soc/codecs/cs35l41.h | 1 -
sound/soc/codecs/cs35l45-tables.c | 3 +
sound/soc/codecs/cs35l45.c | 193 +-
sound/soc/codecs/cs35l45.h | 36 +-
sound/soc/codecs/cs35l56-i2c.c | 3 +-
sound/soc/codecs/cs35l56-sdw.c | 2 +-
sound/soc/codecs/cs35l56-shared.c | 68 +-
sound/soc/codecs/cs35l56-spi.c | 3 +-
sound/soc/codecs/cs35l56.c | 16 +-
sound/soc/codecs/cs4270.c | 2 +-
sound/soc/codecs/cs4271.c | 22 +-
sound/soc/codecs/cs42l42.c | 1 -
sound/soc/codecs/cs42l43-jack.c | 38 +-
sound/soc/codecs/cs42l43-sdw.c | 6 +-
sound/soc/codecs/cs42l43.c | 8 +-
sound/soc/codecs/cs42l56.c | 2 +-
sound/soc/codecs/cs42xx8-i2c.c | 16 +-
sound/soc/codecs/cs43130.c | 3 +-
sound/soc/codecs/cs4349.c | 2 +-
sound/soc/codecs/cs47l15.c | 4 +-
sound/soc/codecs/cs47l24.c | 6 +-
sound/soc/codecs/cs47l35.c | 6 +-
sound/soc/codecs/cs47l85.c | 6 +-
sound/soc/codecs/cs47l90.c | 6 +-
sound/soc/codecs/cs47l92.c | 4 +-
sound/soc/codecs/da7213.c | 203 ++-
sound/soc/codecs/da7213.h | 64 +-
sound/soc/codecs/da7218.c | 29 +-
sound/soc/codecs/da7218.h | 2 +-
sound/soc/codecs/da7219.c | 2 +-
sound/soc/codecs/da9055.c | 1 -
sound/soc/codecs/es8316.c | 52 +-
sound/soc/codecs/es8316.h | 3 +
sound/soc/codecs/es8328.c | 10 +-
sound/soc/codecs/gtm601.c | 2 +-
sound/soc/codecs/hdac_hda.c | 29 +
sound/soc/codecs/hdac_hda.h | 1 +
sound/soc/codecs/hdac_hdmi.c | 13 +-
sound/soc/codecs/lpass-macro-common.c | 2 +-
sound/soc/codecs/lpass-macro-common.h | 2 +
sound/soc/codecs/lpass-rx-macro.c | 6 +-
sound/soc/codecs/lpass-tx-macro.c | 22 +-
sound/soc/codecs/lpass-wsa-macro.c | 3 +
sound/soc/codecs/max9768.c | 45 +-
sound/soc/codecs/max98357a.c | 1 -
sound/soc/codecs/max98373-i2c.c | 17 -
sound/soc/codecs/max98373.c | 35 +-
sound/soc/codecs/max98373.h | 2 +-
sound/soc/codecs/max98388.c | 3 +-
sound/soc/codecs/max98396.c | 1 -
sound/soc/codecs/max98520.c | 2 -
sound/soc/codecs/max9867.c | 8 +-
sound/soc/codecs/max98927.c | 2 -
sound/soc/codecs/mt6351.c | 2 +-
sound/soc/codecs/mt6358.c | 2 +-
sound/soc/codecs/mt6359-accdet.c | 4 -
sound/soc/codecs/mt6359.c | 2 +-
sound/soc/codecs/nau8540.c | 2 +-
sound/soc/codecs/nau8821.c | 3 +
sound/soc/codecs/pcm1681.c | 2 -
sound/soc/codecs/pcm512x-i2c.c | 4 +
sound/soc/codecs/pcm512x.c | 36 +-
sound/soc/codecs/rt1015.c | 13 +
sound/soc/codecs/rt298.c | 1 -
sound/soc/codecs/rt5677-spi.c | 4 +-
sound/soc/codecs/rt5682s.c | 4 +-
sound/soc/codecs/rt715-sdca.c | 4 +-
sound/soc/codecs/rt715.c | 6 +-
sound/soc/codecs/rtq9128.c | 780 ++++++++
sound/soc/codecs/sgtl5000.c | 2 +-
sound/soc/codecs/sigmadsp.c | 7 +-
sound/soc/codecs/sma1303.c | 2 +-
sound/soc/codecs/sta32x.c | 3 +-
sound/soc/codecs/sta350.c | 3 +-
sound/soc/codecs/tas2781-fmwlib.c | 236 ++-
sound/soc/codecs/tas5086.c | 6 +-
sound/soc/codecs/tas571x.c | 15 +-
sound/soc/codecs/tlv320aic31xx.c | 6 +-
sound/soc/codecs/tlv320aic32x4-i2c.c | 19 +-
sound/soc/codecs/tlv320aic32x4-spi.c | 18 +-
sound/soc/codecs/tlv320aic32x4.c | 5 +-
sound/soc/codecs/tlv320aic32x4.h | 3 +-
sound/soc/codecs/uda1334.c | 2 +-
sound/soc/codecs/wcd9335.c | 18 +-
sound/soc/codecs/wcd938x.c | 4 +-
sound/soc/codecs/wm5110.c | 6 +-
sound/soc/codecs/wm8510.c | 2 +-
sound/soc/codecs/wm8523.c | 2 +-
sound/soc/codecs/wm8524.c | 2 +-
sound/soc/codecs/wm8580.c | 28 +-
sound/soc/codecs/wm8711.c | 2 +-
sound/soc/codecs/wm8728.c | 2 +-
sound/soc/codecs/wm8731-i2c.c | 2 +-
sound/soc/codecs/wm8731-spi.c | 2 +-
sound/soc/codecs/wm8737.c | 2 +-
sound/soc/codecs/wm8741.c | 2 +-
sound/soc/codecs/wm8750.c | 2 +-
sound/soc/codecs/wm8753.c | 2 +-
sound/soc/codecs/wm8770.c | 2 +-
sound/soc/codecs/wm8776.c | 2 +-
sound/soc/codecs/wm8782.c | 63 +-
sound/soc/codecs/wm8804.c | 1 -
sound/soc/codecs/wm8962.c | 4 +-
sound/soc/codecs/wm8994.c | 2 +-
sound/soc/codecs/wm8995.c | 2 +-
sound/soc/codecs/wm_adsp.c | 10 +-
sound/soc/codecs/wsa883x.c | 7 +-
sound/soc/dwc/dwc-i2s.c | 2 +-
sound/soc/dwc/dwc-pcm.c | 4 +-
sound/soc/fsl/efika-audio-fabric.c | 4 +-
sound/soc/fsl/eukrea-tlv320.c | 6 +-
sound/soc/fsl/fsl-asoc-card.c | 29 +-
sound/soc/fsl/fsl_asrc_dma.c | 10 +-
sound/soc/fsl/fsl_aud2htx.c | 3 +-
sound/soc/fsl/fsl_dma.c | 2 +-
sound/soc/fsl/fsl_easrc.c | 8 +-
sound/soc/fsl/fsl_mqs.c | 2 +-
sound/soc/fsl/fsl_rpmsg.c | 3 +-
sound/soc/fsl/fsl_sai.c | 3 +-
sound/soc/fsl/fsl_spdif.c | 24 +-
sound/soc/fsl/fsl_ssi.c | 16 +-
sound/soc/fsl/imx-audmix.c | 18 +-
sound/soc/fsl/imx-audmux.c | 1 -
sound/soc/fsl/imx-card.c | 9 +-
sound/soc/fsl/imx-hdmi.c | 4 +-
sound/soc/fsl/imx-pcm-rpmsg.c | 14 +-
sound/soc/fsl/imx-rpmsg.c | 7 +-
sound/soc/fsl/imx-sgtl5000.c | 2 +-
sound/soc/fsl/imx-spdif.c | 2 +-
sound/soc/fsl/mpc5200_dma.c | 25 +-
sound/soc/fsl/mpc5200_psc_ac97.c | 3 +-
sound/soc/fsl/mpc5200_psc_i2s.c | 7 +-
sound/soc/fsl/mpc8610_hpcd.c | 8 +-
sound/soc/fsl/p1022_ds.c | 8 +-
sound/soc/fsl/p1022_rdk.c | 8 +-
sound/soc/fsl/pcm030-audio-fabric.c | 3 +-
sound/soc/generic/audio-graph-card.c | 116 +-
.../soc/generic/audio-graph-card2-custom-sample.c | 32 +-
sound/soc/generic/audio-graph-card2.c | 110 +-
sound/soc/generic/simple-card-utils.c | 221 ++-
sound/soc/generic/simple-card.c | 149 +-
sound/soc/generic/test-component.c | 4 +-
sound/soc/google/chv3-i2s.c | 22 +-
sound/soc/img/img-i2s-in.c | 2 +-
sound/soc/img/img-i2s-out.c | 2 +-
sound/soc/intel/atom/sst-mfld-platform-pcm.c | 12 +-
sound/soc/intel/avs/avs.h | 38 +-
sound/soc/intel/avs/board_selection.c | 11 +-
sound/soc/intel/avs/boards/Kconfig | 10 +
sound/soc/intel/avs/boards/Makefile | 2 +
sound/soc/intel/avs/boards/da7219.c | 21 +-
sound/soc/intel/avs/boards/es8336.c | 26 +-
sound/soc/intel/avs/boards/i2s_test.c | 57 +-
sound/soc/intel/avs/boards/max98357a.c | 18 +-
sound/soc/intel/avs/boards/max98373.c | 20 +-
sound/soc/intel/avs/boards/max98927.c | 20 +-
sound/soc/intel/avs/boards/nau8825.c | 26 +-
sound/soc/intel/avs/boards/rt274.c | 22 +-
sound/soc/intel/avs/boards/rt286.c | 27 +-
sound/soc/intel/avs/boards/rt298.c | 26 +-
sound/soc/intel/avs/boards/rt5514.c | 187 ++
sound/soc/intel/avs/boards/rt5663.c | 26 +-
sound/soc/intel/avs/boards/rt5682.c | 26 +-
sound/soc/intel/avs/boards/ssm4567.c | 22 +-
sound/soc/intel/avs/cldma.h | 4 +-
sound/soc/intel/avs/core.c | 5 +
sound/soc/intel/avs/debugfs.c | 4 +
sound/soc/intel/avs/ipc.c | 52 +-
sound/soc/intel/avs/loader.c | 4 +
sound/soc/intel/avs/messages.c | 112 +-
sound/soc/intel/avs/messages.h | 4 +-
sound/soc/intel/avs/path.c | 31 +-
sound/soc/intel/avs/pcm.c | 76 +-
sound/soc/intel/avs/registers.h | 4 +-
sound/soc/intel/avs/topology.c | 102 +-
sound/soc/intel/avs/utils.h | 65 +
sound/soc/intel/boards/Kconfig | 39 +-
sound/soc/intel/boards/Makefile | 16 +-
sound/soc/intel/boards/bdw-rt5650.c | 6 +-
sound/soc/intel/boards/bdw-rt5677.c | 10 +-
sound/soc/intel/boards/bdw_rt286.c | 8 +-
sound/soc/intel/boards/bxt_da7219_max98357a.c | 8 +-
sound/soc/intel/boards/bxt_rt298.c | 10 +-
sound/soc/intel/boards/bytcht_cx2072x.c | 10 +-
sound/soc/intel/boards/bytcht_da7213.c | 12 +-
sound/soc/intel/boards/bytcht_es8316.c | 8 +-
sound/soc/intel/boards/bytcht_nocodec.c | 4 +-
sound/soc/intel/boards/bytcr_rt5640.c | 10 +-
sound/soc/intel/boards/bytcr_rt5651.c | 10 +-
sound/soc/intel/boards/bytcr_wm5102.c | 244 ++-
sound/soc/intel/boards/cht_bsw_max98090_ti.c | 8 +-
sound/soc/intel/boards/cht_bsw_nau8824.c | 8 +-
sound/soc/intel/boards/cht_bsw_rt5645.c | 16 +-
sound/soc/intel/boards/cht_bsw_rt5672.c | 10 +-
sound/soc/intel/boards/cml_rt1011_rt5682.c | 12 +-
sound/soc/intel/boards/ehl_rt5660.c | 8 +-
sound/soc/intel/boards/glk_rt5682_max98357a.c | 12 +-
sound/soc/intel/boards/hsw_rt5640.c | 4 +-
sound/soc/intel/boards/kbl_da7219_max98357a.c | 8 +-
sound/soc/intel/boards/kbl_da7219_max98927.c | 10 +-
sound/soc/intel/boards/kbl_rt5660.c | 8 +-
sound/soc/intel/boards/kbl_rt5663_max98927.c | 12 +-
.../soc/intel/boards/kbl_rt5663_rt5514_max98927.c | 12 +-
sound/soc/intel/boards/skl_hda_dsp_generic.c | 4 +-
sound/soc/intel/boards/skl_nau88l25_max98357a.c | 14 +-
sound/soc/intel/boards/skl_nau88l25_ssm4567.c | 18 +-
sound/soc/intel/boards/skl_rt286.c | 10 +-
sound/soc/intel/boards/sof_board_helpers.c | 204 +++
sound/soc/intel/boards/sof_board_helpers.h | 64 +
sound/soc/intel/boards/sof_cirrus_common.c | 2 +-
sound/soc/intel/boards/sof_cirrus_common.h | 9 +-
sound/soc/intel/boards/sof_cs42l42.c | 354 +---
.../boards/{sof_da7219_max98373.c => sof_da7219.c} | 409 +++--
sound/soc/intel/boards/sof_es8336.c | 14 +-
sound/soc/intel/boards/sof_hdmi_common.h | 24 +
sound/soc/intel/boards/sof_maxim_common.c | 8 +-
sound/soc/intel/boards/sof_maxim_common.h | 13 +-
sound/soc/intel/boards/sof_nau8825.c | 373 ++--
sound/soc/intel/boards/sof_nuvoton_common.c | 73 +
sound/soc/intel/boards/sof_nuvoton_common.h | 22 +
sound/soc/intel/boards/sof_pcm512x.c | 14 +-
sound/soc/intel/boards/sof_realtek_common.c | 8 +-
sound/soc/intel/boards/sof_realtek_common.h | 37 +-
sound/soc/intel/boards/sof_rt5682.c | 730 +++-----
sound/soc/intel/boards/sof_sdw.c | 307 ++--
sound/soc/intel/boards/sof_sdw_common.h | 21 +-
sound/soc/intel/boards/sof_sdw_cs42l42.c | 2 +-
sound/soc/intel/boards/sof_sdw_cs42l43.c | 156 ++
sound/soc/intel/boards/sof_sdw_hdmi.c | 32 +-
sound/soc/intel/boards/sof_sdw_maxim.c | 4 +-
sound/soc/intel/boards/sof_sdw_rt5682.c | 2 +-
sound/soc/intel/boards/sof_sdw_rt700.c | 2 +-
sound/soc/intel/boards/sof_sdw_rt711.c | 2 +-
sound/soc/intel/boards/sof_sdw_rt712_sdca.c | 6 +-
sound/soc/intel/boards/sof_sdw_rt_amp.c | 4 +-
.../soc/intel/boards/sof_sdw_rt_sdca_jack_common.c | 10 +-
sound/soc/intel/boards/sof_ssp_amp.c | 339 ++--
sound/soc/intel/boards/sof_ssp_common.c | 101 ++
sound/soc/intel/boards/sof_ssp_common.h | 71 +
sound/soc/intel/boards/sof_wm8804.c | 4 +-
sound/soc/intel/catpt/pcm.c | 12 +-
sound/soc/intel/common/Makefile | 1 +
sound/soc/intel/common/soc-acpi-intel-adl-match.c | 19 +
sound/soc/intel/common/soc-acpi-intel-arl-match.c | 51 +
sound/soc/intel/common/soc-acpi-intel-cht-match.c | 43 +
sound/soc/intel/common/soc-acpi-intel-jsl-match.c | 12 +-
sound/soc/intel/common/soc-acpi-intel-mtl-match.c | 150 ++
sound/soc/intel/common/soc-acpi-intel-rpl-match.c | 39 +
sound/soc/intel/keembay/kmb_platform.c | 17 +-
sound/soc/intel/skylake/skl-pcm.c | 21 +-
sound/soc/intel/skylake/skl-sst-utils.c | 1 +
sound/soc/intel/skylake/skl.c | 1 +
sound/soc/kirkwood/armada-370-db.c | 4 +-
sound/soc/kirkwood/kirkwood-dma.c | 2 +-
sound/soc/loongson/loongson_card.c | 4 +-
sound/soc/loongson/loongson_dma.c | 4 +-
sound/soc/mediatek/Kconfig | 2 +
sound/soc/mediatek/common/mtk-afe-fe-dai.c | 22 +-
.../soc/mediatek/common/mtk-afe-platform-driver.c | 4 +-
sound/soc/mediatek/common/mtk-dsp-sof-common.c | 113 +-
sound/soc/mediatek/common/mtk-dsp-sof-common.h | 8 +
sound/soc/mediatek/mt2701/mt2701-afe-pcm.c | 6 +-
sound/soc/mediatek/mt2701/mt2701-cs42448.c | 60 +-
sound/soc/mediatek/mt2701/mt2701-wm8960.c | 6 +-
sound/soc/mediatek/mt6797/mt6797-afe-pcm.c | 6 +-
sound/soc/mediatek/mt7986/mt7986-dai-etdm.c | 23 +-
sound/soc/mediatek/mt7986/mt7986-wm8960.c | 43 +-
sound/soc/mediatek/mt8173/mt8173-afe-pcm.c | 4 +-
sound/soc/mediatek/mt8173/mt8173-max98090.c | 7 +-
sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c | 6 +-
sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c | 8 +-
sound/soc/mediatek/mt8173/mt8173-rt5650.c | 10 +-
sound/soc/mediatek/mt8183/mt8183-afe-pcm.c | 6 +-
sound/soc/mediatek/mt8183/mt8183-da7219-max98357.c | 16 +-
sound/soc/mediatek/mt8183/mt8183-dai-i2s.c | 4 +-
.../mt8183/mt8183-mt6358-ts3a227-max98357.c | 20 +-
sound/soc/mediatek/mt8186/mt8186-afe-gpio.c | 1 -
sound/soc/mediatek/mt8186/mt8186-afe-pcm.c | 12 +-
sound/soc/mediatek/mt8186/mt8186-dai-adda.c | 2 +-
sound/soc/mediatek/mt8186/mt8186-dai-hw-gain.c | 2 +-
sound/soc/mediatek/mt8186/mt8186-dai-i2s.c | 4 +-
sound/soc/mediatek/mt8186/mt8186-dai-src.c | 4 +-
sound/soc/mediatek/mt8186/mt8186-dai-tdm.c | 2 -
sound/soc/mediatek/mt8186/mt8186-mt6366-common.c | 2 +-
.../mt8186/mt8186-mt6366-da7219-max98357.c | 16 +-
.../mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c | 59 +-
sound/soc/mediatek/mt8188/mt8188-afe-pcm.c | 8 +-
sound/soc/mediatek/mt8188/mt8188-dai-etdm.c | 4 +-
sound/soc/mediatek/mt8188/mt8188-mt6359.c | 383 +++-
sound/soc/mediatek/mt8192/mt8192-afe-gpio.c | 1 -
sound/soc/mediatek/mt8192/mt8192-afe-pcm.c | 6 +-
sound/soc/mediatek/mt8192/mt8192-dai-adda.c | 4 +-
sound/soc/mediatek/mt8192/mt8192-dai-i2s.c | 4 +-
.../mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c | 24 +-
sound/soc/mediatek/mt8195/mt8195-afe-pcm.c | 10 +-
sound/soc/mediatek/mt8195/mt8195-mt6359.c | 28 +-
sound/soc/meson/aiu-fifo.c | 2 +-
sound/soc/meson/axg-card.c | 14 +-
sound/soc/meson/axg-fifo.c | 4 +-
sound/soc/meson/axg-fifo.h | 2 +-
sound/soc/meson/axg-tdm.h | 2 +-
sound/soc/meson/gx-card.c | 4 +-
sound/soc/meson/meson-card-utils.c | 10 +-
sound/soc/meson/meson-card.h | 2 +-
sound/soc/meson/meson-codec-glue.c | 2 +-
sound/soc/mxs/mxs-saif.c | 1 -
sound/soc/mxs/mxs-sgtl5000.c | 7 +-
sound/soc/pxa/pxa2xx-i2s.c | 4 +-
sound/soc/pxa/spitz.c | 8 +-
sound/soc/qcom/apq8016_sbc.c | 9 +-
sound/soc/qcom/apq8096.c | 10 +-
sound/soc/qcom/common.c | 8 +-
sound/soc/qcom/lpass-apq8016.c | 8 +-
sound/soc/qcom/lpass-cdc-dma.c | 19 +-
sound/soc/qcom/lpass-cpu.c | 49 +-
sound/soc/qcom/lpass-ipq806x.c | 4 +-
sound/soc/qcom/lpass-platform.c | 87 +-
sound/soc/qcom/lpass-sc7180.c | 8 +-
sound/soc/qcom/lpass-sc7280.c | 8 +-
sound/soc/qcom/lpass.h | 4 +-
sound/soc/qcom/qdsp6/q6afe-clocks.c | 1 +
sound/soc/qcom/qdsp6/q6afe-dai.c | 1 +
sound/soc/qcom/qdsp6/q6afe.c | 1 +
sound/soc/qcom/qdsp6/q6afe.h | 2 -
sound/soc/qcom/qdsp6/q6apm-dai.c | 6 +-
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 5 +-
sound/soc/qcom/qdsp6/q6apm.h | 1 -
sound/soc/qcom/qdsp6/q6asm-dai.c | 13 +-
sound/soc/qcom/qdsp6/q6asm.c | 1 +
sound/soc/qcom/qdsp6/q6asm.h | 1 -
sound/soc/qcom/qdsp6/q6dsp-lpass-clocks.c | 1 -
sound/soc/qcom/qdsp6/q6prm-clocks.c | 2 +-
sound/soc/qcom/qdsp6/q6routing.c | 9 +-
sound/soc/qcom/sc7180.c | 216 ++-
sound/soc/qcom/sc7280.c | 30 +-
sound/soc/qcom/sc8280xp.c | 10 +-
sound/soc/qcom/sdm845.c | 38 +-
sound/soc/qcom/sdw.c | 8 +-
sound/soc/qcom/sm8250.c | 12 +-
sound/soc/qcom/storm.c | 4 +-
sound/soc/rockchip/rk3288_hdmi_analog.c | 52 +-
sound/soc/rockchip/rk3399_gru_sound.c | 28 +-
sound/soc/rockchip/rockchip_i2s.c | 10 +-
sound/soc/rockchip/rockchip_i2s_tdm.c | 30 +-
sound/soc/rockchip/rockchip_max98090.c | 12 +-
sound/soc/rockchip/rockchip_pdm.c | 7 +-
sound/soc/rockchip/rockchip_rt5645.c | 10 +-
sound/soc/samsung/aries_wm8994.c | 13 +-
sound/soc/samsung/arndale.c | 12 +-
sound/soc/samsung/bells.c | 16 +-
sound/soc/samsung/i2s.c | 14 +-
sound/soc/samsung/littlemill.c | 16 +-
sound/soc/samsung/lowland.c | 4 +-
sound/soc/samsung/midas_wm1811.c | 12 +-
sound/soc/samsung/odroid.c | 9 +-
sound/soc/samsung/pcm.c | 8 +-
sound/soc/samsung/smdk_spdif.c | 4 +-
sound/soc/samsung/smdk_wm8994.c | 32 +-
sound/soc/samsung/smdk_wm8994pcm.c | 6 +-
sound/soc/samsung/snow.c | 5 +-
sound/soc/samsung/spdif.c | 14 +-
sound/soc/samsung/speyside.c | 12 +-
sound/soc/samsung/tm2_wm5110.c | 24 +-
sound/soc/samsung/tobermory.c | 8 +-
sound/soc/sh/dma-sh7760.c | 34 +-
sound/soc/sh/fsi.c | 5 +-
sound/soc/sh/migor.c | 10 +-
sound/soc/sh/rcar/core.c | 8 +-
sound/soc/sh/rcar/rsnd.h | 4 +-
sound/soc/sh/rcar/src.c | 1 +
sound/soc/sh/rcar/ssi.c | 2 +
sound/soc/sh/rz-ssi.c | 5 +-
sound/soc/soc-component.c | 24 +-
sound/soc/soc-compress.c | 36 +-
sound/soc/soc-core.c | 20 +-
sound/soc/soc-dai.c | 15 +-
sound/soc/soc-dapm.c | 14 +-
sound/soc/soc-generic-dmaengine-pcm.c | 10 +-
sound/soc/soc-link.c | 14 +-
sound/soc/soc-pcm.c | 117 +-
sound/soc/soc-topology.c | 6 +-
sound/soc/soc-utils.c | 6 +-
sound/soc/sof/Kconfig | 2 +-
sound/soc/sof/Makefile | 6 +-
sound/soc/sof/amd/Kconfig | 9 +
sound/soc/sof/amd/Makefile | 2 +
sound/soc/sof/amd/acp-loader.c | 82 +-
sound/soc/sof/amd/acp-pcm.c | 2 +-
sound/soc/sof/amd/acp.c | 4 +-
sound/soc/sof/amd/acp.h | 21 +-
sound/soc/sof/amd/acp63.c | 146 ++
sound/soc/sof/amd/pci-acp63.c | 106 ++
sound/soc/sof/amd/pci-rmb.c | 10 +-
sound/soc/sof/amd/pci-rn.c | 10 +-
sound/soc/sof/amd/pci-vangogh.c | 10 +-
sound/soc/sof/imx/imx8.c | 26 +-
sound/soc/sof/imx/imx8m.c | 16 +-
sound/soc/sof/imx/imx8ulp.c | 16 +-
sound/soc/sof/intel/Kconfig | 14 +-
sound/soc/sof/intel/Makefile | 3 +-
sound/soc/sof/intel/apl.c | 4 +-
sound/soc/sof/intel/bdw.c | 12 +-
sound/soc/sof/intel/byt.c | 36 +-
sound/soc/sof/intel/cnl.c | 4 +-
sound/soc/sof/intel/hda-codec.c | 1 +
sound/soc/sof/intel/hda-dai-ops.c | 26 +-
sound/soc/sof/intel/hda-dai.c | 12 +-
sound/soc/sof/intel/hda-dsp.c | 3 +
sound/soc/sof/intel/hda-loader.c | 44 +-
sound/soc/sof/intel/hda-pcm.c | 4 +-
sound/soc/sof/intel/hda-stream.c | 4 +-
sound/soc/sof/intel/hda.c | 20 +-
sound/soc/sof/intel/hda.h | 6 +-
sound/soc/sof/intel/icl.c | 4 +-
sound/soc/sof/intel/mtl.c | 3 +
sound/soc/sof/intel/pci-apl.c | 36 +-
sound/soc/sof/intel/pci-cnl.c | 54 +-
sound/soc/sof/intel/pci-icl.c | 36 +-
sound/soc/sof/intel/pci-lnl.c | 10 +-
sound/soc/sof/intel/pci-mtl.c | 43 +-
sound/soc/sof/intel/pci-skl.c | 20 +-
sound/soc/sof/intel/pci-tgl.c | 144 +-
sound/soc/sof/intel/pci-tng.c | 10 +-
sound/soc/sof/intel/telemetry.c | 95 +
sound/soc/sof/intel/telemetry.h | 35 +
sound/soc/sof/intel/tgl.c | 5 +-
sound/soc/sof/ipc.c | 6 +-
sound/soc/sof/ipc3-dtrace.c | 2 +-
sound/soc/sof/ipc3-pcm.c | 6 +-
sound/soc/sof/ipc4-control.c | 175 +-
sound/soc/sof/ipc4-mtrace.c | 34 +-
sound/soc/sof/ipc4-pcm.c | 118 +-
sound/soc/sof/ipc4-priv.h | 3 +
sound/soc/sof/ipc4-telemetry.c | 95 +
sound/soc/sof/ipc4-telemetry.h | 73 +
sound/soc/sof/ipc4-topology.c | 76 +-
sound/soc/sof/ipc4-topology.h | 22 +-
sound/soc/sof/ipc4.c | 40 +-
sound/soc/sof/mediatek/mt8186/mt8186.c | 28 +-
sound/soc/sof/mediatek/mt8195/mt8195.c | 18 +-
sound/soc/sof/nocodec.c | 2 +-
sound/soc/sof/ops.h | 10 +-
sound/soc/sof/pcm.c | 18 +-
sound/soc/sof/sof-acpi-dev.c | 12 +-
sound/soc/sof/sof-acpi-dev.h | 2 +-
sound/soc/sof/sof-audio.c | 7 +
sound/soc/sof/sof-client-ipc-msg-injector.c | 4 +-
sound/soc/sof/sof-client-probes.c | 6 +-
sound/soc/sof/sof-client.c | 27 +-
sound/soc/sof/sof-of-dev.c | 10 +-
sound/soc/sof/sof-of-dev.h | 2 +-
sound/soc/sof/sof-pci-dev.c | 17 +-
sound/soc/sof/sof-priv.h | 2 +-
sound/soc/sof/xtensa/core.c | 11 +
sound/soc/sprd/sprd-pcm-compress.c | 4 +-
sound/soc/sprd/sprd-pcm-dma.c | 4 +-
sound/soc/starfive/Kconfig | 9 +
sound/soc/starfive/Makefile | 1 +
sound/soc/starfive/jh7110_pwmdac.c | 528 ++++++
sound/soc/starfive/jh7110_tdm.c | 2 +-
sound/soc/stm/stm32_adfsdm.c | 24 +-
sound/soc/stm/stm32_i2s.c | 7 +-
sound/soc/stm/stm32_sai.c | 8 +-
sound/soc/stm/stm32_sai_sub.c | 10 +-
sound/soc/stm/stm32_spdifrx.c | 8 +-
sound/soc/sunxi/sun4i-codec.c | 16 +-
sound/soc/sunxi/sun4i-i2s.c | 2 +-
sound/soc/sunxi/sun4i-spdif.c | 7 +-
sound/soc/sunxi/sun50i-codec-analog.c | 3 +-
sound/soc/sunxi/sun50i-dmic.c | 4 +-
sound/soc/sunxi/sun8i-codec-analog.c | 1 -
sound/soc/sunxi/sun8i-codec.c | 2 +-
sound/soc/tegra/tegra186_asrc.c | 3 +-
sound/soc/tegra/tegra186_dspk.c | 2 +-
sound/soc/tegra/tegra20_spdif.c | 2 +-
sound/soc/tegra/tegra210_adx.c | 3 +-
sound/soc/tegra/tegra210_amx.c | 13 +-
sound/soc/tegra/tegra210_dmic.c | 2 +-
sound/soc/tegra/tegra210_i2s.c | 2 +-
sound/soc/tegra/tegra210_mixer.c | 3 +-
sound/soc/tegra/tegra210_mvc.c | 3 +-
sound/soc/tegra/tegra210_ope.c | 3 +-
sound/soc/tegra/tegra210_peq.c | 1 -
sound/soc/tegra/tegra210_sfc.c | 1 -
sound/soc/tegra/tegra30_i2s.c | 1 -
sound/soc/tegra/tegra_asoc_machine.c | 15 +-
sound/soc/tegra/tegra_audio_graph_card.c | 24 +-
sound/soc/tegra/tegra_pcm.c | 4 +-
sound/soc/tegra/tegra_wm8903.c | 4 +-
sound/soc/ti/Kconfig | 5 +-
sound/soc/ti/ams-delta.c | 10 +-
sound/soc/ti/davinci-evm.c | 17 +-
sound/soc/ti/davinci-mcasp.c | 9 +-
sound/soc/ti/j721e-evm.c | 12 +-
sound/soc/ti/n810.c | 37 +-
sound/soc/ti/omap-abe-twl6040.c | 10 +-
sound/soc/ti/omap-dmic.c | 2 +-
sound/soc/ti/omap-hdmi.c | 2 +-
sound/soc/ti/omap-mcbsp-st.c | 2 +-
sound/soc/ti/omap-mcbsp.c | 18 +-
sound/soc/ti/omap-mcpdm.c | 4 +-
sound/soc/ti/omap-twl4030.c | 22 +-
sound/soc/ti/omap3pandora.c | 69 +-
sound/soc/ti/osk5912.c | 5 +-
sound/soc/ti/rx51.c | 25 +-
sound/soc/uniphier/aio-compress.c | 22 +-
sound/soc/uniphier/aio-cpu.c | 4 +-
sound/soc/uniphier/aio-dma.c | 12 +-
sound/soc/uniphier/aio-ld11.c | 2 +-
sound/soc/uniphier/aio-pxs2.c | 2 +-
sound/soc/uniphier/aio.h | 2 +-
sound/soc/ux500/mop500_ab8500.c | 14 +-
sound/soc/ux500/ux500_pcm.c | 4 +-
sound/soc/xtensa/xtfpga-i2s.c | 4 +-
652 files changed, 14833 insertions(+), 5454 deletions(-)
create mode 100644 Documentation/devicetree/bindings/sound/awinic,aw87390.yaml
create mode 100644 Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml
create mode 100644 Documentation/devicetree/bindings/sound/realtek,rt5616.yaml
create mode 100644 Documentation/devicetree/bindings/sound/richtek,rtq9128.yaml
delete mode 100644 Documentation/devicetree/bindings/sound/rt5616.txt
create mode 100644 Documentation/devicetree/bindings/sound/starfive,jh7110-pwmdac.yaml
delete mode 100644 Documentation/devicetree/bindings/sound/tfa9879.txt
create mode 100644 sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c
create mode 100644 sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h
create mode 100644 sound/soc/amd/acp/acp63.c
create mode 100644 sound/soc/amd/acp/acp70.c
create mode 100644 sound/soc/codecs/aw87390.c
create mode 100644 sound/soc/codecs/aw87390.h
create mode 100644 sound/soc/codecs/aw88399.c
create mode 100644 sound/soc/codecs/aw88399.h
create mode 100644 sound/soc/codecs/rtq9128.c
create mode 100644 sound/soc/intel/avs/boards/rt5514.c
create mode 100644 sound/soc/intel/avs/utils.h
create mode 100644 sound/soc/intel/boards/sof_board_helpers.c
create mode 100644 sound/soc/intel/boards/sof_board_helpers.h
rename sound/soc/intel/boards/{sof_da7219_max98373.c => sof_da7219.c} (51%)
create mode 100644 sound/soc/intel/boards/sof_hdmi_common.h
create mode 100644 sound/soc/intel/boards/sof_nuvoton_common.c
create mode 100644 sound/soc/intel/boards/sof_nuvoton_common.h
create mode 100644 sound/soc/intel/boards/sof_sdw_cs42l43.c
create mode 100644 sound/soc/intel/boards/sof_ssp_common.c
create mode 100644 sound/soc/intel/boards/sof_ssp_common.h
create mode 100644 sound/soc/intel/common/soc-acpi-intel-arl-match.c
create mode 100644 sound/soc/sof/amd/acp63.c
create mode 100644 sound/soc/sof/amd/pci-acp63.c
create mode 100644 sound/soc/sof/intel/telemetry.c
create mode 100644 sound/soc/sof/intel/telemetry.h
create mode 100644 sound/soc/sof/ipc4-telemetry.c
create mode 100644 sound/soc/sof/ipc4-telemetry.h
create mode 100644 sound/soc/starfive/jh7110_pwmdac.c
2
2
[PATCH v8 00/30] Add support for QMC HDLC, framer infrastructure and PEF2256 framer
by Herve Codina 30 Oct '23
by Herve Codina 30 Oct '23
30 Oct '23
Hi,
I have a system where I need to handle an HDLC interface and some audio
data.
The HDLC data are transferred using a TDM bus on which a PEF2256
(E1/T1 framer) is present. The PEF2256 transfers data from/to the TDM
bus to/from the E1 line. This PEF2256 is connected to a PowerQUICC SoC
for the control path and the TDM is connected to the SoC (QMC component)
for the data path.
From the QMC HDLC driver, I need to handle HDLC data using the QMC,
carrier detection using the PEF2256 (E1 line carrier) and set/get some
PEF2256 configuration.
The QMC HDLC driver considers the PEF2256 as a generic framer.
It performs operations that involve the PEF2256 through the generic
framer API.
The audio data are exchanged with the PEF2256 using a CPU DAI connected
to the TDM bus through the QMC and the PEF2256 needs to be seen as a
codec in order to be linked to the CPU DAI.
The codec handles the carrier detection using the PEF2256 and reports
the carrier state to the ALSA subsystem using the ASoC jack detection.
The codec, even if instantiated by the PEF2256 driver, considers the
PEF2256 as a generic framer.
The generic framer has:
- 2 consumers (QMC HDLC drv and codec)
- 1 provider (PEF2256)
So, the design is the following:
+------------------+ +---------+
| QMC | <- TDM -> | PEF2256 | <-> E1
+---------+ | +-------------+ | | |
| CPU DAI | <-data--> | QMC channel | | | |
+---------+ | +-------------+ | | |
+--------------+ | +-------------+ | | |
| QMC HDLC drv | <-data--> | QMC channel | | | |
+--------------+ | +-------------+ | | |
^ +------------------+ | |
| +--------+ +-------------+ | |
+-> | framer | <-> | PEF2256 drv | <- local bus ->| |
| | | | +---------+
+-> | | | |
| +--------+ | +-------+ |
+-------------------> | codec | |
| +-------+ |
+-------------+
Further more, the TDM timeslots used by the QMC HDLC driver need to be
configured at runtime (QMC dynamic timeslots).
Several weeks ago, I sent two series related to this topic:
- Add the Lantiq PEF2256 audio support [1]
- RFC Add support for QMC HDLC and PHY [2]
This current series is a rework of these two series taking into account
feedbacks previously received.
In order to implement all of this, I do the following:
1) Perform some fixes (patches 1, 2, 3, 4, 5, 6, 7)
2) Introduce the QMC HDLC driver (patches 8, 9, 10, 11)
3) Add QMC dynamic timeslot support (patches 12 - 22)
4) Add timeslots change support in QMC HDLC (patch 23)
5) Introduce framer infrastructure (patch 24)
6) Add PEF2256 framer provider (patches 25, 26, 27, 28)
7) Add framer codec as a framer consumer (patch 29)
8) Add framer support as a framer consumer in QMC HDLC (patch 30)
The series contains the full story and detailed modifications.
If needed, the series can be split and/or commits can be squashed.
Let me know.
Compare to the previous iteration
https://lore.kernel.org/linux-kernel/20230928070652.330429-1-herve.codina@b…
This v8 series:
- Fixes a race condition
- Uses menuconfig instead of menu and hides CONFIG_GENERIC_FRAMER
- Performs minor changes
Best regards,
Hervé
[1]: https://lore.kernel.org/all/20230417171601.74656-1-herve.codina@bootlin.com/
[2]: https://lore.kernel.org/all/20230323103154.264546-1-herve.codina@bootlin.co…
Changes v7 -> v8
- Patch 10
Fix a race condition when stopping the queue in qmc_hdlc_close()
- Patch 24
Move to menuconfig and hide CONFIG_GENERIC_FRAMER
Remove unneeded check (defensive programming)
Remove unneeded variable assignment
- Patch 25
Add 'Reviewed-by: Rob Herring <robh(a)kernel.org>'
- Patch 26
Use array notation for 'audio_devs'
Changes v6 -> v7
- Patch 8
Move the 'compatible' property to the first property.
Add device/SoC specific compatible strings.
Add 'Reviewed-by: Rob Herring <robh(a)kernel.org>'
- Patch 25
Remove '$ref' from the lantiq,data-rate-bps property. '-bps' is now
a standard suffix.
Changes v5 -> v6
- All patches
Remove 'Signed-off-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
These Sob were added by Christophe when he sent the v4 while I was
on vacation.
https://lore.kernel.org/linux-kernel/992a2b31-e21f-eee3-8bfc-a65b69fe5bd7@c…
- Patch 6, 7
Add 'Acked-by: Conor Dooley <conor.dooley(a)microchip.com>'
Add 'Acked-by: Rob Herring <robh(a)kernel.org>'
- Patch 8
Add a constraint on fsl,framer.
- Patch 25
Fix clocks description (inconsistent capitalisation)
Use '8-bit' instead of '8bit'
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Removed patch 26 (patch applied)
- Patch 26 (patch 27 in v5)
Add 'Reviewed-by: Linus Walleij <linus.walleij(a)linaro.org>'
- Patch 27 (patch 28 in v5)
Move registers definition to .c file and remove .h file
Add 'select PINCONF' in Kconfig
Use dev_err_probe()
Add 'Reviewed-by: Linus Walleij <linus.walleij(a)linaro.org>'
- Patch 28 (patch 29 in v5)
Remove .h file
Changes v4 -> v5
- Patches 1 to 5
No changes
- Patch 6 (new in v5)
Fix QMC binding example
- Patch 7 (new in v5)
Add missing 'additionalProperties: false'
- Patch 8 (new in v5, replace v4 patch 6)
Add QMC HDLC properties in the QMC channel node
Renamed the 'framer' property to 'fsl,framer'
- Patch 9 (new in v5)
Add support for QMC child devices
- Patch 10 (patch 7 in v4)
No changes
- Patch 11 (patch 8 in v4)
Remove fsl,qmc-hdlc.yaml (no more existing file)
- Patches 12 to 22 (patches 9 to 19 in v4)
No changes
- Patch 23 (patch 20 in v4)
Remove unused variable initializations
Remove extra space
- Patch 24 (patch 21 in v4)
Improve Kconfig help text
Fix variable declaration (reverse xmas tree)
Fix typos and extra spaces
Fix documentation issues raised by 'kernel-doc -none'
Move of_node_put() and kfree() out of the mutex
Replace ida_simple_{get,remove}() by ida_{alloc,free}()
Support framer device-tree nodes without '#framer-cells' property
- Patch 25 (patch 22 in v4)
Fix $ref in the pinctrl subnode
Remove '#framer-cells' property
Add needed '|'
- Patch 26 (patch 23 in v4)
Fix a typo in the commit subject
- Patches 27, 28, 29 (patch 24, 25, 26 in v4)
No changes
- Patch 30 (patch 27 in v4)
Fix a typo in the commit log
- Patch 31 (patch 28 in v4)
Used 'fsl,framer' property name instead of 'framer'
Changes v3 -> v4
- Patch 21
Fixes build failure with CONFIG_MODULES
Changes v2 -> v3
- Patches 1, 2, 3, 4
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- New patch
Remove inline keyword from the existing registers accessors helpers
- Patch 6 (patches 5, 27 in v2)
Update the binding title
Squash patch 27
- Patch 7 (patch 6 in v2)
Remove the cast in netdev_to_qmc_hdlc()
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 8 (patch 7 in v2): No change
- Patches 9, 10 (patches 8, 9 in v2)
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 11 (patch 10 in v2)
Remove inline keyword from the introduced qmc_clrsetbits16() helper
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patches 12, 13, 14, 15, 16, 17, 18, 19, 20
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 21 (patch 20 in v2)
Remove unneeded framer NULL pointer check
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 22 (patch 21 in v2)
Change sclkr and sclkx clocks description
Remove the framer phandle property from the framer subnodes
(ie. from framer-codec nodes)
- Patch 23 (patch 22 in v2)
Initialize 'disabled' variable at declaration
Fix commit log
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 24 (patch 23 in v2)
Remove inline keyword from the existing registers accessors helpers
Use dev_warn_ratelimited() in default interrupt handler
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 25 (patch 24 in v2)
Replace #include "linux/bitfield.h" by #include <linux/bitfield.h>
Fold the pinctrl anonymous struct into the struct pef2256_pinctrl
Update commit log
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 26 (patch 25 in v2)
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 27 (patch 26 in v2)
Fix error message
Changed the ch.max computation in framer_dai_hw_rule_channels_by_format()
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
- Patch 28
Add 'Reviewed-by: Christophe Leroy <christophe.leroy(a)csgroup.eu>'
Changes v1 -> v2
- Patches 1, 2 (New in v2)
Fix __iomem addresses declaration
- Patch 19 (17 in v1)
Fix a compilation warning
- Patch 26 (24 in v1)
Fix a typo in Kconfig file
Fix issues raised by sparse (make C=1)
Herve Codina (30):
soc: fsl: cpm1: tsa: Fix __iomem addresses declaration
soc: fsl: cpm1: qmc: Fix __iomem addresses declaration
soc: fsl: cpm1: qmc: Fix rx channel reset
soc: fsl: cpm1: qmc: Extend the API to provide Rx status
soc: fsl: cpm1: qmc: Remove inline function specifiers
dt-bindings: soc: fsl: cpm_qe: cpm1-scc-qmc: Fix example property name
dt-bindings: soc: fsl: cpm_qe: cpm1-scc-qmc: Add
'additionalProperties: false' in child nodes
dt-bindings: soc: fsl: cpm_qe: cpm1-scc-qmc: Add support for QMC HDLC
soc: fsl: cpm1: qmc: Add support for child devices
net: wan: Add support for QMC HDLC
MAINTAINERS: Add the Freescale QMC HDLC driver entry
soc: fsl: cpm1: qmc: Introduce available timeslots masks
soc: fsl: cpm1: qmc: Rename qmc_setup_tsa* to qmc_init_tsa*
soc: fsl: cpm1: qmc: Introduce qmc_chan_setup_tsa*
soc: fsl: cpm1: qmc: Remove no more needed checks from
qmc_check_chans()
soc: fsl: cpm1: qmc: Check available timeslots in qmc_check_chans()
soc: fsl: cpm1: qmc: Add support for disabling channel TSA entries
soc: fsl: cpm1: qmc: Split Tx and Rx TSA entries setup
soc: fsl: cpm1: qmc: Introduce is_tsa_64rxtx flag
soc: fsl: cpm1: qmc: Handle timeslot entries at channel start() and
stop()
soc: fsl: cpm1: qmc: Remove timeslots handling from setup_chan()
soc: fsl: cpm1: qmc: Introduce functions to change timeslots at
runtime
wan: qmc_hdlc: Add runtime timeslots changes support
net: wan: Add framer framework support
dt-bindings: net: Add the Lantiq PEF2256 E1/T1/J1 framer
net: wan: framer: Add support for the Lantiq PEF2256 framer
pinctrl: Add support for the Lantic PEF2256 pinmux
MAINTAINERS: Add the Lantiq PEF2256 driver entry
ASoC: codecs: Add support for the framer codec
net: wan: fsl_qmc_hdlc: Add framer support
.../bindings/net/lantiq,pef2256.yaml | 213 +++++
.../soc/fsl/cpm_qe/fsl,cpm1-scc-qmc.yaml | 37 +-
MAINTAINERS | 15 +
drivers/net/wan/Kconfig | 14 +
drivers/net/wan/Makefile | 3 +
drivers/net/wan/framer/Kconfig | 41 +
drivers/net/wan/framer/Makefile | 7 +
drivers/net/wan/framer/framer-core.c | 882 ++++++++++++++++++
drivers/net/wan/framer/pef2256/Makefile | 8 +
drivers/net/wan/framer/pef2256/pef2256-regs.h | 250 +++++
drivers/net/wan/framer/pef2256/pef2256.c | 880 +++++++++++++++++
drivers/net/wan/fsl_qmc_hdlc.c | 820 ++++++++++++++++
drivers/pinctrl/Kconfig | 15 +
drivers/pinctrl/Makefile | 1 +
drivers/pinctrl/pinctrl-pef2256.c | 358 +++++++
drivers/soc/fsl/qe/qmc.c | 592 +++++++++---
drivers/soc/fsl/qe/tsa.c | 22 +-
include/linux/framer/framer-provider.h | 194 ++++
include/linux/framer/framer.h | 205 ++++
include/linux/framer/pef2256.h | 31 +
include/soc/fsl/qe/qmc.h | 27 +-
sound/soc/codecs/Kconfig | 15 +
sound/soc/codecs/Makefile | 2 +
sound/soc/codecs/framer-codec.c | 413 ++++++++
sound/soc/fsl/fsl_qmc_audio.c | 2 +-
25 files changed, 4907 insertions(+), 140 deletions(-)
create mode 100644 Documentation/devicetree/bindings/net/lantiq,pef2256.yaml
create mode 100644 drivers/net/wan/framer/Kconfig
create mode 100644 drivers/net/wan/framer/Makefile
create mode 100644 drivers/net/wan/framer/framer-core.c
create mode 100644 drivers/net/wan/framer/pef2256/Makefile
create mode 100644 drivers/net/wan/framer/pef2256/pef2256-regs.h
create mode 100644 drivers/net/wan/framer/pef2256/pef2256.c
create mode 100644 drivers/net/wan/fsl_qmc_hdlc.c
create mode 100644 drivers/pinctrl/pinctrl-pef2256.c
create mode 100644 include/linux/framer/framer-provider.h
create mode 100644 include/linux/framer/framer.h
create mode 100644 include/linux/framer/pef2256.h
create mode 100644 sound/soc/codecs/framer-codec.c
--
2.41.0
4
39
Re: [PATCH] patch_realtek: Splitting the UX3402 into two separate models.
by Matthew Pisoni 30 Oct '23
by Matthew Pisoni 30 Oct '23
30 Oct '23
Okay so how would I go about getting the following line added to the
patch_realtek file?
SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM",
ALC245_FIXUP_CS35L41_SPI_2)
It works on my machine I own that model I would just like it added as
other models have been so I don't need to continue to patch the kernel
module when it's already been effectively fixed for others.
This thread looked like you all were discussing modifications to that
file for this issue so I thought it might be a good place to start.
Thank you!
1
0