Skip to content

Commit

Permalink
ARM: at91: pm: rework cpu detection
Browse files Browse the repository at this point in the history
Store SoC differences in a struct to remove cpu_is_* usage.

Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
  • Loading branch information
Alexandre Belloni authored and Nicolas Ferre committed Jan 16, 2015
1 parent eca6f17 commit f5598d3
Showing 1 changed file with 33 additions and 21 deletions.
54 changes: 33 additions & 21 deletions arch/arm/mach-at91/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/sysfs.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/clk/at91_pmc.h>
Expand All @@ -32,6 +33,11 @@
#include "generic.h"
#include "pm.h"

static struct {
unsigned long uhp_udp_mask;
int memctrl;
} at91_pm_data;

static void (*at91_pm_standby)(void);

static int at91_pm_valid_state(suspend_state_t state)
Expand Down Expand Up @@ -71,17 +77,9 @@ static int at91_pm_verify_clocks(void)
scsr = at91_pmc_read(AT91_PMC_SCSR);

/* USB must not be using PLLB */
if (cpu_is_at91rm9200()) {
if ((scsr & (AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP)) != 0) {
pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
return 0;
}
} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263()
|| cpu_is_at91sam9g20() || cpu_is_at91sam9g10()) {
if ((scsr & (AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP)) != 0) {
pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
return 0;
}
if ((scsr & at91_pm_data.uhp_udp_mask) != 0) {
pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
return 0;
}

/* PCK0..PCK3 must be disabled, or configured to use clk32k */
Expand Down Expand Up @@ -149,18 +147,13 @@ static int at91_pm_enter(suspend_state_t state)
* turning off the main oscillator; reverse on wakeup.
*/
if (slow_clock) {
int memctrl = AT91_MEMCTRL_SDRAMC;

if (cpu_is_at91rm9200())
memctrl = AT91_MEMCTRL_MC;
else if (cpu_is_at91sam9g45())
memctrl = AT91_MEMCTRL_DDRSDR;
#ifdef CONFIG_AT91_SLOW_CLOCK
/* copy slow_clock handler to SRAM, and call it */
memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz);
#endif
slow_clock(at91_pmc_base, at91_ramc_base[0],
at91_ramc_base[1], memctrl);
at91_ramc_base[1],
at91_pm_data.memctrl);
break;
} else {
pr_info("AT91: PM - no slow clock mode enabled ...\n");
Expand Down Expand Up @@ -237,10 +230,29 @@ static int __init at91_pm_init(void)

pr_info("AT91: Power Management%s\n", (slow_clock ? " (with slow clock mode)" : ""));

/* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */
if (cpu_is_at91rm9200())
at91_pm_data.memctrl = AT91_MEMCTRL_SDRAMC;

if (of_machine_is_compatible("atmel,at91rm9200")) {
/*
* AT91RM9200 SDRAM low-power mode cannot be used with
* self-refresh.
*/
at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);


at91_pm_data.uhp_udp_mask = AT91RM9200_PMC_UHP |
AT91RM9200_PMC_UDP;
at91_pm_data.memctrl = AT91_MEMCTRL_MC;
} else if (of_machine_is_compatible("atmel,at91sam9260") ||
of_machine_is_compatible("atmel,at91sam9g20") ||
of_machine_is_compatible("atmel,at91sam9261") ||
of_machine_is_compatible("atmel,at91sam9g10") ||
of_machine_is_compatible("atmel,at91sam9263")) {
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP |
AT91SAM926x_PMC_UDP;
} else if (of_machine_is_compatible("atmel,at91sam9g45")) {
at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
}

if (at91_cpuidle_device.dev.platform_data)
platform_device_register(&at91_cpuidle_device);

Expand Down

0 comments on commit f5598d3

Please sign in to comment.