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:
1 parent
54fca86eb6
commit
09aa948bc6
3 files changed
+14
-4
No files matched your search
@@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user