From d17a0ca85e23ef1ae69ef336d296b1d5c67a02a6 Mon Sep 17 00:00:00 2001 From: Matthew Rice Date: Thu, 9 Jun 2022 10:39:28 -0700 Subject: [PATCH] soc: Fix PDR WSA auto-enumeration issue During PDR, WSA auto-enumeration is swapped (WSA2 gets enumerated before WSA1 unlike bootup). This causes offset1s to be swapped because dev_nums are swapped and are used to index into device tree data. Store dev_id during enumeration and use this instead of dev_num to pick out offset1 from device tree data. Change-Id: Ia98ba6554acf67055357625fc789065b60d7006b Signed-off-by: Matthew Rice --- soc/swr-mstr-ctrl.c | 5 +++-- soc/swr-mstr-ctrl.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index d88dab5132..118bd3a581 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -1400,7 +1400,7 @@ static void swrm_get_device_frame_shape(struct swr_mstr_ctrl *swrm, if (swrm->master_id == MASTER_ID_TX) { uc = swrm_get_uc(swrm->bus_clk); - port_id_offset = (port_req->dev_num - 1) * + port_id_offset = swrm->dev_mapping[port_req->dev_num] * SWR_MAX_DEV_PORT_NUM + port_req->slave_port_id; if (port_id_offset >= SWR_MAX_MSTR_PORT_NUM) @@ -1429,7 +1429,7 @@ static void swrm_get_device_frame_shape(struct swr_mstr_ctrl *swrm, } if (swrm->master_id == MASTER_ID_WSA) { uc = swrm_get_uc(swrm->bus_clk); - port_id_offset = (port_req->dev_num - 1) * + port_id_offset = swrm->dev_mapping[port_req->dev_num] * SWR_MAX_DEV_PORT_NUM + port_req->slave_port_id; if (port_id_offset >= SWR_MAX_MSTR_PORT_NUM || @@ -2464,6 +2464,7 @@ static int swrm_get_logical_dev_num(struct swr_master *mstr, u64 dev_id, if ((id & SWR_DEV_ID_MASK) == dev_id) { *dev_num = i; ret = 0; + swrm->dev_mapping[*dev_num] = dev_id; dev_info(swrm->dev, "%s: devnum %d assigned for dev %llx\n", __func__, i, diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h index f51c0c6ede..3e2db6f837 100644 --- a/soc/swr-mstr-ctrl.h +++ b/soc/swr-mstr-ctrl.h @@ -197,6 +197,7 @@ struct swr_mstr_ctrl { u32 is_always_on; bool clk_stop_wakeup; struct swr_port_params pp[SWR_UC_MAX][SWR_MAX_MSTR_PORT_NUM];/*max_devNum * max_ports 11 * 14 */ + u64 dev_mapping[SWR_MAX_DEV_NUM + 1]; /* Dev Num is 1-indexed */ #ifdef CONFIG_DEBUG_FS struct dentry *debugfs_swrm_dent; struct dentry *debugfs_peek;