soc: swr-mstr: Store and compare dev_addr along with dev_num

-> If enumeration is changed runtime, dev_num gets changed
-> so it might result in different dev_num for same device
-> between swrm_connect_port and swr_disconnect_port while powering
up and down of widget
-> This results in not emptying the port_req list, hence swrm not
going to suspend state
-> This results into adsp not going to sleep state

Change-Id: I80326a35f0cac7f7be30cbbee119a8ba247a0f76
This commit is contained in:
Shalini Manjunatha committed 2022-09-14 10:51:38 +05:30
1 parent 54fca86eb6
commit 09aa948bc6
3 files changed
+14 -4

No files matched your search

+3
View File
@@ -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;
};
/*
+5
View File
@@ -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];
+6 -4
View File
@@ -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>
@@ -1108,14 +1109,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;
@@ -1641,7 +1642,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],
@@ -1653,6 +1654,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];
@@ -1729,7 +1731,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",