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>
This commit is contained in:
parent
1b3de22338
commit
bfa21a0dfe
@ -3635,7 +3635,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
|||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_data = regulator_of_get_init_data(dev, regulator_desc,
|
init_data = regulator_of_get_init_data(dev, regulator_desc, config,
|
||||||
&rdev->dev.of_node);
|
&rdev->dev.of_node);
|
||||||
if (!init_data) {
|
if (!init_data) {
|
||||||
init_data = config->init_data;
|
init_data = config->init_data;
|
||||||
|
@ -38,11 +38,13 @@ struct regulator {
|
|||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
||||||
const struct regulator_desc *desc,
|
const struct regulator_desc *desc,
|
||||||
|
struct regulator_config *config,
|
||||||
struct device_node **node);
|
struct device_node **node);
|
||||||
#else
|
#else
|
||||||
static inline struct regulator_init_data *
|
static inline struct regulator_init_data *
|
||||||
regulator_of_get_init_data(struct device *dev,
|
regulator_of_get_init_data(struct device *dev,
|
||||||
const struct regulator_desc *desc,
|
const struct regulator_desc *desc,
|
||||||
|
struct regulator_config *config,
|
||||||
struct device_node **node)
|
struct device_node **node)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -270,6 +270,7 @@ EXPORT_SYMBOL_GPL(of_regulator_match);
|
|||||||
|
|
||||||
struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
||||||
const struct regulator_desc *desc,
|
const struct regulator_desc *desc,
|
||||||
|
struct regulator_config *config,
|
||||||
struct device_node **node)
|
struct device_node **node)
|
||||||
{
|
{
|
||||||
struct device_node *search, *child;
|
struct device_node *search, *child;
|
||||||
@ -307,6 +308,16 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (desc->of_parse_cb) {
|
||||||
|
if (desc->of_parse_cb(child, desc, config)) {
|
||||||
|
dev_err(dev,
|
||||||
|
"driver callback failed to parse DT for regulator %s\n",
|
||||||
|
child->name);
|
||||||
|
init_data = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
of_node_get(child);
|
of_node_get(child);
|
||||||
*node = child;
|
*node = child;
|
||||||
break;
|
break;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
struct regmap;
|
struct regmap;
|
||||||
struct regulator_dev;
|
struct regulator_dev;
|
||||||
|
struct regulator_config;
|
||||||
struct regulator_init_data;
|
struct regulator_init_data;
|
||||||
struct regulator_enable_gpio;
|
struct regulator_enable_gpio;
|
||||||
|
|
||||||
@ -205,6 +206,15 @@ enum regulator_type {
|
|||||||
* @supply_name: Identifying the regulator supply
|
* @supply_name: Identifying the regulator supply
|
||||||
* @of_match: Name used to identify regulator in DT.
|
* @of_match: Name used to identify regulator in DT.
|
||||||
* @regulators_node: Name of node containing regulator definitions in DT.
|
* @regulators_node: Name of node containing regulator definitions in DT.
|
||||||
|
* @of_parse_cb: Optional callback called only if of_match is present.
|
||||||
|
* Will be called for each regulator parsed from DT, during
|
||||||
|
* init_data parsing.
|
||||||
|
* The regulator_config passed as argument to the callback will
|
||||||
|
* be a copy of config passed to regulator_register, valid only
|
||||||
|
* for this particular call. Callback may freely change the
|
||||||
|
* config but it cannot store it for later usage.
|
||||||
|
* Callback should return 0 on success or negative ERRNO
|
||||||
|
* indicating failure.
|
||||||
* @id: Numerical identifier for the regulator.
|
* @id: Numerical identifier for the regulator.
|
||||||
* @ops: Regulator operations table.
|
* @ops: Regulator operations table.
|
||||||
* @irq: Interrupt number for the regulator.
|
* @irq: Interrupt number for the regulator.
|
||||||
@ -251,6 +261,9 @@ struct regulator_desc {
|
|||||||
const char *supply_name;
|
const char *supply_name;
|
||||||
const char *of_match;
|
const char *of_match;
|
||||||
const char *regulators_node;
|
const char *regulators_node;
|
||||||
|
int (*of_parse_cb)(struct device_node *,
|
||||||
|
const struct regulator_desc *,
|
||||||
|
struct regulator_config *);
|
||||||
int id;
|
int id;
|
||||||
bool continuous_voltage_range;
|
bool continuous_voltage_range;
|
||||||
unsigned n_voltages;
|
unsigned n_voltages;
|
||||||
|
Loading…
Reference in New Issue
Block a user