aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-08-20 15:59:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-08-20 15:59:51 -0400
commitfd4d3328b28354475234275eefdd3125c6a54ed7 (patch)
tree101a851a755fc1f817788a6eb4040739798b2568
parentd408ea2a0de777a461a7f7b1d6804dc16685cbef (diff)
parent908d6d52928a7f2a4b317aac47542c5fbef43d88 (diff)
Merge tag 'regulator-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator
Pull regulator fixes from Mark Brown: "A bunch of fixes which are a combination of minor fixes that have been shaken down due to greater testing exposure, the biggest block of which are for the Palmas driver which hadn't had all the changes required for mainline properly tested when it was merged." * tag 'regulator-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: regulator: twl-regulator: fix up VINTANA1/VINTANA2 regulator: core: request only valid gpio pins for regulator enable regulator: twl: Remove references to the twl4030 regulator regulator: gpio-regulator: Split setting of voltages and currents regulator: ab3100: add missing voltage table regulator: anatop: Fix wrong mask used in anatop_get_voltage_sel regulator: tps6586x: correct vin pin for sm0/sm1/sm2 regulator: palmas: Fix palmas_probe error handling regulator: palmas: Call palmas_ldo_[read|write] in palmas_ldo_init regulator: palmas: Fix regmap offsets for PALMAS_REG_SMPS10 vsel_reg regulator: palmas: Fix calculating selector in palmas_map_voltage_ldo
-rw-r--r--Documentation/devicetree/bindings/regulator/tps6586x.txt12
-rw-r--r--drivers/regulator/ab3100.c1
-rw-r--r--drivers/regulator/anatop-regulator.c5
-rw-r--r--drivers/regulator/core.c2
-rw-r--r--drivers/regulator/gpio-regulator.c38
-rw-r--r--drivers/regulator/palmas-regulator.c23
-rw-r--r--drivers/regulator/tps6586x-regulator.c8
-rw-r--r--drivers/regulator/twl-regulator.c5
8 files changed, 59 insertions, 35 deletions
diff --git a/Documentation/devicetree/bindings/regulator/tps6586x.txt b/Documentation/devicetree/bindings/regulator/tps6586x.txt
index d156e1b5db12..da80c2ae0915 100644
--- a/Documentation/devicetree/bindings/regulator/tps6586x.txt
+++ b/Documentation/devicetree/bindings/regulator/tps6586x.txt
@@ -9,9 +9,9 @@ Required properties:
9- regulators: list of regulators provided by this controller, must have 9- regulators: list of regulators provided by this controller, must have
10 property "regulator-compatible" to match their hardware counterparts: 10 property "regulator-compatible" to match their hardware counterparts:
11 sm[0-2], ldo[0-9] and ldo_rtc 11 sm[0-2], ldo[0-9] and ldo_rtc
12- sm0-supply: The input supply for the SM0. 12- vin-sm0-supply: The input supply for the SM0.
13- sm1-supply: The input supply for the SM1. 13- vin-sm1-supply: The input supply for the SM1.
14- sm2-supply: The input supply for the SM2. 14- vin-sm2-supply: The input supply for the SM2.
15- vinldo01-supply: The input supply for the LDO1 and LDO2 15- vinldo01-supply: The input supply for the LDO1 and LDO2
16- vinldo23-supply: The input supply for the LDO2 and LDO3 16- vinldo23-supply: The input supply for the LDO2 and LDO3
17- vinldo4-supply: The input supply for the LDO4 17- vinldo4-supply: The input supply for the LDO4
@@ -30,9 +30,9 @@ Example:
30 #gpio-cells = <2>; 30 #gpio-cells = <2>;
31 gpio-controller; 31 gpio-controller;
32 32
33 sm0-supply = <&some_reg>; 33 vin-sm0-supply = <&some_reg>;
34 sm1-supply = <&some_reg>; 34 vin-sm1-supply = <&some_reg>;
35 sm2-supply = <&some_reg>; 35 vin-sm2-supply = <&some_reg>;
36 vinldo01-supply = <...>; 36 vinldo01-supply = <...>;
37 vinldo23-supply = <...>; 37 vinldo23-supply = <...>;
38 vinldo4-supply = <...>; 38 vinldo4-supply = <...>;
diff --git a/drivers/regulator/ab3100.c b/drivers/regulator/ab3100.c
index 182b553059c9..c151fd5d8c97 100644
--- a/drivers/regulator/ab3100.c
+++ b/drivers/regulator/ab3100.c
@@ -486,6 +486,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = {
486 .id = AB3100_BUCK, 486 .id = AB3100_BUCK,
487 .ops = &regulator_ops_variable_sleepable, 487 .ops = &regulator_ops_variable_sleepable,
488 .n_voltages = ARRAY_SIZE(ldo_e_buck_typ_voltages), 488 .n_voltages = ARRAY_SIZE(ldo_e_buck_typ_voltages),
489 .volt_table = ldo_e_buck_typ_voltages,
489 .type = REGULATOR_VOLTAGE, 490 .type = REGULATOR_VOLTAGE,
490 .owner = THIS_MODULE, 491 .owner = THIS_MODULE,
491 .enable_time = 1000, 492 .enable_time = 1000,
diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c
index e9c2085f9dfb..ce0fe72a428e 100644
--- a/drivers/regulator/anatop-regulator.c
+++ b/drivers/regulator/anatop-regulator.c
@@ -64,14 +64,15 @@ static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector)
64static int anatop_get_voltage_sel(struct regulator_dev *reg) 64static int anatop_get_voltage_sel(struct regulator_dev *reg)
65{ 65{
66 struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); 66 struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
67 u32 val; 67 u32 val, mask;
68 68
69 if (!anatop_reg->control_reg) 69 if (!anatop_reg->control_reg)
70 return -ENOTSUPP; 70 return -ENOTSUPP;
71 71
72 val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg); 72 val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg);
73 val = (val & ((1 << anatop_reg->vol_bit_width) - 1)) >> 73 mask = ((1 << anatop_reg->vol_bit_width) - 1) <<
74 anatop_reg->vol_bit_shift; 74 anatop_reg->vol_bit_shift;
75 val = (val & mask) >> anatop_reg->vol_bit_shift;
75 76
76 return val - anatop_reg->min_bit_val; 77 return val - anatop_reg->min_bit_val;
77} 78}
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index f092588a078c..48385318175a 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -3217,7 +3217,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
3217 3217
3218 dev_set_drvdata(&rdev->dev, rdev); 3218 dev_set_drvdata(&rdev->dev, rdev);
3219 3219
3220 if (config->ena_gpio) { 3220 if (config->ena_gpio && gpio_is_valid(config->ena_gpio)) {
3221 ret = gpio_request_one(config->ena_gpio, 3221 ret = gpio_request_one(config->ena_gpio,
3222 GPIOF_DIR_OUT | config->ena_gpio_flags, 3222 GPIOF_DIR_OUT | config->ena_gpio_flags,
3223 rdev_get_name(rdev)); 3223 rdev_get_name(rdev));
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 34b67bee9323..8b5944f2d7d1 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -57,16 +57,17 @@ static int gpio_regulator_get_value(struct regulator_dev *dev)
57 return -EINVAL; 57 return -EINVAL;
58} 58}
59 59
60static int gpio_regulator_set_value(struct regulator_dev *dev, 60static int gpio_regulator_set_voltage(struct regulator_dev *dev,
61 int min, int max, unsigned *selector) 61 int min_uV, int max_uV,
62 unsigned *selector)
62{ 63{
63 struct gpio_regulator_data *data = rdev_get_drvdata(dev); 64 struct gpio_regulator_data *data = rdev_get_drvdata(dev);
64 int ptr, target = 0, state, best_val = INT_MAX; 65 int ptr, target = 0, state, best_val = INT_MAX;
65 66
66 for (ptr = 0; ptr < data->nr_states; ptr++) 67 for (ptr = 0; ptr < data->nr_states; ptr++)
67 if (data->states[ptr].value < best_val && 68 if (data->states[ptr].value < best_val &&
68 data->states[ptr].value >= min && 69 data->states[ptr].value >= min_uV &&
69 data->states[ptr].value <= max) { 70 data->states[ptr].value <= max_uV) {
70 target = data->states[ptr].gpios; 71 target = data->states[ptr].gpios;
71 best_val = data->states[ptr].value; 72 best_val = data->states[ptr].value;
72 if (selector) 73 if (selector)
@@ -85,13 +86,6 @@ static int gpio_regulator_set_value(struct regulator_dev *dev,
85 return 0; 86 return 0;
86} 87}
87 88
88static int gpio_regulator_set_voltage(struct regulator_dev *dev,
89 int min_uV, int max_uV,
90 unsigned *selector)
91{
92 return gpio_regulator_set_value(dev, min_uV, max_uV, selector);
93}
94
95static int gpio_regulator_list_voltage(struct regulator_dev *dev, 89static int gpio_regulator_list_voltage(struct regulator_dev *dev,
96 unsigned selector) 90 unsigned selector)
97{ 91{
@@ -106,7 +100,27 @@ static int gpio_regulator_list_voltage(struct regulator_dev *dev,
106static int gpio_regulator_set_current_limit(struct regulator_dev *dev, 100static int gpio_regulator_set_current_limit(struct regulator_dev *dev,
107 int min_uA, int max_uA) 101 int min_uA, int max_uA)
108{ 102{
109 return gpio_regulator_set_value(dev, min_uA, max_uA, NULL); 103 struct gpio_regulator_data *data = rdev_get_drvdata(dev);
104 int ptr, target = 0, state, best_val = 0;
105
106 for (ptr = 0; ptr < data->nr_states; ptr++)
107 if (data->states[ptr].value > best_val &&
108 data->states[ptr].value >= min_uA &&
109 data->states[ptr].value <= max_uA) {
110 target = data->states[ptr].gpios;
111 best_val = data->states[ptr].value;
112 }
113
114 if (best_val == 0)
115 return -EINVAL;
116
117 for (ptr = 0; ptr < data->nr_gpios; ptr++) {
118 state = (target & (1 << ptr)) >> ptr;
119 gpio_set_value(data->gpios[ptr].gpio, state);
120 }
121 data->state = target;
122
123 return 0;
110} 124}
111 125
112static struct regulator_ops gpio_regulator_voltage_ops = { 126static struct regulator_ops gpio_regulator_voltage_ops = {
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c
index 17d19fbbc490..46c7e88f8381 100644
--- a/drivers/regulator/palmas-regulator.c
+++ b/drivers/regulator/palmas-regulator.c
@@ -486,9 +486,12 @@ static int palmas_map_voltage_ldo(struct regulator_dev *rdev,
486{ 486{
487 int ret, voltage; 487 int ret, voltage;
488 488
489 ret = ((min_uV - 900000) / 50000) + 1; 489 if (min_uV == 0)
490 if (ret < 0) 490 return 0;
491 return ret; 491
492 if (min_uV < 900000)
493 min_uV = 900000;
494 ret = DIV_ROUND_UP(min_uV - 900000, 50000) + 1;
492 495
493 /* Map back into a voltage to verify we're still in bounds */ 496 /* Map back into a voltage to verify we're still in bounds */
494 voltage = palmas_list_voltage_ldo(rdev, ret); 497 voltage = palmas_list_voltage_ldo(rdev, ret);
@@ -586,7 +589,7 @@ static int palmas_ldo_init(struct palmas *palmas, int id,
586 589
587 addr = palmas_regs_info[id].ctrl_addr; 590 addr = palmas_regs_info[id].ctrl_addr;
588 591
589 ret = palmas_smps_read(palmas, addr, &reg); 592 ret = palmas_ldo_read(palmas, addr, &reg);
590 if (ret) 593 if (ret)
591 return ret; 594 return ret;
592 595
@@ -596,7 +599,7 @@ static int palmas_ldo_init(struct palmas *palmas, int id,
596 if (reg_init->mode_sleep) 599 if (reg_init->mode_sleep)
597 reg |= PALMAS_LDO1_CTRL_MODE_SLEEP; 600 reg |= PALMAS_LDO1_CTRL_MODE_SLEEP;
598 601
599 ret = palmas_smps_write(palmas, addr, reg); 602 ret = palmas_ldo_write(palmas, addr, reg);
600 if (ret) 603 if (ret)
601 return ret; 604 return ret;
602 605
@@ -630,7 +633,7 @@ static __devinit int palmas_probe(struct platform_device *pdev)
630 633
631 ret = palmas_smps_read(palmas, PALMAS_SMPS_CTRL, &reg); 634 ret = palmas_smps_read(palmas, PALMAS_SMPS_CTRL, &reg);
632 if (ret) 635 if (ret)
633 goto err_unregister_regulator; 636 return ret;
634 637
635 if (reg & PALMAS_SMPS_CTRL_SMPS12_SMPS123_EN) 638 if (reg & PALMAS_SMPS_CTRL_SMPS12_SMPS123_EN)
636 pmic->smps123 = 1; 639 pmic->smps123 = 1;
@@ -676,7 +679,9 @@ static __devinit int palmas_probe(struct platform_device *pdev)
676 case PALMAS_REG_SMPS10: 679 case PALMAS_REG_SMPS10:
677 pmic->desc[id].n_voltages = PALMAS_SMPS10_NUM_VOLTAGES; 680 pmic->desc[id].n_voltages = PALMAS_SMPS10_NUM_VOLTAGES;
678 pmic->desc[id].ops = &palmas_ops_smps10; 681 pmic->desc[id].ops = &palmas_ops_smps10;
679 pmic->desc[id].vsel_reg = PALMAS_SMPS10_CTRL; 682 pmic->desc[id].vsel_reg =
683 PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
684 PALMAS_SMPS10_CTRL);
680 pmic->desc[id].vsel_mask = SMPS10_VSEL; 685 pmic->desc[id].vsel_mask = SMPS10_VSEL;
681 pmic->desc[id].enable_reg = 686 pmic->desc[id].enable_reg =
682 PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, 687 PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
@@ -778,8 +783,10 @@ static __devinit int palmas_probe(struct platform_device *pdev)
778 reg_init = pdata->reg_init[id]; 783 reg_init = pdata->reg_init[id];
779 if (reg_init) { 784 if (reg_init) {
780 ret = palmas_ldo_init(palmas, id, reg_init); 785 ret = palmas_ldo_init(palmas, id, reg_init);
781 if (ret) 786 if (ret) {
787 regulator_unregister(pmic->rdev[id]);
782 goto err_unregister_regulator; 788 goto err_unregister_regulator;
789 }
783 } 790 }
784 } 791 }
785 } 792 }
diff --git a/drivers/regulator/tps6586x-regulator.c b/drivers/regulator/tps6586x-regulator.c
index e6da90ab5153..19241fc30050 100644
--- a/drivers/regulator/tps6586x-regulator.c
+++ b/drivers/regulator/tps6586x-regulator.c
@@ -240,14 +240,16 @@ static struct tps6586x_regulator tps6586x_regulator[] = {
240 TPS6586X_LDO(LDO_9, "vinldo9", ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7), 240 TPS6586X_LDO(LDO_9, "vinldo9", ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7),
241 TPS6586X_LDO(LDO_RTC, NULL, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7), 241 TPS6586X_LDO(LDO_RTC, NULL, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
242 TPS6586X_LDO(LDO_1, "vinldo01", dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1), 242 TPS6586X_LDO(LDO_1, "vinldo01", dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1),
243 TPS6586X_LDO(SM_2, "sm2", sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7), 243 TPS6586X_LDO(SM_2, "vin-sm2", sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
244 244
245 TPS6586X_DVM(LDO_2, "vinldo23", dvm, LDO2BV1, 0, 5, ENA, 3, 245 TPS6586X_DVM(LDO_2, "vinldo23", dvm, LDO2BV1, 0, 5, ENA, 3,
246 ENB, 3, VCC2, 6), 246 ENB, 3, VCC2, 6),
247 TPS6586X_DVM(LDO_4, "vinldo4", ldo4, LDO4V1, 0, 5, ENC, 3, 247 TPS6586X_DVM(LDO_4, "vinldo4", ldo4, LDO4V1, 0, 5, ENC, 3,
248 END, 3, VCC1, 6), 248 END, 3, VCC1, 6),
249 TPS6586X_DVM(SM_0, "sm0", dvm, SM0V1, 0, 5, ENA, 1, ENB, 1, VCC1, 2), 249 TPS6586X_DVM(SM_0, "vin-sm0", dvm, SM0V1, 0, 5, ENA, 1,
250 TPS6586X_DVM(SM_1, "sm1", dvm, SM1V1, 0, 5, ENA, 0, ENB, 0, VCC1, 0), 250 ENB, 1, VCC1, 2),
251 TPS6586X_DVM(SM_1, "vin-sm1", dvm, SM1V1, 0, 5, ENA, 0,
252 ENB, 0, VCC1, 0),
251}; 253};
252 254
253/* 255/*
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
index 242fe90dc565..77a71a5c17c3 100644
--- a/drivers/regulator/twl-regulator.c
+++ b/drivers/regulator/twl-regulator.c
@@ -1037,7 +1037,7 @@ TWL6025_ADJUSTABLE_LDO(LDO7, 0x74, 1000, 3300);
1037TWL6025_ADJUSTABLE_LDO(LDO6, 0x60, 1000, 3300); 1037TWL6025_ADJUSTABLE_LDO(LDO6, 0x60, 1000, 3300);
1038TWL6025_ADJUSTABLE_LDO(LDOLN, 0x64, 1000, 3300); 1038TWL6025_ADJUSTABLE_LDO(LDOLN, 0x64, 1000, 3300);
1039TWL6025_ADJUSTABLE_LDO(LDOUSB, 0x70, 1000, 3300); 1039TWL6025_ADJUSTABLE_LDO(LDOUSB, 0x70, 1000, 3300);
1040TWL4030_FIXED_LDO(VINTANA2, 0x3f, 1500, 11, 100, 0x08); 1040TWL4030_FIXED_LDO(VINTANA1, 0x3f, 1500, 11, 100, 0x08);
1041TWL4030_FIXED_LDO(VINTDIG, 0x47, 1500, 13, 100, 0x08); 1041TWL4030_FIXED_LDO(VINTDIG, 0x47, 1500, 13, 100, 0x08);
1042TWL4030_FIXED_LDO(VUSB1V5, 0x71, 1500, 17, 100, 0x08); 1042TWL4030_FIXED_LDO(VUSB1V5, 0x71, 1500, 17, 100, 0x08);
1043TWL4030_FIXED_LDO(VUSB1V8, 0x74, 1800, 18, 100, 0x08); 1043TWL4030_FIXED_LDO(VUSB1V8, 0x74, 1800, 18, 100, 0x08);
@@ -1048,7 +1048,6 @@ TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 0);
1048TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 0); 1048TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 0);
1049TWL6030_FIXED_LDO(V1V8, 0x16, 1800, 0); 1049TWL6030_FIXED_LDO(V1V8, 0x16, 1800, 0);
1050TWL6030_FIXED_LDO(V2V1, 0x1c, 2100, 0); 1050TWL6030_FIXED_LDO(V2V1, 0x1c, 2100, 0);
1051TWL6030_FIXED_RESOURCE(CLK32KG, 0x8C, 0);
1052TWL6025_ADJUSTABLE_SMPS(SMPS3, 0x34); 1051TWL6025_ADJUSTABLE_SMPS(SMPS3, 0x34);
1053TWL6025_ADJUSTABLE_SMPS(SMPS4, 0x10); 1052TWL6025_ADJUSTABLE_SMPS(SMPS4, 0x10);
1054TWL6025_ADJUSTABLE_SMPS(VIO, 0x16); 1053TWL6025_ADJUSTABLE_SMPS(VIO, 0x16);
@@ -1117,7 +1116,7 @@ static const struct of_device_id twl_of_match[] __devinitconst = {
1117 TWL6025_OF_MATCH("ti,twl6025-ldo6", LDO6), 1116 TWL6025_OF_MATCH("ti,twl6025-ldo6", LDO6),
1118 TWL6025_OF_MATCH("ti,twl6025-ldoln", LDOLN), 1117 TWL6025_OF_MATCH("ti,twl6025-ldoln", LDOLN),
1119 TWL6025_OF_MATCH("ti,twl6025-ldousb", LDOUSB), 1118 TWL6025_OF_MATCH("ti,twl6025-ldousb", LDOUSB),
1120 TWLFIXED_OF_MATCH("ti,twl4030-vintana2", VINTANA2), 1119 TWLFIXED_OF_MATCH("ti,twl4030-vintana1", VINTANA1),
1121 TWLFIXED_OF_MATCH("ti,twl4030-vintdig", VINTDIG), 1120 TWLFIXED_OF_MATCH("ti,twl4030-vintdig", VINTDIG),
1122 TWLFIXED_OF_MATCH("ti,twl4030-vusb1v5", VUSB1V5), 1121 TWLFIXED_OF_MATCH("ti,twl4030-vusb1v5", VUSB1V5),
1123 TWLFIXED_OF_MATCH("ti,twl4030-vusb1v8", VUSB1V8), 1122 TWLFIXED_OF_MATCH("ti,twl4030-vusb1v8", VUSB1V8),