summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/soundwire/swr-wcd-ctrl.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/soundwire/swr-wcd-ctrl.c b/drivers/soundwire/swr-wcd-ctrl.c
index 14d28117edc7..e4424359c692 100644
--- a/drivers/soundwire/swr-wcd-ctrl.c
+++ b/drivers/soundwire/swr-wcd-ctrl.c
@@ -779,11 +779,14 @@ static int swrm_disconnect_port(struct swr_master *master,
struct swr_port_info *port;
struct swrm_mports *mport;
struct list_head *ptr, *next;
- u8 bank;
+ u8 bank, active_bank;
int ret = 0;
u8 mport_id = 0;
int port_type = 0;
struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master);
+ u32 reg[SWRM_MAX_PORT_REG];
+ u32 val[SWRM_MAX_PORT_REG];
+ int len = 0;
if (!swrm) {
dev_err(&master->dev,
@@ -798,6 +801,7 @@ static int swrm_disconnect_port(struct swr_master *master,
}
mutex_lock(&swrm->mlock);
bank = get_inactive_bank_num(swrm);
+ active_bank = bank ? 0 : 1;
for (i = 0; i < portinfo->num_port; i++) {
ret = swrm_get_master_port(&mport_id,
portinfo->port_id[i]);
@@ -824,6 +828,12 @@ static int swrm_disconnect_port(struct swr_master *master,
0);
swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_id, 0x00,
SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank));
+ reg[len] = SWRM_DP_PORT_CTRL_BANK((mport_id+1), active_bank);
+ val[len++] = 0;
+ reg[len] = SWRM_CMD_FIFO_WR_CMD;
+ val[len++] = SWR_REG_VAL_PACK(0x00, port->dev_id, 0x00,
+ SWRS_DP_CHANNEL_ENABLE_BANK(port_type,
+ active_bank));
list_for_each_safe(ptr, next, &swrm->mport_list) {
mport = list_entry(ptr, struct swrm_mports, list);
if (mport->id == mport_id) {
@@ -833,6 +843,7 @@ static int swrm_disconnect_port(struct swr_master *master,
}
}
enable_bank_switch(swrm, bank, SWR_MAX_ROW, SWR_MAX_COL);
+ swrm->bulk_write(swrm->handle, reg, val, len);
if (master->num_port >= SWR_MSTR_PORT_LEN)
master->num_port = SWR_MSTR_PORT_LEN;