diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index 52cb433a3..643734477 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -41,6 +41,26 @@ void __iomem *syscon_base_lookup_by_pdevname(const char *s) return ERR_PTR(-ENODEV); } +void __iomem *syscon_base_lookup_by_phandle(struct device_node *np, + const char *property) +{ + struct device_node *node; + struct syscon *syscon; + struct device_d *dev; + + node = of_parse_phandle(np, property, 0); + if (!node) + return ERR_PTR(-ENODEV); + + dev = of_find_device_by_node(node); + if (!dev) + return ERR_PTR(-ENODEV); + + syscon = dev->priv; + + return syscon->base; +} + static int syscon_probe(struct device_d *dev) { struct syscon *syscon; diff --git a/include/mfd/syscon.h b/include/mfd/syscon.h index 68432b7fe..0eccd5cb5 100644 --- a/include/mfd/syscon.h +++ b/include/mfd/syscon.h @@ -16,11 +16,19 @@ #ifdef CONFIG_MFD_SYSCON void __iomem *syscon_base_lookup_by_pdevname(const char *); +void __iomem *syscon_base_lookup_by_phandle + (struct device_node *np, const char *property); #else static inline void __iomem *syscon_base_lookup_by_pdevname(const char *) { return NULL; } + +static inline void __iomem *syscon_base_lookup_by_phandle + (struct device_node *np, const char *property) +{ + return NULL; +} #endif #endif