diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-11-27 13:48:33 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-11-28 12:30:36 -0500 |
commit | 73ee29460e5d0adbb46e4962df69ae2465746612 (patch) | |
tree | 9afcdda72d606fb6f15f322a89c1c998f688a79c | |
parent | 8a7f0c61c0c0dfdf5d5d878fe93ae20b4fd14ee2 (diff) |
regulator: arizona-ldo1: Support 1.8V mode
Some Arizona device support a 1.8V output mode. Enable this in the driver.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r-- | drivers/mfd/wm5102-tables.c | 3 | ||||
-rw-r--r-- | drivers/regulator/arizona-ldo1.c | 107 | ||||
-rw-r--r-- | include/linux/mfd/arizona/registers.h | 16 |
3 files changed, 125 insertions, 1 deletions
diff --git a/drivers/mfd/wm5102-tables.c b/drivers/mfd/wm5102-tables.c index 01b9255ed631..b829a5710ddc 100644 --- a/drivers/mfd/wm5102-tables.c +++ b/drivers/mfd/wm5102-tables.c | |||
@@ -775,6 +775,7 @@ static const struct reg_default wm5102_reg_default[] = { | |||
775 | { 0x00000154, 0x0000 }, /* R340 - Rate Estimator 3 */ | 775 | { 0x00000154, 0x0000 }, /* R340 - Rate Estimator 3 */ |
776 | { 0x00000155, 0x0000 }, /* R341 - Rate Estimator 4 */ | 776 | { 0x00000155, 0x0000 }, /* R341 - Rate Estimator 4 */ |
777 | { 0x00000156, 0x0000 }, /* R342 - Rate Estimator 5 */ | 777 | { 0x00000156, 0x0000 }, /* R342 - Rate Estimator 5 */ |
778 | { 0x00000161, 0x0000 }, /* R353 - Dynamic Frequency Scaling 1 */ | ||
778 | { 0x00000171, 0x0000 }, /* R369 - FLL1 Control 1 */ | 779 | { 0x00000171, 0x0000 }, /* R369 - FLL1 Control 1 */ |
779 | { 0x00000172, 0x0008 }, /* R370 - FLL1 Control 2 */ | 780 | { 0x00000172, 0x0008 }, /* R370 - FLL1 Control 2 */ |
780 | { 0x00000173, 0x0018 }, /* R371 - FLL1 Control 3 */ | 781 | { 0x00000173, 0x0018 }, /* R371 - FLL1 Control 3 */ |
@@ -1564,6 +1565,7 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg) | |||
1564 | case ARIZONA_RATE_ESTIMATOR_3: | 1565 | case ARIZONA_RATE_ESTIMATOR_3: |
1565 | case ARIZONA_RATE_ESTIMATOR_4: | 1566 | case ARIZONA_RATE_ESTIMATOR_4: |
1566 | case ARIZONA_RATE_ESTIMATOR_5: | 1567 | case ARIZONA_RATE_ESTIMATOR_5: |
1568 | case ARIZONA_DYNAMIC_FREQUENCY_SCALING_1: | ||
1567 | case ARIZONA_FLL1_CONTROL_1: | 1569 | case ARIZONA_FLL1_CONTROL_1: |
1568 | case ARIZONA_FLL1_CONTROL_2: | 1570 | case ARIZONA_FLL1_CONTROL_2: |
1569 | case ARIZONA_FLL1_CONTROL_3: | 1571 | case ARIZONA_FLL1_CONTROL_3: |
@@ -1596,6 +1598,7 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg) | |||
1596 | case ARIZONA_FLL2_GPIO_CLOCK: | 1598 | case ARIZONA_FLL2_GPIO_CLOCK: |
1597 | case ARIZONA_MIC_CHARGE_PUMP_1: | 1599 | case ARIZONA_MIC_CHARGE_PUMP_1: |
1598 | case ARIZONA_LDO1_CONTROL_1: | 1600 | case ARIZONA_LDO1_CONTROL_1: |
1601 | case ARIZONA_LDO1_CONTROL_2: | ||
1599 | case ARIZONA_LDO2_CONTROL_1: | 1602 | case ARIZONA_LDO2_CONTROL_1: |
1600 | case ARIZONA_MIC_BIAS_CTRL_1: | 1603 | case ARIZONA_MIC_BIAS_CTRL_1: |
1601 | case ARIZONA_MIC_BIAS_CTRL_2: | 1604 | case ARIZONA_MIC_BIAS_CTRL_2: |
diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c index 800c8ad3db91..739faf99b9e2 100644 --- a/drivers/regulator/arizona-ldo1.c +++ b/drivers/regulator/arizona-ldo1.c | |||
@@ -34,6 +34,108 @@ struct arizona_ldo1 { | |||
34 | struct regulator_init_data init_data; | 34 | struct regulator_init_data init_data; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | static int arizona_ldo1_hc_list_voltage(struct regulator_dev *rdev, | ||
38 | unsigned int selector) | ||
39 | { | ||
40 | if (selector >= rdev->desc->n_voltages) | ||
41 | return -EINVAL; | ||
42 | |||
43 | if (selector == rdev->desc->n_voltages - 1) | ||
44 | return 1800000; | ||
45 | else | ||
46 | return rdev->desc->min_uV + (rdev->desc->uV_step * selector); | ||
47 | } | ||
48 | |||
49 | static int arizona_ldo1_hc_map_voltage(struct regulator_dev *rdev, | ||
50 | int min_uV, int max_uV) | ||
51 | { | ||
52 | int sel; | ||
53 | |||
54 | sel = DIV_ROUND_UP(min_uV - rdev->desc->min_uV, rdev->desc->uV_step); | ||
55 | if (sel >= rdev->desc->n_voltages) | ||
56 | sel = rdev->desc->n_voltages - 1; | ||
57 | |||
58 | return sel; | ||
59 | } | ||
60 | |||
61 | static int arizona_ldo1_hc_set_voltage_sel(struct regulator_dev *rdev, | ||
62 | unsigned sel) | ||
63 | { | ||
64 | struct arizona_ldo1 *ldo = rdev_get_drvdata(rdev); | ||
65 | struct regmap *regmap = ldo->arizona->regmap; | ||
66 | unsigned int val; | ||
67 | int ret; | ||
68 | |||
69 | if (sel == rdev->desc->n_voltages - 1) | ||
70 | val = ARIZONA_LDO1_HI_PWR; | ||
71 | else | ||
72 | val = 0; | ||
73 | |||
74 | ret = regmap_update_bits(regmap, ARIZONA_LDO1_CONTROL_2, | ||
75 | ARIZONA_LDO1_HI_PWR, val); | ||
76 | if (ret != 0) | ||
77 | return ret; | ||
78 | |||
79 | ret = regmap_update_bits(regmap, ARIZONA_DYNAMIC_FREQUENCY_SCALING_1, | ||
80 | ARIZONA_SUBSYS_MAX_FREQ, val); | ||
81 | if (ret != 0) | ||
82 | return ret; | ||
83 | |||
84 | if (val) | ||
85 | return 0; | ||
86 | |||
87 | val = sel << ARIZONA_LDO1_VSEL_SHIFT; | ||
88 | |||
89 | return regmap_update_bits(regmap, ARIZONA_LDO1_CONTROL_1, | ||
90 | ARIZONA_LDO1_VSEL_MASK, val); | ||
91 | } | ||
92 | |||
93 | static int arizona_ldo1_hc_get_voltage_sel(struct regulator_dev *rdev) | ||
94 | { | ||
95 | struct arizona_ldo1 *ldo = rdev_get_drvdata(rdev); | ||
96 | struct regmap *regmap = ldo->arizona->regmap; | ||
97 | unsigned int val; | ||
98 | int ret; | ||
99 | |||
100 | ret = regmap_read(regmap, ARIZONA_LDO1_CONTROL_2, &val); | ||
101 | if (ret != 0) | ||
102 | return ret; | ||
103 | |||
104 | if (val & ARIZONA_LDO1_HI_PWR) | ||
105 | return rdev->desc->n_voltages - 1; | ||
106 | |||
107 | ret = regmap_read(regmap, ARIZONA_LDO1_CONTROL_1, &val); | ||
108 | if (ret != 0) | ||
109 | return ret; | ||
110 | |||
111 | return (val & ARIZONA_LDO1_VSEL_MASK) >> ARIZONA_LDO1_VSEL_SHIFT; | ||
112 | } | ||
113 | |||
114 | static struct regulator_ops arizona_ldo1_hc_ops = { | ||
115 | .list_voltage = arizona_ldo1_hc_list_voltage, | ||
116 | .map_voltage = arizona_ldo1_hc_map_voltage, | ||
117 | .get_voltage_sel = arizona_ldo1_hc_get_voltage_sel, | ||
118 | .set_voltage_sel = arizona_ldo1_hc_set_voltage_sel, | ||
119 | .get_bypass = regulator_get_bypass_regmap, | ||
120 | .set_bypass = regulator_set_bypass_regmap, | ||
121 | }; | ||
122 | |||
123 | static const struct regulator_desc arizona_ldo1_hc = { | ||
124 | .name = "LDO1", | ||
125 | .supply_name = "LDOVDD", | ||
126 | .type = REGULATOR_VOLTAGE, | ||
127 | .ops = &arizona_ldo1_hc_ops, | ||
128 | |||
129 | .bypass_reg = ARIZONA_LDO1_CONTROL_1, | ||
130 | .bypass_mask = ARIZONA_LDO1_BYPASS, | ||
131 | .min_uV = 900000, | ||
132 | .uV_step = 50000, | ||
133 | .n_voltages = 8, | ||
134 | .enable_time = 500, | ||
135 | |||
136 | .owner = THIS_MODULE, | ||
137 | }; | ||
138 | |||
37 | static struct regulator_ops arizona_ldo1_ops = { | 139 | static struct regulator_ops arizona_ldo1_ops = { |
38 | .list_voltage = regulator_list_voltage_linear, | 140 | .list_voltage = regulator_list_voltage_linear, |
39 | .map_voltage = regulator_map_voltage_linear, | 141 | .map_voltage = regulator_map_voltage_linear, |
@@ -81,6 +183,7 @@ static const struct regulator_init_data arizona_ldo1_default = { | |||
81 | static __devinit int arizona_ldo1_probe(struct platform_device *pdev) | 183 | static __devinit int arizona_ldo1_probe(struct platform_device *pdev) |
82 | { | 184 | { |
83 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); | 185 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); |
186 | const struct regulator_desc *desc; | ||
84 | struct regulator_config config = { }; | 187 | struct regulator_config config = { }; |
85 | struct arizona_ldo1 *ldo1; | 188 | struct arizona_ldo1 *ldo1; |
86 | int ret; | 189 | int ret; |
@@ -100,9 +203,11 @@ static __devinit int arizona_ldo1_probe(struct platform_device *pdev) | |||
100 | */ | 203 | */ |
101 | switch (arizona->type) { | 204 | switch (arizona->type) { |
102 | case WM5102: | 205 | case WM5102: |
206 | desc = &arizona_ldo1_hc; | ||
103 | ldo1->init_data = arizona_ldo1_dvfs; | 207 | ldo1->init_data = arizona_ldo1_dvfs; |
104 | break; | 208 | break; |
105 | default: | 209 | default: |
210 | desc = &arizona_ldo1; | ||
106 | ldo1->init_data = arizona_ldo1_default; | 211 | ldo1->init_data = arizona_ldo1_default; |
107 | break; | 212 | break; |
108 | } | 213 | } |
@@ -121,7 +226,7 @@ static __devinit int arizona_ldo1_probe(struct platform_device *pdev) | |||
121 | else | 226 | else |
122 | config.init_data = &ldo1->init_data; | 227 | config.init_data = &ldo1->init_data; |
123 | 228 | ||
124 | ldo1->regulator = regulator_register(&arizona_ldo1, &config); | 229 | ldo1->regulator = regulator_register(desc, &config); |
125 | if (IS_ERR(ldo1->regulator)) { | 230 | if (IS_ERR(ldo1->regulator)) { |
126 | ret = PTR_ERR(ldo1->regulator); | 231 | ret = PTR_ERR(ldo1->regulator); |
127 | dev_err(arizona->dev, "Failed to register LDO1 supply: %d\n", | 232 | dev_err(arizona->dev, "Failed to register LDO1 supply: %d\n", |
diff --git a/include/linux/mfd/arizona/registers.h b/include/linux/mfd/arizona/registers.h index 7671a287dfee..ba26e99c388d 100644 --- a/include/linux/mfd/arizona/registers.h +++ b/include/linux/mfd/arizona/registers.h | |||
@@ -76,6 +76,7 @@ | |||
76 | #define ARIZONA_RATE_ESTIMATOR_3 0x154 | 76 | #define ARIZONA_RATE_ESTIMATOR_3 0x154 |
77 | #define ARIZONA_RATE_ESTIMATOR_4 0x155 | 77 | #define ARIZONA_RATE_ESTIMATOR_4 0x155 |
78 | #define ARIZONA_RATE_ESTIMATOR_5 0x156 | 78 | #define ARIZONA_RATE_ESTIMATOR_5 0x156 |
79 | #define ARIZONA_DYNAMIC_FREQUENCY_SCALING_1 0x161 | ||
79 | #define ARIZONA_FLL1_CONTROL_1 0x171 | 80 | #define ARIZONA_FLL1_CONTROL_1 0x171 |
80 | #define ARIZONA_FLL1_CONTROL_2 0x172 | 81 | #define ARIZONA_FLL1_CONTROL_2 0x172 |
81 | #define ARIZONA_FLL1_CONTROL_3 0x173 | 82 | #define ARIZONA_FLL1_CONTROL_3 0x173 |
@@ -110,6 +111,7 @@ | |||
110 | #define ARIZONA_FLL2_GPIO_CLOCK 0x1AA | 111 | #define ARIZONA_FLL2_GPIO_CLOCK 0x1AA |
111 | #define ARIZONA_MIC_CHARGE_PUMP_1 0x200 | 112 | #define ARIZONA_MIC_CHARGE_PUMP_1 0x200 |
112 | #define ARIZONA_LDO1_CONTROL_1 0x210 | 113 | #define ARIZONA_LDO1_CONTROL_1 0x210 |
114 | #define ARIZONA_LDO1_CONTROL_2 0x212 | ||
113 | #define ARIZONA_LDO2_CONTROL_1 0x213 | 115 | #define ARIZONA_LDO2_CONTROL_1 0x213 |
114 | #define ARIZONA_MIC_BIAS_CTRL_1 0x218 | 116 | #define ARIZONA_MIC_BIAS_CTRL_1 0x218 |
115 | #define ARIZONA_MIC_BIAS_CTRL_2 0x219 | 117 | #define ARIZONA_MIC_BIAS_CTRL_2 0x219 |
@@ -1574,6 +1576,13 @@ | |||
1574 | #define ARIZONA_SAMPLE_RATE_DETECT_D_WIDTH 5 /* SAMPLE_RATE_DETECT_D - [4:0] */ | 1576 | #define ARIZONA_SAMPLE_RATE_DETECT_D_WIDTH 5 /* SAMPLE_RATE_DETECT_D - [4:0] */ |
1575 | 1577 | ||
1576 | /* | 1578 | /* |
1579 | * R353 (0x161) - Dynamic Frequency Scaling 1 | ||
1580 | */ | ||
1581 | #define ARIZONA_SUBSYS_MAX_FREQ 0x0001 /* SUBSYS_MAX_FREQ */ | ||
1582 | #define ARIZONA_SUBSYS_MAX_FREQ_SHIFT 0 /* SUBSYS_MAX_FREQ */ | ||
1583 | #define ARIZONA_SUBSYS_MAX_FREQ_WIDTH 1 /* SUBSYS_MAX_FREQ */ | ||
1584 | |||
1585 | /* | ||
1577 | * R369 (0x171) - FLL1 Control 1 | 1586 | * R369 (0x171) - FLL1 Control 1 |
1578 | */ | 1587 | */ |
1579 | #define ARIZONA_FLL1_FREERUN 0x0002 /* FLL1_FREERUN */ | 1588 | #define ARIZONA_FLL1_FREERUN 0x0002 /* FLL1_FREERUN */ |
@@ -1889,6 +1898,13 @@ | |||
1889 | #define ARIZONA_LDO1_ENA_WIDTH 1 /* LDO1_ENA */ | 1898 | #define ARIZONA_LDO1_ENA_WIDTH 1 /* LDO1_ENA */ |
1890 | 1899 | ||
1891 | /* | 1900 | /* |
1901 | * R530 (0x212) - LDO1 Control 2 | ||
1902 | */ | ||
1903 | #define ARIZONA_LDO1_HI_PWR 0x0001 /* LDO1_HI_PWR */ | ||
1904 | #define ARIZONA_LDO1_HI_PWR_SHIFT 0 /* LDO1_HI_PWR */ | ||
1905 | #define ARIZONA_LDO1_HI_PWR_WIDTH 1 /* LDO1_HI_PWR */ | ||
1906 | |||
1907 | /* | ||
1892 | * R531 (0x213) - LDO2 Control 1 | 1908 | * R531 (0x213) - LDO2 Control 1 |
1893 | */ | 1909 | */ |
1894 | #define ARIZONA_LDO2_VSEL_MASK 0x07E0 /* LDO2_VSEL - [10:5] */ | 1910 | #define ARIZONA_LDO2_VSEL_MASK 0x07E0 /* LDO2_VSEL - [10:5] */ |