mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 07:04:24 +00:00
spi: mediatek: Fix DEVAPC Violation at KO Remove
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>
This commit is contained in:
parent
bff6bef701
commit
0d10e90cee
1 changed files with 7 additions and 1 deletions
|
@ -1273,8 +1273,11 @@ 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);
|
||||||
|
|
||||||
|
@ -1283,6 +1286,9 @@ static int mtk_spi_remove(struct platform_device *pdev)
|
||||||
clk_unprepare(mdata->spi_hclk);
|
clk_unprepare(mdata->spi_hclk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pm_runtime_put_noidle(&pdev->dev);
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue