Skip to content

Commit

Permalink
Merge tag 'samsung-drivers-soc-pmu-4.11' of git://git.kernel.org/pub/…
Browse files Browse the repository at this point in the history
…scm/linux/kernel/git/krzk/linux into devel

Improvements for Exynos PMU driver for v4.11:

Beside basic function of setting proper configuration for low power modes, the
Exynos PMU (Power Management Unit) driver is also a provider of syscon regmap
for its registers.  This regmap is essential to many other drivers wanting to
or needing to implement low power mode.

Exynos pinctrl driver, before getting support for Runtime Power Management,
needs access to this syscon regmap.  Let's do it in a DT ABI friendly way.
  • Loading branch information
Linus Walleij committed Jan 26, 2017
2 parents a41dfe7 + 1da6de3 commit 545e3e7
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
22 changes: 14 additions & 8 deletions drivers/soc/samsung/exynos-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
#include <linux/mfd/syscon.h>
#include <linux/platform_device.h>
#include <linux/delay.h>

Expand Down Expand Up @@ -92,9 +94,18 @@ static const struct of_device_id exynos_pmu_of_device_ids[] = {
{ /*sentinel*/ },
};

struct regmap *exynos_get_pmu_regmap(void)
{
struct device_node *np = of_find_matching_node(NULL,
exynos_pmu_of_device_ids);
if (np)
return syscon_node_to_regmap(np);
return ERR_PTR(-ENODEV);
}
EXPORT_SYMBOL_GPL(exynos_get_pmu_regmap);

static int exynos_pmu_probe(struct platform_device *pdev)
{
const struct of_device_id *match;
struct device *dev = &pdev->dev;
struct resource *res;

Expand All @@ -106,15 +117,10 @@ static int exynos_pmu_probe(struct platform_device *pdev)
pmu_context = devm_kzalloc(&pdev->dev,
sizeof(struct exynos_pmu_context),
GFP_KERNEL);
if (!pmu_context) {
dev_err(dev, "Cannot allocate memory.\n");
if (!pmu_context)
return -ENOMEM;
}
pmu_context->dev = dev;

match = of_match_node(exynos_pmu_of_device_ids, dev->of_node);

pmu_context->pmu_data = match->data;
pmu_context->pmu_data = of_device_get_match_data(dev);

if (pmu_context->pmu_data->pmu_init)
pmu_context->pmu_data->pmu_init();
Expand Down
10 changes: 10 additions & 0 deletions include/linux/soc/samsung/exynos-pmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#ifndef __LINUX_SOC_EXYNOS_PMU_H
#define __LINUX_SOC_EXYNOS_PMU_H

struct regmap;

enum sys_powerdown {
SYS_AFTR,
SYS_LPA,
Expand All @@ -20,5 +22,13 @@ enum sys_powerdown {
};

extern void exynos_sys_powerdown_conf(enum sys_powerdown mode);
#ifdef CONFIG_EXYNOS_PMU
extern struct regmap *exynos_get_pmu_regmap(void);
#else
static inline struct regmap *exynos_get_pmu_regmap(void)
{
return ERR_PTR(-ENODEV);
}
#endif

#endif /* __LINUX_SOC_EXYNOS_PMU_H */

0 comments on commit 545e3e7

Please sign in to comment.