xref: /OK3568_Linux_fs/kernel/drivers/regulator/rt5033-regulator.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Regulator driver for the Richtek RT5033
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2014 Samsung Electronics, Co., Ltd.
6*4882a593Smuzhiyun  * Author: Beomho Seo <beomho.seo@samsung.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/platform_device.h>
11*4882a593Smuzhiyun #include <linux/regulator/driver.h>
12*4882a593Smuzhiyun #include <linux/mfd/rt5033.h>
13*4882a593Smuzhiyun #include <linux/mfd/rt5033-private.h>
14*4882a593Smuzhiyun #include <linux/regulator/of_regulator.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun static const struct regulator_ops rt5033_safe_ldo_ops = {
17*4882a593Smuzhiyun 	.is_enabled		= regulator_is_enabled_regmap,
18*4882a593Smuzhiyun 	.enable			= regulator_enable_regmap,
19*4882a593Smuzhiyun 	.disable		= regulator_disable_regmap,
20*4882a593Smuzhiyun 	.list_voltage		= regulator_list_voltage_linear,
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun static const struct regulator_ops rt5033_buck_ops = {
24*4882a593Smuzhiyun 	.is_enabled		= regulator_is_enabled_regmap,
25*4882a593Smuzhiyun 	.enable			= regulator_enable_regmap,
26*4882a593Smuzhiyun 	.disable		= regulator_disable_regmap,
27*4882a593Smuzhiyun 	.list_voltage		= regulator_list_voltage_linear,
28*4882a593Smuzhiyun 	.map_voltage		= regulator_map_voltage_linear,
29*4882a593Smuzhiyun 	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
30*4882a593Smuzhiyun 	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun static const struct regulator_desc rt5033_supported_regulators[] = {
34*4882a593Smuzhiyun 	[RT5033_BUCK] = {
35*4882a593Smuzhiyun 		.name		= "BUCK",
36*4882a593Smuzhiyun 		.of_match	= of_match_ptr("BUCK"),
37*4882a593Smuzhiyun 		.regulators_node = of_match_ptr("regulators"),
38*4882a593Smuzhiyun 		.id		= RT5033_BUCK,
39*4882a593Smuzhiyun 		.ops		= &rt5033_buck_ops,
40*4882a593Smuzhiyun 		.type		= REGULATOR_VOLTAGE,
41*4882a593Smuzhiyun 		.owner		= THIS_MODULE,
42*4882a593Smuzhiyun 		.n_voltages	= RT5033_REGULATOR_BUCK_VOLTAGE_STEP_NUM,
43*4882a593Smuzhiyun 		.min_uV		= RT5033_REGULATOR_BUCK_VOLTAGE_MIN,
44*4882a593Smuzhiyun 		.uV_step	= RT5033_REGULATOR_BUCK_VOLTAGE_STEP,
45*4882a593Smuzhiyun 		.enable_reg	= RT5033_REG_CTRL,
46*4882a593Smuzhiyun 		.enable_mask	= RT5033_CTRL_EN_BUCK_MASK,
47*4882a593Smuzhiyun 		.vsel_reg	= RT5033_REG_BUCK_CTRL,
48*4882a593Smuzhiyun 		.vsel_mask	= RT5033_BUCK_CTRL_MASK,
49*4882a593Smuzhiyun 	},
50*4882a593Smuzhiyun 	[RT5033_LDO] = {
51*4882a593Smuzhiyun 		.name		= "LDO",
52*4882a593Smuzhiyun 		.of_match	= of_match_ptr("LDO"),
53*4882a593Smuzhiyun 		.regulators_node = of_match_ptr("regulators"),
54*4882a593Smuzhiyun 		.id		= RT5033_LDO,
55*4882a593Smuzhiyun 		.ops		= &rt5033_buck_ops,
56*4882a593Smuzhiyun 		.type		= REGULATOR_VOLTAGE,
57*4882a593Smuzhiyun 		.owner		= THIS_MODULE,
58*4882a593Smuzhiyun 		.n_voltages	= RT5033_REGULATOR_LDO_VOLTAGE_STEP_NUM,
59*4882a593Smuzhiyun 		.min_uV		= RT5033_REGULATOR_LDO_VOLTAGE_MIN,
60*4882a593Smuzhiyun 		.uV_step	= RT5033_REGULATOR_LDO_VOLTAGE_STEP,
61*4882a593Smuzhiyun 		.enable_reg	= RT5033_REG_CTRL,
62*4882a593Smuzhiyun 		.enable_mask	= RT5033_CTRL_EN_LDO_MASK,
63*4882a593Smuzhiyun 		.vsel_reg	= RT5033_REG_LDO_CTRL,
64*4882a593Smuzhiyun 		.vsel_mask	= RT5033_LDO_CTRL_MASK,
65*4882a593Smuzhiyun 	},
66*4882a593Smuzhiyun 	[RT5033_SAFE_LDO] = {
67*4882a593Smuzhiyun 		.name		= "SAFE_LDO",
68*4882a593Smuzhiyun 		.of_match	= of_match_ptr("SAFE_LDO"),
69*4882a593Smuzhiyun 		.regulators_node = of_match_ptr("regulators"),
70*4882a593Smuzhiyun 		.id		= RT5033_SAFE_LDO,
71*4882a593Smuzhiyun 		.ops		= &rt5033_safe_ldo_ops,
72*4882a593Smuzhiyun 		.type		= REGULATOR_VOLTAGE,
73*4882a593Smuzhiyun 		.owner		= THIS_MODULE,
74*4882a593Smuzhiyun 		.n_voltages	= 1,
75*4882a593Smuzhiyun 		.min_uV		= RT5033_REGULATOR_SAFE_LDO_VOLTAGE,
76*4882a593Smuzhiyun 		.enable_reg	= RT5033_REG_CTRL,
77*4882a593Smuzhiyun 		.enable_mask	= RT5033_CTRL_EN_SAFE_LDO_MASK,
78*4882a593Smuzhiyun 	},
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
rt5033_regulator_probe(struct platform_device * pdev)81*4882a593Smuzhiyun static int rt5033_regulator_probe(struct platform_device *pdev)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	struct rt5033_dev *rt5033 = dev_get_drvdata(pdev->dev.parent);
84*4882a593Smuzhiyun 	int ret, i;
85*4882a593Smuzhiyun 	struct regulator_config config = {};
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	config.dev = rt5033->dev;
88*4882a593Smuzhiyun 	config.driver_data = rt5033;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(rt5033_supported_regulators); i++) {
91*4882a593Smuzhiyun 		struct regulator_dev *regulator;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 		config.regmap = rt5033->regmap;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 		regulator = devm_regulator_register(&pdev->dev,
96*4882a593Smuzhiyun 				&rt5033_supported_regulators[i], &config);
97*4882a593Smuzhiyun 		if (IS_ERR(regulator)) {
98*4882a593Smuzhiyun 			ret = PTR_ERR(regulator);
99*4882a593Smuzhiyun 			dev_err(&pdev->dev,
100*4882a593Smuzhiyun 				"Regulator init failed %d: with error: %d\n",
101*4882a593Smuzhiyun 				i, ret);
102*4882a593Smuzhiyun 			return ret;
103*4882a593Smuzhiyun 		}
104*4882a593Smuzhiyun 	}
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	return 0;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun static const struct platform_device_id rt5033_regulator_id[] = {
110*4882a593Smuzhiyun 	{ "rt5033-regulator", },
111*4882a593Smuzhiyun 	{ }
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun MODULE_DEVICE_TABLE(platform, rt5033_regulator_id);
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun static struct platform_driver rt5033_regulator_driver = {
116*4882a593Smuzhiyun 	.driver = {
117*4882a593Smuzhiyun 		.name = "rt5033-regulator",
118*4882a593Smuzhiyun 	},
119*4882a593Smuzhiyun 	.probe		= rt5033_regulator_probe,
120*4882a593Smuzhiyun 	.id_table	= rt5033_regulator_id,
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun module_platform_driver(rt5033_regulator_driver);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun MODULE_DESCRIPTION("Richtek RT5033 Regulator driver");
125*4882a593Smuzhiyun MODULE_AUTHOR("Beomho Seo <beomho.seo@samsung.com>");
126*4882a593Smuzhiyun MODULE_LICENSE("GPL");
127