xref: /openbmc/linux/drivers/regulator/max8893.c (revision 813ebba3)
1d83f778cSSergey Larin // SPDX-License-Identifier: GPL-2.0+
2d83f778cSSergey Larin #include <linux/module.h>
3d83f778cSSergey Larin #include <linux/i2c.h>
4d83f778cSSergey Larin #include <linux/of.h>
5d83f778cSSergey Larin #include <linux/regmap.h>
6d83f778cSSergey Larin #include <linux/regulator/driver.h>
7d83f778cSSergey Larin 
8d83f778cSSergey Larin static const struct regulator_ops max8893_ops = {
9d83f778cSSergey Larin 	.is_enabled		= regulator_is_enabled_regmap,
10d83f778cSSergey Larin 	.enable			= regulator_enable_regmap,
11d83f778cSSergey Larin 	.disable		= regulator_disable_regmap,
12d83f778cSSergey Larin 	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
13d83f778cSSergey Larin 	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
14d83f778cSSergey Larin 	.list_voltage		= regulator_list_voltage_linear,
15d83f778cSSergey Larin 	.map_voltage		= regulator_map_voltage_linear,
16d83f778cSSergey Larin };
17d83f778cSSergey Larin 
18d83f778cSSergey Larin static const struct regulator_desc max8893_regulators[] = {
19d83f778cSSergey Larin 	{
20d83f778cSSergey Larin 		.name = "BUCK",
21d83f778cSSergey Larin 		.supply_name = "in-buck",
22d83f778cSSergey Larin 		.of_match = of_match_ptr("buck"),
23d83f778cSSergey Larin 		.regulators_node = of_match_ptr("regulators"),
24d83f778cSSergey Larin 		.n_voltages = 0x11,
25d83f778cSSergey Larin 		.id = 6,
26d83f778cSSergey Larin 		.ops = &max8893_ops,
27d83f778cSSergey Larin 		.type = REGULATOR_VOLTAGE,
28d83f778cSSergey Larin 		.owner = THIS_MODULE,
29d83f778cSSergey Larin 		.min_uV = 800000,
30d83f778cSSergey Larin 		.uV_step = 100000,
31d83f778cSSergey Larin 		.vsel_reg = 0x4,
32d83f778cSSergey Larin 		.vsel_mask = 0x1f,
33d83f778cSSergey Larin 		.enable_reg = 0x0,
34d83f778cSSergey Larin 		.enable_mask = BIT(7),
35d83f778cSSergey Larin 	},
36d83f778cSSergey Larin 	{
37d83f778cSSergey Larin 		.name = "LDO1",
38d83f778cSSergey Larin 		.supply_name = "in-ldo1",
39d83f778cSSergey Larin 		.of_match = of_match_ptr("ldo1"),
40d83f778cSSergey Larin 		.regulators_node = of_match_ptr("regulators"),
41d83f778cSSergey Larin 		.n_voltages = 0x12,
42d83f778cSSergey Larin 		.id = 1,
43d83f778cSSergey Larin 		.ops = &max8893_ops,
44d83f778cSSergey Larin 		.type = REGULATOR_VOLTAGE,
45d83f778cSSergey Larin 		.owner = THIS_MODULE,
46d83f778cSSergey Larin 		.min_uV = 1600000,
47d83f778cSSergey Larin 		.uV_step = 100000,
48d83f778cSSergey Larin 		.vsel_reg = 0x5,
49d83f778cSSergey Larin 		.vsel_mask = 0x1f,
50d83f778cSSergey Larin 		.enable_reg = 0x0,
51d83f778cSSergey Larin 		.enable_mask = BIT(5),
52d83f778cSSergey Larin 	},
53d83f778cSSergey Larin 	{
54d83f778cSSergey Larin 		.name = "LDO2",
55d83f778cSSergey Larin 		.supply_name = "in-ldo2",
56d83f778cSSergey Larin 		.of_match = of_match_ptr("ldo2"),
57d83f778cSSergey Larin 		.regulators_node = of_match_ptr("regulators"),
58d83f778cSSergey Larin 		.n_voltages = 0x16,
59d83f778cSSergey Larin 		.id = 2,
60d83f778cSSergey Larin 		.ops = &max8893_ops,
61d83f778cSSergey Larin 		.type = REGULATOR_VOLTAGE,
62d83f778cSSergey Larin 		.owner = THIS_MODULE,
63d83f778cSSergey Larin 		.min_uV = 1200000,
64d83f778cSSergey Larin 		.uV_step = 100000,
65d83f778cSSergey Larin 		.vsel_reg = 0x6,
66d83f778cSSergey Larin 		.vsel_mask = 0x1f,
67d83f778cSSergey Larin 		.enable_reg = 0x0,
68d83f778cSSergey Larin 		.enable_mask = BIT(4),
69d83f778cSSergey Larin 	},
70d83f778cSSergey Larin 	{
71d83f778cSSergey Larin 		.name = "LDO3",
72d83f778cSSergey Larin 		.supply_name = "in-ldo3",
73d83f778cSSergey Larin 		.of_match = of_match_ptr("ldo3"),
74d83f778cSSergey Larin 		.regulators_node = of_match_ptr("regulators"),
75d83f778cSSergey Larin 		.n_voltages = 0x12,
76d83f778cSSergey Larin 		.id = 3,
77d83f778cSSergey Larin 		.ops = &max8893_ops,
78d83f778cSSergey Larin 		.type = REGULATOR_VOLTAGE,
79d83f778cSSergey Larin 		.owner = THIS_MODULE,
80d83f778cSSergey Larin 		.min_uV = 1600000,
81d83f778cSSergey Larin 		.uV_step = 100000,
82d83f778cSSergey Larin 		.vsel_reg = 0x7,
83d83f778cSSergey Larin 		.vsel_mask = 0x1f,
84d83f778cSSergey Larin 		.enable_reg = 0x0,
85d83f778cSSergey Larin 		.enable_mask = BIT(3),
86d83f778cSSergey Larin 	},
87d83f778cSSergey Larin 	{
88d83f778cSSergey Larin 		.name = "LDO4",
89d83f778cSSergey Larin 		.supply_name = "in-ldo4",
90d83f778cSSergey Larin 		.of_match = of_match_ptr("ldo4"),
91d83f778cSSergey Larin 		.regulators_node = of_match_ptr("regulators"),
92d83f778cSSergey Larin 		.n_voltages = 0x1a,
93d83f778cSSergey Larin 		.id = 4,
94d83f778cSSergey Larin 		.ops = &max8893_ops,
95d83f778cSSergey Larin 		.type = REGULATOR_VOLTAGE,
96d83f778cSSergey Larin 		.owner = THIS_MODULE,
97d83f778cSSergey Larin 		.min_uV = 800000,
98d83f778cSSergey Larin 		.uV_step = 100000,
99d83f778cSSergey Larin 		.vsel_reg = 0x8,
100d83f778cSSergey Larin 		.vsel_mask = 0x1f,
101d83f778cSSergey Larin 		.enable_reg = 0x0,
102d83f778cSSergey Larin 		.enable_mask = BIT(2),
103d83f778cSSergey Larin 	},
104d83f778cSSergey Larin 	{
105d83f778cSSergey Larin 		.name = "LDO5",
106d83f778cSSergey Larin 		.supply_name = "in-ldo5",
107d83f778cSSergey Larin 		.of_match = of_match_ptr("ldo5"),
108d83f778cSSergey Larin 		.regulators_node = of_match_ptr("regulators"),
109d83f778cSSergey Larin 		.n_voltages = 0x1a,
110d83f778cSSergey Larin 		.id = 5,
111d83f778cSSergey Larin 		.ops = &max8893_ops,
112d83f778cSSergey Larin 		.type = REGULATOR_VOLTAGE,
113d83f778cSSergey Larin 		.owner = THIS_MODULE,
114d83f778cSSergey Larin 		.min_uV = 800000,
115d83f778cSSergey Larin 		.uV_step = 100000,
116d83f778cSSergey Larin 		.vsel_reg = 0x9,
117d83f778cSSergey Larin 		.vsel_mask = 0x1f,
118d83f778cSSergey Larin 		.enable_reg = 0x0,
119d83f778cSSergey Larin 		.enable_mask = BIT(1),
120d83f778cSSergey Larin 	}
121d83f778cSSergey Larin };
122d83f778cSSergey Larin 
123d83f778cSSergey Larin static const struct regmap_config max8893_regmap = {
124d83f778cSSergey Larin 	.reg_bits = 8,
125d83f778cSSergey Larin 	.val_bits = 8,
126d83f778cSSergey Larin };
127d83f778cSSergey Larin 
max8893_probe(struct i2c_client * i2c)128*813ebba3SUwe Kleine-König static int max8893_probe(struct i2c_client *i2c)
129d83f778cSSergey Larin {
130d83f778cSSergey Larin 	int id, ret;
131d83f778cSSergey Larin 	struct regulator_config config = {.dev = &i2c->dev};
132d83f778cSSergey Larin 	struct regmap *regmap = devm_regmap_init_i2c(i2c, &max8893_regmap);
133d83f778cSSergey Larin 
134d83f778cSSergey Larin 	if (IS_ERR(regmap)) {
135d83f778cSSergey Larin 		ret = PTR_ERR(regmap);
136d83f778cSSergey Larin 		dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
137d83f778cSSergey Larin 		return ret;
138d83f778cSSergey Larin 	}
139d83f778cSSergey Larin 
140d83f778cSSergey Larin 	for (id = 0; id < ARRAY_SIZE(max8893_regulators); id++) {
141d83f778cSSergey Larin 		struct regulator_dev *rdev;
142d83f778cSSergey Larin 		rdev = devm_regulator_register(&i2c->dev,
143d83f778cSSergey Larin 					       &max8893_regulators[id],
144d83f778cSSergey Larin 					       &config);
145d83f778cSSergey Larin 		if (IS_ERR(rdev)) {
146d83f778cSSergey Larin 			ret = PTR_ERR(rdev);
147d83f778cSSergey Larin 			dev_err(&i2c->dev, "failed to register %s: %d\n",
148d83f778cSSergey Larin 				max8893_regulators[id].name, ret);
149d83f778cSSergey Larin 			return ret;
150d83f778cSSergey Larin 		}
151d83f778cSSergey Larin 	}
152d83f778cSSergey Larin 
153d83f778cSSergey Larin 	return 0;
154d83f778cSSergey Larin }
155d83f778cSSergey Larin 
156d83f778cSSergey Larin #ifdef CONFIG_OF
157d83f778cSSergey Larin static const struct of_device_id max8893_dt_match[] = {
158d83f778cSSergey Larin 	{ .compatible = "maxim,max8893" },
159d83f778cSSergey Larin 	{ /* sentinel */ },
160d83f778cSSergey Larin };
161d83f778cSSergey Larin MODULE_DEVICE_TABLE(of, max8893_dt_match);
162d83f778cSSergey Larin #endif
163d83f778cSSergey Larin 
164d83f778cSSergey Larin static const struct i2c_device_id max8893_ids[] = {
165d83f778cSSergey Larin 	{ "max8893", 0 },
166d83f778cSSergey Larin 	{ },
167d83f778cSSergey Larin };
168d83f778cSSergey Larin MODULE_DEVICE_TABLE(i2c, max8893_ids);
169d83f778cSSergey Larin 
170d83f778cSSergey Larin static struct i2c_driver max8893_driver = {
171*813ebba3SUwe Kleine-König 	.probe		= max8893_probe,
172d83f778cSSergey Larin 	.driver		= {
173d83f778cSSergey Larin 		.name	= "max8893",
17446600ab1SDouglas Anderson 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
175d83f778cSSergey Larin 		.of_match_table = of_match_ptr(max8893_dt_match),
176d83f778cSSergey Larin 	},
177d83f778cSSergey Larin 	.id_table	= max8893_ids,
178d83f778cSSergey Larin };
179d83f778cSSergey Larin 
180d83f778cSSergey Larin module_i2c_driver(max8893_driver);
181d83f778cSSergey Larin 
182d83f778cSSergey Larin MODULE_DESCRIPTION("Maxim MAX8893 PMIC driver");
183d83f778cSSergey Larin MODULE_AUTHOR("Sergey Larin <cerg2010cerg2010@mail.ru>");
184d83f778cSSergey Larin MODULE_LICENSE("GPL");
185