2 * Copyright (C) STMicroelectronics 2017
4 * Author: Fabrice Gasnier <fabrice.gasnier@st.com>
6 * License terms: GNU General Public License (GPL), version 2
9 #include <linux/bitfield.h>
10 #include <linux/clk.h>
12 #include <linux/iopoll.h>
13 #include <linux/module.h>
14 #include <linux/of_device.h>
15 #include <linux/platform_device.h>
16 #include <linux/regulator/driver.h>
17 #include <linux/regulator/of_regulator.h>
18 #include <linux/pm_runtime.h>
20 /* STM32 VREFBUF registers */
21 #define STM32_VREFBUF_CSR 0x00
23 /* STM32 VREFBUF CSR bitfields */
24 #define STM32_VRS GENMASK(6, 4)
25 #define STM32_VRR BIT(3)
26 #define STM32_HIZ BIT(1)
27 #define STM32_ENVR BIT(0)
29 #define STM32_VREFBUF_AUTO_SUSPEND_DELAY_MS 10
31 struct stm32_vrefbuf
{
37 static const unsigned int stm32_vrefbuf_voltages
[] = {
38 /* Matches resp. VRS = 000b, 001b, 010b, 011b */
39 2500000, 2048000, 1800000, 1500000,
42 static int stm32_vrefbuf_enable(struct regulator_dev
*rdev
)
44 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
48 ret
= pm_runtime_get_sync(priv
->dev
);
50 pm_runtime_put_noidle(priv
->dev
);
54 val
= readl_relaxed(priv
->base
+ STM32_VREFBUF_CSR
);
55 val
= (val
& ~STM32_HIZ
) | STM32_ENVR
;
56 writel_relaxed(val
, priv
->base
+ STM32_VREFBUF_CSR
);
59 * Vrefbuf startup time depends on external capacitor: wait here for
60 * VRR to be set. That means output has reached expected value.
61 * ~650us sleep should be enough for caps up to 1.5uF. Use 10ms as
64 ret
= readl_poll_timeout(priv
->base
+ STM32_VREFBUF_CSR
, val
,
65 val
& STM32_VRR
, 650, 10000);
67 dev_err(&rdev
->dev
, "stm32 vrefbuf timed out!\n");
68 val
= readl_relaxed(priv
->base
+ STM32_VREFBUF_CSR
);
69 val
= (val
& ~STM32_ENVR
) | STM32_HIZ
;
70 writel_relaxed(val
, priv
->base
+ STM32_VREFBUF_CSR
);
73 pm_runtime_mark_last_busy(priv
->dev
);
74 pm_runtime_put_autosuspend(priv
->dev
);
79 static int stm32_vrefbuf_disable(struct regulator_dev
*rdev
)
81 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
85 ret
= pm_runtime_get_sync(priv
->dev
);
87 pm_runtime_put_noidle(priv
->dev
);
91 val
= readl_relaxed(priv
->base
+ STM32_VREFBUF_CSR
);
92 val
= (val
& ~STM32_ENVR
) | STM32_HIZ
;
93 writel_relaxed(val
, priv
->base
+ STM32_VREFBUF_CSR
);
95 pm_runtime_mark_last_busy(priv
->dev
);
96 pm_runtime_put_autosuspend(priv
->dev
);
101 static int stm32_vrefbuf_is_enabled(struct regulator_dev
*rdev
)
103 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
106 ret
= pm_runtime_get_sync(priv
->dev
);
108 pm_runtime_put_noidle(priv
->dev
);
112 ret
= readl_relaxed(priv
->base
+ STM32_VREFBUF_CSR
) & STM32_ENVR
;
114 pm_runtime_mark_last_busy(priv
->dev
);
115 pm_runtime_put_autosuspend(priv
->dev
);
120 static int stm32_vrefbuf_set_voltage_sel(struct regulator_dev
*rdev
,
123 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
127 ret
= pm_runtime_get_sync(priv
->dev
);
129 pm_runtime_put_noidle(priv
->dev
);
133 val
= readl_relaxed(priv
->base
+ STM32_VREFBUF_CSR
);
134 val
= (val
& ~STM32_VRS
) | FIELD_PREP(STM32_VRS
, sel
);
135 writel_relaxed(val
, priv
->base
+ STM32_VREFBUF_CSR
);
137 pm_runtime_mark_last_busy(priv
->dev
);
138 pm_runtime_put_autosuspend(priv
->dev
);
143 static int stm32_vrefbuf_get_voltage_sel(struct regulator_dev
*rdev
)
145 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
149 ret
= pm_runtime_get_sync(priv
->dev
);
151 pm_runtime_put_noidle(priv
->dev
);
155 val
= readl_relaxed(priv
->base
+ STM32_VREFBUF_CSR
);
156 ret
= FIELD_GET(STM32_VRS
, val
);
158 pm_runtime_mark_last_busy(priv
->dev
);
159 pm_runtime_put_autosuspend(priv
->dev
);
164 static const struct regulator_ops stm32_vrefbuf_volt_ops
= {
165 .enable
= stm32_vrefbuf_enable
,
166 .disable
= stm32_vrefbuf_disable
,
167 .is_enabled
= stm32_vrefbuf_is_enabled
,
168 .get_voltage_sel
= stm32_vrefbuf_get_voltage_sel
,
169 .set_voltage_sel
= stm32_vrefbuf_set_voltage_sel
,
170 .list_voltage
= regulator_list_voltage_table
,
173 static const struct regulator_desc stm32_vrefbuf_regu
= {
175 .supply_name
= "vdda",
176 .volt_table
= stm32_vrefbuf_voltages
,
177 .n_voltages
= ARRAY_SIZE(stm32_vrefbuf_voltages
),
178 .ops
= &stm32_vrefbuf_volt_ops
,
179 .type
= REGULATOR_VOLTAGE
,
180 .owner
= THIS_MODULE
,
183 static int stm32_vrefbuf_probe(struct platform_device
*pdev
)
185 struct resource
*res
;
186 struct stm32_vrefbuf
*priv
;
187 struct regulator_config config
= { };
188 struct regulator_dev
*rdev
;
191 priv
= devm_kzalloc(&pdev
->dev
, sizeof(*priv
), GFP_KERNEL
);
194 priv
->dev
= &pdev
->dev
;
196 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
197 priv
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
198 if (IS_ERR(priv
->base
))
199 return PTR_ERR(priv
->base
);
201 priv
->clk
= devm_clk_get(&pdev
->dev
, NULL
);
202 if (IS_ERR(priv
->clk
))
203 return PTR_ERR(priv
->clk
);
205 pm_runtime_get_noresume(&pdev
->dev
);
206 pm_runtime_set_active(&pdev
->dev
);
207 pm_runtime_set_autosuspend_delay(&pdev
->dev
,
208 STM32_VREFBUF_AUTO_SUSPEND_DELAY_MS
);
209 pm_runtime_use_autosuspend(&pdev
->dev
);
210 pm_runtime_enable(&pdev
->dev
);
212 ret
= clk_prepare_enable(priv
->clk
);
214 dev_err(&pdev
->dev
, "clk prepare failed with error %d\n", ret
);
218 config
.dev
= &pdev
->dev
;
219 config
.driver_data
= priv
;
220 config
.of_node
= pdev
->dev
.of_node
;
221 config
.init_data
= of_get_regulator_init_data(&pdev
->dev
,
223 &stm32_vrefbuf_regu
);
225 rdev
= regulator_register(&stm32_vrefbuf_regu
, &config
);
228 dev_err(&pdev
->dev
, "register failed with error %d\n", ret
);
231 platform_set_drvdata(pdev
, rdev
);
233 pm_runtime_mark_last_busy(&pdev
->dev
);
234 pm_runtime_put_autosuspend(&pdev
->dev
);
239 clk_disable_unprepare(priv
->clk
);
241 pm_runtime_disable(&pdev
->dev
);
242 pm_runtime_set_suspended(&pdev
->dev
);
243 pm_runtime_put_noidle(&pdev
->dev
);
248 static int stm32_vrefbuf_remove(struct platform_device
*pdev
)
250 struct regulator_dev
*rdev
= platform_get_drvdata(pdev
);
251 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
253 pm_runtime_get_sync(&pdev
->dev
);
254 regulator_unregister(rdev
);
255 clk_disable_unprepare(priv
->clk
);
256 pm_runtime_disable(&pdev
->dev
);
257 pm_runtime_set_suspended(&pdev
->dev
);
258 pm_runtime_put_noidle(&pdev
->dev
);
263 static int __maybe_unused
stm32_vrefbuf_runtime_suspend(struct device
*dev
)
265 struct regulator_dev
*rdev
= dev_get_drvdata(dev
);
266 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
268 clk_disable_unprepare(priv
->clk
);
273 static int __maybe_unused
stm32_vrefbuf_runtime_resume(struct device
*dev
)
275 struct regulator_dev
*rdev
= dev_get_drvdata(dev
);
276 struct stm32_vrefbuf
*priv
= rdev_get_drvdata(rdev
);
278 return clk_prepare_enable(priv
->clk
);
281 static const struct dev_pm_ops stm32_vrefbuf_pm_ops
= {
282 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
283 pm_runtime_force_resume
)
284 SET_RUNTIME_PM_OPS(stm32_vrefbuf_runtime_suspend
,
285 stm32_vrefbuf_runtime_resume
,
289 static const struct of_device_id stm32_vrefbuf_of_match
[] = {
290 { .compatible
= "st,stm32-vrefbuf", },
293 MODULE_DEVICE_TABLE(of
, stm32_vrefbuf_of_match
);
295 static struct platform_driver stm32_vrefbuf_driver
= {
296 .probe
= stm32_vrefbuf_probe
,
297 .remove
= stm32_vrefbuf_remove
,
299 .name
= "stm32-vrefbuf",
300 .of_match_table
= of_match_ptr(stm32_vrefbuf_of_match
),
301 .pm
= &stm32_vrefbuf_pm_ops
,
304 module_platform_driver(stm32_vrefbuf_driver
);
306 MODULE_LICENSE("GPL v2");
307 MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>");
308 MODULE_DESCRIPTION("STMicroelectronics STM32 VREFBUF driver");
309 MODULE_ALIAS("platform:stm32-vrefbuf");