Skip to contentSkip to conversation

ARM: davinci: enable PM for DT boot

PATCH New Kevin Hilman 2 participants 7 messages Oct 25, 2016 – Nov 14, 2016

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

PATCH 1/1 ARM: davinci: enable PM for DT boot

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +18 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
+
+	ret = da850_register_pm(&da850_pm_device);
+	if (ret)
+		pr_warn("%s: suspend registration failed: %d\n", __func__, ret);
+
 	of_platform_default_populate(NULL, da850_auxdata_lookup, NULL);
 }
 
Signature · 1 line
2.9.3
#1 lore raw

PATCH 1/1 ARM: davinci: enable PM for DT boot

Hi Kevin,

Quoted 25 lines · Kevin Hilman

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +7 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {

arch/arm/mach-davinci/da8xx-dt.c static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = { · line 62

Quoted 10 lines
arch/arm/mach-davinci/da8xx-dt.c +8 -0
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
+
+	ret = da850_register_pm(&da850_pm_device);

I am not sure if it makes sense to keep the "pm device" around anymore. I think for both DT and non-DT boot, we can get rid of the fake PM device and combine da850_register_pm() and davinci_pm_probe() into a single davinci_init_suspend() function which can then be called both for DT and non-DT boot.

This was we can also avoid replication of the platform data and platform device structures.

Thanks,
Sekhar

#2 lore raw

PATCH 1/1 ARM: davinci: enable PM for DT boot

Quoted 45 lines · Sekhar Nori

Hi Kevin,

Quoted 25 lines · Kevin Hilman

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +7 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {

arch/arm/mach-davinci/da8xx-dt.c static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = { · line 62

Quoted 10 lines
arch/arm/mach-davinci/da8xx-dt.c +8 -0
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
+
+	ret = da850_register_pm(&da850_pm_device);

I am not sure if it makes sense to keep the "pm device" around anymore. I think for both DT and non-DT boot, we can get rid of the fake PM device and combine da850_register_pm() and davinci_pm_probe() into a single davinci_init_suspend() function which can then be called both for DT and non-DT boot.

Quoted 2 lines

This was we can also avoid replication of the platform data and platform device structures.

Great, that sounds much cleaner. Will re-spin.

Kevin

#3 lore raw

PATCH 1/1 ARM: davinci: enable PM for DT boot

In reply to Sekhar Nori

Hi Sekhar,

Quoted 34 lines · Sekhar Nori
Quoted 33 lines · Kevin Hilman

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +13 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
Quoted 8 lines

arch/arm/mach-davinci/da8xx-dt.c static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = { · line 62

Quoted 2 lines
arch/arm/mach-davinci/da8xx-dt.c +2 -0
+
+	ret = da850_register_pm(&da850_pm_device);

I am not sure if it makes sense to keep the "pm device" around anymore. I think for both DT and non-DT boot, we can get rid of the fake PM device and combine da850_register_pm() and davinci_pm_probe() into a single davinci_init_suspend() function which can then be called both for DT and non-DT boot.

Looking closer at this, where do you propose the pdata comes from for the non-DT boot?

It seems to me that we can't currently remove the pdata dependency without breaking the non-DT platforms, so the approach proposed here is the least invasive.

Once other platforms are DT converted, we could clean this up a bit more.

Kevin

#4 lore raw

PATCH 1/1 ARM: davinci: enable PM for DT boot

Quoted 47 lines · Kevin Hilman

Hi Sekhar,

Quoted 34 lines · Sekhar Nori
Quoted 33 lines · Kevin Hilman

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +13 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
Quoted 8 lines

arch/arm/mach-davinci/da8xx-dt.c static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = { · line 62

Quoted 2 lines
arch/arm/mach-davinci/da8xx-dt.c +2 -0
+
+	ret = da850_register_pm(&da850_pm_device);

I am not sure if it makes sense to keep the "pm device" around anymore. I think for both DT and non-DT boot, we can get rid of the fake PM device and combine da850_register_pm() and davinci_pm_probe() into a single davinci_init_suspend() function which can then be called both for DT and non-DT boot.

Quoted 6 lines

Looking closer at this, where do you propose the pdata comes from for the non-DT boot?

It seems to me that we can't currently remove the pdata dependency without breaking the non-DT platforms, so the approach proposed here is the least invasive.

There is a single value of sleep count that is used today (128). So I was thinking we can hardcode that in pm.c. We are not going to add more board files anyway so there is no risk here.

For future, if a different sleepcount value is needed, it will need to be a new DT property.

Thanks,
Sekhar

#5 lore raw

PATCH 1/1 ARM: davinci: enable PM for DT boot

Quoted 55 lines · Sekhar Nori
Quoted 47 lines · Kevin Hilman

Hi Sekhar,

Quoted 34 lines · Sekhar Nori
Quoted 33 lines · Kevin Hilman

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +13 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
Quoted 8 lines

arch/arm/mach-davinci/da8xx-dt.c static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = { · line 62

Quoted 2 lines
arch/arm/mach-davinci/da8xx-dt.c +2 -0
+
+	ret = da850_register_pm(&da850_pm_device);

I am not sure if it makes sense to keep the "pm device" around anymore. I think for both DT and non-DT boot, we can get rid of the fake PM device and combine da850_register_pm() and davinci_pm_probe() into a single davinci_init_suspend() function which can then be called both for DT and non-DT boot.

Quoted 6 lines

Looking closer at this, where do you propose the pdata comes from for the non-DT boot?

It seems to me that we can't currently remove the pdata dependency without breaking the non-DT platforms, so the approach proposed here is the least invasive.

Quoted 6 lines

There is a single value of sleep count that is used today (128). So I was thinking we can hardcode that in pm.c. We are not going to add more board files anyway so there is no risk here.

For future, if a different sleepcount value is needed, it will need to be a new DT property.

Right, but getting rid of the pdata is more than just hard-coding the sleep count. There are a bunch of other fields in the pdata, which are filled out to some standard defaults in da850.c. Are you proposing to hard-code those in pm.c also?

An intermediate step might be to start by removing the platform_device/pdata from the board files, but keep it in da850.c for now. Then, a follow-up cleanup could be done to either move all of that into pm.c, or use DT.

Kevin

#6 lore raw

PATCH 1/1 ARM: davinci: enable PM for DT boot

Quoted 61 lines · Kevin Hilman
Quoted 59 lines · Sekhar Nori
Quoted 47 lines · Kevin Hilman

Hi Sekhar,

Quoted 34 lines · Sekhar Nori
Quoted 33 lines · Kevin Hilman

Currently system PM is only enabled for legacy (non-DT) boot. Enable for DT boot also.

Tested on da850-lcdk using "rtcwake -m mem -s5 -d rtc0".

---
 arch/arm/mach-davinci/da8xx-dt.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
arch/arm/mach-davinci/da8xx-dt.c +13 -0
index c9f7e9274aa8..a8089fa40d86 100644
@@ -43,8 +43,26 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 
 #ifdef CONFIG_ARCH_DAVINCI_DA850
 
+static struct davinci_pm_config da850_pm_pdata = {
+	.sleepcount = 128,
+};
+
+static struct platform_device da850_pm_device = {
+	.name           = "pm-davinci",
+	.dev = {
+		.platform_data	= &da850_pm_pdata,
+	},
+	.id             = -1,
+};
+
 static void __init da850_init_machine(void)
 {
+	int ret;
Quoted 8 lines

arch/arm/mach-davinci/da8xx-dt.c static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = { · line 62

Quoted 2 lines
arch/arm/mach-davinci/da8xx-dt.c +2 -0
+
+	ret = da850_register_pm(&da850_pm_device);

I am not sure if it makes sense to keep the "pm device" around anymore. I think for both DT and non-DT boot, we can get rid of the fake PM device and combine da850_register_pm() and davinci_pm_probe() into a single davinci_init_suspend() function which can then be called both for DT and non-DT boot.

Quoted 6 lines

Looking closer at this, where do you propose the pdata comes from for the non-DT boot?

It seems to me that we can't currently remove the pdata dependency without breaking the non-DT platforms, so the approach proposed here is the least invasive.

There is a single value of sleep count that is used today (128). So I was thinking we can hardcode that in pm.c. We are not going to add more board files anyway so there is no risk here.

Quoted 7 lines
Quoted 2 lines

For future, if a different sleepcount value is needed, it will need to be a new DT property.

Right, but getting rid of the pdata is more than just hard-coding the sleep count. There are a bunch of other fields in the pdata, which are filled out to some standard defaults in da850.c. Are you proposing to hard-code those in pm.c also?

Yeah. When I wrote the code for pm.c, I wrote it hoping that it can be used on other davinci devices too. But since then, no other DaVinci device has gained PM support. DM365 could support PM, but its not supported even on TI's internal releases.

Even if in future PM does get supported on DM365, platform data will not be used for sure. And besides, the sequence in sleep.S has only ever been tested on DA850 and pretty sure will need some tweaks for running on DM365.

Quoted 5 lines

An intermediate step might be to start by removing the platform_device/pdata from the board files, but keep it in da850.c for now. Then, a follow-up cleanup could be done to either move all of that into pm.c, or use DT.

I think keeping it in pm.c is fine. We could have called pm.c da850-pm.c but thats not really required I guess since thats the only device in mach-davinci which supports suspend-to-RAM anyway.

Thanks,
Sekhar