diff options
author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2015-01-05 06:48:42 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-01-08 15:15:45 -0500 |
commit | bfa21a0dfe6915dc85953b5d40ea9dae5fdf205f (patch) | |
tree | a65674f6cf409a546fc2a62c74e3ab25261a4f4d | |
parent | 1b3de223385d6bf2ab9bf2e9e80aebb26fedd426 (diff) |
regulator: Allow parsing custom properties when using simplified DT parsing
When drivers use simplified DT parsing method (they provide
'regulator_desc.of_match') they still may want to parse custom
properties for some of the regulators. For example some of the
regulators support GPIO enable control.
Add a driver-supplied callback for such case. This way the regulator
core parses common bindings offloading a lot of code from drivers and
still custom properties may be used.
The callback, called for each parsed regulator, may modify the
'regulator_config' initially passed to regulator_register().
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/regulator/core.c | 2 | ||||
-rw-r--r-- | drivers/regulator/internal.h | 2 | ||||
-rw-r--r-- | drivers/regulator/of_regulator.c | 11 | ||||
-rw-r--r-- | include/linux/regulator/driver.h | 13 |
4 files changed, 27 insertions, 1 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index c13b557a560e..5fae8cabd254 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -3635,7 +3635,7 @@ regulator_register(const struct regulator_desc *regulator_desc, | |||
3635 | return ERR_PTR(-ENOMEM); | 3635 | return ERR_PTR(-ENOMEM); |
3636 | } | 3636 | } |
3637 | 3637 | ||
3638 | init_data = regulator_of_get_init_data(dev, regulator_desc, | 3638 | init_data = regulator_of_get_init_data(dev, regulator_desc, config, |
3639 | &rdev->dev.of_node); | 3639 | &rdev->dev.of_node); |
3640 | if (!init_data) { | 3640 | if (!init_data) { |
3641 | init_data = config->init_data; | 3641 | init_data = config->init_data; |
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h index 80ba2a35a04b..c74ac8734023 100644 --- a/drivers/regulator/internal.h +++ b/drivers/regulator/internal.h | |||
@@ -38,11 +38,13 @@ struct regulator { | |||
38 | #ifdef CONFIG_OF | 38 | #ifdef CONFIG_OF |
39 | struct regulator_init_data *regulator_of_get_init_data(struct device *dev, | 39 | struct regulator_init_data *regulator_of_get_init_data(struct device *dev, |
40 | const struct regulator_desc *desc, | 40 | const struct regulator_desc *desc, |
41 | struct regulator_config *config, | ||
41 | struct device_node **node); | 42 | struct device_node **node); |
42 | #else | 43 | #else |
43 | static inline struct regulator_init_data * | 44 | static inline struct regulator_init_data * |
44 | regulator_of_get_init_data(struct device *dev, | 45 | regulator_of_get_init_data(struct device *dev, |
45 | const struct regulator_desc *desc, | 46 | const struct regulator_desc *desc, |
47 | struct regulator_config *config, | ||
46 | struct device_node **node) | 48 | struct device_node **node) |
47 | { | 49 | { |
48 | return NULL; | 50 | return NULL; |
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index 91eaaf010524..24e812c48d93 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c | |||
@@ -270,6 +270,7 @@ EXPORT_SYMBOL_GPL(of_regulator_match); | |||
270 | 270 | ||
271 | struct regulator_init_data *regulator_of_get_init_data(struct device *dev, | 271 | struct regulator_init_data *regulator_of_get_init_data(struct device *dev, |
272 | const struct regulator_desc *desc, | 272 | const struct regulator_desc *desc, |
273 | struct regulator_config *config, | ||
273 | struct device_node **node) | 274 | struct device_node **node) |
274 | { | 275 | { |
275 | struct device_node *search, *child; | 276 | struct device_node *search, *child; |
@@ -307,6 +308,16 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev, | |||
307 | break; | 308 | break; |
308 | } | 309 | } |
309 | 310 | ||
311 | if (desc->of_parse_cb) { | ||
312 | if (desc->of_parse_cb(child, desc, config)) { | ||
313 | dev_err(dev, | ||
314 | "driver callback failed to parse DT for regulator %s\n", | ||
315 | child->name); | ||
316 | init_data = NULL; | ||
317 | break; | ||
318 | } | ||
319 | } | ||
320 | |||
310 | of_node_get(child); | 321 | of_node_get(child); |
311 | *node = child; | 322 | *node = child; |
312 | break; | 323 | break; |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 5f1e9ca47417..d4ad5b5a02bb 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | struct regmap; | 22 | struct regmap; |
23 | struct regulator_dev; | 23 | struct regulator_dev; |
24 | struct regulator_config; | ||
24 | struct regulator_init_data; | 25 | struct regulator_init_data; |
25 | struct regulator_enable_gpio; | 26 | struct regulator_enable_gpio; |
26 | 27 | ||
@@ -205,6 +206,15 @@ enum regulator_type { | |||
205 | * @supply_name: Identifying the regulator supply | 206 | * @supply_name: Identifying the regulator supply |
206 | * @of_match: Name used to identify regulator in DT. | 207 | * @of_match: Name used to identify regulator in DT. |
207 | * @regulators_node: Name of node containing regulator definitions in DT. | 208 | * @regulators_node: Name of node containing regulator definitions in DT. |
209 | * @of_parse_cb: Optional callback called only if of_match is present. | ||
210 | * Will be called for each regulator parsed from DT, during | ||
211 | * init_data parsing. | ||
212 | * The regulator_config passed as argument to the callback will | ||
213 | * be a copy of config passed to regulator_register, valid only | ||
214 | * for this particular call. Callback may freely change the | ||
215 | * config but it cannot store it for later usage. | ||
216 | * Callback should return 0 on success or negative ERRNO | ||
217 | * indicating failure. | ||
208 | * @id: Numerical identifier for the regulator. | 218 | * @id: Numerical identifier for the regulator. |
209 | * @ops: Regulator operations table. | 219 | * @ops: Regulator operations table. |
210 | * @irq: Interrupt number for the regulator. | 220 | * @irq: Interrupt number for the regulator. |
@@ -251,6 +261,9 @@ struct regulator_desc { | |||
251 | const char *supply_name; | 261 | const char *supply_name; |
252 | const char *of_match; | 262 | const char *of_match; |
253 | const char *regulators_node; | 263 | const char *regulators_node; |
264 | int (*of_parse_cb)(struct device_node *, | ||
265 | const struct regulator_desc *, | ||
266 | struct regulator_config *); | ||
254 | int id; | 267 | int id; |
255 | bool continuous_voltage_range; | 268 | bool continuous_voltage_range; |
256 | unsigned n_voltages; | 269 | unsigned n_voltages; |