Loading drivers/regulator/core.c +7 −3 Original line number Diff line number Diff line Loading @@ -3516,12 +3516,17 @@ regulator_register(const struct regulator_desc *regulator_desc, return ERR_PTR(-EINVAL); } init_data = config->init_data; rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL); if (rdev == NULL) return ERR_PTR(-ENOMEM); init_data = regulator_of_get_init_data(dev, regulator_desc, &rdev->dev.of_node); if (!init_data) { init_data = config->init_data; rdev->dev.of_node = of_node_get(config->of_node); } mutex_lock(®ulator_list_mutex); mutex_init(&rdev->mutex); Loading @@ -3548,7 +3553,6 @@ regulator_register(const struct regulator_desc *regulator_desc, /* register with sysfs */ rdev->dev.class = ®ulator_class; rdev->dev.of_node = of_node_get(config->of_node); rdev->dev.parent = dev; dev_set_name(&rdev->dev, "regulator.%d", atomic_inc_return(®ulator_no) - 1); Loading drivers/regulator/internal.h +4 −0 Original line number Diff line number Diff line Loading @@ -35,4 +35,8 @@ struct regulator { struct dentry *debugfs; }; struct regulator_init_data *regulator_of_get_init_data(struct device *dev, const struct regulator_desc *desc, struct device_node **node); #endif drivers/regulator/of_regulator.c +51 −0 Original line number Diff line number Diff line Loading @@ -14,8 +14,11 @@ #include <linux/slab.h> #include <linux/of.h> #include <linux/regulator/machine.h> #include <linux/regulator/driver.h> #include <linux/regulator/of_regulator.h> #include "internal.h" static void of_get_regulation_constraints(struct device_node *np, struct regulator_init_data **init_data) { Loading Loading @@ -189,3 +192,51 @@ int of_regulator_match(struct device *dev, struct device_node *node, return count; } EXPORT_SYMBOL_GPL(of_regulator_match); struct regulator_init_data *regulator_of_get_init_data(struct device *dev, const struct regulator_desc *desc, struct device_node **node) { struct device_node *search, *child; struct regulator_init_data *init_data = NULL; const char *name; if (!dev->of_node || !desc->of_match) return NULL; if (desc->regulators_node) search = of_get_child_by_name(dev->of_node, desc->regulators_node); else search = dev->of_node; if (!search) { dev_err(dev, "Failed to find regulator container node\n"); return NULL; } for_each_child_of_node(search, child) { name = of_get_property(child, "regulator-compatible", NULL); if (!name) name = child->name; if (strcmp(desc->of_match, name)) continue; init_data = of_get_regulator_init_data(dev, child); if (!init_data) { dev_err(dev, "failed to parse DT for regulator %s\n", child->name); break; } of_node_get(child); *node = child; break; } of_node_put(search); return init_data; } include/linux/regulator/driver.h +4 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,8 @@ enum regulator_type { * * @name: Identifying name for the regulator. * @supply_name: Identifying the regulator supply * @of_match: Name used to identify regulator in DT. * @regulators_node: Name of node containing regulator definitions in DT. * @id: Numerical identifier for the regulator. * @ops: Regulator operations table. * @irq: Interrupt number for the regulator. Loading Loading @@ -242,6 +244,8 @@ enum regulator_type { struct regulator_desc { const char *name; const char *supply_name; const char *of_match; const char *regulators_node; int id; bool continuous_voltage_range; unsigned n_voltages; Loading Loading
drivers/regulator/core.c +7 −3 Original line number Diff line number Diff line Loading @@ -3516,12 +3516,17 @@ regulator_register(const struct regulator_desc *regulator_desc, return ERR_PTR(-EINVAL); } init_data = config->init_data; rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL); if (rdev == NULL) return ERR_PTR(-ENOMEM); init_data = regulator_of_get_init_data(dev, regulator_desc, &rdev->dev.of_node); if (!init_data) { init_data = config->init_data; rdev->dev.of_node = of_node_get(config->of_node); } mutex_lock(®ulator_list_mutex); mutex_init(&rdev->mutex); Loading @@ -3548,7 +3553,6 @@ regulator_register(const struct regulator_desc *regulator_desc, /* register with sysfs */ rdev->dev.class = ®ulator_class; rdev->dev.of_node = of_node_get(config->of_node); rdev->dev.parent = dev; dev_set_name(&rdev->dev, "regulator.%d", atomic_inc_return(®ulator_no) - 1); Loading
drivers/regulator/internal.h +4 −0 Original line number Diff line number Diff line Loading @@ -35,4 +35,8 @@ struct regulator { struct dentry *debugfs; }; struct regulator_init_data *regulator_of_get_init_data(struct device *dev, const struct regulator_desc *desc, struct device_node **node); #endif
drivers/regulator/of_regulator.c +51 −0 Original line number Diff line number Diff line Loading @@ -14,8 +14,11 @@ #include <linux/slab.h> #include <linux/of.h> #include <linux/regulator/machine.h> #include <linux/regulator/driver.h> #include <linux/regulator/of_regulator.h> #include "internal.h" static void of_get_regulation_constraints(struct device_node *np, struct regulator_init_data **init_data) { Loading Loading @@ -189,3 +192,51 @@ int of_regulator_match(struct device *dev, struct device_node *node, return count; } EXPORT_SYMBOL_GPL(of_regulator_match); struct regulator_init_data *regulator_of_get_init_data(struct device *dev, const struct regulator_desc *desc, struct device_node **node) { struct device_node *search, *child; struct regulator_init_data *init_data = NULL; const char *name; if (!dev->of_node || !desc->of_match) return NULL; if (desc->regulators_node) search = of_get_child_by_name(dev->of_node, desc->regulators_node); else search = dev->of_node; if (!search) { dev_err(dev, "Failed to find regulator container node\n"); return NULL; } for_each_child_of_node(search, child) { name = of_get_property(child, "regulator-compatible", NULL); if (!name) name = child->name; if (strcmp(desc->of_match, name)) continue; init_data = of_get_regulator_init_data(dev, child); if (!init_data) { dev_err(dev, "failed to parse DT for regulator %s\n", child->name); break; } of_node_get(child); *node = child; break; } of_node_put(search); return init_data; }
include/linux/regulator/driver.h +4 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,8 @@ enum regulator_type { * * @name: Identifying name for the regulator. * @supply_name: Identifying the regulator supply * @of_match: Name used to identify regulator in DT. * @regulators_node: Name of node containing regulator definitions in DT. * @id: Numerical identifier for the regulator. * @ops: Regulator operations table. * @irq: Interrupt number for the regulator. Loading Loading @@ -242,6 +244,8 @@ enum regulator_type { struct regulator_desc { const char *name; const char *supply_name; const char *of_match; const char *regulators_node; int id; bool continuous_voltage_range; unsigned n_voltages; Loading