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_get_sync(priv->dev); in stm32_vrefbuf_enable()
49 pm_runtime_put_noidle(priv->dev); in stm32_vrefbuf_enable()
53 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
55 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
58 * Vrefbuf startup time depends on external capacitor: wait here for in stm32_vrefbuf_enable()
63 ret = readl_poll_timeout(priv->base + STM32_VREFBUF_CSR, val, in stm32_vrefbuf_enable()
66 dev_err(&rdev->dev, "stm32 vrefbuf timed out!\n"); in stm32_vrefbuf_enable()
67 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
69 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_enable()
72 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_enable()
73 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_enable()
84 ret = pm_runtime_get_sync(priv->dev); in stm32_vrefbuf_disable()
86 pm_runtime_put_noidle(priv->dev); in stm32_vrefbuf_disable()
90 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_disable()
92 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_disable()
94 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_disable()
95 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_disable()
105 ret = pm_runtime_get_sync(priv->dev); in stm32_vrefbuf_is_enabled()
107 pm_runtime_put_noidle(priv->dev); in stm32_vrefbuf_is_enabled()
111 ret = readl_relaxed(priv->base + STM32_VREFBUF_CSR) & STM32_ENVR; in stm32_vrefbuf_is_enabled()
113 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_is_enabled()
114 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_is_enabled()
126 ret = pm_runtime_get_sync(priv->dev); in stm32_vrefbuf_set_voltage_sel()
128 pm_runtime_put_noidle(priv->dev); in stm32_vrefbuf_set_voltage_sel()
132 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_set_voltage_sel()
134 writel_relaxed(val, priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_set_voltage_sel()
136 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_set_voltage_sel()
137 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_set_voltage_sel()
148 ret = pm_runtime_get_sync(priv->dev); in stm32_vrefbuf_get_voltage_sel()
150 pm_runtime_put_noidle(priv->dev); in stm32_vrefbuf_get_voltage_sel()
154 val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); in stm32_vrefbuf_get_voltage_sel()
157 pm_runtime_mark_last_busy(priv->dev); in stm32_vrefbuf_get_voltage_sel()
158 pm_runtime_put_autosuspend(priv->dev); in stm32_vrefbuf_get_voltage_sel()
190 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in stm32_vrefbuf_probe()
192 return -ENOMEM; in stm32_vrefbuf_probe()
193 priv->dev = &pdev->dev; in stm32_vrefbuf_probe()
195 priv->base = devm_platform_ioremap_resource(pdev, 0); in stm32_vrefbuf_probe()
196 if (IS_ERR(priv->base)) in stm32_vrefbuf_probe()
197 return PTR_ERR(priv->base); in stm32_vrefbuf_probe()
199 priv->clk = devm_clk_get(&pdev->dev, NULL); in stm32_vrefbuf_probe()
200 if (IS_ERR(priv->clk)) in stm32_vrefbuf_probe()
201 return PTR_ERR(priv->clk); in stm32_vrefbuf_probe()
203 pm_runtime_get_noresume(&pdev->dev); in stm32_vrefbuf_probe()
204 pm_runtime_set_active(&pdev->dev); in stm32_vrefbuf_probe()
205 pm_runtime_set_autosuspend_delay(&pdev->dev, in stm32_vrefbuf_probe()
207 pm_runtime_use_autosuspend(&pdev->dev); in stm32_vrefbuf_probe()
208 pm_runtime_enable(&pdev->dev); in stm32_vrefbuf_probe()
210 ret = clk_prepare_enable(priv->clk); in stm32_vrefbuf_probe()
212 dev_err(&pdev->dev, "clk prepare failed with error %d\n", ret); in stm32_vrefbuf_probe()
216 config.dev = &pdev->dev; in stm32_vrefbuf_probe()
218 config.of_node = pdev->dev.of_node; in stm32_vrefbuf_probe()
219 config.init_data = of_get_regulator_init_data(&pdev->dev, in stm32_vrefbuf_probe()
220 pdev->dev.of_node, in stm32_vrefbuf_probe()
226 dev_err(&pdev->dev, "register failed with error %d\n", ret); in stm32_vrefbuf_probe()
231 pm_runtime_mark_last_busy(&pdev->dev); in stm32_vrefbuf_probe()
232 pm_runtime_put_autosuspend(&pdev->dev); in stm32_vrefbuf_probe()
237 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_probe()
239 pm_runtime_disable(&pdev->dev); in stm32_vrefbuf_probe()
240 pm_runtime_set_suspended(&pdev->dev); in stm32_vrefbuf_probe()
241 pm_runtime_put_noidle(&pdev->dev); in stm32_vrefbuf_probe()
251 pm_runtime_get_sync(&pdev->dev); in stm32_vrefbuf_remove()
253 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_remove()
254 pm_runtime_disable(&pdev->dev); in stm32_vrefbuf_remove()
255 pm_runtime_set_suspended(&pdev->dev); in stm32_vrefbuf_remove()
256 pm_runtime_put_noidle(&pdev->dev); in stm32_vrefbuf_remove()
266 clk_disable_unprepare(priv->clk); in stm32_vrefbuf_runtime_suspend()
276 return clk_prepare_enable(priv->clk); in stm32_vrefbuf_runtime_resume()
288 { .compatible = "st,stm32-vrefbuf", },
297 .name = "stm32-vrefbuf",
306 MODULE_DESCRIPTION("STMicroelectronics STM32 VREFBUF driver");
307 MODULE_ALIAS("platform:stm32-vrefbuf");