Skip to content

Commit

Permalink
gpio: omap: Remove custom PM calls and use cpu_pm instead
Browse files Browse the repository at this point in the history
For a long time the gpio-omap custom PM calls have been annoying me so
let's replace them with cpu_pm instead. This will enable GPIO PM for
deeper idle states on omap4. And we can handle GPIO PM for omap2/3/4
in the same way.

Note that with this patch we are also slightly changing GPIO PM to be
less aggressive for omap3 and only will idle GPIO when PER context
may be lost.

For omap2, we don't need to save context and don't want to remove any
triggering so let's add a quirk flag for that.

Let's do this all in a single patch to avoid a situation where old
custom calls still are used with new code.

Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
Cc: Keerthy <j-keerthy@ti.com>
Cc: Ladislav Michl <ladis@linux-mips.org>
Cc: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Acked-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
tmlind authored and linusw committed Sep 24, 2018
1 parent ec0daae commit b764a58
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 96 deletions.
7 changes: 3 additions & 4 deletions arch/arm/mach-omap2/pm24xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
* published by the Free Software Foundation.
*/

#include <linux/cpu_pm.h>
#include <linux/suspend.h>
#include <linux/sched.h>
#include <linux/proc_fs.h>
Expand All @@ -29,8 +30,6 @@
#include <linux/clk-provider.h>
#include <linux/irq.h>
#include <linux/time.h>
#include <linux/gpio.h>
#include <linux/platform_data/gpio-omap.h>

#include <asm/fncpy.h>

Expand Down Expand Up @@ -87,7 +86,7 @@ static int omap2_enter_full_retention(void)
l = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0) | OMAP24XX_USBSTANDBYCTRL;
omap_ctrl_writel(l, OMAP2_CONTROL_DEVCONF0);

omap2_gpio_prepare_for_idle(0);
cpu_cluster_pm_enter();

/* One last check for pending IRQs to avoid extra latency due
* to sleeping unnecessarily. */
Expand All @@ -100,7 +99,7 @@ static int omap2_enter_full_retention(void)
OMAP_SDRC_REGADDR(SDRC_POWER));

no_sleep:
omap2_gpio_resume_after_idle();
cpu_cluster_pm_exit();

clk_enable(osc_ck);

Expand Down
14 changes: 5 additions & 9 deletions arch/arm/mach-omap2/pm34xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,18 @@
* published by the Free Software Foundation.
*/

#include <linux/cpu_pm.h>
#include <linux/pm.h>
#include <linux/suspend.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/list.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/omap-dma.h>
#include <linux/omap-gpmc.h>
#include <linux/platform_data/gpio-omap.h>

#include <trace/events/power.h>

Expand Down Expand Up @@ -197,7 +196,6 @@ void omap_sram_idle(void)
int mpu_next_state = PWRDM_POWER_ON;
int per_next_state = PWRDM_POWER_ON;
int core_next_state = PWRDM_POWER_ON;
int per_going_off;
u32 sdrc_pwr = 0;

mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm);
Expand Down Expand Up @@ -227,10 +225,8 @@ void omap_sram_idle(void)
pwrdm_pre_transition(NULL);

/* PER */
if (per_next_state < PWRDM_POWER_ON) {
per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;
omap2_gpio_prepare_for_idle(per_going_off);
}
if (per_next_state == PWRDM_POWER_OFF)
cpu_cluster_pm_enter();

/* CORE */
if (core_next_state < PWRDM_POWER_ON) {
Expand Down Expand Up @@ -295,8 +291,8 @@ void omap_sram_idle(void)
pwrdm_post_transition(NULL);

/* PER */
if (per_next_state < PWRDM_POWER_ON)
omap2_gpio_resume_after_idle();
if (per_next_state == PWRDM_POWER_OFF)
cpu_cluster_pm_exit();
}

static void omap3_pm_idle(void)
Expand Down
Loading

0 comments on commit b764a58

Please sign in to comment.