diff options
author | Michael Turquette <mturquette@linaro.org> | 2014-11-29 00:11:10 -0500 |
---|---|---|
committer | Michael Turquette <mturquette@linaro.org> | 2014-11-29 00:11:10 -0500 |
commit | ffa3a37a611190b2a7f44b24b903b3985d8ba780 (patch) | |
tree | 23bea220ad594a39c53bb4460c201dc59ae93ef4 | |
parent | b572b5f821abb350439609f367bd35961f53a28e (diff) | |
parent | 159a5e920446aed12fe373ecc3c7b3dc667091ae (diff) |
Merge tag 'ib-mfd-regulator-clk-v3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd into clk-next
Immutable branch between MFD, Regulator and Clk, due for v3.19
-rw-r--r-- | Documentation/devicetree/bindings/mfd/s2mps11.txt | 22 | ||||
-rw-r--r-- | drivers/clk/clk-s2mps11.c | 24 | ||||
-rw-r--r-- | drivers/mfd/sec-core.c | 29 | ||||
-rw-r--r-- | drivers/mfd/sec-irq.c | 23 | ||||
-rw-r--r-- | drivers/regulator/Kconfig | 10 | ||||
-rw-r--r-- | drivers/regulator/s2mps11.c | 102 | ||||
-rw-r--r-- | include/linux/mfd/samsung/core.h | 2 | ||||
-rw-r--r-- | include/linux/mfd/samsung/s2mps13.h | 186 |
8 files changed, 374 insertions, 24 deletions
diff --git a/Documentation/devicetree/bindings/mfd/s2mps11.txt b/Documentation/devicetree/bindings/mfd/s2mps11.txt index 0e4026a6cbbf..57a045016fca 100644 --- a/Documentation/devicetree/bindings/mfd/s2mps11.txt +++ b/Documentation/devicetree/bindings/mfd/s2mps11.txt | |||
@@ -1,5 +1,5 @@ | |||
1 | 1 | ||
2 | * Samsung S2MPS11, S2MPS14 and S2MPU02 Voltage and Current Regulator | 2 | * Samsung S2MPS11, S2MPS13, S2MPS14 and S2MPU02 Voltage and Current Regulator |
3 | 3 | ||
4 | The Samsung S2MPS11 is a multi-function device which includes voltage and | 4 | The Samsung S2MPS11 is a multi-function device which includes voltage and |
5 | current regulators, RTC, charger controller and other sub-blocks. It is | 5 | current regulators, RTC, charger controller and other sub-blocks. It is |
@@ -7,8 +7,8 @@ interfaced to the host controller using an I2C interface. Each sub-block is | |||
7 | addressed by the host system using different I2C slave addresses. | 7 | addressed by the host system using different I2C slave addresses. |
8 | 8 | ||
9 | Required properties: | 9 | Required properties: |
10 | - compatible: Should be "samsung,s2mps11-pmic" or "samsung,s2mps14-pmic" | 10 | - compatible: Should be "samsung,s2mps11-pmic" or "samsung,s2mps13-pmic" |
11 | or "samsung,s2mpu02-pmic". | 11 | or "samsung,s2mps14-pmic" or "samsung,s2mpu02-pmic". |
12 | - reg: Specifies the I2C slave address of the pmic block. It should be 0x66. | 12 | - reg: Specifies the I2C slave address of the pmic block. It should be 0x66. |
13 | 13 | ||
14 | Optional properties: | 14 | Optional properties: |
@@ -17,8 +17,8 @@ Optional properties: | |||
17 | - interrupts: Interrupt specifiers for interrupt sources. | 17 | - interrupts: Interrupt specifiers for interrupt sources. |
18 | 18 | ||
19 | Optional nodes: | 19 | Optional nodes: |
20 | - clocks: s2mps11 and s5m8767 provide three(AP/CP/BT) buffered 32.768 KHz | 20 | - clocks: s2mps11, s2mps13 and s5m8767 provide three(AP/CP/BT) buffered 32.768 |
21 | outputs, so to register these as clocks with common clock framework | 21 | KHz outputs, so to register these as clocks with common clock framework |
22 | instantiate a sub-node named "clocks". It uses the common clock binding | 22 | instantiate a sub-node named "clocks". It uses the common clock binding |
23 | documented in : | 23 | documented in : |
24 | [Documentation/devicetree/bindings/clock/clock-bindings.txt] | 24 | [Documentation/devicetree/bindings/clock/clock-bindings.txt] |
@@ -30,12 +30,12 @@ Optional nodes: | |||
30 | the clock which they consume. | 30 | the clock which they consume. |
31 | Clock ID Devices | 31 | Clock ID Devices |
32 | ---------------------------------------------------------- | 32 | ---------------------------------------------------------- |
33 | 32KhzAP 0 S2MPS11, S2MPS14, S5M8767 | 33 | 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S5M8767 |
34 | 32KhzCP 1 S2MPS11, S5M8767 | 34 | 32KhzCP 1 S2MPS11, S2MPS13, S5M8767 |
35 | 32KhzBT 2 S2MPS11, S2MPS14, S5M8767 | 35 | 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S5M8767 |
36 | 36 | ||
37 | - compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps14-clk", | 37 | - compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps13-clk", |
38 | "samsung,s5m8767-clk" | 38 | "samsung,s2mps14-clk", "samsung,s5m8767-clk" |
39 | 39 | ||
40 | - regulators: The regulators of s2mps11 that have to be instantiated should be | 40 | - regulators: The regulators of s2mps11 that have to be instantiated should be |
41 | included in a sub-node named 'regulators'. Regulator nodes included in this | 41 | included in a sub-node named 'regulators'. Regulator nodes included in this |
@@ -81,12 +81,14 @@ as per the datasheet of s2mps11. | |||
81 | - LDOn | 81 | - LDOn |
82 | - valid values for n are: | 82 | - valid values for n are: |
83 | - S2MPS11: 1 to 38 | 83 | - S2MPS11: 1 to 38 |
84 | - S2MPS13: 1 to 40 | ||
84 | - S2MPS14: 1 to 25 | 85 | - S2MPS14: 1 to 25 |
85 | - S2MPU02: 1 to 28 | 86 | - S2MPU02: 1 to 28 |
86 | - Example: LDO1, LDO2, LDO28 | 87 | - Example: LDO1, LDO2, LDO28 |
87 | - BUCKn | 88 | - BUCKn |
88 | - valid values for n are: | 89 | - valid values for n are: |
89 | - S2MPS11: 1 to 10 | 90 | - S2MPS11: 1 to 10 |
91 | - S2MPS13: 1 to 10 | ||
90 | - S2MPS14: 1 to 5 | 92 | - S2MPS14: 1 to 5 |
91 | - S2MPU02: 1 to 7 | 93 | - S2MPU02: 1 to 7 |
92 | - Example: BUCK1, BUCK2, BUCK9 | 94 | - Example: BUCK1, BUCK2, BUCK9 |
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index f16ab25e12c0..4f98898efd3c 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/clk-provider.h> | 23 | #include <linux/clk-provider.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/mfd/samsung/s2mps11.h> | 25 | #include <linux/mfd/samsung/s2mps11.h> |
26 | #include <linux/mfd/samsung/s2mps13.h> | ||
26 | #include <linux/mfd/samsung/s2mps14.h> | 27 | #include <linux/mfd/samsung/s2mps14.h> |
27 | #include <linux/mfd/samsung/s5m8767.h> | 28 | #include <linux/mfd/samsung/s5m8767.h> |
28 | #include <linux/mfd/samsung/core.h> | 29 | #include <linux/mfd/samsung/core.h> |
@@ -120,6 +121,24 @@ static struct clk_init_data s2mps11_clks_init[S2MPS11_CLKS_NUM] = { | |||
120 | }, | 121 | }, |
121 | }; | 122 | }; |
122 | 123 | ||
124 | static struct clk_init_data s2mps13_clks_init[S2MPS11_CLKS_NUM] = { | ||
125 | [S2MPS11_CLK_AP] = { | ||
126 | .name = "s2mps13_ap", | ||
127 | .ops = &s2mps11_clk_ops, | ||
128 | .flags = CLK_IS_ROOT, | ||
129 | }, | ||
130 | [S2MPS11_CLK_CP] = { | ||
131 | .name = "s2mps13_cp", | ||
132 | .ops = &s2mps11_clk_ops, | ||
133 | .flags = CLK_IS_ROOT, | ||
134 | }, | ||
135 | [S2MPS11_CLK_BT] = { | ||
136 | .name = "s2mps13_bt", | ||
137 | .ops = &s2mps11_clk_ops, | ||
138 | .flags = CLK_IS_ROOT, | ||
139 | }, | ||
140 | }; | ||
141 | |||
123 | static struct clk_init_data s2mps14_clks_init[S2MPS11_CLKS_NUM] = { | 142 | static struct clk_init_data s2mps14_clks_init[S2MPS11_CLKS_NUM] = { |
124 | [S2MPS11_CLK_AP] = { | 143 | [S2MPS11_CLK_AP] = { |
125 | .name = "s2mps14_ap", | 144 | .name = "s2mps14_ap", |
@@ -184,6 +203,10 @@ static int s2mps11_clk_probe(struct platform_device *pdev) | |||
184 | s2mps11_reg = S2MPS11_REG_RTC_CTRL; | 203 | s2mps11_reg = S2MPS11_REG_RTC_CTRL; |
185 | clks_init = s2mps11_clks_init; | 204 | clks_init = s2mps11_clks_init; |
186 | break; | 205 | break; |
206 | case S2MPS13X: | ||
207 | s2mps11_reg = S2MPS13_REG_RTCCTRL; | ||
208 | clks_init = s2mps13_clks_init; | ||
209 | break; | ||
187 | case S2MPS14X: | 210 | case S2MPS14X: |
188 | s2mps11_reg = S2MPS14_REG_RTCCTRL; | 211 | s2mps11_reg = S2MPS14_REG_RTCCTRL; |
189 | clks_init = s2mps14_clks_init; | 212 | clks_init = s2mps14_clks_init; |
@@ -279,6 +302,7 @@ static int s2mps11_clk_remove(struct platform_device *pdev) | |||
279 | 302 | ||
280 | static const struct platform_device_id s2mps11_clk_id[] = { | 303 | static const struct platform_device_id s2mps11_clk_id[] = { |
281 | { "s2mps11-clk", S2MPS11X}, | 304 | { "s2mps11-clk", S2MPS11X}, |
305 | { "s2mps13-clk", S2MPS13X}, | ||
282 | { "s2mps14-clk", S2MPS14X}, | 306 | { "s2mps14-clk", S2MPS14X}, |
283 | { "s5m8767-clk", S5M8767X}, | 307 | { "s5m8767-clk", S5M8767X}, |
284 | { }, | 308 | { }, |
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c index dba7e2b6f8e9..b39960532f76 100644 --- a/drivers/mfd/sec-core.c +++ b/drivers/mfd/sec-core.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/mfd/samsung/irq.h> | 27 | #include <linux/mfd/samsung/irq.h> |
28 | #include <linux/mfd/samsung/s2mpa01.h> | 28 | #include <linux/mfd/samsung/s2mpa01.h> |
29 | #include <linux/mfd/samsung/s2mps11.h> | 29 | #include <linux/mfd/samsung/s2mps11.h> |
30 | #include <linux/mfd/samsung/s2mps13.h> | ||
30 | #include <linux/mfd/samsung/s2mps14.h> | 31 | #include <linux/mfd/samsung/s2mps14.h> |
31 | #include <linux/mfd/samsung/s2mpu02.h> | 32 | #include <linux/mfd/samsung/s2mpu02.h> |
32 | #include <linux/mfd/samsung/s5m8763.h> | 33 | #include <linux/mfd/samsung/s5m8763.h> |
@@ -74,6 +75,15 @@ static const struct mfd_cell s2mps11_devs[] = { | |||
74 | } | 75 | } |
75 | }; | 76 | }; |
76 | 77 | ||
78 | static const struct mfd_cell s2mps13_devs[] = { | ||
79 | { .name = "s2mps13-pmic", }, | ||
80 | { .name = "s2mps13-rtc", }, | ||
81 | { | ||
82 | .name = "s2mps13-clk", | ||
83 | .of_compatible = "samsung,s2mps13-clk", | ||
84 | }, | ||
85 | }; | ||
86 | |||
77 | static const struct mfd_cell s2mps14_devs[] = { | 87 | static const struct mfd_cell s2mps14_devs[] = { |
78 | { | 88 | { |
79 | .name = "s2mps14-pmic", | 89 | .name = "s2mps14-pmic", |
@@ -108,6 +118,9 @@ static const struct of_device_id sec_dt_match[] = { | |||
108 | .compatible = "samsung,s2mps11-pmic", | 118 | .compatible = "samsung,s2mps11-pmic", |
109 | .data = (void *)S2MPS11X, | 119 | .data = (void *)S2MPS11X, |
110 | }, { | 120 | }, { |
121 | .compatible = "samsung,s2mps13-pmic", | ||
122 | .data = (void *)S2MPS13X, | ||
123 | }, { | ||
111 | .compatible = "samsung,s2mps14-pmic", | 124 | .compatible = "samsung,s2mps14-pmic", |
112 | .data = (void *)S2MPS14X, | 125 | .data = (void *)S2MPS14X, |
113 | }, { | 126 | }, { |
@@ -194,6 +207,15 @@ static const struct regmap_config s2mps11_regmap_config = { | |||
194 | .cache_type = REGCACHE_FLAT, | 207 | .cache_type = REGCACHE_FLAT, |
195 | }; | 208 | }; |
196 | 209 | ||
210 | static const struct regmap_config s2mps13_regmap_config = { | ||
211 | .reg_bits = 8, | ||
212 | .val_bits = 8, | ||
213 | |||
214 | .max_register = S2MPS13_REG_LDODSCH5, | ||
215 | .volatile_reg = s2mps11_volatile, | ||
216 | .cache_type = REGCACHE_FLAT, | ||
217 | }; | ||
218 | |||
197 | static const struct regmap_config s2mps14_regmap_config = { | 219 | static const struct regmap_config s2mps14_regmap_config = { |
198 | .reg_bits = 8, | 220 | .reg_bits = 8, |
199 | .val_bits = 8, | 221 | .val_bits = 8, |
@@ -325,6 +347,9 @@ static int sec_pmic_probe(struct i2c_client *i2c, | |||
325 | case S2MPS11X: | 347 | case S2MPS11X: |
326 | regmap = &s2mps11_regmap_config; | 348 | regmap = &s2mps11_regmap_config; |
327 | break; | 349 | break; |
350 | case S2MPS13X: | ||
351 | regmap = &s2mps13_regmap_config; | ||
352 | break; | ||
328 | case S2MPS14X: | 353 | case S2MPS14X: |
329 | regmap = &s2mps14_regmap_config; | 354 | regmap = &s2mps14_regmap_config; |
330 | break; | 355 | break; |
@@ -378,6 +403,10 @@ static int sec_pmic_probe(struct i2c_client *i2c, | |||
378 | sec_devs = s2mps11_devs; | 403 | sec_devs = s2mps11_devs; |
379 | num_sec_devs = ARRAY_SIZE(s2mps11_devs); | 404 | num_sec_devs = ARRAY_SIZE(s2mps11_devs); |
380 | break; | 405 | break; |
406 | case S2MPS13X: | ||
407 | sec_devs = s2mps13_devs; | ||
408 | num_sec_devs = ARRAY_SIZE(s2mps13_devs); | ||
409 | break; | ||
381 | case S2MPS14X: | 410 | case S2MPS14X: |
382 | sec_devs = s2mps14_devs; | 411 | sec_devs = s2mps14_devs; |
383 | num_sec_devs = ARRAY_SIZE(s2mps14_devs); | 412 | num_sec_devs = ARRAY_SIZE(s2mps14_devs); |
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c index f9a57869e3ec..ba86a918c2da 100644 --- a/drivers/mfd/sec-irq.c +++ b/drivers/mfd/sec-irq.c | |||
@@ -389,14 +389,22 @@ static const struct regmap_irq_chip s2mps11_irq_chip = { | |||
389 | .ack_base = S2MPS11_REG_INT1, | 389 | .ack_base = S2MPS11_REG_INT1, |
390 | }; | 390 | }; |
391 | 391 | ||
392 | #define S2MPS1X_IRQ_CHIP_COMMON_DATA \ | ||
393 | .irqs = s2mps14_irqs, \ | ||
394 | .num_irqs = ARRAY_SIZE(s2mps14_irqs), \ | ||
395 | .num_regs = 3, \ | ||
396 | .status_base = S2MPS14_REG_INT1, \ | ||
397 | .mask_base = S2MPS14_REG_INT1M, \ | ||
398 | .ack_base = S2MPS14_REG_INT1 \ | ||
399 | |||
400 | static const struct regmap_irq_chip s2mps13_irq_chip = { | ||
401 | .name = "s2mps13", | ||
402 | S2MPS1X_IRQ_CHIP_COMMON_DATA, | ||
403 | }; | ||
404 | |||
392 | static const struct regmap_irq_chip s2mps14_irq_chip = { | 405 | static const struct regmap_irq_chip s2mps14_irq_chip = { |
393 | .name = "s2mps14", | 406 | .name = "s2mps14", |
394 | .irqs = s2mps14_irqs, | 407 | S2MPS1X_IRQ_CHIP_COMMON_DATA, |
395 | .num_irqs = ARRAY_SIZE(s2mps14_irqs), | ||
396 | .num_regs = 3, | ||
397 | .status_base = S2MPS14_REG_INT1, | ||
398 | .mask_base = S2MPS14_REG_INT1M, | ||
399 | .ack_base = S2MPS14_REG_INT1, | ||
400 | }; | 408 | }; |
401 | 409 | ||
402 | static const struct regmap_irq_chip s2mpu02_irq_chip = { | 410 | static const struct regmap_irq_chip s2mpu02_irq_chip = { |
@@ -452,6 +460,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic) | |||
452 | case S2MPS11X: | 460 | case S2MPS11X: |
453 | sec_irq_chip = &s2mps11_irq_chip; | 461 | sec_irq_chip = &s2mps11_irq_chip; |
454 | break; | 462 | break; |
463 | case S2MPS13X: | ||
464 | sec_irq_chip = &s2mps13_irq_chip; | ||
465 | break; | ||
455 | case S2MPS14X: | 466 | case S2MPS14X: |
456 | sec_irq_chip = &s2mps14_irq_chip; | 467 | sec_irq_chip = &s2mps14_irq_chip; |
457 | break; | 468 | break; |
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 55d7b7b0f2e0..5e061347be93 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig | |||
@@ -529,13 +529,13 @@ config REGULATOR_S2MPA01 | |||
529 | via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. | 529 | via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. |
530 | 530 | ||
531 | config REGULATOR_S2MPS11 | 531 | config REGULATOR_S2MPS11 |
532 | tristate "Samsung S2MPS11/S2MPS14/S2MPU02 voltage regulator" | 532 | tristate "Samsung S2MPS11/S2MPS13/S2MPS14/S2MPU02 voltage regulator" |
533 | depends on MFD_SEC_CORE | 533 | depends on MFD_SEC_CORE |
534 | help | 534 | help |
535 | This driver supports a Samsung S2MPS11/S2MPS14/S2MPU02 voltage output | 535 | This driver supports a Samsung S2MPS11/S2MPS13/S2MPS14/S2MPU02 voltage |
536 | regulator via I2C bus. The chip is comprised of high efficient Buck | 536 | output regulator via I2C bus. The chip is comprised of high efficient |
537 | converters including Dual-Phase Buck converter, Buck-Boost converter, | 537 | Buck converters including Dual-Phase Buck converter, Buck-Boost |
538 | various LDOs. | 538 | converter, various LDOs. |
539 | 539 | ||
540 | config REGULATOR_S5M8767 | 540 | config REGULATOR_S5M8767 |
541 | tristate "Samsung S5M8767A voltage regulator" | 541 | tristate "Samsung S5M8767A voltage regulator" |
diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index adab82d5279f..738dc7763d47 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/of_gpio.h> | 30 | #include <linux/of_gpio.h> |
31 | #include <linux/mfd/samsung/core.h> | 31 | #include <linux/mfd/samsung/core.h> |
32 | #include <linux/mfd/samsung/s2mps11.h> | 32 | #include <linux/mfd/samsung/s2mps11.h> |
33 | #include <linux/mfd/samsung/s2mps13.h> | ||
33 | #include <linux/mfd/samsung/s2mps14.h> | 34 | #include <linux/mfd/samsung/s2mps14.h> |
34 | #include <linux/mfd/samsung/s2mpu02.h> | 35 | #include <linux/mfd/samsung/s2mpu02.h> |
35 | 36 | ||
@@ -45,10 +46,10 @@ struct s2mps11_info { | |||
45 | enum sec_device_type dev_type; | 46 | enum sec_device_type dev_type; |
46 | 47 | ||
47 | /* | 48 | /* |
48 | * One bit for each S2MPS14/S2MPU02 regulator whether the suspend mode | 49 | * One bit for each S2MPS13/S2MPS14/S2MPU02 regulator whether |
49 | * was enabled. | 50 | * the suspend mode was enabled. |
50 | */ | 51 | */ |
51 | unsigned long long s2mps14_suspend_state:35; | 52 | unsigned long long s2mps14_suspend_state:50; |
52 | 53 | ||
53 | /* Array of size rdev_num with GPIO-s for external sleep control */ | 54 | /* Array of size rdev_num with GPIO-s for external sleep control */ |
54 | int *ext_control_gpio; | 55 | int *ext_control_gpio; |
@@ -369,12 +370,101 @@ static const struct regulator_desc s2mps11_regulators[] = { | |||
369 | regulator_desc_s2mps11_buck6_10(10, MIN_750_MV, STEP_12_5_MV), | 370 | regulator_desc_s2mps11_buck6_10(10, MIN_750_MV, STEP_12_5_MV), |
370 | }; | 371 | }; |
371 | 372 | ||
373 | static struct regulator_ops s2mps14_reg_ops; | ||
374 | |||
375 | #define regulator_desc_s2mps13_ldo(num, min, step, min_sel) { \ | ||
376 | .name = "LDO"#num, \ | ||
377 | .id = S2MPS13_LDO##num, \ | ||
378 | .ops = &s2mps14_reg_ops, \ | ||
379 | .type = REGULATOR_VOLTAGE, \ | ||
380 | .owner = THIS_MODULE, \ | ||
381 | .min_uV = min, \ | ||
382 | .uV_step = step, \ | ||
383 | .linear_min_sel = min_sel, \ | ||
384 | .n_voltages = S2MPS14_LDO_N_VOLTAGES, \ | ||
385 | .vsel_reg = S2MPS13_REG_L1CTRL + num - 1, \ | ||
386 | .vsel_mask = S2MPS14_LDO_VSEL_MASK, \ | ||
387 | .enable_reg = S2MPS13_REG_L1CTRL + num - 1, \ | ||
388 | .enable_mask = S2MPS14_ENABLE_MASK \ | ||
389 | } | ||
390 | |||
391 | #define regulator_desc_s2mps13_buck(num, min, step, min_sel) { \ | ||
392 | .name = "BUCK"#num, \ | ||
393 | .id = S2MPS13_BUCK##num, \ | ||
394 | .ops = &s2mps14_reg_ops, \ | ||
395 | .type = REGULATOR_VOLTAGE, \ | ||
396 | .owner = THIS_MODULE, \ | ||
397 | .min_uV = min, \ | ||
398 | .uV_step = step, \ | ||
399 | .linear_min_sel = min_sel, \ | ||
400 | .n_voltages = S2MPS14_BUCK_N_VOLTAGES, \ | ||
401 | .ramp_delay = S2MPS13_BUCK_RAMP_DELAY, \ | ||
402 | .vsel_reg = S2MPS13_REG_B1OUT + (num - 1) * 2, \ | ||
403 | .vsel_mask = S2MPS14_BUCK_VSEL_MASK, \ | ||
404 | .enable_reg = S2MPS13_REG_B1CTRL + (num - 1) * 2, \ | ||
405 | .enable_mask = S2MPS14_ENABLE_MASK \ | ||
406 | } | ||
407 | |||
408 | static const struct regulator_desc s2mps13_regulators[] = { | ||
409 | regulator_desc_s2mps13_ldo(1, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
410 | regulator_desc_s2mps13_ldo(2, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
411 | regulator_desc_s2mps13_ldo(3, MIN_1000_MV, STEP_25_MV, 0x08), | ||
412 | regulator_desc_s2mps13_ldo(4, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
413 | regulator_desc_s2mps13_ldo(5, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
414 | regulator_desc_s2mps13_ldo(6, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
415 | regulator_desc_s2mps13_ldo(7, MIN_1000_MV, STEP_25_MV, 0x08), | ||
416 | regulator_desc_s2mps13_ldo(8, MIN_1000_MV, STEP_25_MV, 0x08), | ||
417 | regulator_desc_s2mps13_ldo(9, MIN_1000_MV, STEP_25_MV, 0x08), | ||
418 | regulator_desc_s2mps13_ldo(10, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
419 | regulator_desc_s2mps13_ldo(11, MIN_800_MV, STEP_25_MV, 0x10), | ||
420 | regulator_desc_s2mps13_ldo(12, MIN_800_MV, STEP_25_MV, 0x10), | ||
421 | regulator_desc_s2mps13_ldo(13, MIN_800_MV, STEP_25_MV, 0x10), | ||
422 | regulator_desc_s2mps13_ldo(14, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
423 | regulator_desc_s2mps13_ldo(15, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
424 | regulator_desc_s2mps13_ldo(16, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
425 | regulator_desc_s2mps13_ldo(17, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
426 | regulator_desc_s2mps13_ldo(18, MIN_1000_MV, STEP_25_MV, 0x08), | ||
427 | regulator_desc_s2mps13_ldo(19, MIN_1000_MV, STEP_25_MV, 0x08), | ||
428 | regulator_desc_s2mps13_ldo(20, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
429 | regulator_desc_s2mps13_ldo(21, MIN_1000_MV, STEP_25_MV, 0x08), | ||
430 | regulator_desc_s2mps13_ldo(22, MIN_1000_MV, STEP_25_MV, 0x08), | ||
431 | regulator_desc_s2mps13_ldo(23, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
432 | regulator_desc_s2mps13_ldo(24, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
433 | regulator_desc_s2mps13_ldo(25, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
434 | regulator_desc_s2mps13_ldo(26, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
435 | regulator_desc_s2mps13_ldo(27, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
436 | regulator_desc_s2mps13_ldo(28, MIN_1000_MV, STEP_25_MV, 0x08), | ||
437 | regulator_desc_s2mps13_ldo(29, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
438 | regulator_desc_s2mps13_ldo(30, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
439 | regulator_desc_s2mps13_ldo(31, MIN_1000_MV, STEP_25_MV, 0x08), | ||
440 | regulator_desc_s2mps13_ldo(32, MIN_1000_MV, STEP_25_MV, 0x08), | ||
441 | regulator_desc_s2mps13_ldo(33, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
442 | regulator_desc_s2mps13_ldo(34, MIN_1000_MV, STEP_25_MV, 0x08), | ||
443 | regulator_desc_s2mps13_ldo(35, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
444 | regulator_desc_s2mps13_ldo(36, MIN_800_MV, STEP_12_5_MV, 0x00), | ||
445 | regulator_desc_s2mps13_ldo(37, MIN_1000_MV, STEP_25_MV, 0x08), | ||
446 | regulator_desc_s2mps13_ldo(38, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
447 | regulator_desc_s2mps13_ldo(39, MIN_1000_MV, STEP_25_MV, 0x08), | ||
448 | regulator_desc_s2mps13_ldo(40, MIN_1400_MV, STEP_50_MV, 0x0C), | ||
449 | regulator_desc_s2mps13_buck(1, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
450 | regulator_desc_s2mps13_buck(2, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
451 | regulator_desc_s2mps13_buck(3, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
452 | regulator_desc_s2mps13_buck(4, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
453 | regulator_desc_s2mps13_buck(5, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
454 | regulator_desc_s2mps13_buck(6, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
455 | regulator_desc_s2mps13_buck(7, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
456 | regulator_desc_s2mps13_buck(8, MIN_1000_MV, STEP_12_5_MV, 0x20), | ||
457 | regulator_desc_s2mps13_buck(9, MIN_1000_MV, STEP_12_5_MV, 0x20), | ||
458 | regulator_desc_s2mps13_buck(10, MIN_500_MV, STEP_6_25_MV, 0x10), | ||
459 | }; | ||
460 | |||
372 | static int s2mps14_regulator_enable(struct regulator_dev *rdev) | 461 | static int s2mps14_regulator_enable(struct regulator_dev *rdev) |
373 | { | 462 | { |
374 | struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev); | 463 | struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev); |
375 | unsigned int val; | 464 | unsigned int val; |
376 | 465 | ||
377 | switch (s2mps11->dev_type) { | 466 | switch (s2mps11->dev_type) { |
467 | case S2MPS13X: | ||
378 | case S2MPS14X: | 468 | case S2MPS14X: |
379 | if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev))) | 469 | if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev))) |
380 | val = S2MPS14_ENABLE_SUSPEND; | 470 | val = S2MPS14_ENABLE_SUSPEND; |
@@ -406,6 +496,7 @@ static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev) | |||
406 | 496 | ||
407 | /* Below LDO should be always on or does not support suspend mode. */ | 497 | /* Below LDO should be always on or does not support suspend mode. */ |
408 | switch (s2mps11->dev_type) { | 498 | switch (s2mps11->dev_type) { |
499 | case S2MPS13X: | ||
409 | case S2MPS14X: | 500 | case S2MPS14X: |
410 | switch (rdev_id) { | 501 | switch (rdev_id) { |
411 | case S2MPS14_LDO3: | 502 | case S2MPS14_LDO3: |
@@ -831,6 +922,10 @@ static int s2mps11_pmic_probe(struct platform_device *pdev) | |||
831 | s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators); | 922 | s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators); |
832 | regulators = s2mps11_regulators; | 923 | regulators = s2mps11_regulators; |
833 | break; | 924 | break; |
925 | case S2MPS13X: | ||
926 | s2mps11->rdev_num = ARRAY_SIZE(s2mps13_regulators); | ||
927 | regulators = s2mps13_regulators; | ||
928 | break; | ||
834 | case S2MPS14X: | 929 | case S2MPS14X: |
835 | s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators); | 930 | s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators); |
836 | regulators = s2mps14_regulators; | 931 | regulators = s2mps14_regulators; |
@@ -927,6 +1022,7 @@ out: | |||
927 | 1022 | ||
928 | static const struct platform_device_id s2mps11_pmic_id[] = { | 1023 | static const struct platform_device_id s2mps11_pmic_id[] = { |
929 | { "s2mps11-pmic", S2MPS11X}, | 1024 | { "s2mps11-pmic", S2MPS11X}, |
1025 | { "s2mps13-pmic", S2MPS13X}, | ||
930 | { "s2mps14-pmic", S2MPS14X}, | 1026 | { "s2mps14-pmic", S2MPS14X}, |
931 | { "s2mpu02-pmic", S2MPU02}, | 1027 | { "s2mpu02-pmic", S2MPU02}, |
932 | { }, | 1028 | { }, |
diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h index 1825edacbda7..3fdb7cfbffb3 100644 --- a/include/linux/mfd/samsung/core.h +++ b/include/linux/mfd/samsung/core.h | |||
@@ -28,6 +28,7 @@ | |||
28 | #define MIN_800_MV 800000 | 28 | #define MIN_800_MV 800000 |
29 | #define MIN_750_MV 750000 | 29 | #define MIN_750_MV 750000 |
30 | #define MIN_600_MV 600000 | 30 | #define MIN_600_MV 600000 |
31 | #define MIN_500_MV 500000 | ||
31 | 32 | ||
32 | /* Macros to represent steps for LDO/BUCK */ | 33 | /* Macros to represent steps for LDO/BUCK */ |
33 | #define STEP_50_MV 50000 | 34 | #define STEP_50_MV 50000 |
@@ -41,6 +42,7 @@ enum sec_device_type { | |||
41 | S5M8767X, | 42 | S5M8767X, |
42 | S2MPA01, | 43 | S2MPA01, |
43 | S2MPS11X, | 44 | S2MPS11X, |
45 | S2MPS13X, | ||
44 | S2MPS14X, | 46 | S2MPS14X, |
45 | S2MPU02, | 47 | S2MPU02, |
46 | }; | 48 | }; |
diff --git a/include/linux/mfd/samsung/s2mps13.h b/include/linux/mfd/samsung/s2mps13.h new file mode 100644 index 000000000000..ce5dda8958fe --- /dev/null +++ b/include/linux/mfd/samsung/s2mps13.h | |||
@@ -0,0 +1,186 @@ | |||
1 | /* | ||
2 | * s2mps13.h | ||
3 | * | ||
4 | * Copyright (c) 2014 Samsung Electronics Co., Ltd | ||
5 | * http://www.samsung.com | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #ifndef __LINUX_MFD_S2MPS13_H | ||
20 | #define __LINUX_MFD_S2MPS13_H | ||
21 | |||
22 | /* S2MPS13 registers */ | ||
23 | enum s2mps13_reg { | ||
24 | S2MPS13_REG_ID, | ||
25 | S2MPS13_REG_INT1, | ||
26 | S2MPS13_REG_INT2, | ||
27 | S2MPS13_REG_INT3, | ||
28 | S2MPS13_REG_INT1M, | ||
29 | S2MPS13_REG_INT2M, | ||
30 | S2MPS13_REG_INT3M, | ||
31 | S2MPS13_REG_ST1, | ||
32 | S2MPS13_REG_ST2, | ||
33 | S2MPS13_REG_PWRONSRC, | ||
34 | S2MPS13_REG_OFFSRC, | ||
35 | S2MPS13_REG_BU_CHG, | ||
36 | S2MPS13_REG_RTCCTRL, | ||
37 | S2MPS13_REG_CTRL1, | ||
38 | S2MPS13_REG_CTRL2, | ||
39 | S2MPS13_REG_RSVD1, | ||
40 | S2MPS13_REG_RSVD2, | ||
41 | S2MPS13_REG_RSVD3, | ||
42 | S2MPS13_REG_RSVD4, | ||
43 | S2MPS13_REG_RSVD5, | ||
44 | S2MPS13_REG_RSVD6, | ||
45 | S2MPS13_REG_CTRL3, | ||
46 | S2MPS13_REG_RSVD7, | ||
47 | S2MPS13_REG_RSVD8, | ||
48 | S2MPS13_REG_WRSTBI, | ||
49 | S2MPS13_REG_B1CTRL, | ||
50 | S2MPS13_REG_B1OUT, | ||
51 | S2MPS13_REG_B2CTRL, | ||
52 | S2MPS13_REG_B2OUT, | ||
53 | S2MPS13_REG_B3CTRL, | ||
54 | S2MPS13_REG_B3OUT, | ||
55 | S2MPS13_REG_B4CTRL, | ||
56 | S2MPS13_REG_B4OUT, | ||
57 | S2MPS13_REG_B5CTRL, | ||
58 | S2MPS13_REG_B5OUT, | ||
59 | S2MPS13_REG_B6CTRL, | ||
60 | S2MPS13_REG_B6OUT, | ||
61 | S2MPS13_REG_B7CTRL, | ||
62 | S2MPS13_REG_B7OUT, | ||
63 | S2MPS13_REG_B8CTRL, | ||
64 | S2MPS13_REG_B8OUT, | ||
65 | S2MPS13_REG_B9CTRL, | ||
66 | S2MPS13_REG_B9OUT, | ||
67 | S2MPS13_REG_B10CTRL, | ||
68 | S2MPS13_REG_B10OUT, | ||
69 | S2MPS13_REG_BB1CTRL, | ||
70 | S2MPS13_REG_BB1OUT, | ||
71 | S2MPS13_REG_BUCK_RAMP1, | ||
72 | S2MPS13_REG_BUCK_RAMP2, | ||
73 | S2MPS13_REG_LDO_DVS1, | ||
74 | S2MPS13_REG_LDO_DVS2, | ||
75 | S2MPS13_REG_LDO_DVS3, | ||
76 | S2MPS13_REG_B6OUT2, | ||
77 | S2MPS13_REG_L1CTRL, | ||
78 | S2MPS13_REG_L2CTRL, | ||
79 | S2MPS13_REG_L3CTRL, | ||
80 | S2MPS13_REG_L4CTRL, | ||
81 | S2MPS13_REG_L5CTRL, | ||
82 | S2MPS13_REG_L6CTRL, | ||
83 | S2MPS13_REG_L7CTRL, | ||
84 | S2MPS13_REG_L8CTRL, | ||
85 | S2MPS13_REG_L9CTRL, | ||
86 | S2MPS13_REG_L10CTRL, | ||
87 | S2MPS13_REG_L11CTRL, | ||
88 | S2MPS13_REG_L12CTRL, | ||
89 | S2MPS13_REG_L13CTRL, | ||
90 | S2MPS13_REG_L14CTRL, | ||
91 | S2MPS13_REG_L15CTRL, | ||
92 | S2MPS13_REG_L16CTRL, | ||
93 | S2MPS13_REG_L17CTRL, | ||
94 | S2MPS13_REG_L18CTRL, | ||
95 | S2MPS13_REG_L19CTRL, | ||
96 | S2MPS13_REG_L20CTRL, | ||
97 | S2MPS13_REG_L21CTRL, | ||
98 | S2MPS13_REG_L22CTRL, | ||
99 | S2MPS13_REG_L23CTRL, | ||
100 | S2MPS13_REG_L24CTRL, | ||
101 | S2MPS13_REG_L25CTRL, | ||
102 | S2MPS13_REG_L26CTRL, | ||
103 | S2MPS13_REG_L27CTRL, | ||
104 | S2MPS13_REG_L28CTRL, | ||
105 | S2MPS13_REG_L30CTRL, | ||
106 | S2MPS13_REG_L31CTRL, | ||
107 | S2MPS13_REG_L32CTRL, | ||
108 | S2MPS13_REG_L33CTRL, | ||
109 | S2MPS13_REG_L34CTRL, | ||
110 | S2MPS13_REG_L35CTRL, | ||
111 | S2MPS13_REG_L36CTRL, | ||
112 | S2MPS13_REG_L37CTRL, | ||
113 | S2MPS13_REG_L38CTRL, | ||
114 | S2MPS13_REG_L39CTRL, | ||
115 | S2MPS13_REG_L40CTRL, | ||
116 | S2MPS13_REG_LDODSCH1, | ||
117 | S2MPS13_REG_LDODSCH2, | ||
118 | S2MPS13_REG_LDODSCH3, | ||
119 | S2MPS13_REG_LDODSCH4, | ||
120 | S2MPS13_REG_LDODSCH5, | ||
121 | }; | ||
122 | |||
123 | /* regulator ids */ | ||
124 | enum s2mps13_regulators { | ||
125 | S2MPS13_LDO1, | ||
126 | S2MPS13_LDO2, | ||
127 | S2MPS13_LDO3, | ||
128 | S2MPS13_LDO4, | ||
129 | S2MPS13_LDO5, | ||
130 | S2MPS13_LDO6, | ||
131 | S2MPS13_LDO7, | ||
132 | S2MPS13_LDO8, | ||
133 | S2MPS13_LDO9, | ||
134 | S2MPS13_LDO10, | ||
135 | S2MPS13_LDO11, | ||
136 | S2MPS13_LDO12, | ||
137 | S2MPS13_LDO13, | ||
138 | S2MPS13_LDO14, | ||
139 | S2MPS13_LDO15, | ||
140 | S2MPS13_LDO16, | ||
141 | S2MPS13_LDO17, | ||
142 | S2MPS13_LDO18, | ||
143 | S2MPS13_LDO19, | ||
144 | S2MPS13_LDO20, | ||
145 | S2MPS13_LDO21, | ||
146 | S2MPS13_LDO22, | ||
147 | S2MPS13_LDO23, | ||
148 | S2MPS13_LDO24, | ||
149 | S2MPS13_LDO25, | ||
150 | S2MPS13_LDO26, | ||
151 | S2MPS13_LDO27, | ||
152 | S2MPS13_LDO28, | ||
153 | S2MPS13_LDO29, | ||
154 | S2MPS13_LDO30, | ||
155 | S2MPS13_LDO31, | ||
156 | S2MPS13_LDO32, | ||
157 | S2MPS13_LDO33, | ||
158 | S2MPS13_LDO34, | ||
159 | S2MPS13_LDO35, | ||
160 | S2MPS13_LDO36, | ||
161 | S2MPS13_LDO37, | ||
162 | S2MPS13_LDO38, | ||
163 | S2MPS13_LDO39, | ||
164 | S2MPS13_LDO40, | ||
165 | S2MPS13_BUCK1, | ||
166 | S2MPS13_BUCK2, | ||
167 | S2MPS13_BUCK3, | ||
168 | S2MPS13_BUCK4, | ||
169 | S2MPS13_BUCK5, | ||
170 | S2MPS13_BUCK6, | ||
171 | S2MPS13_BUCK7, | ||
172 | S2MPS13_BUCK8, | ||
173 | S2MPS13_BUCK9, | ||
174 | S2MPS13_BUCK10, | ||
175 | |||
176 | S2MPS13_REGULATOR_MAX, | ||
177 | }; | ||
178 | |||
179 | /* | ||
180 | * Default ramp delay in uv/us. Datasheet says that ramp delay can be | ||
181 | * controlled however it does not specify which register is used for that. | ||
182 | * Let's assume that default value will be set. | ||
183 | */ | ||
184 | #define S2MPS13_BUCK_RAMP_DELAY 12500 | ||
185 | |||
186 | #endif /* __LINUX_MFD_S2MPS13_H */ | ||