2014-10-06 09:31:53

by Pankaj Dubey

[permalink] [raw]
Subject: [PATCH v9 0/2] ARM: Exynos: Convert PMU implementation into a platform driver

This patch series, modifies Exynos Power Management Unit (PMU) related code
for converting it into a platform_driver. This is also preparation for moving
PMU related code out of machine folder into a either "drivers/mfd", or
"drivers/power" or some other suitable place so that ARM64 based SoC can
utilize common piece of code.

These patches are created on top of Kukjin Kim's for-next.

Vikas Sajjan have tested these patches on Exynos5420 based Peach board for
system boot and S2R.

This patch series depends on following patch series:
[1]: mfd: syscon: Decouple syscon interface from syscon devices.
https://lkml.org/lkml/2014/9/30/156

Patch v8 and discussion can be found here:
http://www.spinics.net/lists/arm-kernel/msg366831.html

Change since v8:
- Changed __raw_readl/writel into readl/writel_relaxed as suggested by Arnd.

Change since v7:
- Removing registration of syscon provider. As it will be handled now by
syscon patch [1].
- Rebased on top of latest kgene/for-next.

Change since v6:
- Removed NULL check for pmu_data in pmu.c.
- Moved pmu_raw_readl and pmu_raw_writel inline helper function
into common.h.

Change Since v5:
- Squashed patch "Move "mach/map.h" inclusion from regs-pmu.h to platsmp.c"
into patch "Refactored code for using PMU address via DT".
- Addressed review comments from Tomasz Figa.
- Using init_irq machine function to initialize PMU mapping instead
of init_time.
- Rebased on latest Kukjin Kim's for-next branch.

Changes Since v4:
- Splitted patch series in two parts. Part 1 has code cleanup under mach-exynos
and posted as separate patch [2]. Current patchset is part 2 which modified
exynos pmu implementation for making it platform driver.
- Removed dependency over early_syscon API.
- Removed usage of regmap read/write APIs.
- Modified probe function to register exynos pmu as syscon provider using
Tomasz Figa's syscon patch [1].
- Address various other review comments from Tomasz Figa.
- Removed signed-off-by of Young-Gun Jang <yg1004.jang at samsung.com>,
as this id is no more valid. Taking ownership of all his patches.

Changes Since v3:
- Optimized exynos_pmu_probe function by removing exynos_pmu_data_init
as suggested by Vikas Sajjan.
- Modified syscon_early_regmap_lookup_by_phandle and
syscon_regmap_lookup_by_phandle function call to pass property as NULL.

Changes Since v2:
- Rebased on top of Daniel Lezcano's Exynos cpuidle refactor patches.
- Removed early mapping of PMU base address from exynos.c and removed
"get_exynos_pmuaddr" function. Instead of this added code in platsmp.c
to get PMU base address using of_iomap as suggested by Tomasz Figa.
- Converted PMU implementation into platform_driver by using static
platform_device method.

Changes Since v1:
- Rebased on latest for-next of Kukjin Kim's tree.
- Updated patch: Add support for mapping PMU base address via DT
- Removed __initdata from declaration of "exynos_pmu_base", as it caused
kernel crash as pointed out by Vikas Sajjan.
- Added support for Syscon initialization and getting PMU regmap handle
as suggested by Sylwester. Since current implementation of early
intialization [1] has limitation that "early_syscon_init" requires
DT to be unflattened and system should be able to allocate memory,
we can't use regmap handles for platsmp.c file as "smp_secondary_init"
will be called before DT unflattening. So I have kept both method for
accessing PMU base address. platsmp.c will use ioremmaped address where
as rest other files can use regmap handle.
- Updated patch: Refactored code for PMU register mapping via DT
- Modified to use regmap_read/write when using regmap handle.
- Added patch: Add device tree based initialization support for PMU.
- Convert existing PMU implementation to be a device tree based
before moving it to "drivers/mfd" folder. As suggested by Bartlomiej.
- Dropped making a platform_driver for PMU, as currently PMU binding
has two compatibility strings as "samsung, exynosxxx-pmu", "syscon",
once we enable MFD_SYSCON config option, current "syscon" driver probe
gets called and PMU probe never gets called. So modified PMU
initialization code to scan DT and match against supported compatiblity
string in driver code, and once we get matching node use that for
accessing PMU regmap handle using "syscon_early_regmap_lookup_by_phandle".
If there is any better solution please suggest.


Pankaj Dubey (2):
ARM: EXYNOS: Add platform driver support for Exynos PMU
ARM: EXYNOS: Move PMU specific definitions from common.h

arch/arm/mach-exynos/Kconfig | 1 +
arch/arm/mach-exynos/common.h | 17 ----
arch/arm/mach-exynos/exynos-pmu.h | 24 +++++
arch/arm/mach-exynos/pm.c | 1 +
arch/arm/mach-exynos/pmu.c | 191 ++++++++++++++++++++++++++++---------
arch/arm/mach-exynos/suspend.c | 1 +
6 files changed, 175 insertions(+), 60 deletions(-)
create mode 100644 arch/arm/mach-exynos/exynos-pmu.h

--
1.7.9.5


2014-10-06 09:32:01

by Pankaj Dubey

[permalink] [raw]
Subject: [PATCH v9 1/2] ARM: EXYNOS: Add platform driver support for Exynos PMU

This patch modifies Exynos Power Management Unit (PMU) initialization
implementation in following way:

- Added platform driver support for Exynos PMU IP.
- Added platform struct exynos_pmu_data to hold platform specific data.
- For each SoC's PMU support now we can add platform data and statically
bind PMU configuration and SoC specific initialization function.
- Separate each SoC's PMU initialization function and make it as part of
platform data.
- It also removes uses of soc_is_exynosXYZ().

Signed-off-by: Pankaj Dubey <[email protected]>
Reviewed-by: Tomasz Figa <[email protected]>
---
arch/arm/mach-exynos/Kconfig | 1 +
arch/arm/mach-exynos/pmu.c | 171 +++++++++++++++++++++++++++++++-----------
2 files changed, 130 insertions(+), 42 deletions(-)

diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index 46f3c0d..0ca168e 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -24,6 +24,7 @@ menuconfig ARCH_EXYNOS
select PM_GENERIC_DOMAINS if PM_RUNTIME
select S5P_DEV_MFC
select SRAM
+ select MFD_SYSCON
help
Support for SAMSUNG EXYNOS SoCs (EXYNOS4/5)

diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c
index cfc62e8..1f5aaa7 100644
--- a/arch/arm/mach-exynos/pmu.c
+++ b/arch/arm/mach-exynos/pmu.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*
* EXYNOS - CPU PMU(Power Management Unit) support
@@ -10,12 +10,26 @@
*/

#include <linux/io.h>
-#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>

#include "common.h"
#include "regs-pmu.h"

-static const struct exynos_pmu_conf *exynos_pmu_config;
+struct exynos_pmu_data {
+ const struct exynos_pmu_conf *pmu_config;
+ const struct exynos_pmu_conf *pmu_config_extra;
+
+ void (*pmu_init)(void);
+ void (*powerdown_conf)(enum sys_powerdown);
+};
+
+struct exynos_pmu_context {
+ struct device *dev;
+ const struct exynos_pmu_data *pmu_data;
+};
+
+static struct exynos_pmu_context *pmu_context;

static const struct exynos_pmu_conf exynos4210_pmu_config[] = {
/* { .offset = offset, .val = { AFTR, LPA, SLEEP } */
@@ -336,7 +350,7 @@ static unsigned int const exynos5_list_diable_wfi_wfe[] = {
EXYNOS5_ISP_ARM_OPTION,
};

-static void exynos5_init_pmu(void)
+static void exynos5_powerdown_conf(enum sys_powerdown mode)
{
unsigned int i;
unsigned int tmp;
@@ -344,7 +358,7 @@ static void exynos5_init_pmu(void)
/*
* Enable both SC_FEEDBACK and SC_COUNTER
*/
- for (i = 0 ; i < ARRAY_SIZE(exynos5_list_both_cnt_feed) ; i++) {
+ for (i = 0; i < ARRAY_SIZE(exynos5_list_both_cnt_feed); i++) {
tmp = pmu_raw_readl(exynos5_list_both_cnt_feed[i]);
tmp |= (EXYNOS5_USE_SC_FEEDBACK |
EXYNOS5_USE_SC_COUNTER);
@@ -361,7 +375,7 @@ static void exynos5_init_pmu(void)
/*
* Disable WFI/WFE on XXX_OPTION
*/
- for (i = 0 ; i < ARRAY_SIZE(exynos5_list_diable_wfi_wfe) ; i++) {
+ for (i = 0; i < ARRAY_SIZE(exynos5_list_diable_wfi_wfe); i++) {
tmp = pmu_raw_readl(exynos5_list_diable_wfi_wfe[i]);
tmp &= ~(EXYNOS5_OPTION_USE_STANDBYWFE |
EXYNOS5_OPTION_USE_STANDBYWFI);
@@ -373,51 +387,124 @@ void exynos_sys_powerdown_conf(enum sys_powerdown mode)
{
unsigned int i;

- if (soc_is_exynos5250())
- exynos5_init_pmu();
+ const struct exynos_pmu_data *pmu_data = pmu_context->pmu_data;

- for (i = 0; (exynos_pmu_config[i].offset != PMU_TABLE_END) ; i++)
- pmu_raw_writel(exynos_pmu_config[i].val[mode],
- exynos_pmu_config[i].offset);
+ if (pmu_data->powerdown_conf)
+ pmu_data->powerdown_conf(mode);

- if (soc_is_exynos4412()) {
- for (i = 0; exynos4412_pmu_config[i].offset != PMU_TABLE_END ; i++)
- pmu_raw_writel(exynos4412_pmu_config[i].val[mode],
- exynos4412_pmu_config[i].offset);
+ if (pmu_data->pmu_config) {
+ for (i = 0; (pmu_data->pmu_config[i].offset != PMU_TABLE_END); i++)
+ pmu_raw_writel(pmu_data->pmu_config[i].val[mode],
+ pmu_data->pmu_config[i].offset);
+ }
+
+ if (pmu_data->pmu_config_extra) {
+ for (i = 0; pmu_data->pmu_config_extra[i].offset != PMU_TABLE_END; i++)
+ pmu_raw_writel(pmu_data->pmu_config_extra[i].val[mode],
+ pmu_data->pmu_config_extra[i].offset);
}
}

-static int __init exynos_pmu_init(void)
+static void exynos5250_pmu_init(void)
{
unsigned int value;
+ /*
+ * When SYS_WDTRESET is set, watchdog timer reset request
+ * is ignored by power management unit.
+ */
+ value = pmu_raw_readl(EXYNOS5_AUTO_WDTRESET_DISABLE);
+ value &= ~EXYNOS5_SYS_WDTRESET;
+ pmu_raw_writel(value, EXYNOS5_AUTO_WDTRESET_DISABLE);
+
+ value = pmu_raw_readl(EXYNOS5_MASK_WDTRESET_REQUEST);
+ value &= ~EXYNOS5_SYS_WDTRESET;
+ pmu_raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST);
+}
+
+static const struct exynos_pmu_data exynos4210_pmu_data = {
+ .pmu_config = exynos4210_pmu_config,
+};
+
+static const struct exynos_pmu_data exynos4212_pmu_data = {
+ .pmu_config = exynos4x12_pmu_config,
+};
+
+static const struct exynos_pmu_data exynos4412_pmu_data = {
+ .pmu_config = exynos4x12_pmu_config,
+ .pmu_config_extra = exynos4412_pmu_config,
+};
+
+static const struct exynos_pmu_data exynos5250_pmu_data = {
+ .pmu_config = exynos5250_pmu_config,
+ .pmu_init = exynos5250_pmu_init,
+ .powerdown_conf = exynos5_powerdown_conf,
+};
+
+/*
+ * PMU platform driver and devicetree bindings.
+ */
+static const struct of_device_id exynos_pmu_of_device_ids[] = {
+ {
+ .compatible = "samsung,exynos4210-pmu",
+ .data = &exynos4210_pmu_data,
+ }, {
+ .compatible = "samsung,exynos4212-pmu",
+ .data = &exynos4212_pmu_data,
+ }, {
+ .compatible = "samsung,exynos4412-pmu",
+ .data = &exynos4412_pmu_data,
+ }, {
+ .compatible = "samsung,exynos5250-pmu",
+ .data = &exynos5250_pmu_data,
+ },
+ { /*sentinel*/ },
+};

- exynos_pmu_config = exynos4210_pmu_config;
-
- if (soc_is_exynos4210()) {
- exynos_pmu_config = exynos4210_pmu_config;
- pr_info("EXYNOS4210 PMU Initialize\n");
- } else if (soc_is_exynos4212() || soc_is_exynos4412()) {
- exynos_pmu_config = exynos4x12_pmu_config;
- pr_info("EXYNOS4x12 PMU Initialize\n");
- } else if (soc_is_exynos5250()) {
- /*
- * When SYS_WDTRESET is set, watchdog timer reset request
- * is ignored by power management unit.
- */
- value = pmu_raw_readl(EXYNOS5_AUTO_WDTRESET_DISABLE);
- value &= ~EXYNOS5_SYS_WDTRESET;
- pmu_raw_writel(value, EXYNOS5_AUTO_WDTRESET_DISABLE);
-
- value = pmu_raw_readl(EXYNOS5_MASK_WDTRESET_REQUEST);
- value &= ~EXYNOS5_SYS_WDTRESET;
- pmu_raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST);
-
- exynos_pmu_config = exynos5250_pmu_config;
- pr_info("EXYNOS5250 PMU Initialize\n");
- } else {
- pr_info("EXYNOS: PMU not supported\n");
+static int exynos_pmu_probe(struct platform_device *pdev)
+{
+ const struct of_device_id *match;
+ struct device *dev = &pdev->dev;
+ struct resource *res;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ pmu_base_addr = devm_ioremap_resource(dev, res);
+ if (IS_ERR(pmu_base_addr))
+ return PTR_ERR(pmu_base_addr);
+
+ pmu_context = devm_kzalloc(&pdev->dev,
+ sizeof(struct exynos_pmu_context),
+ GFP_KERNEL);
+ if (!pmu_context) {
+ dev_err(dev, "Cannot allocate memory.\n");
+ return -ENOMEM;
}
+ pmu_context->dev = dev;
+
+ match = of_match_node(exynos_pmu_of_device_ids, dev->of_node);
+
+ pmu_context->pmu_data = match->data;

+ if (pmu_context->pmu_data->pmu_init)
+ pmu_context->pmu_data->pmu_init();
+
+ platform_set_drvdata(pdev, pmu_context);
+
+ dev_dbg(dev, "Exynos PMU Driver probe done\n");
return 0;
}
-arch_initcall(exynos_pmu_init);
+
+static struct platform_driver exynos_pmu_driver = {
+ .driver = {
+ .name = "exynos-pmu",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_pmu_of_device_ids,
+ },
+ .probe = exynos_pmu_probe,
+};
+
+static int __init exynos_pmu_init(void)
+{
+ return platform_driver_register(&exynos_pmu_driver);
+
+}
+postcore_initcall(exynos_pmu_init);
--
1.7.9.5

2014-10-06 09:32:08

by Pankaj Dubey

[permalink] [raw]
Subject: [PATCH v9 2/2] ARM: EXYNOS: Move PMU specific definitions from common.h

This patch moves PMU specific definitions into a new file
as exynos-pmu.h.
This will help in reducing dependency of common.h in pmu.c.

Signed-off-by: Pankaj Dubey <[email protected]>
Reviewed-by: Tomasz Figa <[email protected]>
---
arch/arm/mach-exynos/common.h | 17 -----------------
arch/arm/mach-exynos/exynos-pmu.h | 24 ++++++++++++++++++++++++
arch/arm/mach-exynos/pm.c | 1 +
arch/arm/mach-exynos/pmu.c | 20 +++++++++++++++++++-
arch/arm/mach-exynos/suspend.c | 1 +
5 files changed, 45 insertions(+), 18 deletions(-)
create mode 100644 arch/arm/mach-exynos/exynos-pmu.h

diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index d4d09bc..431be1b 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -139,23 +139,6 @@ extern void exynos_cpu_resume_ns(void);

extern struct smp_operations exynos_smp_ops;

-/* PMU(Power Management Unit) support */
-
-#define PMU_TABLE_END (-1U)
-
-enum sys_powerdown {
- SYS_AFTR,
- SYS_LPA,
- SYS_SLEEP,
- NUM_SYS_POWERDOWN,
-};
-
-struct exynos_pmu_conf {
- unsigned int offset;
- unsigned int val[NUM_SYS_POWERDOWN];
-};
-
-extern void exynos_sys_powerdown_conf(enum sys_powerdown mode);
extern void exynos_cpu_power_down(int cpu);
extern void exynos_cpu_power_up(int cpu);
extern int exynos_cpu_power_state(int cpu);
diff --git a/arch/arm/mach-exynos/exynos-pmu.h b/arch/arm/mach-exynos/exynos-pmu.h
new file mode 100644
index 0000000..a2ab0d5
--- /dev/null
+++ b/arch/arm/mach-exynos/exynos-pmu.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com
+ *
+ * Header for EXYNOS PMU Driver support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __EXYNOS_PMU_H
+#define __EXYNOS_PMU_H
+
+enum sys_powerdown {
+ SYS_AFTR,
+ SYS_LPA,
+ SYS_SLEEP,
+ NUM_SYS_POWERDOWN,
+};
+
+extern void exynos_sys_powerdown_conf(enum sys_powerdown mode);
+
+#endif /* __EXYNOS_PMU_H */
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c
index 4f10fa6..86f3ecd 100644
--- a/arch/arm/mach-exynos/pm.c
+++ b/arch/arm/mach-exynos/pm.c
@@ -26,6 +26,7 @@
#include <plat/pm-common.h>

#include "common.h"
+#include "exynos-pmu.h"
#include "regs-pmu.h"
#include "regs-sys.h"

diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c
index 1f5aaa7..1993e08 100644
--- a/arch/arm/mach-exynos/pmu.c
+++ b/arch/arm/mach-exynos/pmu.c
@@ -13,9 +13,16 @@
#include <linux/of.h>
#include <linux/platform_device.h>

-#include "common.h"
+#include "exynos-pmu.h"
#include "regs-pmu.h"

+#define PMU_TABLE_END (-1U)
+
+struct exynos_pmu_conf {
+ unsigned int offset;
+ unsigned int val[NUM_SYS_POWERDOWN];
+};
+
struct exynos_pmu_data {
const struct exynos_pmu_conf *pmu_config;
const struct exynos_pmu_conf *pmu_config_extra;
@@ -29,8 +36,19 @@ struct exynos_pmu_context {
const struct exynos_pmu_data *pmu_data;
};

+static void __iomem *pmu_base_addr;
static struct exynos_pmu_context *pmu_context;

+static inline void pmu_raw_writel(u32 val, u32 offset)
+{
+ writel_relaxed(val, pmu_base_addr + offset);
+}
+
+static inline u32 pmu_raw_readl(u32 offset)
+{
+ return readl_relaxed(pmu_base_addr + offset);
+}
+
static const struct exynos_pmu_conf exynos4210_pmu_config[] = {
/* { .offset = offset, .val = { AFTR, LPA, SLEEP } */
{ S5P_ARM_CORE0_LOWPWR, { 0x0, 0x0, 0x2 } },
diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c
index f5d9773..079d999 100644
--- a/arch/arm/mach-exynos/suspend.c
+++ b/arch/arm/mach-exynos/suspend.c
@@ -33,6 +33,7 @@
#include "common.h"
#include "regs-pmu.h"
#include "regs-sys.h"
+#include "exynos-pmu.h"

#define S5P_CHECK_SLEEP 0x00000BAD

--
1.7.9.5

2014-10-07 01:53:35

by Kukjin Kim

[permalink] [raw]
Subject: RE: [PATCH v9 0/2] ARM: Exynos: Convert PMU implementation into a platform driver

Pankaj Dubey wrote:
>
> This patch series, modifies Exynos Power Management Unit (PMU) related code
> for converting it into a platform_driver. This is also preparation for moving
> PMU related code out of machine folder into a either "drivers/mfd", or
> "drivers/power" or some other suitable place so that ARM64 based SoC can
> utilize common piece of code.
>
> These patches are created on top of Kukjin Kim's for-next.
>
> Vikas Sajjan have tested these patches on Exynos5420 based Peach board for
> system boot and S2R.
>
> This patch series depends on following patch series:
> [1]: mfd: syscon: Decouple syscon interface from syscon devices.
> https://lkml.org/lkml/2014/9/30/156
>
> Patch v8 and discussion can be found here:
> http://www.spinics.net/lists/arm-kernel/msg366831.html
>
> Change since v8:
> - Changed __raw_readl/writel into readl/writel_relaxed as suggested by Arnd.
>
> Change since v7:
> - Removing registration of syscon provider. As it will be handled now by
> syscon patch [1].
> - Rebased on top of latest kgene/for-next.
>
> Change since v6:
> - Removed NULL check for pmu_data in pmu.c.
> - Moved pmu_raw_readl and pmu_raw_writel inline helper function
> into common.h.
>
> Change Since v5:
> - Squashed patch "Move "mach/map.h" inclusion from regs-pmu.h to platsmp.c"
> into patch "Refactored code for using PMU address via DT".
> - Addressed review comments from Tomasz Figa.
> - Using init_irq machine function to initialize PMU mapping instead
> of init_time.
> - Rebased on latest Kukjin Kim's for-next branch.
>
> Changes Since v4:
> - Splitted patch series in two parts. Part 1 has code cleanup under mach-exynos
> and posted as separate patch [2]. Current patchset is part 2 which modified
> exynos pmu implementation for making it platform driver.
> - Removed dependency over early_syscon API.
> - Removed usage of regmap read/write APIs.
> - Modified probe function to register exynos pmu as syscon provider using
> Tomasz Figa's syscon patch [1].
> - Address various other review comments from Tomasz Figa.
> - Removed signed-off-by of Young-Gun Jang <yg1004.jang at samsung.com>,
> as this id is no more valid. Taking ownership of all his patches.
>
> Changes Since v3:
> - Optimized exynos_pmu_probe function by removing exynos_pmu_data_init
> as suggested by Vikas Sajjan.
> - Modified syscon_early_regmap_lookup_by_phandle and
> syscon_regmap_lookup_by_phandle function call to pass property as NULL.
>
> Changes Since v2:
> - Rebased on top of Daniel Lezcano's Exynos cpuidle refactor patches.
> - Removed early mapping of PMU base address from exynos.c and removed
> "get_exynos_pmuaddr" function. Instead of this added code in platsmp.c
> to get PMU base address using of_iomap as suggested by Tomasz Figa.
> - Converted PMU implementation into platform_driver by using static
> platform_device method.
>
> Changes Since v1:
> - Rebased on latest for-next of Kukjin Kim's tree.
> - Updated patch: Add support for mapping PMU base address via DT
> - Removed __initdata from declaration of "exynos_pmu_base", as it caused
> kernel crash as pointed out by Vikas Sajjan.
> - Added support for Syscon initialization and getting PMU regmap handle
> as suggested by Sylwester. Since current implementation of early
> intialization [1] has limitation that "early_syscon_init" requires
> DT to be unflattened and system should be able to allocate memory,
> we can't use regmap handles for platsmp.c file as "smp_secondary_init"
> will be called before DT unflattening. So I have kept both method for
> accessing PMU base address. platsmp.c will use ioremmaped address where
> as rest other files can use regmap handle.
> - Updated patch: Refactored code for PMU register mapping via DT
> - Modified to use regmap_read/write when using regmap handle.
> - Added patch: Add device tree based initialization support for PMU.
> - Convert existing PMU implementation to be a device tree based
> before moving it to "drivers/mfd" folder. As suggested by Bartlomiej.
> - Dropped making a platform_driver for PMU, as currently PMU binding
> has two compatibility strings as "samsung, exynosxxx-pmu", "syscon",
> once we enable MFD_SYSCON config option, current "syscon" driver probe
> gets called and PMU probe never gets called. So modified PMU
> initialization code to scan DT and match against supported compatiblity
> string in driver code, and once we get matching node use that for
> accessing PMU regmap handle using "syscon_early_regmap_lookup_by_phandle".
> If there is any better solution please suggest.
>
>
> Pankaj Dubey (2):
> ARM: EXYNOS: Add platform driver support for Exynos PMU
> ARM: EXYNOS: Move PMU specific definitions from common.h
>
> arch/arm/mach-exynos/Kconfig | 1 +
> arch/arm/mach-exynos/common.h | 17 ----
> arch/arm/mach-exynos/exynos-pmu.h | 24 +++++
> arch/arm/mach-exynos/pm.c | 1 +
> arch/arm/mach-exynos/pmu.c | 191 ++++++++++++++++++++++++++++---------
> arch/arm/mach-exynos/suspend.c | 1 +
> 6 files changed, 175 insertions(+), 60 deletions(-)
> create mode 100644 arch/arm/mach-exynos/exynos-pmu.h
>
> --
> 1.7.9.5

Hi Pankaj,

Thanks for your addressing and looks good to me.

I'll queue this series after -rc1 release.

- Kukjin

2014-10-07 12:29:43

by Javier Martinez Canillas

[permalink] [raw]
Subject: Re: [PATCH v9 1/2] ARM: EXYNOS: Add platform driver support for Exynos PMU

Hello Pankaj,

On Mon, Oct 6, 2014 at 11:26 AM, Pankaj Dubey <[email protected]> wrote:
> This patch modifies Exynos Power Management Unit (PMU) initialization
> implementation in following way:
>
> - Added platform driver support for Exynos PMU IP.
> - Added platform struct exynos_pmu_data to hold platform specific data.
> - For each SoC's PMU support now we can add platform data and statically
> bind PMU configuration and SoC specific initialization function.
> - Separate each SoC's PMU initialization function and make it as part of
> platform data.
> - It also removes uses of soc_is_exynosXYZ().
>
> Signed-off-by: Pankaj Dubey <[email protected]>
> Reviewed-by: Tomasz Figa <[email protected]>
> ---
> arch/arm/mach-exynos/Kconfig | 1 +
> arch/arm/mach-exynos/pmu.c | 171 +++++++++++++++++++++++++++++++-----------
> 2 files changed, 130 insertions(+), 42 deletions(-)
>

Suspend-to-RAM is working on my Exynos5420 Peach Pit Chromebook, so:

Tested-by: Javier Martinez Canillas <[email protected]>

Best regards,
Javier

2014-10-07 12:31:03

by Javier Martinez Canillas

[permalink] [raw]
Subject: Re: [PATCH v9 2/2] ARM: EXYNOS: Move PMU specific definitions from common.h

Hello Pankaj,

On Mon, Oct 6, 2014 at 11:26 AM, Pankaj Dubey <[email protected]> wrote:
> This patch moves PMU specific definitions into a new file
> as exynos-pmu.h.
> This will help in reducing dependency of common.h in pmu.c.
>
> Signed-off-by: Pankaj Dubey <[email protected]>
> Reviewed-by: Tomasz Figa <[email protected]>
> ---
> arch/arm/mach-exynos/common.h | 17 -----------------
> arch/arm/mach-exynos/exynos-pmu.h | 24 ++++++++++++++++++++++++
> arch/arm/mach-exynos/pm.c | 1 +
> arch/arm/mach-exynos/pmu.c | 20 +++++++++++++++++++-
> arch/arm/mach-exynos/suspend.c | 1 +
> 5 files changed, 45 insertions(+), 18 deletions(-)
> create mode 100644 arch/arm/mach-exynos/exynos-pmu.h
>

Tested-by: Javier Martinez Canillas <[email protected]>

Best regards,
Javier