Merge "soc: swr-mstr-ctrl: add new lock to sync runtime_resume and runtime_suspend"
This commit is contained in:
commit
efbb81f9ad
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
@ -1738,6 +1738,8 @@ static int swrm_slvdev_datapath_control(struct swr_master *master, bool enable)
|
|||||||
dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n",
|
dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n",
|
||||||
__func__);
|
__func__);
|
||||||
pm_runtime_mark_last_busy(swrm->dev);
|
pm_runtime_mark_last_busy(swrm->dev);
|
||||||
|
if (!enable)
|
||||||
|
pm_runtime_set_autosuspend_delay(swrm->dev, 80);
|
||||||
pm_runtime_put_autosuspend(swrm->dev);
|
pm_runtime_put_autosuspend(swrm->dev);
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
@ -2848,6 +2850,7 @@ static int swrm_probe(struct platform_device *pdev)
|
|||||||
mutex_init(&swrm->clklock);
|
mutex_init(&swrm->clklock);
|
||||||
mutex_init(&swrm->devlock);
|
mutex_init(&swrm->devlock);
|
||||||
mutex_init(&swrm->pm_lock);
|
mutex_init(&swrm->pm_lock);
|
||||||
|
mutex_init(&swrm->runtime_lock);
|
||||||
swrm->wlock_holders = 0;
|
swrm->wlock_holders = 0;
|
||||||
swrm->pm_state = SWRM_PM_SLEEPABLE;
|
swrm->pm_state = SWRM_PM_SLEEPABLE;
|
||||||
init_waitqueue_head(&swrm->pm_wq);
|
init_waitqueue_head(&swrm->pm_wq);
|
||||||
@ -3020,6 +3023,7 @@ err_irq_fail:
|
|||||||
mutex_destroy(&swrm->clklock);
|
mutex_destroy(&swrm->clklock);
|
||||||
mutex_destroy(&swrm->pm_lock);
|
mutex_destroy(&swrm->pm_lock);
|
||||||
pm_qos_remove_request(&swrm->pm_qos_req);
|
pm_qos_remove_request(&swrm->pm_qos_req);
|
||||||
|
mutex_destroy(&swrm->runtime_lock);
|
||||||
|
|
||||||
err_pdata_fail:
|
err_pdata_fail:
|
||||||
err_memory_fail:
|
err_memory_fail:
|
||||||
@ -3059,6 +3063,7 @@ static int swrm_remove(struct platform_device *pdev)
|
|||||||
mutex_destroy(&swrm->force_down_lock);
|
mutex_destroy(&swrm->force_down_lock);
|
||||||
mutex_destroy(&swrm->pm_lock);
|
mutex_destroy(&swrm->pm_lock);
|
||||||
pm_qos_remove_request(&swrm->pm_qos_req);
|
pm_qos_remove_request(&swrm->pm_qos_req);
|
||||||
|
mutex_destroy(&swrm->runtime_lock);
|
||||||
devm_kfree(&pdev->dev, swrm);
|
devm_kfree(&pdev->dev, swrm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3090,6 +3095,7 @@ static int swrm_runtime_resume(struct device *dev)
|
|||||||
|
|
||||||
dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
|
dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
|
||||||
__func__, swrm->state);
|
__func__, swrm->state);
|
||||||
|
mutex_lock(&swrm->runtime_lock);
|
||||||
mutex_lock(&swrm->reslock);
|
mutex_lock(&swrm->reslock);
|
||||||
|
|
||||||
if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) {
|
if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) {
|
||||||
@ -3101,6 +3107,7 @@ static int swrm_runtime_resume(struct device *dev)
|
|||||||
if (swrm->req_clk_switch)
|
if (swrm->req_clk_switch)
|
||||||
swrm->req_clk_switch = false;
|
swrm->req_clk_switch = false;
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
|
mutex_unlock(&swrm->runtime_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
|
if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
|
||||||
@ -3118,6 +3125,7 @@ static int swrm_runtime_resume(struct device *dev)
|
|||||||
pr_err("%s: irq data is NULL\n",
|
pr_err("%s: irq data is NULL\n",
|
||||||
__func__);
|
__func__);
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
|
mutex_unlock(&swrm->runtime_lock);
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
}
|
}
|
||||||
mutex_lock(&swrm->irq_lock);
|
mutex_lock(&swrm->irq_lock);
|
||||||
@ -3209,6 +3217,7 @@ exit:
|
|||||||
if (swrm->req_clk_switch)
|
if (swrm->req_clk_switch)
|
||||||
swrm->req_clk_switch = false;
|
swrm->req_clk_switch = false;
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
|
mutex_unlock(&swrm->runtime_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -3230,6 +3239,7 @@ static int swrm_runtime_suspend(struct device *dev)
|
|||||||
swrm->state = SWR_MSTR_SSR;
|
swrm->state = SWR_MSTR_SSR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
mutex_lock(&swrm->runtime_lock);
|
||||||
mutex_lock(&swrm->reslock);
|
mutex_lock(&swrm->reslock);
|
||||||
mutex_lock(&swrm->force_down_lock);
|
mutex_lock(&swrm->force_down_lock);
|
||||||
current_state = swrm->state;
|
current_state = swrm->state;
|
||||||
@ -3327,6 +3337,10 @@ exit:
|
|||||||
if (!hw_core_err)
|
if (!hw_core_err)
|
||||||
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
|
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
|
mutex_unlock(&swrm->runtime_lock);
|
||||||
|
dev_dbg(dev, "%s: pm_runtime: suspend done state: %d\n",
|
||||||
|
__func__, swrm->state);
|
||||||
|
pm_runtime_set_autosuspend_delay(dev, auto_suspend_timer);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SWR_WCD_CTRL_H
|
#ifndef _SWR_WCD_CTRL_H
|
||||||
@ -134,6 +135,7 @@ struct swr_mstr_ctrl {
|
|||||||
struct mutex reslock;
|
struct mutex reslock;
|
||||||
struct mutex pm_lock;
|
struct mutex pm_lock;
|
||||||
struct mutex irq_lock;
|
struct mutex irq_lock;
|
||||||
|
struct mutex runtime_lock;
|
||||||
u32 swrm_base_reg;
|
u32 swrm_base_reg;
|
||||||
char __iomem *swrm_dig_base;
|
char __iomem *swrm_dig_base;
|
||||||
char __iomem *swrm_hctl_reg;
|
char __iomem *swrm_hctl_reg;
|
||||||
|
Loading…
Reference in New Issue
Block a user