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_mark_last_busy(priv->dev); in stm32_vrefbuf_enable()
71 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_enable()
82 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_disable()
86 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_disable()
88 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_disable()
90 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_disable()
91 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_disable()
101 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_is_enabled()
105 ret = readl_relaxed(priv->base + STM32_VREFBUF_CSR) & STM32_ENVR; in stm32_vrefbuf_is_enabled()
107 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_is_enabled()
108 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_is_enabled()
120 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_set_voltage_sel()
124 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_set_voltage_sel()
126 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_set_voltage_sel()
128 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_set_voltage_sel()
129 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_set_voltage_sel()
140 ret = pm_runtime_resume_and_get(priv->dev); in stm32_vrefbuf_get_voltage_sel()
144 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_get_voltage_sel()
147 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_get_voltage_sel()
148 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_get_voltage_sel()
180 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in stm32_vrefbuf_probe()
182 return -ENOMEM; in stm32_vrefbuf_probe()
183 priv->dev = &pdev->dev; in stm32_vrefbuf_probe()
185 priv->base = devm_platform_ioremap_resource(pdev, 0); in stm32_vrefbuf_probe()
186 if (IS_ERR(priv->base)) in stm32_vrefbuf_probe()
187 return PTR_ERR(priv->base); in stm32_vrefbuf_probe()
189 priv->clk = devm_clk_get(&pdev->dev, NULL); in stm32_vrefbuf_probe()
190 if (IS_ERR(priv->clk)) in stm32_vrefbuf_probe()
191 return PTR_ERR(priv->clk); in stm32_vrefbuf_probe()
193 pm_runtime_get_noresume(&pdev->dev); in stm32_vrefbuf_probe()
194 pm_runtime_set_active(&pdev->dev); in stm32_vrefbuf_probe()
195 pm_runtime_set_autosuspend_delay(&pdev->dev, in stm32_vrefbuf_probe()
197 pm_runtime_use_autosuspend(&pdev->dev); in stm32_vrefbuf_probe()
198 pm_runtime_enable(&pdev->dev); in stm32_vrefbuf_probe()
200 ret = clk_prepare_enable(priv->clk); in stm32_vrefbuf_probe()
202 dev_err(&pdev->dev, "clk prepare failed with error %d\n", ret); in stm32_vrefbuf_probe()
206 config.dev = &pdev->dev; in stm32_vrefbuf_probe()
208 config.of_node = pdev->dev.of_node; in stm32_vrefbuf_probe()
209 config.init_data = of_get_regulator_init_data(&pdev->dev, in stm32_vrefbuf_probe()
210 pdev->dev.of_node, in stm32_vrefbuf_probe()
216 dev_err(&pdev->dev, "register failed with error %d\n", ret); in stm32_vrefbuf_probe()
221 pm_runtime_mark_last_busy(&pdev->dev); in stm32_vrefbuf_probe()
222 pm_runtime_put_autosuspend(&pdev->dev); in stm32_vrefbuf_probe()
227 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_probe()
229 pm_runtime_disable(&pdev->dev); in stm32_vrefbuf_probe()
230 pm_runtime_set_suspended(&pdev->dev); in stm32_vrefbuf_probe()
231 pm_runtime_put_noidle(&pdev->dev); in stm32_vrefbuf_probe()
241 pm_runtime_get_sync(&pdev->dev); in stm32_vrefbuf_remove()
243 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_remove()
244 pm_runtime_disable(&pdev->dev); in stm32_vrefbuf_remove()
245 pm_runtime_set_suspended(&pdev->dev); in stm32_vrefbuf_remove()
246 pm_runtime_put_noidle(&pdev->dev); in stm32_vrefbuf_remove()
256 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_runtime_suspend()
266 return clk_prepare_enable(priv->clk); in stm32_vrefbuf_runtime_resume()
278 { .compatible = "st,stm32-vrefbuf", },
287 .name = "stm32-vrefbuf",
296 MODULE_DESCRIPTION("STMicroelectronics STM32 VREFBUF driver");
297 MODULE_ALIAS("platform:stm32-vrefbuf");