diff options
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/axp20x.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 96102753847f..b8324f5dc078 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -28,9 +28,11 @@ #include <linux/mfd/core.h> #include <linux/of_device.h> #include <linux/acpi.h> - #define AXP20X_OFF 0x80 +static DEFINE_SPINLOCK(axp20x_list_slock); +static LIST_HEAD(axp20x_list); + static const char * const axp20x_model_names[] = { "AXP152", "AXP202", @@ -821,6 +823,27 @@ int axp20x_match_device(struct axp20x_dev *axp20x) } EXPORT_SYMBOL(axp20x_match_device); +struct regmap *axp20x_node_to_regmap(struct device_node *np) +{ + struct axp20x_dev *entry, *axp20x = NULL; + + spin_lock(&axp20x_list_slock); + + list_for_each_entry(entry, &axp20x_list, list) + if (entry->dev && entry->dev->of_node == np) { + axp20x = entry; + break; + } + + spin_unlock(&axp20x_list_slock); + + if (axp20x) + return axp20x->regmap; + + return NULL; +} +EXPORT_SYMBOL_GPL(syscon_node_to_regmap); + int axp20x_device_probe(struct axp20x_dev *axp20x) { int ret; @@ -848,6 +871,10 @@ int axp20x_device_probe(struct axp20x_dev *axp20x) pm_power_off = axp20x_power_off; } + spin_lock(&axp20x_list_slock); + list_add_tail(&axp20x->list, &axp20x_list); + spin_unlock(&axp20x_list_slock); + dev_info(axp20x->dev, "AXP20X driver loaded\n"); return 0; |