From b4c7c680ef759d21e727dabf68f2797523836168 Mon Sep 17 00:00:00 2001 From: Ramprasad Katkam Date: Wed, 19 Dec 2018 18:58:36 +0530 Subject: [PATCH 1/2] soc: swr-mstr: switch to bank 0 before ssr/pdr Do bank switch to default bank during ssr/pdr as master is reset to default state. This avoids wrong state of swr master during pdr. Change-Id: I86a7bd53d471e9d864d25dcb84ad8fe12151cc0d Signed-off-by: Ramprasad Katkam --- soc/swr-mstr-ctrl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index ddf04ab4c2d3..f2fa733e363b 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -493,9 +493,9 @@ static int swrm_cmd_fifo_wr_cmd(struct swr_mstr_ctrl *swrm, u8 cmd_data, dev_dbg(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x,wcmd_id: 0x%x, \ dev_num: 0x%x, cmd_data: 0x%x\n", __func__, reg_addr, cmd_id, swrm->wcmd_id,dev_addr, cmd_data); + swr_master_write(swrm, SWRM_CMD_FIFO_WR_CMD, val); /* wait for FIFO WR command to complete to avoid overflow */ usleep_range(250, 255); - swr_master_write(swrm, SWRM_CMD_FIFO_WR_CMD, val); if (cmd_id == 0xF) { /* * sleep for 10ms for MSM soundwire variant to allow broadcast @@ -2042,6 +2042,7 @@ static int swrm_runtime_resume(struct device *dev) if (swrm_clk_request(swrm, true)) goto exit; if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) { + enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL); list_for_each_entry(swr_dev, &mstr->devices, dev_list) { ret = swr_device_up(swr_dev); if (ret) { @@ -2096,6 +2097,7 @@ static int swrm_runtime_suspend(struct device *dev) goto exit; } if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) { + enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL); swrm_clk_pause(swrm); swr_master_write(swrm, SWRM_COMP_CFG_ADDR, 0x00); list_for_each_entry(swr_dev, &mstr->devices, dev_list) { From 44b7a9602b6f3efbe515278ede38c1f4cbb6fa36 Mon Sep 17 00:00:00 2001 From: Ramprasad Katkam Date: Thu, 20 Dec 2018 15:08:44 +0530 Subject: [PATCH 2/2] soc: swr-mstr: Hold suspend during hw wakeup interrupt Hold system suspend when hardware wakeup interrupt is received to resume soundwire master. Change-Id: I99a58aa7d28cfa514d72bacc8c6fc6e95fbe038a Signed-off-by: Ramprasad Katkam --- soc/swr-mstr-ctrl.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index f2fa733e363b..0d81239707b6 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -1430,12 +1430,17 @@ static irqreturn_t swrm_wakeup_interrupt(int irq, void *dev) return ret; } mutex_unlock(&swrm->devlock); + if (unlikely(swrm_lock_sleep(swrm) == false)) { + dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); + goto exit; + } if (swrm->wake_irq > 0) disable_irq_nosync(swrm->wake_irq); pm_runtime_get_sync(swrm->dev); pm_runtime_mark_last_busy(swrm->dev); pm_runtime_put_autosuspend(swrm->dev); - + swrm_unlock_sleep(swrm); +exit: return ret; }