s2mpa01.c revision 0608032a9067c165e5ed75c56311a08cbb28564f
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		ramp_reg = S2MPA01_REG_RAMP1;
120f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
121f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK2:
122f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK2_RAMP_EN_SHIFT;
123f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
124f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
125f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
126f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
127f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
128f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay24)
129f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay24 = ramp_delay;
130f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
131f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay24;
132f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
133f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
134f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_reg = S2MPA01_REG_RAMP1;
135f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
136f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK3:
137f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK3_RAMP_EN_SHIFT;
138f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
139f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
140f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
141f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
142f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
143f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		s2mpa01->ramp_delay3 = ramp_delay;
144f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK3_RAMP_SHIFT;
145f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_reg = S2MPA01_REG_RAMP1;
146f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
147f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK4:
148f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		enable_shift = S2MPA01_BUCK4_RAMP_EN_SHIFT;
149f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (!ramp_delay) {
150f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_enable = 0;
151f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			break;
152f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
153f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
154f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay24)
155f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay24 = ramp_delay;
156f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
157f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay24;
158f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
159f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
160f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_reg = S2MPA01_REG_RAMP1;
161f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
162f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK5:
163f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		s2mpa01->ramp_delay5 = ramp_delay;
164f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK5_RAMP_SHIFT;
165f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
166f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK6:
167f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay16)
168f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay16 = ramp_delay;
169f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
170f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay16;
171f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
172f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
173f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
174f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK7:
175f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		s2mpa01->ramp_delay7 = ramp_delay;
176f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK7_RAMP_SHIFT;
177f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
178f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK8:
179f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK9:
180f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	case S2MPA01_BUCK10:
181f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (ramp_delay > s2mpa01->ramp_delay8910)
182f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			s2mpa01->ramp_delay8910 = ramp_delay;
183f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
184f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			ramp_delay = s2mpa01->ramp_delay8910;
185f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
186f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		ramp_shift = S2MPA01_BUCK8910_RAMP_SHIFT;
187f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		break;
188f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	default:
189f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		return 0;
190f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
191f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
192f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (!ramp_enable)
193f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		goto ramp_disable;
194f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
19551e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski	/* Ramp delay can be enabled/disabled only for buck[1234] */
19651e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski	if (rdev_get_id(rdev) >= S2MPA01_BUCK1 &&
19751e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski			rdev_get_id(rdev) <= S2MPA01_BUCK4) {
19851e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski		ret = regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
19951e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski					 1 << enable_shift, 1 << enable_shift);
20051e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski		if (ret) {
20151e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski			dev_err(&rdev->dev, "failed to enable ramp rate\n");
20251e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski			return ret;
20351e2fc0a251ba64c68207e4c6f6ac33c891b2465Krzysztof Kozlowski		}
204f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
205f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
206f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	ramp_val = get_ramp_delay(ramp_delay);
207f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
208f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
209f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				  ramp_val << ramp_shift);
210f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
211f18792714608a670c2762d22f695d77d02fc965eSachin Kamatramp_disable:
212f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
213f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				  1 << enable_shift, 0);
214f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
215f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
216f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_ops s2mpa01_ldo_ops = {
217f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.list_voltage		= regulator_list_voltage_linear,
218f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.map_voltage		= regulator_map_voltage_linear,
219f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.is_enabled		= regulator_is_enabled_regmap,
220f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable			= regulator_enable_regmap,
221f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.disable		= regulator_disable_regmap,
222f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
223f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
224f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
225f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
226f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
227f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_ops s2mpa01_buck_ops = {
228f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.list_voltage		= regulator_list_voltage_linear,
229f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.map_voltage		= regulator_map_voltage_linear,
230f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.is_enabled		= regulator_is_enabled_regmap,
231f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable			= regulator_enable_regmap,
232f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.disable		= regulator_disable_regmap,
233f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
234f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
235f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_voltage_time_sel	= s2mpa01_regulator_set_voltage_time_sel,
236f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.set_ramp_delay		= s2mpa01_set_ramp_delay,
237f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
238f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
239f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_ldo1(num)	{		\
240f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "LDO"#num,			\
241f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_LDO##num,		\
242f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_ldo_ops,		\
243f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,		\
244f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,			\
245f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_LDO_MIN,		\
246f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_LDO_STEP1,		\
247f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_LDO_N_VOLTAGES,	\
248f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
249f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_LDO_VSEL_MASK,	\
250f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
251f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK		\
252f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
253f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_ldo2(num)	{		\
254f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "LDO"#num,			\
255f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_LDO##num,		\
256f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_ldo_ops,		\
257f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,		\
258f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,			\
259f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_LDO_MIN,		\
260f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_LDO_STEP2,		\
261f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_LDO_N_VOLTAGES,	\
262f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
263f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_LDO_VSEL_MASK,	\
264f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
265f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK		\
266f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
267f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
268f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck1_4(num)	{			\
269f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK"#num,				\
270f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK##num,			\
271f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
272f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
273f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
274f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_BUCK_MIN1,			\
275f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_BUCK_STEP1,			\
276f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
277f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
278f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B1CTRL2 + (num - 1) * 2,	\
279f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
280f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B1CTRL1 + (num - 1) * 2,	\
281f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
282f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
283f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
284f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck5	{				\
285f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK5",				\
286f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK5,			\
287f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
288f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
289f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
290f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_BUCK_MIN2,			\
291f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_BUCK_STEP1,			\
292f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
293f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
294f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B5CTRL2,			\
295f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
296f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B5CTRL1,			\
297f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
298f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
299f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
300f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck6_7(num)	{			\
301f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK"#num,				\
302f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK##num,			\
303f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
304f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
305f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
306f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_BUCK_MIN1,			\
307f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_BUCK_STEP1,			\
308f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
309f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
310f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B6CTRL2 + (num - 6) * 2,	\
311f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
312f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B6CTRL1 + (num - 6) * 2,	\
313f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
314f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
315f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
316f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck8	{				\
317f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK8",				\
318f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK8,			\
319f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
320f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
321f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
322f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_BUCK_MIN2,			\
323f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_BUCK_STEP2,			\
324f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
325f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
326f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B8CTRL2,			\
327f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
328f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B8CTRL1,			\
329f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
330f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
331f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
332f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck9	{				\
333f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK9",				\
334f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK9,			\
335f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
336f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
337f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
338f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_BUCK_MIN4,			\
339f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_BUCK_STEP2,			\
340f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
341f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
342f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B9CTRL2,			\
343f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
344f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B9CTRL1,			\
345f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
346f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
347f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
348f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck10	{				\
349f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.name		= "BUCK10",				\
350f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id		= S2MPA01_BUCK10,			\
351f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ops		= &s2mpa01_buck_ops,			\
352f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.type		= REGULATOR_VOLTAGE,			\
353f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.owner		= THIS_MODULE,				\
354f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.min_uV		= S2MPA01_BUCK_MIN3,			\
355f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.uV_step	= S2MPA01_BUCK_STEP2,			\
356f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
357f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
358f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_reg	= S2MPA01_REG_B10CTRL2,			\
359f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
360f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_reg	= S2MPA01_REG_B10CTRL1,			\
361f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.enable_mask	= S2MPA01_ENABLE_MASK			\
362f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
363f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
364f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_desc regulators[] = {
365f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(1),
366f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(2),
367f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(3),
368f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(4),
369f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(5),
370f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(6),
371f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(7),
372f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(8),
373f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(9),
374f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(10),
375f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(11),
376f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(12),
377f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(13),
378f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(14),
379f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(15),
380f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(16),
381f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(17),
382f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(18),
383f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(19),
384f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(20),
385f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(21),
386f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(22),
387f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo2(23),
388f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(24),
389f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(25),
390f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_ldo1(26),
391f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(1),
392f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(2),
393f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(3),
394f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck1_4(4),
395f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck5,
396f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck6_7(6),
397f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck6_7(7),
398f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck8,
399f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck9,
400f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	regulator_desc_buck10,
401f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
402f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
403f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_pmic_probe(struct platform_device *pdev)
404f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{
405f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
406f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct sec_platform_data *pdata = dev_get_platdata(iodev->dev);
407f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct of_regulator_match rdata[S2MPA01_REGULATOR_MAX];
408f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct device_node *reg_np = NULL;
409f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct regulator_config config = { };
410f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	struct s2mpa01_info *s2mpa01;
411f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	int i;
412f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
413f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	s2mpa01 = devm_kzalloc(&pdev->dev, sizeof(*s2mpa01), GFP_KERNEL);
414f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (!s2mpa01)
415f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		return -ENOMEM;
416f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
417f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	for (i = 0; i < S2MPA01_REGULATOR_CNT; i++)
418f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		rdata[i].name = regulators[i].name;
419f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
420f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	if (iodev->dev->of_node) {
421f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		reg_np = of_get_child_by_name(iodev->dev->of_node,
422f18792714608a670c2762d22f695d77d02fc965eSachin Kamat							"regulators");
423f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			if (!reg_np) {
424f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				dev_err(&pdev->dev,
425f18792714608a670c2762d22f695d77d02fc965eSachin Kamat					"could not find regulators sub-node\n");
426f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				return -EINVAL;
427f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			}
428f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
429f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		of_regulator_match(&pdev->dev, reg_np, rdata,
430f18792714608a670c2762d22f695d77d02fc965eSachin Kamat						S2MPA01_REGULATOR_MAX);
431f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		of_node_put(reg_np);
432f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
433f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
434f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	platform_set_drvdata(pdev, s2mpa01);
435f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
436f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	config.dev = &pdev->dev;
437f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	config.regmap = iodev->regmap_pmic;
438f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	config.driver_data = s2mpa01;
439f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
440f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	for (i = 0; i < S2MPA01_REGULATOR_MAX; i++) {
441f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		struct regulator_dev *rdev;
442f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (pdata)
443f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			config.init_data = pdata->regulators[i].initdata;
444f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		else
445f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			config.init_data = rdata[i].init_data;
446f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
447f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (reg_np)
448f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			config.of_node = rdata[i].of_node;
449f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
450f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		rdev = devm_regulator_register(&pdev->dev,
451f18792714608a670c2762d22f695d77d02fc965eSachin Kamat						&regulators[i], &config);
452f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		if (IS_ERR(rdev)) {
453f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			dev_err(&pdev->dev, "regulator init failed for %d\n",
454f18792714608a670c2762d22f695d77d02fc965eSachin Kamat				i);
455f18792714608a670c2762d22f695d77d02fc965eSachin Kamat			return PTR_ERR(rdev);
456f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		}
457f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	}
458f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
459f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	return 0;
460f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}
461f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
462f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic const struct platform_device_id s2mpa01_pmic_id[] = {
463f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	{ "s2mpa01-pmic", 0},
464f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	{ },
465f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
466f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id);
467f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
468f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct platform_driver s2mpa01_pmic_driver = {
469f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.driver = {
470f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		.name = "s2mpa01-pmic",
471f18792714608a670c2762d22f695d77d02fc965eSachin Kamat		.owner = THIS_MODULE,
472f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	},
473f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.probe = s2mpa01_pmic_probe,
474f18792714608a670c2762d22f695d77d02fc965eSachin Kamat	.id_table = s2mpa01_pmic_id,
475f18792714608a670c2762d22f695d77d02fc965eSachin Kamat};
476f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
477f18792714608a670c2762d22f695d77d02fc965eSachin Kamatmodule_platform_driver(s2mpa01_pmic_driver);
478f18792714608a670c2762d22f695d77d02fc965eSachin Kamat
479f18792714608a670c2762d22f695d77d02fc965eSachin Kamat/* Module information */
480f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
481f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_AUTHOR("Sachin Kamat <sachin.kamat@samsung.com>");
482f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_DESCRIPTION("SAMSUNG S2MPA01 Regulator Driver");
483f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_LICENSE("GPL");
484