Skip to contentSkip to conversation

Samsung PM consolidation part 2 (multiplatform)

PATCH Superseded Tomasz Figa 5 participants 23 messages Feb 6, 2014 – Mar 18, 2014

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Current Samsung PM code is heavily unprepared for multiplatform systems. The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any possible quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from mach-, just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms like Exynos.

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and then reimplementing Exynos PM support in a multiplatform-capable way by using those generic parts. The result is that now PM initialization is started from mach-exynos*-dt, which calls Exynos-specific initialization code that registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

 arch/arm/mach-exynos/Kconfig                   |  16 +--
 arch/arm/mach-exynos/Makefile                  |   2 +-
 arch/arm/mach-exynos/common.c                  |   1 +
 arch/arm/mach-exynos/common.h                  |  14 ++
 arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
 arch/arm/mach-exynos/pm.c                      | 172 +++++++++++++++++++------
 arch/arm/mach-exynos/regs-pmu.h                |   2 +
 arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
 arch/arm/mach-s3c64xx/pm.c                     |   1 -
 arch/arm/mach-s5p64x0/pm.c                     |   1 -
 arch/arm/plat-samsung/Makefile                 |   2 +
 arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
 arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
 arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
 arch/arm/plat-samsung/pm-check.c               |   2 +-
 arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
 arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
 arch/arm/plat-samsung/pm.c                     | 146 ---------------------
 arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
 19 files changed, 531 insertions(+), 400 deletions(-)
 delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h
 create mode 100644 arch/arm/mach-exynos/sleep.S
 create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h
 create mode 100644 arch/arm/plat-samsung/pm-common.c
 create mode 100644 arch/arm/plat-samsung/pm-debug.c
Signature · 1 line
1.8.5.2
#1 lore raw

PATCH v2 1/12 ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend

Trying to resume l2x0 if it was not enabled before suspend leads to system crash. This patch prevents this by checking if l2x0_regs_phys is a valid pointer to l2x0 context data saved on initialization.

---
 arch/arm/plat-samsung/s5p-sleep.S | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
arch/arm/plat-samsung/s5p-sleep.S +5 -3
index a030e73..20764bd 100644
@@ -59,13 +59,15 @@ ENTRY(s3c_cpu_resume)
 	and	r0, r0, r1
 	ldr	r1, =CPU_CORTEX_A9
 	cmp	r0, r1
-	bne	resume_l2on
+	bne	skip_l2_resume
 	adr	r0, l2x0_regs_phys
 	ldr	r0, [r0]
+	cmp	r0, #0
+	beq	skip_l2_resume
 	ldr	r1, [r0, #L2X0_R_PHY_BASE]
 	ldr	r2, [r1, #L2X0_CTRL]
 	tst	r2, #0x1
-	bne	resume_l2on
+	bne	skip_l2_resume
 	ldr	r2, [r0, #L2X0_R_AUX_CTRL]
 	str	r2, [r1, #L2X0_AUX_CTRL]
 	ldr	r2, [r0, #L2X0_R_TAG_LATENCY]
@@ -78,7 +80,7 @@ ENTRY(s3c_cpu_resume)
 	str	r2, [r1, #L2X0_POWER_CTRL]
 	mov	r2, #1
 	str	r2, [r1, #L2X0_CTRL]
-resume_l2on:
+skip_l2_resume:
 #endif
 	b	cpu_resume
 ENDPROC(s3c_cpu_resume)
Signature · 1 line
1.8.5.2
#2 lore raw

PATCH v2 2/12 ARM: SAMSUNG: Add soc_is_s3c2410() helper

In reply to Tomasz Figa

Due to the S3C2410 SoC being quite different from other S3C24xx SoCs in some aspects, such as availability of DIVSLOT register in its UART blocks, there is a need sometimes to check whether we are running on this SoC, not just the S3C24xx series. This patch adds soc_is_s3c2410() helper function for this purpose.

---
 arch/arm/plat-samsung/include/plat/cpu.h | 6 ++++++
 1 file changed, 6 insertions(+)
arch/arm/plat-samsung/include/plat/cpu.h +6 -0
index 335beb3..6bf86f6 100644
@@ -20,6 +20,9 @@
 
 extern unsigned long samsung_cpu_id;
 
+#define S3C2410_CPU_ID		0x32410000
+#define S3C2410_CPU_MASK	0xFFFFFFFF
+
 #define S3C24XX_CPU_ID		0x32400000
 #define S3C24XX_CPU_MASK	0xFFF00000
 
@@ -56,6 +59,7 @@ static inline int is_samsung_##name(void)	\
 	return ((samsung_cpu_id & mask) == (id & mask));	\
 }
 
+IS_SAMSUNG_CPU(s3c2410, S3C2410_CPU_ID, S3C2410_CPU_MASK)
 IS_SAMSUNG_CPU(s3c24xx, S3C24XX_CPU_ID, S3C24XX_CPU_MASK)
 IS_SAMSUNG_CPU(s3c2412, S3C2412_CPU_ID, S3C2412_CPU_MASK)
 IS_SAMSUNG_CPU(s3c6400, S3C6400_CPU_ID, S3C64XX_CPU_MASK)
@@ -76,8 +80,10 @@ IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK)
     defined(CONFIG_CPU_S3C2442) || defined(CONFIG_CPU_S3C244X) || \
     defined(CONFIG_CPU_S3C2443)
 # define soc_is_s3c24xx()	is_samsung_s3c24xx()
+# define soc_is_s3c2410()	is_samsung_s3c2410()
 #else
 # define soc_is_s3c24xx()	0
+# define soc_is_s3c2410()	0
 #endif
 
 #if defined(CONFIG_CPU_S3C2412)
Signature · 1 line
1.8.5.2
#3 lore raw

PATCH v2 3/12 ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type

In reply to Tomasz Figa

The only SoC that does not have DIVSLOT register is S3C2410, so instead of exporting a variable for platforms to set if DIVSLOT register should be preserved, it's enough to simply check whether we are running on a S3C2410 instead.

---
 arch/arm/mach-s3c64xx/pm.c              |  1 -
 arch/arm/mach-s5p64x0/pm.c              |  1 -
 arch/arm/plat-samsung/include/plat/pm.h |  2 --
 arch/arm/plat-samsung/pm.c              | 18 +++++-------------
 4 files changed, 5 insertions(+), 17 deletions(-)
arch/arm/mach-s3c64xx/pm.c +0 -1
index b5a6698..6b37694 100644
@@ -332,7 +332,6 @@ static __init int s3c64xx_pm_initcall(void)
 {
 	pm_cpu_prep = s3c64xx_pm_prepare;
 	pm_cpu_sleep = s3c64xx_cpu_suspend;
-	pm_uart_udivslot = 1;
 
 #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK
 	gpio_request(S3C64XX_GPN(12), "DEBUG_LED0");
arch/arm/mach-s5p64x0/pm.c +0 -1
index 861e15c..ec8229c 100644
@@ -161,7 +161,6 @@ static int s5p64x0_pm_add(struct device *dev, struct subsys_interface *sif)
 {
 	pm_cpu_prep = s5p64x0_pm_prepare;
 	pm_cpu_sleep = s5p64x0_cpu_suspend;
-	pm_uart_udivslot = 1;
 
 	return 0;
 }
arch/arm/plat-samsung/include/plat/pm.h +0 -2
index ff6063f..21758c6 100644
@@ -54,8 +54,6 @@ extern int (*pm_cpu_sleep)(unsigned long);
 
 extern unsigned long s3c_pm_flags;
 
-extern unsigned char pm_uart_udivslot;  /* true to save UART UDIVSLOT */
-
 /* from sleep.S */
 
 extern int s3c2410_cpu_suspend(unsigned long);
arch/arm/plat-samsung/pm.c +5 -13
index e5b0f2c..5d9daf6 100644
@@ -23,6 +23,7 @@
 #include <asm/cacheflush.h>
 #include <asm/suspend.h>
 
+#include <plat/cpu.h>
 #include <plat/regs-serial.h>
 
 #ifdef CONFIG_SAMSUNG_ATAGS
@@ -71,17 +72,6 @@ static inline void s3c_pm_debug_init(void)
 	s3c_pm_debug_init_uart();
 }
 
-#else
-#define s3c_pm_debug_init() do { } while(0)
-
-#endif /* CONFIG_SAMSUNG_PM_DEBUG */
-
-/* Save the UART configurations if we are configured for debug. */
-
-unsigned char pm_uart_udivslot;
-
-#ifdef CONFIG_SAMSUNG_PM_DEBUG
-
 static struct pm_uart_save uart_save;
 
 static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
@@ -94,7 +84,7 @@ static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
 	save->umcon = __raw_readl(regs + S3C2410_UMCON);
 	save->ubrdiv = __raw_readl(regs + S3C2410_UBRDIV);
 
-	if (pm_uart_udivslot)
+	if (!soc_is_s3c2410())
 		save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT);
 
 	S3C_PMDBG("UART[%d]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n",
@@ -118,7 +108,7 @@ static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
 	__raw_writel(save->umcon, regs + S3C2410_UMCON);
 	__raw_writel(save->ubrdiv, regs + S3C2410_UBRDIV);
 
-	if (pm_uart_udivslot)
+	if (!soc_is_s3c2410())
 		__raw_writel(save->udivslot, regs + S3C2443_DIVSLOT);
 }
 
@@ -127,6 +117,8 @@ static void s3c_pm_restore_uarts(void)
 	s3c_pm_restore_uart(CONFIG_DEBUG_S3C_UART, &uart_save);
 }
 #else
+#define s3c_pm_debug_init() do { } while (0)
+
 static void s3c_pm_save_uarts(void) { }
 static void s3c_pm_restore_uarts(void) { }
 #endif
Signature · 1 line
1.8.5.2
#4 lore raw

PATCH v2 4/12 ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address

In reply to Tomasz Figa

This patch modifies Samsung PM debug helpers to use a multiplatform friendly way of getting base address of debug UART port, so instead of using a per-mach static macro, a generic debug_ll_addr() helper is used.

---
 arch/arm/plat-samsung/pm.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
arch/arm/plat-samsung/pm.c +13 -2
index 5d9daf6..53b3d67 100644
@@ -21,6 +21,7 @@
 #include <linux/io.h>
 
 #include <asm/cacheflush.h>
+#include <asm/mach/map.h>
 #include <asm/suspend.h>
 
 #include <plat/cpu.h>
@@ -74,9 +75,19 @@ static inline void s3c_pm_debug_init(void)
 
 static struct pm_uart_save uart_save;
 
+static inline void __iomem *s3c_pm_uart_base(void)
+{
+	unsigned long paddr;
+	unsigned long vaddr;
+
+	debug_ll_addr(&paddr, &vaddr);
+
+	return (void __iomem *)vaddr;
+}
+
 static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
 {
-	void __iomem *regs = S3C_VA_UARTx(uart);
+	void __iomem *regs = s3c_pm_uart_base();
 
 	save->ulcon = __raw_readl(regs + S3C2410_ULCON);
 	save->ucon = __raw_readl(regs + S3C2410_UCON);
@@ -98,7 +109,7 @@ static void s3c_pm_save_uarts(void)
 
 static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
 {
-	void __iomem *regs = S3C_VA_UARTx(uart);
+	void __iomem *regs = s3c_pm_uart_base();
 
 	s3c_pm_arch_update_uart(regs, save);
 
Signature · 1 line
1.8.5.2
#5 lore raw

PATCH v2 5/12 ARM: SAMSUNG: pm: Consolidate PM debug functions

In reply to Tomasz Figa

This patch removes one-line functions that was used just to pass constant arguments to lower level functions. After previous patches the need for those constants has been eliminated, so the main functions can be called directly.

---
 arch/arm/plat-samsung/pm.c | 20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)
arch/arm/plat-samsung/pm.c +6 -14
index 53b3d67..7c1d4385 100644
@@ -85,9 +85,10 @@ static inline void __iomem *s3c_pm_uart_base(void)
 	return (void __iomem *)vaddr;
 }
 
-static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
+static void s3c_pm_save_uarts(void)
 {
 	void __iomem *regs = s3c_pm_uart_base();
+	struct pm_uart_save *save = &uart_save;
 
 	save->ulcon = __raw_readl(regs + S3C2410_ULCON);
 	save->ucon = __raw_readl(regs + S3C2410_UCON);
@@ -98,18 +99,14 @@ static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
 	if (!soc_is_s3c2410())
 		save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT);
 
-	S3C_PMDBG("UART[%d]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n",
-		  uart, save->ulcon, save->ucon, save->ufcon, save->ubrdiv);
-}
-
-static void s3c_pm_save_uarts(void)
-{
-	s3c_pm_save_uart(CONFIG_DEBUG_S3C_UART, &uart_save);
+	S3C_PMDBG("UART[%p]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n",
+		  regs, save->ulcon, save->ucon, save->ufcon, save->ubrdiv);
 }
 
-static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
+static void s3c_pm_restore_uarts(void)
 {
 	void __iomem *regs = s3c_pm_uart_base();
+	struct pm_uart_save *save = &uart_save;
 
 	s3c_pm_arch_update_uart(regs, save);
 
@@ -122,11 +119,6 @@ static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
 	if (!soc_is_s3c2410())
 		__raw_writel(save->udivslot, regs + S3C2443_DIVSLOT);
 }
-
-static void s3c_pm_restore_uarts(void)
-{
-	s3c_pm_restore_uart(CONFIG_DEBUG_S3C_UART, &uart_save);
-}
 #else
 #define s3c_pm_debug_init() do { } while (0)
 
Signature · 1 line
1.8.5.2
#6 lore raw

PATCH v2 6/12 ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file

In reply to Tomasz Figa

Not all Samsung SoC platforms are going to use the legacy Samsung PM code enabled by CONFIG_SAMSUNG_PM_DEBUG. To allow using Samsung PM debug helpers on such platforms, related code is moved to separate file and a plat/pm-common.h header is added to separate legacy and generic code.

---
 arch/arm/plat-samsung/Makefile                 |  1 +
 arch/arm/plat-samsung/include/plat/pm-common.h | 70 ++++++++++++++++++
 arch/arm/plat-samsung/include/plat/pm.h        | 39 +---------
 arch/arm/plat-samsung/pm-debug.c               | 98 ++++++++++++++++++++++++++
 arch/arm/plat-samsung/pm.c                     | 85 ----------------------
 5 files changed, 170 insertions(+), 123 deletions(-)
 create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h
 create mode 100644 arch/arm/plat-samsung/pm-debug.c
arch/arm/plat-samsung/Makefile +1 -0
index 9267d29..ba30a16 100644
@@ -50,6 +50,7 @@ obj-$(CONFIG_SAMSUNG_DMADEV)	+= dma-ops.o
 obj-$(CONFIG_SAMSUNG_PM)	+= pm.o
 obj-$(CONFIG_SAMSUNG_PM_GPIO)	+= pm-gpio.o
 obj-$(CONFIG_SAMSUNG_PM_CHECK)	+= pm-check.o
+obj-$(CONFIG_SAMSUNG_PM_DEBUG)	+= pm-debug.o
 
 obj-$(CONFIG_SAMSUNG_WAKEMASK)	+= wakeup-mask.o
 obj-$(CONFIG_SAMSUNG_WDT_RESET)	+= watchdog-reset.o
arch/arm/plat-samsung/include/plat/pm-common.h new file +70 -0

70 lines not on this page · raw message

arch/arm/plat-samsung/include/plat/pm.h +1 -38
index 21758c6..2e04396 100644
@@ -16,6 +16,7 @@
 */
 
 #include <linux/irq.h>
+#include <plat/pm-common.h>
 
 struct device;
 
@@ -76,26 +77,6 @@ struct sleep_save {
 #define SAVE_ITEM(x) \
 	{ .reg = (x) }
 
-/**
- * struct pm_uart_save - save block for core UART
- * @ulcon: Save value for S3C2410_ULCON
- * @ucon: Save value for S3C2410_UCON
- * @ufcon: Save value for S3C2410_UFCON
- * @umcon: Save value for S3C2410_UMCON
- * @ubrdiv: Save value for S3C2410_UBRDIV
- *
- * Save block for UART registers to be held over sleep and restored if they
- * are needed (say by debug).
-*/
-struct pm_uart_save {
-	u32	ulcon;
-	u32	ucon;
-	u32	ufcon;
-	u32	umcon;
-	u32	ubrdiv;
-	u32	udivslot;
-};
-
 /* helper functions to save/restore lists of registers. */
 
 extern void s3c_pm_do_save(struct sleep_save *ptr, int count);
@@ -112,24 +93,6 @@ extern void s3c_cpu_resume(void);
 #define s3c_cpu_resume NULL
 #endif
 
-/* PM debug functions */
-
-#ifdef CONFIG_SAMSUNG_PM_DEBUG
-/**
- * s3c_pm_dbg() - low level debug function for use in suspend/resume.
- * @msg: The message to print.
- *
- * This function is used mainly to debug the resume process before the system
- * can rely on printk/console output. It uses the low-level debugging output
- * routine printascii() to do its work.
- */
-extern void s3c_pm_dbg(const char *msg, ...);
-
-#define S3C_PMDBG(fmt...) s3c_pm_dbg(fmt)
-#else
-#define S3C_PMDBG(fmt...) printk(KERN_DEBUG fmt)
-#endif
-
 #ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK
 /**
  * s3c_pm_debug_smdkled() - Debug PM suspend/resume via SMDK Board LEDs
arch/arm/plat-samsung/pm-debug.c new file +98 -0

98 lines not on this page · raw message

arch/arm/plat-samsung/pm.c +0 -85

102 lines not on this page · raw message

Signature · 1 line
1.8.5.2
#7 lore raw

PATCH v2 7/12 ARM: SAMSUNG: Move common save/restore helpers to separate file

In reply to Tomasz Figa

To separate legacy PM code from generic helpers, this patch moves the generic register save/restore helpers to a new file called pm-common.c that is compiled always when CONFIG_PM_SLEEP is enabled, to allow platforms that do not want to use the legacy PM code use the generic helpers.

---
 arch/arm/plat-samsung/Makefile                 |  1 +
 arch/arm/plat-samsung/include/plat/pm-common.h | 26 +++++++++
 arch/arm/plat-samsung/include/plat/pm.h        | 25 ---------
 arch/arm/plat-samsung/pm-common.c              | 75 ++++++++++++++++++++++++++
 arch/arm/plat-samsung/pm.c                     | 56 -------------------
 5 files changed, 102 insertions(+), 81 deletions(-)
 create mode 100644 arch/arm/plat-samsung/pm-common.c
arch/arm/plat-samsung/Makefile +1 -0
index ba30a16..25c826e 100644
@@ -47,6 +47,7 @@ obj-$(CONFIG_SAMSUNG_DMADEV)	+= dma-ops.o
 
 # PM support
 
+obj-$(CONFIG_PM_SLEEP)		+= pm-common.o
 obj-$(CONFIG_SAMSUNG_PM)	+= pm.o
 obj-$(CONFIG_SAMSUNG_PM_GPIO)	+= pm-gpio.o
 obj-$(CONFIG_SAMSUNG_PM_CHECK)	+= pm-check.o
arch/arm/plat-samsung/include/plat/pm-common.h +26 -0
index f72974a..741723e 100644
@@ -13,6 +13,32 @@
 #ifndef __PLAT_SAMSUNG_PM_COMMON_H
 #define __PLAT_SAMSUNG_PM_COMMON_H __FILE__
 
+#include <linux/irq.h>
+
+/* sleep save info */
+
+/**
+ * struct sleep_save - save information for shared peripherals.
+ * @reg: Pointer to the register to save.
+ * @val: Holder for the value saved from reg.
+ *
+ * This describes a list of registers which is used by the pm core and
+ * other subsystem to save and restore register values over suspend.
+ */
+struct sleep_save {
+	void __iomem	*reg;
+	unsigned long	val;
+};
+
+#define SAVE_ITEM(x) \
+	{ .reg = (x) }
+
+/* helper functions to save/restore lists of registers. */
+
+extern void s3c_pm_do_save(struct sleep_save *ptr, int count);
+extern void s3c_pm_do_restore(const struct sleep_save *ptr, int count);
+extern void s3c_pm_do_restore_core(const struct sleep_save *ptr, int count);
+
 /* PM debug functions */
 
 /**
arch/arm/plat-samsung/include/plat/pm.h +0 -25
index 2e04396..4099e8d 100644
@@ -15,7 +15,6 @@
  * management
 */
 
-#include <linux/irq.h>
 #include <plat/pm-common.h>
 
 struct device;
@@ -59,30 +58,6 @@ extern unsigned long s3c_pm_flags;
 
 extern int s3c2410_cpu_suspend(unsigned long);
 
-/* sleep save info */
-
-/**
- * struct sleep_save - save information for shared peripherals.
- * @reg: Pointer to the register to save.
- * @val: Holder for the value saved from reg.
- *
- * This describes a list of registers which is used by the pm core and
- * other subsystem to save and restore register values over suspend.
- */
-struct sleep_save {
-	void __iomem	*reg;
-	unsigned long	val;
-};
-
-#define SAVE_ITEM(x) \
-	{ .reg = (x) }
-
-/* helper functions to save/restore lists of registers. */
-
-extern void s3c_pm_do_save(struct sleep_save *ptr, int count);
-extern void s3c_pm_do_restore(const struct sleep_save *ptr, int count);
-extern void s3c_pm_do_restore_core(const struct sleep_save *ptr, int count);
-
 #ifdef CONFIG_SAMSUNG_PM
 extern int s3c_irq_wake(struct irq_data *data, unsigned int state);
 extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
arch/arm/plat-samsung/pm-common.c new file +75 -0

75 lines not on this page · raw message

arch/arm/plat-samsung/pm.c +0 -56

62 lines not on this page · raw message

Signature · 1 line
1.8.5.2
#8 lore raw

PATCH v2 8/12 ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h

In reply to Tomasz Figa

To allow using Samsung PM memory check helpers on platforms that do not use the legacy Samsung PM core, this patch moves prototypes of relevant functions to plat/pm-common.h header.

---
 arch/arm/plat-samsung/include/plat/pm-common.h | 14 ++++++++++++++
 arch/arm/plat-samsung/include/plat/pm.h        | 14 --------------
 arch/arm/plat-samsung/pm-check.c               |  2 +-
 3 files changed, 15 insertions(+), 15 deletions(-)
arch/arm/plat-samsung/include/plat/pm-common.h +14 -0
index 741723e..8705f9e 100644
@@ -93,4 +93,18 @@ static inline void s3c_pm_save_uarts(void) { }
 static inline void s3c_pm_restore_uarts(void) { }
 #endif
 
+/* suspend memory checking */
+
+#ifdef CONFIG_SAMSUNG_PM_CHECK
+extern void s3c_pm_check_prepare(void);
+extern void s3c_pm_check_restore(void);
+extern void s3c_pm_check_cleanup(void);
+extern void s3c_pm_check_store(void);
+#else
+#define s3c_pm_check_prepare() do { } while (0)
+#define s3c_pm_check_restore() do { } while (0)
+#define s3c_pm_check_cleanup() do { } while (0)
+#define s3c_pm_check_store()   do { } while (0)
+#endif
+
 #endif
arch/arm/plat-samsung/include/plat/pm.h +0 -14
index 4099e8d..e17d871 100644
@@ -80,20 +80,6 @@ extern void s3c_pm_debug_smdkled(u32 set, u32 clear);
 static inline void s3c_pm_debug_smdkled(u32 set, u32 clear) { }
 #endif /* CONFIG_S3C_PM_DEBUG_LED_SMDK */
 
-/* suspend memory checking */
-
-#ifdef CONFIG_SAMSUNG_PM_CHECK
-extern void s3c_pm_check_prepare(void);
-extern void s3c_pm_check_restore(void);
-extern void s3c_pm_check_cleanup(void);
-extern void s3c_pm_check_store(void);
-#else
-#define s3c_pm_check_prepare() do { } while(0)
-#define s3c_pm_check_restore() do { } while(0)
-#define s3c_pm_check_cleanup() do { } while(0)
-#define s3c_pm_check_store()   do { } while(0)
-#endif
-
 /**
  * s3c_pm_configure_extint() - ensure pins are correctly set for IRQ
  *
arch/arm/plat-samsung/pm-check.c +1 -1
index 3cbd626..04aff2c 100644
@@ -19,7 +19,7 @@
 #include <linux/ioport.h>
 #include <linux/slab.h>
 
-#include <plat/pm.h>
+#include <plat/pm-common.h>
 
 #if CONFIG_SAMSUNG_PM_CHECK_CHUNKSIZE < 1
 #error CONFIG_SAMSUNG_PM_CHECK_CHUNKSIZE must be a positive non-zero value
Signature · 1 line
1.8.5.2
#9 lore raw

PATCH v2 9/12 ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM

In reply to Tomasz Figa

CONFIG_PM means that at least one of CONFIG_PM_SLEEP and CONFIG_PM_RUNTIME is enabled, while multiple entries in mach-exynos/Kconfig abused it to enable sleep- and runtime-specific functionality.

This patch fixes this abuse by replacing dependencies on CONFIG_PM with appropriate dependencies on either CONFIG_PM_SLEEP or CONFIG_PM_RUNTIME, whichever is appropriate.

---
 arch/arm/mach-exynos/Kconfig | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)
arch/arm/mach-exynos/Kconfig +12 -12
index 4c414af..0964d97 100644
@@ -24,7 +24,7 @@ config ARCH_EXYNOS4
 	select HAVE_SMP
 	select MIGHT_HAVE_CACHE_L2X0
 	select PINCTRL
-	select PM_GENERIC_DOMAINS if PM
+	select PM_GENERIC_DOMAINS if PM_RUNTIME
 	select S5P_DEV_MFC
 	help
 	  Samsung EXYNOS4 SoCs based systems
@@ -47,10 +47,10 @@ config CPU_EXYNOS4210
 	default y
 	depends on ARCH_EXYNOS4
 	select ARCH_HAS_BANDGAP
-	select ARM_CPU_SUSPEND if PM
+	select ARM_CPU_SUSPEND if PM_SLEEP
 	select PINCTRL_EXYNOS
-	select S5P_PM if PM
-	select S5P_SLEEP if PM
+	select S5P_PM if PM_SLEEP
+	select S5P_SLEEP if PM_SLEEP
 	select SAMSUNG_DMADEV
 	help
 	  Enable EXYNOS4210 CPU support
@@ -61,8 +61,8 @@ config SOC_EXYNOS4212
 	depends on ARCH_EXYNOS4
 	select ARCH_HAS_BANDGAP
 	select PINCTRL_EXYNOS
-	select S5P_PM if PM
-	select S5P_SLEEP if PM
+	select S5P_PM if PM_SLEEP
+	select S5P_SLEEP if PM_SLEEP
 	select SAMSUNG_DMADEV
 	help
 	  Enable EXYNOS4212 SoC support
@@ -83,9 +83,9 @@ config SOC_EXYNOS5250
 	depends on ARCH_EXYNOS5
 	select ARCH_HAS_BANDGAP
 	select PINCTRL_EXYNOS
-	select PM_GENERIC_DOMAINS if PM
-	select S5P_PM if PM
-	select S5P_SLEEP if PM
+	select PM_GENERIC_DOMAINS if PM_RUNTIME
+	select S5P_PM if PM_SLEEP
+	select S5P_SLEEP if PM_SLEEP
 	select S5P_DEV_MFC
 	select SAMSUNG_DMADEV
 	help
@@ -95,9 +95,9 @@ config SOC_EXYNOS5420
 	bool "SAMSUNG EXYNOS5420"
 	default y
 	depends on ARCH_EXYNOS5
-	select PM_GENERIC_DOMAINS if PM
-	select S5P_PM if PM
-	select S5P_SLEEP if PM
+	select PM_GENERIC_DOMAINS if PM_RUNTIME
+	select S5P_PM if PM_SLEEP
+	select S5P_SLEEP if PM_SLEEP
 	help
 	  Enable EXYNOS5420 SoC support
 
Signature · 1 line
1.8.5.2
#10 lore raw

PATCH v2 10/12 ARM: EXYNOS: Remove PM initcalls and useless indirection

In reply to Tomasz Figa

This patch simplifies Exynos PM initialization and makes it multiplatform friendly by replacing initcalls used originally to invoke all the initialization code with explicit function calls.

In addition, an useless subsys_interface is removed, as all its .add_dev callback did was setting two function pointers.

---
 arch/arm/mach-exynos/common.c |  1 +
 arch/arm/mach-exynos/common.h |  6 ++++++
 arch/arm/mach-exynos/pm.c     | 50 +++++++++++--------------------------------
 3 files changed, 19 insertions(+), 38 deletions(-)
arch/arm/mach-exynos/common.c +1 -0
index f18be40..fb4e7dc 100644
@@ -315,6 +315,7 @@ void __init exynos_init_late(void)
 		return;
 
 	pm_genpd_poweroff_unused();
+	exynos_pm_init();
 }
 
 static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
arch/arm/mach-exynos/common.h +6 -0
index f76967b..82e08fb 100644
@@ -27,6 +27,12 @@ void exynos_init_late(void);
 
 void exynos_firmware_init(void);
 
+#ifdef CONFIG_PM_SLEEP
+extern void __init exynos_pm_init(void);
+#else
+static inline void exynos_pm_init(void) {}
+#endif
+
 extern struct smp_operations exynos_smp_ops;
 
 extern void exynos_cpu_die(unsigned int cpu);
arch/arm/mach-exynos/pm.c +12 -38

63 lines not on this page · raw message

Signature · 1 line
1.8.5.2
#11 lore raw

PATCH v2 11/12 ARM: EXYNOS: Stop using legacy Samsung PM code

In reply to Tomasz Figa

Since Exynos SoCs does not follow most of the semantics of older SoCs when configuring the system to enter sleep, there is no reason to rely on the legacy Samsung PM core anymore.

This patch adds local Exynos suspend ops and removes all the code left unnecessary. As a side effect, suspend support on Exynos becomes multiplatform-friendly.

---
 arch/arm/mach-exynos/Kconfig                |  8 ---
 arch/arm/mach-exynos/Makefile               |  2 +-
 arch/arm/mach-exynos/common.h               |  8 +++
 arch/arm/mach-exynos/include/mach/pm-core.h | 75 -------------------------
 arch/arm/mach-exynos/pm.c                   | 79 ++++++++++++++++++++++++---
 arch/arm/mach-exynos/regs-pmu.h             |  2 +
 arch/arm/mach-exynos/sleep.S                | 85 +++++++++++++++++++++++++++++
 arch/arm/plat-samsung/s5p-sleep.S           | 45 ---------------
 8 files changed, 167 insertions(+), 137 deletions(-)
 delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h
 create mode 100644 arch/arm/mach-exynos/sleep.S
arch/arm/mach-exynos/Kconfig +0 -8
index 0964d97..fcd78c2 100644
@@ -49,8 +49,6 @@ config CPU_EXYNOS4210
 	select ARCH_HAS_BANDGAP
 	select ARM_CPU_SUSPEND if PM_SLEEP
 	select PINCTRL_EXYNOS
-	select S5P_PM if PM_SLEEP
-	select S5P_SLEEP if PM_SLEEP
 	select SAMSUNG_DMADEV
 	help
 	  Enable EXYNOS4210 CPU support
@@ -61,8 +59,6 @@ config SOC_EXYNOS4212
 	depends on ARCH_EXYNOS4
 	select ARCH_HAS_BANDGAP
 	select PINCTRL_EXYNOS
-	select S5P_PM if PM_SLEEP
-	select S5P_SLEEP if PM_SLEEP
 	select SAMSUNG_DMADEV
 	help
 	  Enable EXYNOS4212 SoC support
@@ -84,8 +80,6 @@ config SOC_EXYNOS5250
 	select ARCH_HAS_BANDGAP
 	select PINCTRL_EXYNOS
 	select PM_GENERIC_DOMAINS if PM_RUNTIME
-	select S5P_PM if PM_SLEEP
-	select S5P_SLEEP if PM_SLEEP
 	select S5P_DEV_MFC
 	select SAMSUNG_DMADEV
 	help
@@ -96,8 +90,6 @@ config SOC_EXYNOS5420
 	default y
 	depends on ARCH_EXYNOS5
 	select PM_GENERIC_DOMAINS if PM_RUNTIME
-	select S5P_PM if PM_SLEEP
-	select S5P_SLEEP if PM_SLEEP
 	help
 	  Enable EXYNOS5420 SoC support
 
arch/arm/mach-exynos/Makefile +1 -1
index 8930b66..58fe9e6 100644
@@ -14,7 +14,7 @@ obj-				:=
 
 obj-$(CONFIG_ARCH_EXYNOS)	+= common.o
 
-obj-$(CONFIG_S5P_PM)		+= pm.o
+obj-$(CONFIG_PM_SLEEP)		+= pm.o sleep.o
 obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
 obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o
 
arch/arm/mach-exynos/common.h +8 -0
index 82e08fb..aba6a2a 100644
@@ -27,12 +27,20 @@ void exynos_init_late(void);
 
 void exynos_firmware_init(void);
 
+#ifdef CONFIG_PINCTRL_EXYNOS
+extern u32 exynos_get_eint_wake_mask(void);
+#else
+static inline u32 exynos_get_eint_wake_mask(void) { return 0xffffffff; }
+#endif
+
 #ifdef CONFIG_PM_SLEEP
 extern void __init exynos_pm_init(void);
 #else
 static inline void exynos_pm_init(void) {}
 #endif
 
+extern void exynos_cpu_resume(void);
+
 extern struct smp_operations exynos_smp_ops;
 
 extern void exynos_cpu_die(unsigned int cpu);
arch/arm/mach-exynos/include/mach/pm-core.h deleted +0 -75

75 lines not on this page · raw message

arch/arm/mach-exynos/pm.c +71 -8

122 lines not on this page · raw message

arch/arm/mach-exynos/regs-pmu.h +2 -0
index 7c029ce..2c15a8f 100644
@@ -31,6 +31,8 @@
 #define EXYNOS5440_SWRESET			S5P_PMUREG(0x00C4)
 
 #define S5P_WAKEUP_STAT				S5P_PMUREG(0x0600)
+#define S5P_EINT_WAKEUP_MASK			S5P_PMUREG(0x0604)
+#define S5P_WAKEUP_MASK				S5P_PMUREG(0x0608)
 
 #define S5P_INFORM0				S5P_PMUREG(0x0800)
 #define S5P_INFORM1				S5P_PMUREG(0x0804)
arch/arm/mach-exynos/sleep.S new file +85 -0

85 lines not on this page · raw message

arch/arm/plat-samsung/s5p-sleep.S +0 -45

57 lines not on this page · raw message

Signature · 1 line
1.8.5.2
#12 lore raw

PATCH v2 12/12 ARM: exynos: Allow wake-up using GIC interrupts

In reply to Tomasz Figa

This patch restores the ability to receive wake-up events from internal GIC interrupts, e.g. RTC tick or alarm interrupts.

---
 arch/arm/mach-exynos/pm.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)
arch/arm/mach-exynos/pm.c +53 -0
index ada1c83..15af0ce 100644
@@ -17,6 +17,7 @@
 #include <linux/suspend.h>
 #include <linux/syscore_ops.h>
 #include <linux/io.h>
+#include <linux/irqchip/arm-gic.h>
 #include <linux/err.h>
 #include <linux/clk.h>
 
@@ -35,6 +36,16 @@
 #include "common.h"
 #include "regs-pmu.h"
 
+/**
+ * struct exynos_wkup_irq - Exynos GIC to PMU IRQ mapping
+ * @hwirq: Hardware IRQ signal of the GIC
+ * @mask: Mask in PMU wake-up mask register
+ */
+struct exynos_wkup_irq {
+	unsigned int hwirq;
+	u32 mask;
+};
+
 static struct sleep_save exynos5_sys_save[] = {
 	SAVE_ITEM(EXYNOS5_SYS_I2C_CFG),
 };
@@ -48,8 +59,47 @@ static struct sleep_save exynos_core_save[] = {
 	SAVE_ITEM(S5P_SROM_BC3),
 };
 
+/*
+ * GIC wake-up support
+ */
+
 static u32 exynos_irqwake_intmask = 0xffffffff;
 
+static const struct exynos_wkup_irq exynos4_wkup_irq[] = {
+	{ 76, BIT(1) }, /* RTC alarm */
+	{ 77, BIT(2) }, /* RTC tick */
+	{ /* sentinel */ },
+};
+
+static const struct exynos_wkup_irq exynos5250_wkup_irq[] = {
+	{ 75, BIT(1) }, /* RTC alarm */
+	{ 76, BIT(2) }, /* RTC tick */
+	{ /* sentinel */ },
+};
+
+static int exynos_irq_set_wake(struct irq_data *data, unsigned int state)
+{
+	const struct exynos_wkup_irq *wkup_irq;
+
+	if (soc_is_exynos5250())
+		wkup_irq = exynos5250_wkup_irq;
+	else
+		wkup_irq = exynos4_wkup_irq;
+
+	while (wkup_irq->mask) {
+		if (wkup_irq->hwirq == data->hwirq) {
+			if (!state)
+				exynos_irqwake_intmask |= wkup_irq->mask;
+			else
+				exynos_irqwake_intmask &= ~wkup_irq->mask;
+			return 0;
+		}
+		++wkup_irq;
+	}
+
+	return -ENOENT;
+}
+
 /* For Cortex-A9 Diagnostic and Power control register */
 static unsigned int save_arm_register[2];
 
@@ -258,6 +308,9 @@ void __init exynos_pm_init(void)
 {
 	u32 tmp;
 
+	/* Platform-specific GIC callback */
+	gic_arch_extn.irq_set_wake = exynos_irq_set_wake;
+
 	/* All wakeup disable */
 	tmp = __raw_readl(S5P_WAKEUP_MASK);
 	tmp |= ((0xFF << 8) | (0x1F << 1));
Signature · 1 line
1.8.5.2
#13 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

In reply to Tomasz Figa
Quoted 3 lines · Tomasz Figa

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Has this been reported, and is it being worked on by anyone?

-Olof

#14 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Quoted 7 lines · Olof Johansson
Quoted 3 lines · Tomasz Figa

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Has this been reported, and is it being worked on by anyone?

Yes, reported quite a long time ago by Vikas Sajjan of Samsung/Linaro, but I'm not sure if anybody is working to fix it.

I've been looking into this for a while, but couldn't really find anything except that it hangs when PMU starts power state transtion after CPU executing WFI instruction.

Best regards,
Tomasz

#15 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Tomasz,

Quoted 14 lines · Tomasz Figa
Quoted 9 lines · Olof Johansson
Quoted 3 lines · Tomasz Figa

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Has this been reported, and is it being worked on by anyone?

Quoted 6 lines

Yes, reported quite a long time ago by Vikas Sajjan of Samsung/Linaro, but I'm not sure if anybody is working to fix it.

I've been looking into this for a while, but couldn't really find anything except that it hangs when PMU starts power state transtion after CPU executing WFI instruction.

It's likely it's something else, but just in case I'll point you to a bug that we fixed that had the same symptom. There's some details (and a lot of noise) in <http://crbug.com/218132>. ...or maybe just look at the root cause at <http://crosreview.com/42067>.

-Doug

#16 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Hi Doug,

Quoted 20 lines · Doug Anderson

Tomasz,

Quoted 17 lines · Tomasz Figa
Quoted 9 lines · Olof Johansson
Quoted 3 lines · Tomasz Figa

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Has this been reported, and is it being worked on by anyone?

Yes, reported quite a long time ago by Vikas Sajjan of Samsung/Linaro, but I'm not sure if anybody is working to fix it.

Quoted 8 lines
Quoted 3 lines

I've been looking into this for a while, but couldn't really find anything except that it hangs when PMU starts power state transtion after CPU executing WFI instruction.

It's likely it's something else, but just in case I'll point you to a bug that we fixed that had the same symptom. There's some details (and a lot of noise) in <http://crbug.com/218132>. ...or maybe just look at the root cause at <http://crosreview.com/42067>.

OK. Thanks for pointing me to this. Will do some more tests back at the office after the weekend.

Best regards,
Tomasz

#17 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

In reply to Tomasz Figa
Quoted 73 lines · Tomasz Figa

Current Samsung PM code is heavily unprepared for multiplatform systems. The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any possible quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from mach-, just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms like Exynos.

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and then reimplementing Exynos PM support in a multiplatform-capable way by using those generic parts. The result is that now PM initialization is started from mach-exynos*-dt, which calls Exynos-specific initialization code that registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

  arch/arm/mach-exynos/Kconfig                   |  16 +--
  arch/arm/mach-exynos/Makefile                  |   2 +-
  arch/arm/mach-exynos/common.c                  |   1 +
  arch/arm/mach-exynos/common.h                  |  14 ++
  arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
  arch/arm/mach-exynos/pm.c                      | 172 +++++++++++++++++++------
  arch/arm/mach-exynos/regs-pmu.h                |   2 +
  arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
  arch/arm/mach-s3c64xx/pm.c                     |   1 -
  arch/arm/mach-s5p64x0/pm.c                     |   1 -
  arch/arm/plat-samsung/Makefile                 |   2 +
  arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
  arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
  arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
  arch/arm/plat-samsung/pm-check.c               |   2 +-
  arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
  arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
  arch/arm/plat-samsung/pm.c                     | 146 ---------------------
  arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
  19 files changed, 531 insertions(+), 400 deletions(-)
Quoted 6 lines

delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h create mode 100644 arch/arm/mach-exynos/sleep.S
create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h create mode 100644 arch/arm/plat-samsung/pm-common.c create mode 100644 arch/arm/plat-samsung/pm-debug.c

With patch

[PATCH] ARM: dts: exynos5250-arndale: Keep G3D regulator always on

on Exynos5250-based Arndale board, including suspend to RAM:

Best regards,
Tomasz

#18 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

In reply to Tomasz Figa

Hi Kukjin,

Quoted 73 lines · Tomasz Figa

Current Samsung PM code is heavily unprepared for multiplatform systems. The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any possible quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from mach-, just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms like Exynos.

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and then reimplementing Exynos PM support in a multiplatform-capable way by using those generic parts. The result is that now PM initialization is started from mach-exynos*-dt, which calls Exynos-specific initialization code that registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

  arch/arm/mach-exynos/Kconfig                   |  16 +--
  arch/arm/mach-exynos/Makefile                  |   2 +-
  arch/arm/mach-exynos/common.c                  |   1 +
  arch/arm/mach-exynos/common.h                  |  14 ++
  arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
  arch/arm/mach-exynos/pm.c                      | 172 +++++++++++++++++++------
  arch/arm/mach-exynos/regs-pmu.h                |   2 +
  arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
  arch/arm/mach-s3c64xx/pm.c                     |   1 -
  arch/arm/mach-s5p64x0/pm.c                     |   1 -
  arch/arm/plat-samsung/Makefile                 |   2 +
  arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
  arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
  arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
  arch/arm/plat-samsung/pm-check.c               |   2 +-
  arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
  arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
  arch/arm/plat-samsung/pm.c                     | 146 ---------------------
  arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
  19 files changed, 531 insertions(+), 400 deletions(-)
Quoted 6 lines

delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h create mode 100644 arch/arm/mach-exynos/sleep.S
create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h create mode 100644 arch/arm/plat-samsung/pm-common.c create mode 100644 arch/arm/plat-samsung/pm-debug.c

What do you think about this series?

Best regards,
Tomasz

#19 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Quoted 88 lines · Tomasz Figa

Hi Kukjin,

Quoted 78 lines · Tomasz Figa

Current Samsung PM code is heavily unprepared for multiplatform systems. The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any possible quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from mach-, just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms
like Exynos.

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and then reimplementing Exynos PM support in a multiplatform-capable way by using those generic parts. The result is that now PM initialization is started from mach-exynos*-dt, which calls Exynos-specific initialization code that
registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being
moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

  arch/arm/mach-exynos/Kconfig                   |  16 +--
  arch/arm/mach-exynos/Makefile                  |   2 +-
  arch/arm/mach-exynos/common.c                  |   1 +
  arch/arm/mach-exynos/common.h                  |  14 ++
  arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
  arch/arm/mach-exynos/pm.c                      | 172
+++++++++++++++++++------
  arch/arm/mach-exynos/regs-pmu.h                |   2 +
  arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
  arch/arm/mach-s3c64xx/pm.c                     |   1 -
  arch/arm/mach-s5p64x0/pm.c                     |   1 -
  arch/arm/plat-samsung/Makefile                 |   2 +
  arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
  arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
  arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
  arch/arm/plat-samsung/pm-check.c               |   2 +-
  arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
  arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
  arch/arm/plat-samsung/pm.c                     | 146
---------------------
  arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
  19 files changed, 531 insertions(+), 400 deletions(-)
Quoted 6 lines

delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h create mode 100644 arch/arm/mach-exynos/sleep.S
create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h create mode 100644 arch/arm/plat-samsung/pm-common.c create mode 100644 arch/arm/plat-samsung/pm-debug.c

Quoted 1 line

What do you think about this series?

A subtle ping.

Best regards,
Tomasz

#20 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Quoted 4 lines · Tomasz Figa
Quoted 2 lines · Tomasz Figa

Hi Kukjin,

Hi Tomasz,

Quoted 2 lines
Quoted 2 lines · Tomasz Figa
Quoted 1 line

Current Samsung PM code is heavily unprepared for multiplatform

systems.

Quoted 7 lines
Quoted 4 lines
Quoted 4 lines

The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any

possible

Quoted 2 lines
Quoted 2 lines

quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from

mach-,

Quoted 6 lines
Quoted 6 lines
Quoted 6 lines

just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms
like Exynos.

Quoted 77 lines
Quoted 3 lines
Quoted 3 lines

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and

then

Quoted 1 line
Quoted 1 line

reimplementing Exynos PM support in a multiplatform-capable way by

using

Quoted 1 line
Quoted 1 line

those generic parts. The result is that now PM initialization is

started

Quoted 68 lines
Quoted 60 lines

from mach-exynos*-dt, which calls Exynos-specific initialization code that
registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being
moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

  arch/arm/mach-exynos/Kconfig                   |  16 +--
  arch/arm/mach-exynos/Makefile                  |   2 +-
  arch/arm/mach-exynos/common.c                  |   1 +
  arch/arm/mach-exynos/common.h                  |  14 ++
  arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
  arch/arm/mach-exynos/pm.c                      | 172
+++++++++++++++++++------
  arch/arm/mach-exynos/regs-pmu.h                |   2 +
  arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
  arch/arm/mach-s3c64xx/pm.c                     |   1 -
  arch/arm/mach-s5p64x0/pm.c                     |   1 -
  arch/arm/plat-samsung/Makefile                 |   2 +
  arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
  arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
  arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
  arch/arm/plat-samsung/pm-check.c               |   2 +-
  arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
  arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
  arch/arm/plat-samsung/pm.c                     | 146
---------------------
  arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
  19 files changed, 531 insertions(+), 400 deletions(-)
Quoted 6 lines

delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h create mode 100644 arch/arm/mach-exynos/sleep.S
create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h create mode 100644 arch/arm/plat-samsung/pm-common.c create mode 100644 arch/arm/plat-samsung/pm-debug.c

What do you think about this series?

I'm fine on this whole series and will apply.

Thanks,
Kukjin

#21 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

In reply to Tomasz Figa
Quoted 6 lines · Tomasz Figa
Quoted 4 lines · Tomasz Figa

Hi Kukjin,

Quoted 1 line · Tomasz Figa

Current Samsung PM code is heavily unprepared for multiplatform

systems.

Quoted 7 lines
Quoted 4 lines
Quoted 4 lines

The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any

possible

Quoted 2 lines
Quoted 2 lines

quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from

mach-,

Quoted 6 lines
Quoted 6 lines
Quoted 6 lines

just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms
like Exynos.

Quoted 74 lines
Quoted 3 lines
Quoted 3 lines

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and

then

Quoted 1 line
Quoted 1 line

reimplementing Exynos PM support in a multiplatform-capable way by

using

Quoted 1 line
Quoted 1 line

those generic parts. The result is that now PM initialization is

started

Quoted 66 lines
Quoted 66 lines

from mach-exynos*-dt, which calls Exynos-specific initialization code that
registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being
moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

  arch/arm/mach-exynos/Kconfig                   |  16 +--
  arch/arm/mach-exynos/Makefile                  |   2 +-
  arch/arm/mach-exynos/common.c                  |   1 +
  arch/arm/mach-exynos/common.h                  |  14 ++
  arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
  arch/arm/mach-exynos/pm.c                      | 172
+++++++++++++++++++------
  arch/arm/mach-exynos/regs-pmu.h                |   2 +
  arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
  arch/arm/mach-s3c64xx/pm.c                     |   1 -
  arch/arm/mach-s5p64x0/pm.c                     |   1 -
  arch/arm/plat-samsung/Makefile                 |   2 +
  arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
  arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
  arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
  arch/arm/plat-samsung/pm-check.c               |   2 +-
  arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
  arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
  arch/arm/plat-samsung/pm.c                     | 146
---------------------
  arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
  19 files changed, 531 insertions(+), 400 deletions(-)

delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h create mode 100644 arch/arm/mach-exynos/sleep.S
create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h create mode 100644 arch/arm/plat-samsung/pm-common.c create mode 100644 arch/arm/plat-samsung/pm-debug.c

Hi Tomasz,

Build error happens with s3c6400_defconfig:

In file included from arch/arm/plat-samsung/pm.c:38:0:
arch/arm/mach-s3c64xx/include/mach/pm-core.h: In function 's3c_pm_arch_update_uart':
arch/arm/mach-s3c64xx/include/mach/pm-core.h:64:32: error: 'S3C2410_UCON' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:64:32: note: each undeclared identifier is reported only once for each function it appears in arch/arm/mach-s3c64xx/include/mach/pm-core.h:65:24: error:
'S3C6400_UCON_CLKMASK' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:73:16: error:
'S3C2410_UCON_TXILEVEL' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:73:40: error:
'S3C2410_UCON_RXILEVEL' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:87:18: error:
'S3C6400_UCON_UCLK0' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:89:15: error:
'S3C6400_UCON_PCLK2' undeclared (first use in this function) make[2]: *** [arch/arm/plat-samsung/pm.o] Error 1
make[1]: *** [arch/arm/plat-samsung] Error 2
make[1]: *** Waiting for unfinished jobs....

And with s5p64x0_defconfig:

In file included from arch/arm/plat-samsung/pm.c:38:0:
arch/arm/mach-s5p64x0/include/mach/pm-core.h: In function 's3c_pm_arch_update_uart':
arch/arm/mach-s5p64x0/include/mach/pm-core.h:57:32: error: 'S3C2410_UCON' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:57:32: note: each undeclared identifier is reported only once for each function it appears in arch/arm/mach-s5p64x0/include/mach/pm-core.h:58:24: error:
'S3C6400_UCON_CLKMASK' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:68:16: error:
'S3C2410_UCON_TXILEVEL' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:68:40: error:
'S3C2410_UCON_RXILEVEL' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:85:18: error:
'S3C6400_UCON_UCLK0' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:87:11: error:
'S3C6400_UCON_PCLK2' undeclared (first use in this function) make[2]: *** [arch/arm/plat-samsung/pm.o] Error 1
make[2]: *** Waiting for unfinished jobs....
CC arch/arm/mach-s5p64x0/setup-sdhci-gpio.o
CC fs/char_dev.o
make[1]: *** [arch/arm/plat-samsung] Error 2
make[1]: *** Waiting for unfinished jobs....

Please see the 'v3.15-next/s2r-pm-samsung-2' branch.

- Kukjin

#22 lore raw

v2 cover Samsung PM consolidation part 2 (multiplatform)

Hi Kukjin,

Quoted 148 lines · Kukjin Kim
Quoted 6 lines · Tomasz Figa
Quoted 4 lines · Tomasz Figa

Hi Kukjin,

Quoted 1 line · Tomasz Figa

Current Samsung PM code is heavily unprepared for multiplatform

systems.

Quoted 7 lines
Quoted 4 lines
Quoted 4 lines

The design implies accessing functions and global variables defined in particular mach- subdirectory from common code in plat-, which is not allowed when building ARCH_MULTIPLATFORM. In addition there is a lot of forced code unification, which makes common function handle any

possible

Quoted 2 lines
Quoted 2 lines

quirks of all supported SoCs. In the end this design turned out to not work too well, ending with a lot of empty functions exported from

mach-,

Quoted 6 lines
Quoted 6 lines
Quoted 6 lines

just because code in common pm.c calls them. Moreover, recent trend of moving lower level suspend/resume code to proper drivers, like pinctrl or clk, made a lot of code there redundant, especially on DT-only platforms
like Exynos.

Quoted 74 lines
Quoted 3 lines
Quoted 3 lines

This patch series attempts to untie Exynos PM support from the legacy Samsung PM core and make it multiplatform-aware, by isolating truly generic parts of the latter, making them multiplatform-friendly and

then

Quoted 1 line
Quoted 1 line

reimplementing Exynos PM support in a multiplatform-capable way by

using

Quoted 1 line
Quoted 1 line

those generic parts. The result is that now PM initialization is

started

Quoted 66 lines
Quoted 66 lines

from mach-exynos*-dt, which calls Exynos-specific initialization code that
registers platform_suspend_ops, so control flow is basically reversed ending with mach- code calling more generic plat- code if needed.

This is limited to Exynos right now, but remaining SoCs could follow in further series.

Depends on Samsung PM consolidation part 1 (clocks) series:
- http://thread.gmane.org/gmane.linux.kernel.samsung-soc/26816

On Exynos4210-based Trats, Exynos4412-based Trats2 and Exynos5250-based Arndale boards (except suspend/resume, which is broken because of unrelated reasons):

Changes since v1 (RFC):
- fixed l2x0 resume,
- fixed checkpatch complaints (about issues in existing code being
moved),
- rebased on top of current linux-next,
- slightly reordered patches to make the order more logical.

Tomasz Figa (12):
ARM: EXYNOS: Do not resume l2x0 if not enabled before suspend
ARM: SAMSUNG: Add soc_is_s3c2410() helper
ARM: SAMSUNG: pm: Save UART DIVSLOT register based on SoC type
ARM: SAMSUNG: pm: Use debug_ll_addr() to get UART base address
ARM: SAMSUNG: pm: Consolidate PM debug functions
ARM: SAMSUNG: pm: Move Samsung PM debug code into separate file
ARM: SAMSUNG: Move common save/restore helpers to separate file
ARM: SAMSUNG: pm: Move s3c_pm_check_* prototypes to plat/pm-common.h
ARM: EXYNOS: Kconfig: Fix abuse of CONFIG_PM
ARM: EXYNOS: Remove PM initcalls and useless indirection
ARM: EXYNOS: Stop using legacy Samsung PM code
ARM: exynos: Allow wake-up using GIC interrupts

   arch/arm/mach-exynos/Kconfig                   |  16 +--
   arch/arm/mach-exynos/Makefile                  |   2 +-
   arch/arm/mach-exynos/common.c                  |   1 +
   arch/arm/mach-exynos/common.h                  |  14 ++
   arch/arm/mach-exynos/include/mach/pm-core.h    |  75 -----------
   arch/arm/mach-exynos/pm.c                      | 172
+++++++++++++++++++------
   arch/arm/mach-exynos/regs-pmu.h                |   2 +
   arch/arm/mach-exynos/sleep.S                   |  85 ++++++++++++
   arch/arm/mach-s3c64xx/pm.c                     |   1 -
   arch/arm/mach-s5p64x0/pm.c                     |   1 -
   arch/arm/plat-samsung/Makefile                 |   2 +
   arch/arm/plat-samsung/include/plat/cpu.h       |   6 +
   arch/arm/plat-samsung/include/plat/pm-common.h | 110 ++++++++++++++++
   arch/arm/plat-samsung/include/plat/pm.h        |  80 +-----------
   arch/arm/plat-samsung/pm-check.c               |   2 +-
   arch/arm/plat-samsung/pm-common.c              |  75 +++++++++++
   arch/arm/plat-samsung/pm-debug.c               |  98 ++++++++++++++
   arch/arm/plat-samsung/pm.c                     | 146
---------------------
   arch/arm/plat-samsung/s5p-sleep.S              |  43 -------
   19 files changed, 531 insertions(+), 400 deletions(-)

delete mode 100644 arch/arm/mach-exynos/include/mach/pm-core.h create mode 100644 arch/arm/mach-exynos/sleep.S
create mode 100644 arch/arm/plat-samsung/include/plat/pm-common.h create mode 100644 arch/arm/plat-samsung/pm-common.c create mode 100644 arch/arm/plat-samsung/pm-debug.c

Hi Tomasz,

Build error happens with s3c6400_defconfig:

In file included from arch/arm/plat-samsung/pm.c:38:0:
arch/arm/mach-s3c64xx/include/mach/pm-core.h: In function 's3c_pm_arch_update_uart':
arch/arm/mach-s3c64xx/include/mach/pm-core.h:64:32: error: 'S3C2410_UCON' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:64:32: note: each undeclared identifier is reported only once for each function it appears in arch/arm/mach-s3c64xx/include/mach/pm-core.h:65:24: error:
'S3C6400_UCON_CLKMASK' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:73:16: error:
'S3C2410_UCON_TXILEVEL' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:73:40: error:
'S3C2410_UCON_RXILEVEL' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:87:18: error:
'S3C6400_UCON_UCLK0' undeclared (first use in this function) arch/arm/mach-s3c64xx/include/mach/pm-core.h:89:15: error:
'S3C6400_UCON_PCLK2' undeclared (first use in this function) make[2]: *** [arch/arm/plat-samsung/pm.o] Error 1
make[1]: *** [arch/arm/plat-samsung] Error 2
make[1]: *** Waiting for unfinished jobs....

And with s5p64x0_defconfig:

In file included from arch/arm/plat-samsung/pm.c:38:0:
arch/arm/mach-s5p64x0/include/mach/pm-core.h: In function 's3c_pm_arch_update_uart':
arch/arm/mach-s5p64x0/include/mach/pm-core.h:57:32: error: 'S3C2410_UCON' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:57:32: note: each undeclared identifier is reported only once for each function it appears in arch/arm/mach-s5p64x0/include/mach/pm-core.h:58:24: error:
'S3C6400_UCON_CLKMASK' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:68:16: error:
'S3C2410_UCON_TXILEVEL' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:68:40: error:
'S3C2410_UCON_RXILEVEL' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:85:18: error:
'S3C6400_UCON_UCLK0' undeclared (first use in this function) arch/arm/mach-s5p64x0/include/mach/pm-core.h:87:11: error:
'S3C6400_UCON_PCLK2' undeclared (first use in this function) make[2]: *** [arch/arm/plat-samsung/pm.o] Error 1
make[2]: *** Waiting for unfinished jobs....
CC arch/arm/mach-s5p64x0/setup-sdhci-gpio.o
CC fs/char_dev.o
make[1]: *** [arch/arm/plat-samsung] Error 2
make[1]: *** Waiting for unfinished jobs....

Quoted 1 line

Please see the 'v3.15-next/s2r-pm-samsung-2' branch.

I've sent a series of fixup patches:

http://www.spinics.net/lists/arm-kernel/msg316390.html

Compile tested on s3c24xx, s3c64xx, s5p64x0, s5pv210 and exynos with and without CONFIG_PM_SLEEP.

Best regards,
Tomasz