diff mbox

[RFC,5/9] soc: samsung: pm: Add support for suspend-to-ram of Exynos5433

Message ID 1515484746-10656-6-git-send-email-cw00.choi@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Chanwoo Choi Jan. 9, 2018, 7:59 a.m. UTC
This patch adds the specific exynos_pm_data instance for Exynos5433
in order to support the suspend-to-ram. Exynos5433 SoC need to write
the 'cpu_resume' poiter address and the specific magic number
for suspend mode.

Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
 drivers/soc/samsung/exynos-pm.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

--
1.9.1

Comments

Krzysztof Kozlowski Jan. 9, 2018, 12:45 p.m. UTC | #1
On Tue, Jan 9, 2018 at 8:59 AM, Chanwoo Choi <cw00.choi@samsung.com> wrote:
> This patch adds the specific exynos_pm_data instance for Exynos5433
> in order to support the suspend-to-ram. Exynos5433 SoC need to write
> the 'cpu_resume' poiter address and the specific magic number
> for suspend mode.
>
> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
> ---
>  drivers/soc/samsung/exynos-pm.c | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>
> diff --git a/drivers/soc/samsung/exynos-pm.c b/drivers/soc/samsung/exynos-pm.c
> index 45d84bbe5e61..70d949ba5cab 100644
> --- a/drivers/soc/samsung/exynos-pm.c
> +++ b/drivers/soc/samsung/exynos-pm.c
> @@ -12,6 +12,7 @@
>  #include <linux/regulator/machine.h>
>  #include <linux/syscore_ops.h>
>  #include <linux/suspend.h>
> +#include <linux/psci.h>
>
>  #include <asm/cpuidle.h>
>  #include <asm/io.h>
> @@ -123,7 +124,44 @@ static void exynos_pm_finish(void)
>  #define exynos_pm_data_arm_ptr(data)   NULL
>  #endif
>
> +static int exynos5433_pm_suspend(unsigned long unused)
> +{
> +       /*
> +        * Exynos5433 uses PSCI v0.1 which provides the only one
> +        * entry point (psci_ops.cpu_suspend) for both cpuidle and
> +        * suspend-to-RAM. Also, PSCI v0.1 needs the specific 'power_state'
> +        * parameter for the suspend mode. In order to enter suspend mode,
> +        * Exynos5433 calls the 'psci_ops.cpu_suspend' with '0x3010000'
> +        * power_state parameter.
> +        *
> +        * '0x3010000' means that both cluster and system are going to enter
> +        * the power-down state as following:
> +        * - [25:24] 0x3 : Indicate the cluster and system.
> +        * - [16]    0x1 : Indicate power-down state.

Define them, it will be more readable (name of define given just as an example):

EXYNOS5433_PCSI_SUSPEND_SYSTEM (0x3 << 24)
(or even split per system and cluser and use BIT() if this is real meaning)
and probably reuse existing S5P_CENTRAL_LOWPWR_CFG

> +        */
> +       return psci_ops.cpu_suspend(0x3010000, __pa_symbol(cpu_resume));
> +}
> +
> +static int exynos5433_pm_suspend_enter(suspend_state_t state)
> +{
> +       if (!sysram_ns_base_addr)
> +               return -EINVAL;
> +
> +       __raw_writel(virt_to_phys(cpu_resume), sysram_ns_base_addr + 0x8);
> +       __raw_writel(EXYNOS_SLEEP_MAGIC, sysram_ns_base_addr + 0xc);

Document them in Documentation/arm/Samsung/Bootloader-interface.txt.

Best regards,
Krzysztof

> +
> +       return cpu_suspend(0, exynos5433_pm_suspend);
> +}
> +
> +const struct exynos_pm_data exynos5433_pm_data = {
> +       .enter          = exynos5433_pm_suspend_enter,
> +};
> +
>  static const struct of_device_id exynos_pm_of_device_ids[] = {
> +       {
> +               .compatible = "samsung,exynos5433-pmu",
> +               .data = exynos_pm_data_arm_ptr(exynos5433_pm_data),
> +       },
>         { /*sentinel*/ },
>  };
>
> --
> 1.9.1
>
Chanwoo Choi Jan. 11, 2018, 5:40 a.m. UTC | #2
On 2018년 01월 09일 21:45, Krzysztof Kozlowski wrote:
> On Tue, Jan 9, 2018 at 8:59 AM, Chanwoo Choi <cw00.choi@samsung.com> wrote:
>> This patch adds the specific exynos_pm_data instance for Exynos5433
>> in order to support the suspend-to-ram. Exynos5433 SoC need to write
>> the 'cpu_resume' poiter address and the specific magic number
>> for suspend mode.
>>
>> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
>> ---
>>  drivers/soc/samsung/exynos-pm.c | 38 ++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 38 insertions(+)
>>
>> diff --git a/drivers/soc/samsung/exynos-pm.c b/drivers/soc/samsung/exynos-pm.c
>> index 45d84bbe5e61..70d949ba5cab 100644
>> --- a/drivers/soc/samsung/exynos-pm.c
>> +++ b/drivers/soc/samsung/exynos-pm.c
>> @@ -12,6 +12,7 @@
>>  #include <linux/regulator/machine.h>
>>  #include <linux/syscore_ops.h>
>>  #include <linux/suspend.h>
>> +#include <linux/psci.h>
>>
>>  #include <asm/cpuidle.h>
>>  #include <asm/io.h>
>> @@ -123,7 +124,44 @@ static void exynos_pm_finish(void)
>>  #define exynos_pm_data_arm_ptr(data)   NULL
>>  #endif
>>
>> +static int exynos5433_pm_suspend(unsigned long unused)
>> +{
>> +       /*
>> +        * Exynos5433 uses PSCI v0.1 which provides the only one
>> +        * entry point (psci_ops.cpu_suspend) for both cpuidle and
>> +        * suspend-to-RAM. Also, PSCI v0.1 needs the specific 'power_state'
>> +        * parameter for the suspend mode. In order to enter suspend mode,
>> +        * Exynos5433 calls the 'psci_ops.cpu_suspend' with '0x3010000'
>> +        * power_state parameter.
>> +        *
>> +        * '0x3010000' means that both cluster and system are going to enter
>> +        * the power-down state as following:
>> +        * - [25:24] 0x3 : Indicate the cluster and system.
>> +        * - [16]    0x1 : Indicate power-down state.
> 
> Define them, it will be more readable (name of define given just as an example):
> 
> EXYNOS5433_PCSI_SUSPEND_SYSTEM (0x3 << 24)
> (or even split per system and cluser and use BIT() if this is real meaning)
> and probably reuse existing S5P_CENTRAL_LOWPWR_CFG

OK. I'll define it as the constant.

> 
>> +        */
>> +       return psci_ops.cpu_suspend(0x3010000, __pa_symbol(cpu_resume));
>> +}
>> +
>> +static int exynos5433_pm_suspend_enter(suspend_state_t state)
>> +{
>> +       if (!sysram_ns_base_addr)
>> +               return -EINVAL;
>> +
>> +       __raw_writel(virt_to_phys(cpu_resume), sysram_ns_base_addr + 0x8);
>> +       __raw_writel(EXYNOS_SLEEP_MAGIC, sysram_ns_base_addr + 0xc);
> 
> Document them in Documentation/arm/Samsung/Bootloader-interface.txt.

OK.

> 
> Best regards,
> Krzysztof
> 
>> +
>> +       return cpu_suspend(0, exynos5433_pm_suspend);
>> +}
>> +
>> +const struct exynos_pm_data exynos5433_pm_data = {
>> +       .enter          = exynos5433_pm_suspend_enter,
>> +};
>> +
>>  static const struct of_device_id exynos_pm_of_device_ids[] = {
>> +       {
>> +               .compatible = "samsung,exynos5433-pmu",
>> +               .data = exynos_pm_data_arm_ptr(exynos5433_pm_data),
>> +       },
>>         { /*sentinel*/ },
>>  };
>>
>> --
>> 1.9.1
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
>
diff mbox

Patch

diff --git a/drivers/soc/samsung/exynos-pm.c b/drivers/soc/samsung/exynos-pm.c
index 45d84bbe5e61..70d949ba5cab 100644
--- a/drivers/soc/samsung/exynos-pm.c
+++ b/drivers/soc/samsung/exynos-pm.c
@@ -12,6 +12,7 @@ 
 #include <linux/regulator/machine.h>
 #include <linux/syscore_ops.h>
 #include <linux/suspend.h>
+#include <linux/psci.h>

 #include <asm/cpuidle.h>
 #include <asm/io.h>
@@ -123,7 +124,44 @@  static void exynos_pm_finish(void)
 #define exynos_pm_data_arm_ptr(data)	NULL
 #endif

+static int exynos5433_pm_suspend(unsigned long unused)
+{
+	/*
+	 * Exynos5433 uses PSCI v0.1 which provides the only one
+	 * entry point (psci_ops.cpu_suspend) for both cpuidle and
+	 * suspend-to-RAM. Also, PSCI v0.1 needs the specific 'power_state'
+	 * parameter for the suspend mode. In order to enter suspend mode,
+	 * Exynos5433 calls the 'psci_ops.cpu_suspend' with '0x3010000'
+	 * power_state parameter.
+	 *
+	 * '0x3010000' means that both cluster and system are going to enter
+	 * the power-down state as following:
+	 * - [25:24] 0x3 : Indicate the cluster and system.
+	 * - [16]    0x1 : Indicate power-down state.
+	 */
+	return psci_ops.cpu_suspend(0x3010000, __pa_symbol(cpu_resume));
+}
+
+static int exynos5433_pm_suspend_enter(suspend_state_t state)
+{
+	if (!sysram_ns_base_addr)
+		return -EINVAL;
+
+	__raw_writel(virt_to_phys(cpu_resume), sysram_ns_base_addr + 0x8);
+	__raw_writel(EXYNOS_SLEEP_MAGIC, sysram_ns_base_addr + 0xc);
+
+	return cpu_suspend(0, exynos5433_pm_suspend);
+}
+
+const struct exynos_pm_data exynos5433_pm_data = {
+	.enter		= exynos5433_pm_suspend_enter,
+};
+
 static const struct of_device_id exynos_pm_of_device_ids[] = {
+	{
+		.compatible = "samsung,exynos5433-pmu",
+		.data = exynos_pm_data_arm_ptr(exynos5433_pm_data),
+	},
 	{ /*sentinel*/ },
 };