summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilson Sung <wilsonsung@google.com>2022-12-20 16:27:55 +0800
committerWilson Sung <wilsonsung@google.com>2022-12-20 16:27:55 +0800
commit8540cb6038deabc130f3934095a97e731147516f (patch)
treebeaabcb6e9be6f0db6ee956e73f81a1599694d00
parent5729b2f716350d9a63f12b1f33db8f4ce5a7815f (diff)
parentd5d266316c190b5f99df178621ac6d5493bc6fa8 (diff)
downloadmsm-extra-8540cb6038deabc130f3934095a97e731147516f.tar.gz
Merge branch 'LA.UM.9.12.C10.11.00.00.840.478' via branch 'qcom-msm-4.19-7250-audio-drivers.lnx.4.0.r3' into android-msm-pixel-4.19
Change-Id: I4b5bfeacc3b1799d29f54922654f330242dfc636
-rw-r--r--include/soc/soundwire.h3
-rw-r--r--soc/soundwire.c5
-rw-r--r--soc/swr-mstr-ctrl.c10
3 files changed, 14 insertions, 4 deletions
diff --git a/include/soc/soundwire.h b/include/soc/soundwire.h
index 3e61da12..7b69d1a8 100644
--- a/include/soc/soundwire.h
+++ b/include/soc/soundwire.h
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef _LINUX_SOUNDWIRE_H
@@ -83,6 +84,7 @@ struct swr_port_info {
u8 req_ch;
u8 num_ch;
u32 ch_rate;
+ u64 dev_addr;
};
/*
@@ -107,6 +109,7 @@ struct swr_params {
u32 ch_rate[SWR_MAX_DEV_PORT_NUM];
u8 ch_en[SWR_MAX_DEV_PORT_NUM];
u8 port_type[SWR_MAX_DEV_PORT_NUM];
+ u64 dev_addr;
};
/*
diff --git a/soc/soundwire.c b/soc/soundwire.c
index 2aa3ba4b..f3688b01 100644
--- a/soc/soundwire.c
+++ b/soc/soundwire.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/kernel.h>
@@ -363,6 +364,8 @@ int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port,
txn->tid = i;
txn->dev_num = dev->dev_num;
+ //assign device addr also, as dev_num can dynamically change during device enumeration
+ txn->dev_addr = dev->addr;
txn->num_port = num_port;
for (i = 0; i < num_port; i++) {
txn->port_id[i] = port_id[i];
@@ -442,6 +445,8 @@ int swr_disconnect_port(struct swr_device *dev, u8 *port_id, u8 num_port,
txn->tid = i;
txn->dev_num = dev->dev_num;
+ //assign device address as dev_num can change dynamically during device enumeration
+ txn->dev_addr = dev->addr;
txn->num_port = num_port;
for (i = 0; i < num_port; i++) {
txn->port_id[i] = port_id[i];
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index 4cdb3f50..09d382a1 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/irq.h>
@@ -1098,14 +1099,14 @@ static void swrm_switch_frame_shape(struct swr_mstr_ctrl *swrm, int mclk_freq)
}
static struct swr_port_info *swrm_get_port_req(struct swrm_mports *mport,
- u8 slv_port, u8 dev_num)
+ u8 slv_port, u8 dev_num, u64 dev_addr)
{
struct swr_port_info *port_req = NULL;
list_for_each_entry(port_req, &mport->port_req_list, list) {
/* Store dev_id instead of dev_num if enumeration is changed run_time */
if ((port_req->slave_port_id == slv_port)
- && (port_req->dev_num == dev_num))
+ && ((port_req->dev_num == dev_num) || (port_req->dev_addr == dev_addr)))
return port_req;
}
return NULL;
@@ -1631,7 +1632,7 @@ static int swrm_connect_port(struct swr_master *master,
mport = &(swrm->mport_cfg[mstr_port_id]);
/* get port req */
port_req = swrm_get_port_req(mport, portinfo->port_id[i],
- portinfo->dev_num);
+ portinfo->dev_num, portinfo->dev_addr);
if (!port_req) {
dev_dbg(&master->dev, "%s: new req:port id %d dev %d\n",
__func__, portinfo->port_id[i],
@@ -1643,6 +1644,7 @@ static int swrm_connect_port(struct swr_master *master,
goto mem_fail;
}
port_req->dev_num = portinfo->dev_num;
+ port_req->dev_addr = portinfo->dev_addr;
port_req->slave_port_id = portinfo->port_id[i];
port_req->num_ch = portinfo->num_ch[i];
port_req->ch_rate = portinfo->ch_rate[i];
@@ -1719,7 +1721,7 @@ static int swrm_disconnect_port(struct swr_master *master,
mport = &(swrm->mport_cfg[mstr_port_id]);
/* get port req */
port_req = swrm_get_port_req(mport, portinfo->port_id[i],
- portinfo->dev_num);
+ portinfo->dev_num, portinfo->dev_addr);
if (!port_req) {
dev_err(&master->dev, "%s:port not enabled : port %d\n",