s2mpa01.c revision 0e4f417857083f399769491f6e7773d111debd0f
1f18792714608a670c2762d22f695d77d02fc965eSachin Kamat/*
2f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * Copyright (c) 2013 Samsung Electronics Co., Ltd
3f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *		http://www.samsung.com
4f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *
5f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *  This program is free software; you can redistribute  it and/or modify it
6f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *  under  the terms of  the GNU General  Public License as published by the
7f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *  Free Software Foundation;  either version 2 of the  License, or (at your
8f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *  option) any later version.
9f18792714608a670c2762d22f695d77d02fc965eSachin Kamat *
10f18792714608a670c2762d22f695d77d02fc965eSachin Kamat */
11f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
12f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/bug.h>
13f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/err.h>
14f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/gpio.h>
15f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/slab.h>
16f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/module.h>
17f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/of.h>
18f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regmap.h>
19f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/platform_device.h>
20f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regulator/driver.h>
21f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regulator/machine.h>
22f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regulator/of_regulator.h>
23f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/mfd/samsung/core.h>
24f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/mfd/samsung/s2mpa01.h>
25f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
26f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define S2MPA01_REGULATOR_CNT ARRAY_SIZE(regulators)
27f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
28f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstruct s2mpa01_info {
29f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ramp_delay24;
30f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ramp_delay3;
31f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ramp_delay5;
32f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ramp_delay16;
33f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ramp_delay7;
34f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ramp_delay8910;
35f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
36f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
37f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int get_ramp_delay(int ramp_delay)
38f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{
39f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	unsigned char cnt = 0;
40f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
41f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	ramp_delay /= 6250;
42f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
43f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	while (true) {
44f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = ramp_delay >> 1;
45f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay == 0)
46f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
47f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		cnt++;
48f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
49f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
50f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (cnt > 3)
51f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		cnt = 3;
52f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
53f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return cnt;
54f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
55f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
56f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
57f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				   unsigned int old_selector,
58f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				   unsigned int new_selector)
59f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{
60f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev);
61f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	unsigned int ramp_delay = 0;
62f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int old_volt, new_volt;
63f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
640608032a9067c165e5ed75c56311a08cbb28564fKrzysztof Kozlowski	switch (rdev_get_id(rdev)) {
65f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK2:
66f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK4:
67f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = s2mpa01->ramp_delay24;
68f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
69f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK3:
70f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = s2mpa01->ramp_delay3;
71f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
72f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK5:
73f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = s2mpa01->ramp_delay5;
74f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
75f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK1:
76f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK6:
77f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = s2mpa01->ramp_delay16;
78f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
79f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK7:
80f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = s2mpa01->ramp_delay7;
81f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
82f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK8:
83f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK9:
84f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK10:
85f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = s2mpa01->ramp_delay8910;
86f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
87f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
88f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
89f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (ramp_delay == 0)
90f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_delay = rdev->desc->ramp_delay;
91f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
92f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector);
93f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector);
94f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
95f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay);
96f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
97f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
98f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
99f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{
100f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev);
101f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	unsigned int ramp_val, ramp_shift, ramp_reg = S2MPA01_REG_RAMP2;
102f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	unsigned int ramp_enable = 1, enable_shift = 0;
103f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int ret;
104f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
1050608032a9067c165e5ed75c56311a08cbb28564fKrzysztof Kozlowski	switch (rdev_get_id(rdev)) {
106f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK1:
107f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK1_RAMP_EN_SHIFT;
108f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
109f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
110f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
111f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
112f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
113f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay16)
114f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay16 = ramp_delay;
115f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
116f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay16;
117f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
118f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
119f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
120f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK2:
121f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK2_RAMP_EN_SHIFT;
122f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
123f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
124f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
125f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
126f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
127f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay24)
128f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay24 = ramp_delay;
129f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
130f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay24;
131f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
132f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
133f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_reg = S2MPA01_REG_RAMP1;
134f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
135f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK3:
136f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK3_RAMP_EN_SHIFT;
137f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
138f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
139f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
140f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
141f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
142f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		s2mpa01->ramp_delay3 = ramp_delay;
143f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK3_RAMP_SHIFT;
144f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_reg = S2MPA01_REG_RAMP1;
145f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
146f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK4:
147f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK4_RAMP_EN_SHIFT;
148f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
149f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
150f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
151f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
152f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
153f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay24)
154f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay24 = ramp_delay;
155f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
156f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay24;
157f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
158f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
159f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_reg = S2MPA01_REG_RAMP1;
160f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
161f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK5:
162f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		s2mpa01->ramp_delay5 = ramp_delay;
163f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK5_RAMP_SHIFT;
164f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
165f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK6:
166f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay16)
167f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay16 = ramp_delay;
168f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
169f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay16;
170f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
171f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
172f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
173f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK7:
174f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		s2mpa01->ramp_delay7 = ramp_delay;
175f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK7_RAMP_SHIFT;
176f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
177f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK8:
178f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK9:
179f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK10:
180f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay8910)
181f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay8910 = ramp_delay;
182f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
183f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay8910;
184f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
185f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK8910_RAMP_SHIFT;
186f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
187f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	default:
188f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		return 0;
189f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
190f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
191f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (!ramp_enable)
192f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		goto ramp_disable;
193f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
19451e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski	/* Ramp delay can be enabled/disabled only for buck[1234] */
19551e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski	if (rdev_get_id(rdev) >= S2MPA01_BUCK1 &&
19651e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski			rdev_get_id(rdev) <= S2MPA01_BUCK4) {
19751e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski		ret = regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
19851e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski					 1 << enable_shift, 1 << enable_shift);
19951e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski		if (ret) {
20051e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski			dev_err(&rdev->dev, "failed to enable ramp rate\n");
20151e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski			return ret;
20251e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski		}
203f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
204f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
205f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	ramp_val = get_ramp_delay(ramp_delay);
206f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
207f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
208f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				  ramp_val << ramp_shift);
209f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
210f18792714608a670c2762d22f695d77d02fc965eSachin Kamatramp_disable:
211f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
212f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				  1 << enable_shift, 0);
213f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
214f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
215f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_ops s2mpa01_ldo_ops = {
216f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.list_voltage		= regulator_list_voltage_linear,
217f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.map_voltage		= regulator_map_voltage_linear,
218f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.is_enabled		= regulator_is_enabled_regmap,
219f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable			= regulator_enable_regmap,
220f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.disable		= regulator_disable_regmap,
221f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
222f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
223f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
224f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
225f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
226f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_ops s2mpa01_buck_ops = {
227f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.list_voltage		= regulator_list_voltage_linear,
228f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.map_voltage		= regulator_map_voltage_linear,
229f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.is_enabled		= regulator_is_enabled_regmap,
230f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable			= regulator_enable_regmap,
231f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.disable		= regulator_disable_regmap,
232f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
233f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
234f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_time_sel	= s2mpa01_regulator_set_voltage_time_sel,
235f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_ramp_delay		= s2mpa01_set_ramp_delay,
236f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
237f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
238f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_ldo1(num)	{		\
239f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "LDO"#num,			\
240f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_LDO##num,		\
241f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_ldo_ops,		\
242f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,		\
243f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,			\
2440e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_800_MV,			\
2450e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_50_MV,			\
246f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_LDO_N_VOLTAGES,	\
247f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
248f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_LDO_VSEL_MASK,	\
249f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
250f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK		\
251f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
252f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_ldo2(num)	{		\
253f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "LDO"#num,			\
254f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_LDO##num,		\
255f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_ldo_ops,		\
256f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,		\
257f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,			\
2580e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_800_MV,			\
2590e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_25_MV,			\
260f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_LDO_N_VOLTAGES,	\
261f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
262f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_LDO_VSEL_MASK,	\
263f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
264f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK		\
265f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
266f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
267f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck1_4(num)	{			\
268f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK"#num,				\
269f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK##num,			\
270f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
271f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
272f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
2730e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_600_MV,				\
2740e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_6_25_MV,				\
275f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
276f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
277f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B1CTRL2 + (num - 1) * 2,	\
278f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
279f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B1CTRL1 + (num - 1) * 2,	\
280f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
281f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
282f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
283f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck5	{				\
284f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK5",				\
285f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK5,			\
286f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
287f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
288f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
2890e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_800_MV,				\
2900e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_6_25_MV,				\
291f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
292f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
293f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B5CTRL2,			\
294f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
295f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B5CTRL1,			\
296f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
297f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
298f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
299f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck6_7(num)	{			\
300f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK"#num,				\
301f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK##num,			\
302f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
303f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
304f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
3050e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_600_MV,				\
3060e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_6_25_MV,				\
307f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
308f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
309f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B6CTRL2 + (num - 6) * 2,	\
310f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
311f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B6CTRL1 + (num - 6) * 2,	\
312f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
313f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
314f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
315f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck8	{				\
316f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK8",				\
317f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK8,			\
318f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
319f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
320f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
3210e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_800_MV,				\
3220e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_12_5_MV,				\
323f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
324f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
325f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B8CTRL2,			\
326f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
327f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B8CTRL1,			\
328f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
329f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
330f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
331f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck9	{				\
332f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK9",				\
333f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK9,			\
334f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
335f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
336f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
3370e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_1500_MV,				\
3380e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_12_5_MV,				\
339f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
340f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
341f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B9CTRL2,			\
342f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
343f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B9CTRL1,			\
344f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
345f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
346f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
347f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck10	{				\
348f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK10",				\
349f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK10,			\
350f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
351f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
352f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
3530e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.min_uV		= MIN_1000_MV,				\
3540e4f417857083f399769491f6e7773d111debd0fAmit Daniel Kachhap	.uV_step	= STEP_12_5_MV,				\
355f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
356f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
357f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B10CTRL2,			\
358f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
359f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B10CTRL1,			\
360f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
361f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
362f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
363f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_desc regulators[] = {
364f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(1),
365f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(2),
366f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(3),
367f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(4),
368f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(5),
369f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(6),
370f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(7),
371f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(8),
372f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(9),
373f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(10),
374f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(11),
375f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(12),
376f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(13),
377f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(14),
378f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(15),
379f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(16),
380f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(17),
381f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(18),
382f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(19),
383f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(20),
384f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(21),
385f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(22),
386f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(23),
387f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(24),
388f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(25),
389f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(26),
390f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(1),
391f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(2),
392f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(3),
393f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(4),
394f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck5,
395f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck6_7(6),
396f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck6_7(7),
397f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck8,
398f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck9,
399f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck10,
400f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
401f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
402f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_pmic_probe(struct platform_device *pdev)
403f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{
404f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
405f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct sec_platform_data *pdata = dev_get_platdata(iodev->dev);
406f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct of_regulator_match rdata[S2MPA01_REGULATOR_MAX];
407f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct device_node *reg_np = NULL;
408f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct regulator_config config = { };
409f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct s2mpa01_info *s2mpa01;
410f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int i;
411f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
412f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	s2mpa01 = devm_kzalloc(&pdev->dev, sizeof(*s2mpa01), GFP_KERNEL);
413f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (!s2mpa01)
414f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		return -ENOMEM;
415f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
416f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	for (i = 0; i < S2MPA01_REGULATOR_CNT; i++)
417f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		rdata[i].name = regulators[i].name;
418f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
419f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (iodev->dev->of_node) {
420f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		reg_np = of_get_child_by_name(iodev->dev->of_node,
421f18792714608a670c2762d22f695d77d02fc965eSachin Kamat							"regulators");
422f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			if (!reg_np) {
423f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				dev_err(&pdev->dev,
424f18792714608a670c2762d22f695d77d02fc965eSachin Kamat					"could not find regulators sub-node\n");
425f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				return -EINVAL;
426f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			}
427f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
428f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		of_regulator_match(&pdev->dev, reg_np, rdata,
429f18792714608a670c2762d22f695d77d02fc965eSachin Kamat						S2MPA01_REGULATOR_MAX);
430f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		of_node_put(reg_np);
431f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
432f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
433f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	platform_set_drvdata(pdev, s2mpa01);
434f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
435f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	config.dev = &pdev->dev;
436f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	config.regmap = iodev->regmap_pmic;
437f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	config.driver_data = s2mpa01;
438f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
439f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	for (i = 0; i < S2MPA01_REGULATOR_MAX; i++) {
440f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		struct regulator_dev *rdev;
441f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (pdata)
442f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			config.init_data = pdata->regulators[i].initdata;
443f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
444f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			config.init_data = rdata[i].init_data;
445f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
446f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (reg_np)
447f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			config.of_node = rdata[i].of_node;
448f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
449f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		rdev = devm_regulator_register(&pdev->dev,
450f18792714608a670c2762d22f695d77d02fc965eSachin Kamat						&regulators[i], &config);
451f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (IS_ERR(rdev)) {
452f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			dev_err(&pdev->dev, "regulator init failed for %d\n",
453f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				i);
454f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			return PTR_ERR(rdev);
455f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
456f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
457f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
458f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return 0;
459f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
460f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
461f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic const struct platform_device_id s2mpa01_pmic_id[] = {
462f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	{ "s2mpa01-pmic", 0},
463f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	{ },
464f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
465f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id);
466f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
467f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct platform_driver s2mpa01_pmic_driver = {
468f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.driver = {
469f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		.name = "s2mpa01-pmic",
470f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		.owner = THIS_MODULE,
471f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	},
472f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.probe = s2mpa01_pmic_probe,
473f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id_table = s2mpa01_pmic_id,
474f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
475f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
476f18792714608a670c2762d22f695d77d02fc965eSachin Kamatmodule_platform_driver(s2mpa01_pmic_driver);
477f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
478f18792714608a670c2762d22f695d77d02fc965eSachin Kamat/* Module information */
479f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
480f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_AUTHOR("Sachin Kamat <sachin.kamat@samsung.com>");
481f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_DESCRIPTION("SAMSUNG S2MPA01 Regulator Driver");
482f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_LICENSE("GPL");
483