diff options
Diffstat (limited to 'drivers/regulator/pwm-regulator.c')
-rw-r--r-- | drivers/regulator/pwm-regulator.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c index 253833ae35f3..ffa96124a5e7 100644 --- a/drivers/regulator/pwm-regulator.c +++ b/drivers/regulator/pwm-regulator.c | |||
@@ -21,10 +21,8 @@ | |||
21 | #include <linux/pwm.h> | 21 | #include <linux/pwm.h> |
22 | 22 | ||
23 | struct pwm_regulator_data { | 23 | struct pwm_regulator_data { |
24 | struct regulator_desc desc; | ||
25 | struct pwm_voltages *duty_cycle_table; | 24 | struct pwm_voltages *duty_cycle_table; |
26 | struct pwm_device *pwm; | 25 | struct pwm_device *pwm; |
27 | bool enabled; | ||
28 | int state; | 26 | int state; |
29 | }; | 27 | }; |
30 | 28 | ||
@@ -33,17 +31,17 @@ struct pwm_voltages { | |||
33 | unsigned int dutycycle; | 31 | unsigned int dutycycle; |
34 | }; | 32 | }; |
35 | 33 | ||
36 | static int pwm_regulator_get_voltage_sel(struct regulator_dev *dev) | 34 | static int pwm_regulator_get_voltage_sel(struct regulator_dev *rdev) |
37 | { | 35 | { |
38 | struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev); | 36 | struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev); |
39 | 37 | ||
40 | return drvdata->state; | 38 | return drvdata->state; |
41 | } | 39 | } |
42 | 40 | ||
43 | static int pwm_regulator_set_voltage_sel(struct regulator_dev *dev, | 41 | static int pwm_regulator_set_voltage_sel(struct regulator_dev *rdev, |
44 | unsigned selector) | 42 | unsigned selector) |
45 | { | 43 | { |
46 | struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev); | 44 | struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev); |
47 | unsigned int pwm_reg_period; | 45 | unsigned int pwm_reg_period; |
48 | int dutycycle; | 46 | int dutycycle; |
49 | int ret; | 47 | int ret; |
@@ -55,30 +53,27 @@ static int pwm_regulator_set_voltage_sel(struct regulator_dev *dev, | |||
55 | 53 | ||
56 | ret = pwm_config(drvdata->pwm, dutycycle, pwm_reg_period); | 54 | ret = pwm_config(drvdata->pwm, dutycycle, pwm_reg_period); |
57 | if (ret) { | 55 | if (ret) { |
58 | dev_err(&dev->dev, "Failed to configure PWM\n"); | 56 | dev_err(&rdev->dev, "Failed to configure PWM\n"); |
59 | return ret; | 57 | return ret; |
60 | } | 58 | } |
61 | 59 | ||
62 | drvdata->state = selector; | 60 | drvdata->state = selector; |
63 | 61 | ||
64 | if (!drvdata->enabled) { | 62 | ret = pwm_enable(drvdata->pwm); |
65 | ret = pwm_enable(drvdata->pwm); | 63 | if (ret) { |
66 | if (ret) { | 64 | dev_err(&rdev->dev, "Failed to enable PWM\n"); |
67 | dev_err(&dev->dev, "Failed to enable PWM\n"); | 65 | return ret; |
68 | return ret; | ||
69 | } | ||
70 | drvdata->enabled = true; | ||
71 | } | 66 | } |
72 | 67 | ||
73 | return 0; | 68 | return 0; |
74 | } | 69 | } |
75 | 70 | ||
76 | static int pwm_regulator_list_voltage(struct regulator_dev *dev, | 71 | static int pwm_regulator_list_voltage(struct regulator_dev *rdev, |
77 | unsigned selector) | 72 | unsigned selector) |
78 | { | 73 | { |
79 | struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev); | 74 | struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev); |
80 | 75 | ||
81 | if (selector >= drvdata->desc.n_voltages) | 76 | if (selector >= rdev->desc->n_voltages) |
82 | return -EINVAL; | 77 | return -EINVAL; |
83 | 78 | ||
84 | return drvdata->duty_cycle_table[selector].uV; | 79 | return drvdata->duty_cycle_table[selector].uV; |
@@ -91,7 +86,7 @@ static struct regulator_ops pwm_regulator_voltage_ops = { | |||
91 | .map_voltage = regulator_map_voltage_iterate, | 86 | .map_voltage = regulator_map_voltage_iterate, |
92 | }; | 87 | }; |
93 | 88 | ||
94 | static const struct regulator_desc pwm_regulator_desc = { | 89 | static struct regulator_desc pwm_regulator_desc = { |
95 | .name = "pwm-regulator", | 90 | .name = "pwm-regulator", |
96 | .ops = &pwm_regulator_voltage_ops, | 91 | .ops = &pwm_regulator_voltage_ops, |
97 | .type = REGULATOR_VOLTAGE, | 92 | .type = REGULATOR_VOLTAGE, |
@@ -117,8 +112,6 @@ static int pwm_regulator_probe(struct platform_device *pdev) | |||
117 | if (!drvdata) | 112 | if (!drvdata) |
118 | return -ENOMEM; | 113 | return -ENOMEM; |
119 | 114 | ||
120 | memcpy(&drvdata->desc, &pwm_regulator_desc, sizeof(pwm_regulator_desc)); | ||
121 | |||
122 | /* determine the number of voltage-table */ | 115 | /* determine the number of voltage-table */ |
123 | prop = of_find_property(np, "voltage-table", &length); | 116 | prop = of_find_property(np, "voltage-table", &length); |
124 | if (!prop) { | 117 | if (!prop) { |
@@ -133,7 +126,7 @@ static int pwm_regulator_probe(struct platform_device *pdev) | |||
133 | return -EINVAL; | 126 | return -EINVAL; |
134 | } | 127 | } |
135 | 128 | ||
136 | drvdata->desc.n_voltages = length / sizeof(*drvdata->duty_cycle_table); | 129 | pwm_regulator_desc.n_voltages = length / sizeof(*drvdata->duty_cycle_table); |
137 | 130 | ||
138 | drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev, | 131 | drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev, |
139 | length, GFP_KERNEL); | 132 | length, GFP_KERNEL); |
@@ -150,7 +143,7 @@ static int pwm_regulator_probe(struct platform_device *pdev) | |||
150 | } | 143 | } |
151 | 144 | ||
152 | config.init_data = of_get_regulator_init_data(&pdev->dev, np, | 145 | config.init_data = of_get_regulator_init_data(&pdev->dev, np, |
153 | &drvdata->desc); | 146 | &pwm_regulator_desc); |
154 | if (!config.init_data) | 147 | if (!config.init_data) |
155 | return -ENOMEM; | 148 | return -ENOMEM; |
156 | 149 | ||
@@ -165,10 +158,10 @@ static int pwm_regulator_probe(struct platform_device *pdev) | |||
165 | } | 158 | } |
166 | 159 | ||
167 | regulator = devm_regulator_register(&pdev->dev, | 160 | regulator = devm_regulator_register(&pdev->dev, |
168 | &drvdata->desc, &config); | 161 | &pwm_regulator_desc, &config); |
169 | if (IS_ERR(regulator)) { | 162 | if (IS_ERR(regulator)) { |
170 | dev_err(&pdev->dev, "Failed to register regulator %s\n", | 163 | dev_err(&pdev->dev, "Failed to register regulator %s\n", |
171 | drvdata->desc.name); | 164 | pwm_regulator_desc.name); |
172 | return PTR_ERR(regulator); | 165 | return PTR_ERR(regulator); |
173 | } | 166 | } |
174 | 167 | ||