soc: swr-mstr: Fix headset detect issue due to master.num_dev not updated

Headset is not detected sometimes due to master.num_dev not being
updated when we call GET_ENUM_SLAVE_STATUS as get_logical address
may not have been called. Also enable slave irq only when
swr wokeup from clk stop and not when master is already up.
This will prevent valid irq to be discarded as spurious irq.

Change-Id: I00284e9340668c853d0bd604fe66801118982780
Signed-off-by: Vatsal Bucha <vbucha@codeaurora.org>
This commit is contained in:
Vatsal Bucha
2020-08-14 13:54:10 +05:30
parent 4e3e8f9ffd
commit 1bd0eed253

View File

@@ -2066,20 +2066,21 @@ handle_irq:
case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED: case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED:
break; break;
case SWRM_INTERRUPT_STATUS_EXT_CLK_STOP_WAKEUP: case SWRM_INTERRUPT_STATUS_EXT_CLK_STOP_WAKEUP:
if (swrm->state == SWR_MSTR_UP) if (swrm->state == SWR_MSTR_UP) {
dev_dbg(swrm->dev, dev_dbg(swrm->dev,
"%s:SWR Master is already up\n", "%s:SWR Master is already up\n",
__func__); __func__);
else } else {
dev_err_ratelimited(swrm->dev, dev_err_ratelimited(swrm->dev,
"%s: SWR wokeup during clock stop\n", "%s: SWR wokeup during clock stop\n",
__func__); __func__);
/* It might be possible the slave device gets reset /* It might be possible the slave device gets
* and slave interrupt gets missed. So re-enable * reset and slave interrupt gets missed. So
* Host IRQ and process slave pending * re-enable Host IRQ and process slave pending
* interrupts, if any. * interrupts, if any.
*/ */
swrm_enable_slave_irq(swrm); swrm_enable_slave_irq(swrm);
}
break; break;
default: default:
dev_err_ratelimited(swrm->dev, dev_err_ratelimited(swrm->dev,
@@ -2574,6 +2575,8 @@ static int swrm_probe(struct platform_device *pdev)
SWRM_NUM_AUTO_ENUM_SLAVES); SWRM_NUM_AUTO_ENUM_SLAVES);
ret = -EINVAL; ret = -EINVAL;
goto err_pdata_fail; goto err_pdata_fail;
} else {
swrm->master.num_dev = swrm->num_dev;
} }
} }