1 // SPDX-License-Identifier: GPL-2.0-only
3 * Regulator driver for the Richtek RT5033
5 * Copyright (C) 2014 Samsung Electronics, Co., Ltd.
6 * Author: Beomho Seo <beomho.seo@samsung.com>
9 #include <linux/module.h>
10 #include <linux/platform_device.h>
11 #include <linux/regulator/driver.h>
12 #include <linux/mfd/rt5033.h>
13 #include <linux/mfd/rt5033-private.h>
14 #include <linux/regulator/of_regulator.h>
16 static const struct regulator_ops rt5033_safe_ldo_ops
= {
17 .is_enabled
= regulator_is_enabled_regmap
,
18 .enable
= regulator_enable_regmap
,
19 .disable
= regulator_disable_regmap
,
20 .list_voltage
= regulator_list_voltage_linear
,
23 static const struct regulator_ops rt5033_buck_ops
= {
24 .is_enabled
= regulator_is_enabled_regmap
,
25 .enable
= regulator_enable_regmap
,
26 .disable
= regulator_disable_regmap
,
27 .list_voltage
= regulator_list_voltage_linear
,
28 .map_voltage
= regulator_map_voltage_linear
,
29 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
30 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
33 static const struct regulator_desc rt5033_supported_regulators
[] = {
36 .of_match
= of_match_ptr("BUCK"),
37 .regulators_node
= of_match_ptr("regulators"),
39 .ops
= &rt5033_buck_ops
,
40 .type
= REGULATOR_VOLTAGE
,
42 .n_voltages
= RT5033_REGULATOR_BUCK_VOLTAGE_STEP_NUM
,
43 .min_uV
= RT5033_REGULATOR_BUCK_VOLTAGE_MIN
,
44 .uV_step
= RT5033_REGULATOR_BUCK_VOLTAGE_STEP
,
45 .enable_reg
= RT5033_REG_CTRL
,
46 .enable_mask
= RT5033_CTRL_EN_BUCK_MASK
,
47 .vsel_reg
= RT5033_REG_BUCK_CTRL
,
48 .vsel_mask
= RT5033_BUCK_CTRL_MASK
,
52 .of_match
= of_match_ptr("LDO"),
53 .regulators_node
= of_match_ptr("regulators"),
55 .ops
= &rt5033_buck_ops
,
56 .type
= REGULATOR_VOLTAGE
,
58 .n_voltages
= RT5033_REGULATOR_LDO_VOLTAGE_STEP_NUM
,
59 .min_uV
= RT5033_REGULATOR_LDO_VOLTAGE_MIN
,
60 .uV_step
= RT5033_REGULATOR_LDO_VOLTAGE_STEP
,
61 .enable_reg
= RT5033_REG_CTRL
,
62 .enable_mask
= RT5033_CTRL_EN_LDO_MASK
,
63 .vsel_reg
= RT5033_REG_LDO_CTRL
,
64 .vsel_mask
= RT5033_LDO_CTRL_MASK
,
68 .of_match
= of_match_ptr("SAFE_LDO"),
69 .regulators_node
= of_match_ptr("regulators"),
70 .id
= RT5033_SAFE_LDO
,
71 .ops
= &rt5033_safe_ldo_ops
,
72 .type
= REGULATOR_VOLTAGE
,
75 .min_uV
= RT5033_REGULATOR_SAFE_LDO_VOLTAGE
,
76 .enable_reg
= RT5033_REG_CTRL
,
77 .enable_mask
= RT5033_CTRL_EN_SAFE_LDO_MASK
,
81 static int rt5033_regulator_probe(struct platform_device
*pdev
)
83 struct rt5033_dev
*rt5033
= dev_get_drvdata(pdev
->dev
.parent
);
85 struct regulator_config config
= {};
87 config
.dev
= rt5033
->dev
;
88 config
.driver_data
= rt5033
;
90 for (i
= 0; i
< ARRAY_SIZE(rt5033_supported_regulators
); i
++) {
91 struct regulator_dev
*regulator
;
93 config
.regmap
= rt5033
->regmap
;
95 regulator
= devm_regulator_register(&pdev
->dev
,
96 &rt5033_supported_regulators
[i
], &config
);
97 if (IS_ERR(regulator
)) {
98 ret
= PTR_ERR(regulator
);
100 "Regulator init failed %d: with error: %d\n",
109 static const struct platform_device_id rt5033_regulator_id
[] = {
110 { "rt5033-regulator", },
113 MODULE_DEVICE_TABLE(platform
, rt5033_regulator_id
);
115 static struct platform_driver rt5033_regulator_driver
= {
117 .name
= "rt5033-regulator",
119 .probe
= rt5033_regulator_probe
,
120 .id_table
= rt5033_regulator_id
,
122 module_platform_driver(rt5033_regulator_driver
);
124 MODULE_DESCRIPTION("Richtek RT5033 Regulator driver");
125 MODULE_AUTHOR("Beomho Seo <beomho.seo@samsung.com>");
126 MODULE_LICENSE("GPL");