spi: mediatek: Fix DEVAPC Violation at KO Remove
[ Upstream commit 0d10e90cee9eb57882b0f7e19fd699033722e226 ] A DEVAPC violation occurs when removing the module due to accessing HW registers without base clock. To fix this bug, the correct method is: 1. Call the runtime resume function to enable the clock; 2. Operate the registers to reset the HW; 3. Turn off the clocks and disable the device RPM mechanism. Signed-off-by: Zhichao Liu <zhichao.liu@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Link: https://lore.kernel.org/r/20221110072839.30961-1-zhichao.liu@mediatek.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d9f0107be1
commit
c3b818c91a
@@ -912,14 +912,20 @@ static int mtk_spi_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct spi_master *master = platform_get_drvdata(pdev);
|
struct spi_master *master = platform_get_drvdata(pdev);
|
||||||
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
||||||
|
int ret;
|
||||||
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
mtk_spi_reset(mdata);
|
mtk_spi_reset(mdata);
|
||||||
|
|
||||||
if (mdata->dev_comp->no_need_unprepare)
|
if (mdata->dev_comp->no_need_unprepare)
|
||||||
clk_unprepare(mdata->spi_clk);
|
clk_unprepare(mdata->spi_clk);
|
||||||
|
|
||||||
|
pm_runtime_put_noidle(&pdev->dev);
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user