xref: /openbmc/linux/drivers/regulator/max8952.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2202f4f53SMyungJoo Ham /*
3202f4f53SMyungJoo Ham  * max8952.c - Voltage and current regulation for the Maxim 8952
4202f4f53SMyungJoo Ham  *
5202f4f53SMyungJoo Ham  * Copyright (C) 2010 Samsung Electronics
6202f4f53SMyungJoo Ham  * MyungJoo Ham <myungjoo.ham@samsung.com>
7202f4f53SMyungJoo Ham  */
8202f4f53SMyungJoo Ham 
9202f4f53SMyungJoo Ham #include <linux/module.h>
10202f4f53SMyungJoo Ham #include <linux/init.h>
11202f4f53SMyungJoo Ham #include <linux/i2c.h>
12202f4f53SMyungJoo Ham #include <linux/err.h>
13202f4f53SMyungJoo Ham #include <linux/platform_device.h>
14202f4f53SMyungJoo Ham #include <linux/regulator/driver.h>
15202f4f53SMyungJoo Ham #include <linux/regulator/max8952.h>
16d7a261c2SLinus Walleij #include <linux/gpio/consumer.h>
17202f4f53SMyungJoo Ham #include <linux/io.h>
183ff4aa95STomasz Figa #include <linux/of.h>
193ff4aa95STomasz Figa #include <linux/regulator/of_regulator.h>
20202f4f53SMyungJoo Ham #include <linux/slab.h>
21202f4f53SMyungJoo Ham 
22202f4f53SMyungJoo Ham /* Registers */
23202f4f53SMyungJoo Ham enum {
24202f4f53SMyungJoo Ham 	MAX8952_REG_MODE0,
25202f4f53SMyungJoo Ham 	MAX8952_REG_MODE1,
26202f4f53SMyungJoo Ham 	MAX8952_REG_MODE2,
27202f4f53SMyungJoo Ham 	MAX8952_REG_MODE3,
28202f4f53SMyungJoo Ham 	MAX8952_REG_CONTROL,
29202f4f53SMyungJoo Ham 	MAX8952_REG_SYNC,
30202f4f53SMyungJoo Ham 	MAX8952_REG_RAMP,
31202f4f53SMyungJoo Ham 	MAX8952_REG_CHIP_ID1,
32202f4f53SMyungJoo Ham 	MAX8952_REG_CHIP_ID2,
33202f4f53SMyungJoo Ham };
34202f4f53SMyungJoo Ham 
35202f4f53SMyungJoo Ham struct max8952_data {
36202f4f53SMyungJoo Ham 	struct i2c_client	*client;
37202f4f53SMyungJoo Ham 	struct max8952_platform_data *pdata;
38fd742eaaSLinus Walleij 	struct gpio_desc *vid0_gpiod;
39fd742eaaSLinus Walleij 	struct gpio_desc *vid1_gpiod;
40202f4f53SMyungJoo Ham 	bool vid0;
41202f4f53SMyungJoo Ham 	bool vid1;
42202f4f53SMyungJoo Ham };
43202f4f53SMyungJoo Ham 
max8952_read_reg(struct max8952_data * max8952,u8 reg)44202f4f53SMyungJoo Ham static int max8952_read_reg(struct max8952_data *max8952, u8 reg)
45202f4f53SMyungJoo Ham {
46202f4f53SMyungJoo Ham 	int ret = i2c_smbus_read_byte_data(max8952->client, reg);
47a5f8f963SSachin Kamat 
48202f4f53SMyungJoo Ham 	if (ret > 0)
49202f4f53SMyungJoo Ham 		ret &= 0xff;
50202f4f53SMyungJoo Ham 
51202f4f53SMyungJoo Ham 	return ret;
52202f4f53SMyungJoo Ham }
53202f4f53SMyungJoo Ham 
max8952_write_reg(struct max8952_data * max8952,u8 reg,u8 value)54202f4f53SMyungJoo Ham static int max8952_write_reg(struct max8952_data *max8952,
55202f4f53SMyungJoo Ham 		u8 reg, u8 value)
56202f4f53SMyungJoo Ham {
57202f4f53SMyungJoo Ham 	return i2c_smbus_write_byte_data(max8952->client, reg, value);
58202f4f53SMyungJoo Ham }
59202f4f53SMyungJoo Ham 
max8952_list_voltage(struct regulator_dev * rdev,unsigned int selector)60202f4f53SMyungJoo Ham static int max8952_list_voltage(struct regulator_dev *rdev,
61202f4f53SMyungJoo Ham 		unsigned int selector)
62202f4f53SMyungJoo Ham {
63202f4f53SMyungJoo Ham 	struct max8952_data *max8952 = rdev_get_drvdata(rdev);
64202f4f53SMyungJoo Ham 
65202f4f53SMyungJoo Ham 	if (rdev_get_id(rdev) != 0)
66202f4f53SMyungJoo Ham 		return -EINVAL;
67202f4f53SMyungJoo Ham 
68b9b49af5SAxel Lin 	return (max8952->pdata->dvs_mode[selector] * 10 + 770) * 1000;
69202f4f53SMyungJoo Ham }
70202f4f53SMyungJoo Ham 
max8952_get_voltage_sel(struct regulator_dev * rdev)71b9b49af5SAxel Lin static int max8952_get_voltage_sel(struct regulator_dev *rdev)
72202f4f53SMyungJoo Ham {
73202f4f53SMyungJoo Ham 	struct max8952_data *max8952 = rdev_get_drvdata(rdev);
74202f4f53SMyungJoo Ham 	u8 vid = 0;
75202f4f53SMyungJoo Ham 
76202f4f53SMyungJoo Ham 	if (max8952->vid0)
77202f4f53SMyungJoo Ham 		vid += 1;
78202f4f53SMyungJoo Ham 	if (max8952->vid1)
79202f4f53SMyungJoo Ham 		vid += 2;
80202f4f53SMyungJoo Ham 
81b9b49af5SAxel Lin 	return vid;
82202f4f53SMyungJoo Ham }
83202f4f53SMyungJoo Ham 
max8952_set_voltage_sel(struct regulator_dev * rdev,unsigned selector)846ea67d04SAxel Lin static int max8952_set_voltage_sel(struct regulator_dev *rdev,
856ea67d04SAxel Lin 				   unsigned selector)
86202f4f53SMyungJoo Ham {
87202f4f53SMyungJoo Ham 	struct max8952_data *max8952 = rdev_get_drvdata(rdev);
88202f4f53SMyungJoo Ham 
89fd742eaaSLinus Walleij 	if (!max8952->vid0_gpiod || !max8952->vid1_gpiod) {
90202f4f53SMyungJoo Ham 		/* DVS not supported */
91202f4f53SMyungJoo Ham 		return -EPERM;
92202f4f53SMyungJoo Ham 	}
93202f4f53SMyungJoo Ham 
946ea67d04SAxel Lin 	max8952->vid0 = selector & 0x1;
956ea67d04SAxel Lin 	max8952->vid1 = (selector >> 1) & 0x1;
96fd742eaaSLinus Walleij 	gpiod_set_value(max8952->vid0_gpiod, max8952->vid0);
97fd742eaaSLinus Walleij 	gpiod_set_value(max8952->vid1_gpiod, max8952->vid1);
98202f4f53SMyungJoo Ham 
99202f4f53SMyungJoo Ham 	return 0;
100202f4f53SMyungJoo Ham }
101202f4f53SMyungJoo Ham 
1026e09f4afSBhumika Goyal static const struct regulator_ops max8952_ops = {
103202f4f53SMyungJoo Ham 	.list_voltage		= max8952_list_voltage,
104b9b49af5SAxel Lin 	.get_voltage_sel	= max8952_get_voltage_sel,
1056ea67d04SAxel Lin 	.set_voltage_sel	= max8952_set_voltage_sel,
106202f4f53SMyungJoo Ham };
107202f4f53SMyungJoo Ham 
108bd6ff0d6SAxel Lin static const struct regulator_desc regulator = {
109202f4f53SMyungJoo Ham 	.name		= "MAX8952_VOUT",
110202f4f53SMyungJoo Ham 	.id		= 0,
111202f4f53SMyungJoo Ham 	.n_voltages	= MAX8952_NUM_DVS_MODE,
112202f4f53SMyungJoo Ham 	.ops		= &max8952_ops,
113202f4f53SMyungJoo Ham 	.type		= REGULATOR_VOLTAGE,
114202f4f53SMyungJoo Ham 	.owner		= THIS_MODULE,
115202f4f53SMyungJoo Ham };
116202f4f53SMyungJoo Ham 
1173ff4aa95STomasz Figa #ifdef CONFIG_OF
118cfe6e333SJingoo Han static const struct of_device_id max8952_dt_match[] = {
1193ff4aa95STomasz Figa 	{ .compatible = "maxim,max8952" },
1203ff4aa95STomasz Figa 	{},
1213ff4aa95STomasz Figa };
1223ff4aa95STomasz Figa MODULE_DEVICE_TABLE(of, max8952_dt_match);
1233ff4aa95STomasz Figa 
max8952_parse_dt(struct device * dev)1243ff4aa95STomasz Figa static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
1253ff4aa95STomasz Figa {
1263ff4aa95STomasz Figa 	struct max8952_platform_data *pd;
1273ff4aa95STomasz Figa 	struct device_node *np = dev->of_node;
1283ff4aa95STomasz Figa 	int ret;
1293ff4aa95STomasz Figa 	int i;
1303ff4aa95STomasz Figa 
1313ff4aa95STomasz Figa 	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
1327752d964SSachin Kamat 	if (!pd)
1333ff4aa95STomasz Figa 		return NULL;
1343ff4aa95STomasz Figa 
1353ff4aa95STomasz Figa 	if (of_property_read_u32(np, "max8952,default-mode", &pd->default_mode))
1363ff4aa95STomasz Figa 		dev_warn(dev, "Default mode not specified, assuming 0\n");
1373ff4aa95STomasz Figa 
1383ff4aa95STomasz Figa 	ret = of_property_read_u32_array(np, "max8952,dvs-mode-microvolt",
1393ff4aa95STomasz Figa 					pd->dvs_mode, ARRAY_SIZE(pd->dvs_mode));
1403ff4aa95STomasz Figa 	if (ret) {
1413ff4aa95STomasz Figa 		dev_err(dev, "max8952,dvs-mode-microvolt property not specified");
1423ff4aa95STomasz Figa 		return NULL;
1433ff4aa95STomasz Figa 	}
1443ff4aa95STomasz Figa 
1453ff4aa95STomasz Figa 	for (i = 0; i < ARRAY_SIZE(pd->dvs_mode); ++i) {
1463ff4aa95STomasz Figa 		if (pd->dvs_mode[i] < 770000 || pd->dvs_mode[i] > 1400000) {
1473ff4aa95STomasz Figa 			dev_err(dev, "DVS voltage %d out of range\n", i);
1483ff4aa95STomasz Figa 			return NULL;
1493ff4aa95STomasz Figa 		}
1503ff4aa95STomasz Figa 		pd->dvs_mode[i] = (pd->dvs_mode[i] - 770000) / 10000;
1513ff4aa95STomasz Figa 	}
1523ff4aa95STomasz Figa 
1533ff4aa95STomasz Figa 	if (of_property_read_u32(np, "max8952,sync-freq", &pd->sync_freq))
1543ff4aa95STomasz Figa 		dev_warn(dev, "max8952,sync-freq property not specified, defaulting to 26MHz\n");
1553ff4aa95STomasz Figa 
1563ff4aa95STomasz Figa 	if (of_property_read_u32(np, "max8952,ramp-speed", &pd->ramp_speed))
1573ff4aa95STomasz Figa 		dev_warn(dev, "max8952,ramp-speed property not specified, defaulting to 32mV/us\n");
1583ff4aa95STomasz Figa 
159072e78b1SJavier Martinez Canillas 	pd->reg_data = of_get_regulator_init_data(dev, np, &regulator);
1603ff4aa95STomasz Figa 	if (!pd->reg_data) {
1613ff4aa95STomasz Figa 		dev_err(dev, "Failed to parse regulator init data\n");
1623ff4aa95STomasz Figa 		return NULL;
1633ff4aa95STomasz Figa 	}
1643ff4aa95STomasz Figa 
1653ff4aa95STomasz Figa 	return pd;
1663ff4aa95STomasz Figa }
1673ff4aa95STomasz Figa #else
max8952_parse_dt(struct device * dev)1683ff4aa95STomasz Figa static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
1693ff4aa95STomasz Figa {
1703ff4aa95STomasz Figa 	return NULL;
1713ff4aa95STomasz Figa }
1723ff4aa95STomasz Figa #endif
1733ff4aa95STomasz Figa 
max8952_pmic_probe(struct i2c_client * client)174c20c3673SUwe Kleine-König static int max8952_pmic_probe(struct i2c_client *client)
175202f4f53SMyungJoo Ham {
1766b96092aSWolfram Sang 	struct i2c_adapter *adapter = client->adapter;
177dff91d0bSJingoo Han 	struct max8952_platform_data *pdata = dev_get_platdata(&client->dev);
178c172708dSMark Brown 	struct regulator_config config = { };
179202f4f53SMyungJoo Ham 	struct max8952_data *max8952;
180b874f41cSKrzysztof Kozlowski 	struct regulator_dev *rdev;
181d7a261c2SLinus Walleij 	struct gpio_desc *gpiod;
182d7a261c2SLinus Walleij 	enum gpiod_flags gflags;
183202f4f53SMyungJoo Ham 
184fd742eaaSLinus Walleij 	int ret = 0;
185202f4f53SMyungJoo Ham 
1863ff4aa95STomasz Figa 	if (client->dev.of_node)
1873ff4aa95STomasz Figa 		pdata = max8952_parse_dt(&client->dev);
1883ff4aa95STomasz Figa 
189202f4f53SMyungJoo Ham 	if (!pdata) {
190202f4f53SMyungJoo Ham 		dev_err(&client->dev, "Require the platform data\n");
191202f4f53SMyungJoo Ham 		return -EINVAL;
192202f4f53SMyungJoo Ham 	}
193202f4f53SMyungJoo Ham 
194202f4f53SMyungJoo Ham 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
195202f4f53SMyungJoo Ham 		return -EIO;
196202f4f53SMyungJoo Ham 
197372de4aaSAxel Lin 	max8952 = devm_kzalloc(&client->dev, sizeof(struct max8952_data),
198372de4aaSAxel Lin 			       GFP_KERNEL);
199202f4f53SMyungJoo Ham 	if (!max8952)
200202f4f53SMyungJoo Ham 		return -ENOMEM;
201202f4f53SMyungJoo Ham 
202202f4f53SMyungJoo Ham 	max8952->client = client;
203202f4f53SMyungJoo Ham 	max8952->pdata = pdata;
204202f4f53SMyungJoo Ham 
205b874f41cSKrzysztof Kozlowski 	config.dev = &client->dev;
2063ec6eb9cSTomasz Figa 	config.init_data = pdata->reg_data;
207c172708dSMark Brown 	config.driver_data = max8952;
20871622e15SAxel Lin 	config.of_node = client->dev.of_node;
209c172708dSMark Brown 
2103ec6eb9cSTomasz Figa 	if (pdata->reg_data->constraints.boot_on)
211d7a261c2SLinus Walleij 		gflags = GPIOD_OUT_HIGH;
212d7a261c2SLinus Walleij 	else
213d7a261c2SLinus Walleij 		gflags = GPIOD_OUT_LOW;
21463239e4bSLinus Walleij 	gflags |= GPIOD_FLAGS_BIT_NONEXCLUSIVE;
215894077d5SLinus Walleij 	/*
216894077d5SLinus Walleij 	 * Do not use devm* here: the regulator core takes over the
217894077d5SLinus Walleij 	 * lifecycle management of the GPIO descriptor.
218894077d5SLinus Walleij 	 */
219894077d5SLinus Walleij 	gpiod = gpiod_get_optional(&client->dev,
220d7a261c2SLinus Walleij 				   "max8952,en",
221d7a261c2SLinus Walleij 				   gflags);
222d7a261c2SLinus Walleij 	if (IS_ERR(gpiod))
223d7a261c2SLinus Walleij 		return PTR_ERR(gpiod);
224d7a261c2SLinus Walleij 	if (gpiod)
225d7a261c2SLinus Walleij 		config.ena_gpiod = gpiod;
226b669e0adSAxel Lin 
227b874f41cSKrzysztof Kozlowski 	rdev = devm_regulator_register(&client->dev, &regulator, &config);
228b874f41cSKrzysztof Kozlowski 	if (IS_ERR(rdev)) {
229b874f41cSKrzysztof Kozlowski 		ret = PTR_ERR(rdev);
230b874f41cSKrzysztof Kozlowski 		dev_err(&client->dev, "regulator init failed (%d)\n", ret);
231372de4aaSAxel Lin 		return ret;
232da05738eSAxel Lin 	}
233202f4f53SMyungJoo Ham 
234c8237f01SAxel Lin 	max8952->vid0 = pdata->default_mode & 0x1;
235c8237f01SAxel Lin 	max8952->vid1 = (pdata->default_mode >> 1) & 0x1;
236202f4f53SMyungJoo Ham 
237fd742eaaSLinus Walleij 	/* Fetch vid0 and vid1 GPIOs if available */
238fd742eaaSLinus Walleij 	gflags = max8952->vid0 ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
239fd742eaaSLinus Walleij 	max8952->vid0_gpiod = devm_gpiod_get_index_optional(&client->dev,
240fd742eaaSLinus Walleij 							    "max8952,vid",
241fd742eaaSLinus Walleij 							    0, gflags);
242fd742eaaSLinus Walleij 	if (IS_ERR(max8952->vid0_gpiod))
243fd742eaaSLinus Walleij 		return PTR_ERR(max8952->vid0_gpiod);
244fd742eaaSLinus Walleij 	gflags = max8952->vid1 ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
245fd742eaaSLinus Walleij 	max8952->vid1_gpiod = devm_gpiod_get_index_optional(&client->dev,
246fd742eaaSLinus Walleij 							    "max8952,vid",
247fd742eaaSLinus Walleij 							    1, gflags);
248fd742eaaSLinus Walleij 	if (IS_ERR(max8952->vid1_gpiod))
249fd742eaaSLinus Walleij 		return PTR_ERR(max8952->vid1_gpiod);
250d7da152cSAxel Lin 
251fd742eaaSLinus Walleij 	/* If either VID GPIO is missing just disable this */
252fd742eaaSLinus Walleij 	if (!max8952->vid0_gpiod || !max8952->vid1_gpiod) {
253b874f41cSKrzysztof Kozlowski 		dev_warn(&client->dev, "VID0/1 gpio invalid: "
25425985edcSLucas De Marchi 			 "DVS not available.\n");
255202f4f53SMyungJoo Ham 		max8952->vid0 = 0;
256202f4f53SMyungJoo Ham 		max8952->vid1 = 0;
257fd742eaaSLinus Walleij 		/* Make sure if we have any descriptors they get set to low */
258fd742eaaSLinus Walleij 		if (max8952->vid0_gpiod)
259fd742eaaSLinus Walleij 			gpiod_set_value(max8952->vid0_gpiod, 0);
260fd742eaaSLinus Walleij 		if (max8952->vid1_gpiod)
261fd742eaaSLinus Walleij 			gpiod_set_value(max8952->vid1_gpiod, 0);
262202f4f53SMyungJoo Ham 
263202f4f53SMyungJoo Ham 		/* Disable Pulldown of EN only */
264202f4f53SMyungJoo Ham 		max8952_write_reg(max8952, MAX8952_REG_CONTROL, 0x60);
265202f4f53SMyungJoo Ham 
266b874f41cSKrzysztof Kozlowski 		dev_err(&client->dev, "DVS modes disabled because VID0 and VID1"
267202f4f53SMyungJoo Ham 				" do not have proper controls.\n");
268202f4f53SMyungJoo Ham 	} else {
269202f4f53SMyungJoo Ham 		/*
270202f4f53SMyungJoo Ham 		 * Disable Pulldown on EN, VID0, VID1 to reduce
271202f4f53SMyungJoo Ham 		 * leakage current of MAX8952 assuming that MAX8952
272202f4f53SMyungJoo Ham 		 * is turned on (EN==1). Note that without having VID0/1
273202f4f53SMyungJoo Ham 		 * properly connected, turning pulldown off can be
274202f4f53SMyungJoo Ham 		 * problematic. Thus, turn this off only when they are
275202f4f53SMyungJoo Ham 		 * controllable by GPIO.
276202f4f53SMyungJoo Ham 		 */
277202f4f53SMyungJoo Ham 		max8952_write_reg(max8952, MAX8952_REG_CONTROL, 0x0);
278202f4f53SMyungJoo Ham 	}
279202f4f53SMyungJoo Ham 
280202f4f53SMyungJoo Ham 	max8952_write_reg(max8952, MAX8952_REG_MODE0,
281202f4f53SMyungJoo Ham 			(max8952_read_reg(max8952,
282202f4f53SMyungJoo Ham 					  MAX8952_REG_MODE0) & 0xC0) |
283202f4f53SMyungJoo Ham 			(pdata->dvs_mode[0] & 0x3F));
284202f4f53SMyungJoo Ham 	max8952_write_reg(max8952, MAX8952_REG_MODE1,
285202f4f53SMyungJoo Ham 			(max8952_read_reg(max8952,
286202f4f53SMyungJoo Ham 					  MAX8952_REG_MODE1) & 0xC0) |
287202f4f53SMyungJoo Ham 			(pdata->dvs_mode[1] & 0x3F));
288202f4f53SMyungJoo Ham 	max8952_write_reg(max8952, MAX8952_REG_MODE2,
289202f4f53SMyungJoo Ham 			(max8952_read_reg(max8952,
290202f4f53SMyungJoo Ham 					  MAX8952_REG_MODE2) & 0xC0) |
291202f4f53SMyungJoo Ham 			(pdata->dvs_mode[2] & 0x3F));
292202f4f53SMyungJoo Ham 	max8952_write_reg(max8952, MAX8952_REG_MODE3,
293202f4f53SMyungJoo Ham 			(max8952_read_reg(max8952,
294202f4f53SMyungJoo Ham 					  MAX8952_REG_MODE3) & 0xC0) |
295202f4f53SMyungJoo Ham 			(pdata->dvs_mode[3] & 0x3F));
296202f4f53SMyungJoo Ham 
297202f4f53SMyungJoo Ham 	max8952_write_reg(max8952, MAX8952_REG_SYNC,
298202f4f53SMyungJoo Ham 			(max8952_read_reg(max8952, MAX8952_REG_SYNC) & 0x3F) |
299202f4f53SMyungJoo Ham 			((pdata->sync_freq & 0x3) << 6));
300202f4f53SMyungJoo Ham 	max8952_write_reg(max8952, MAX8952_REG_RAMP,
301202f4f53SMyungJoo Ham 			(max8952_read_reg(max8952, MAX8952_REG_RAMP) & 0x1F) |
302202f4f53SMyungJoo Ham 			((pdata->ramp_speed & 0x7) << 5));
303202f4f53SMyungJoo Ham 
304202f4f53SMyungJoo Ham 	i2c_set_clientdata(client, max8952);
305202f4f53SMyungJoo Ham 
306da05738eSAxel Lin 	return 0;
307202f4f53SMyungJoo Ham }
308202f4f53SMyungJoo Ham 
309202f4f53SMyungJoo Ham static const struct i2c_device_id max8952_ids[] = {
310202f4f53SMyungJoo Ham 	{ "max8952", 0 },
311202f4f53SMyungJoo Ham 	{ },
312202f4f53SMyungJoo Ham };
313202f4f53SMyungJoo Ham MODULE_DEVICE_TABLE(i2c, max8952_ids);
314202f4f53SMyungJoo Ham 
315202f4f53SMyungJoo Ham static struct i2c_driver max8952_pmic_driver = {
316c20c3673SUwe Kleine-König 	.probe		= max8952_pmic_probe,
317202f4f53SMyungJoo Ham 	.driver		= {
318202f4f53SMyungJoo Ham 		.name	= "max8952",
319*259b93b2SDouglas Anderson 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
3203ff4aa95STomasz Figa 		.of_match_table = of_match_ptr(max8952_dt_match),
321202f4f53SMyungJoo Ham 	},
322202f4f53SMyungJoo Ham 	.id_table	= max8952_ids,
323202f4f53SMyungJoo Ham };
324202f4f53SMyungJoo Ham 
max8952_pmic_init(void)325202f4f53SMyungJoo Ham static int __init max8952_pmic_init(void)
326202f4f53SMyungJoo Ham {
327202f4f53SMyungJoo Ham 	return i2c_add_driver(&max8952_pmic_driver);
328202f4f53SMyungJoo Ham }
329202f4f53SMyungJoo Ham subsys_initcall(max8952_pmic_init);
330202f4f53SMyungJoo Ham 
max8952_pmic_exit(void)331202f4f53SMyungJoo Ham static void __exit max8952_pmic_exit(void)
332202f4f53SMyungJoo Ham {
333202f4f53SMyungJoo Ham 	i2c_del_driver(&max8952_pmic_driver);
334202f4f53SMyungJoo Ham }
335202f4f53SMyungJoo Ham module_exit(max8952_pmic_exit);
336202f4f53SMyungJoo Ham 
337202f4f53SMyungJoo Ham MODULE_DESCRIPTION("MAXIM 8952 voltage regulator driver");
338202f4f53SMyungJoo Ham MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
339202f4f53SMyungJoo Ham MODULE_LICENSE("GPL");
340