aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-11-27 13:48:33 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-11-28 12:30:36 -0500
commit73ee29460e5d0adbb46e4962df69ae2465746612 (patch)
tree9afcdda72d606fb6f15f322a89c1c998f688a79c
parent8a7f0c61c0c0dfdf5d5d878fe93ae20b4fd14ee2 (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.c3
-rw-r--r--drivers/regulator/arizona-ldo1.c107
-rw-r--r--include/linux/mfd/arizona/registers.h16
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
37static 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
49static 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
61static 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
93static 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
114static 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
123static 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
37static struct regulator_ops arizona_ldo1_ops = { 139static 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 = {
81static __devinit int arizona_ldo1_probe(struct platform_device *pdev) 183static __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] */