mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 06:50:37 +00:00
soc: samsung: usi: add a routine for unconfiguring the ip
Add a devm_add_action_or_reset() routine for unconfiguring the USI IP block whenever the device gets removed. Signed-off-by: Ivaylo Ivanov <ivo.ivanov.ivanov1@gmail.com> Link: https://lore.kernel.org/r/20250204172803.3425496-3-ivo.ivanov.ivanov1@gmail.com Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
This commit is contained in:
parent
648d2852ea
commit
11e77776b5
@ -174,6 +174,30 @@ static int exynos_usi_configure(struct exynos_usi *usi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void exynos_usi_unconfigure(void *data)
|
||||
{
|
||||
struct exynos_usi *usi = data;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
ret = clk_bulk_prepare_enable(usi->data->num_clks, usi->clks);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
/* Make sure that we've stopped providing the clock to USI IP */
|
||||
val = readl(usi->regs + USI_OPTION);
|
||||
val &= ~USI_OPTION_CLKREQ_ON;
|
||||
val |= ~USI_OPTION_CLKSTOP_ON;
|
||||
writel(val, usi->regs + USI_OPTION);
|
||||
|
||||
/* Set USI block state to reset */
|
||||
val = readl(usi->regs + USI_CON);
|
||||
val |= USI_CON_RESET;
|
||||
writel(val, usi->regs + USI_CON);
|
||||
|
||||
clk_bulk_disable_unprepare(usi->data->num_clks, usi->clks);
|
||||
}
|
||||
|
||||
static int exynos_usi_parse_dt(struct device_node *np, struct exynos_usi *usi)
|
||||
{
|
||||
int ret;
|
||||
@ -251,6 +275,10 @@ static int exynos_usi_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(&pdev->dev, exynos_usi_unconfigure, usi);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make it possible to embed protocol nodes into USI np */
|
||||
return of_platform_populate(np, NULL, NULL, dev);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user