Lines Matching +full:stm32 +full:- +full:vrefbuf

1 // SPDX-License-Identifier: GPL-2.0-only
19 /* STM32 VREFBUF registers */
22 /* STM32 VREFBUF CSR bitfields */
47 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_enable()
51 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
53 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
56 * Vrefbuf startup time depends on external capacitor: wait here for in stm32_vrefbuf_enable()
61 ret = readl_poll_timeout(priv->base + STM32_VREFBUF_CSR, val, in stm32_vrefbuf_enable()
64 dev_err(&rdev->dev, "stm32 vrefbuf timed out!\n"); in stm32_vrefbuf_enable()
65 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
67 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
70 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_enable()
81 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_disable()
85 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_disable()
87 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_disable()
89 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_disable()
99 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_is_enabled()
103 ret = readl_relaxed(priv->base + STM32_VREFBUF_CSR) & STM32_ENVR; in stm32_vrefbuf_is_enabled()
105 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_is_enabled()
117 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_set_voltage_sel()
121 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_set_voltage_sel()
123 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_set_voltage_sel()
125 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_set_voltage_sel()
136 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_get_voltage_sel()
140 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_get_voltage_sel()
143 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_get_voltage_sel()
175 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in stm32_vrefbuf_probe()
177 return -ENOMEM; in stm32_vrefbuf_probe()
178 priv->dev = &pdev->dev; in stm32_vrefbuf_probe()
180 priv->base = devm_platform_ioremap_resource(pdev, 0); in stm32_vrefbuf_probe()
181 if (IS_ERR(priv->base)) in stm32_vrefbuf_probe()
182 return PTR_ERR(priv->base); in stm32_vrefbuf_probe()
184 priv->clk = devm_clk_get(&pdev->dev, NULL); in stm32_vrefbuf_probe()
185 if (IS_ERR(priv->clk)) in stm32_vrefbuf_probe()
186 return PTR_ERR(priv->clk); in stm32_vrefbuf_probe()
188 pm_runtime_get_noresume(&pdev->dev); in stm32_vrefbuf_probe()
189 pm_runtime_set_active(&pdev->dev); in stm32_vrefbuf_probe()
190 pm_runtime_set_autosuspend_delay(&pdev->dev, in stm32_vrefbuf_probe()
192 pm_runtime_use_autosuspend(&pdev->dev); in stm32_vrefbuf_probe()
193 pm_runtime_enable(&pdev->dev); in stm32_vrefbuf_probe()
195 ret = clk_prepare_enable(priv->clk); in stm32_vrefbuf_probe()
197 dev_err(&pdev->dev, "clk prepare failed with error %d\n", ret); in stm32_vrefbuf_probe()
201 config.dev = &pdev->dev; in stm32_vrefbuf_probe()
203 config.of_node = pdev->dev.of_node; in stm32_vrefbuf_probe()
204 config.init_data = of_get_regulator_init_data(&pdev->dev, in stm32_vrefbuf_probe()
205 pdev->dev.of_node, in stm32_vrefbuf_probe()
208 rdev = regulator_register(&pdev->dev, &stm32_vrefbuf_regu, &config); in stm32_vrefbuf_probe()
211 dev_err(&pdev->dev, "register failed with error %d\n", ret); in stm32_vrefbuf_probe()
216 pm_runtime_put_autosuspend(&pdev->dev); in stm32_vrefbuf_probe()
221 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_probe()
223 pm_runtime_disable(&pdev->dev); in stm32_vrefbuf_probe()
224 pm_runtime_set_suspended(&pdev->dev); in stm32_vrefbuf_probe()
225 pm_runtime_put_noidle(&pdev->dev); in stm32_vrefbuf_probe()
235 pm_runtime_get_sync(&pdev->dev); in stm32_vrefbuf_remove()
237 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_remove()
238 pm_runtime_disable(&pdev->dev); in stm32_vrefbuf_remove()
239 pm_runtime_set_suspended(&pdev->dev); in stm32_vrefbuf_remove()
240 pm_runtime_put_noidle(&pdev->dev); in stm32_vrefbuf_remove()
248 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_runtime_suspend()
258 return clk_prepare_enable(priv->clk); in stm32_vrefbuf_runtime_resume()
270 { .compatible = "st,stm32-vrefbuf", },
279 .name = "stm32-vrefbuf",
289 MODULE_DESCRIPTION("STMicroelectronics STM32 VREFBUF driver");
290 MODULE_ALIAS("platform:stm32-vrefbuf");