Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5598d34 authored by Alexandre Belloni's avatar Alexandre Belloni Committed by Nicolas Ferre
Browse files

ARM: at91: pm: rework cpu detection



Store SoC differences in a struct to remove cpu_is_* usage.

Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
parent eca6f172
Loading
Loading
Loading
Loading
+33 −21
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/sysfs.h>
#include <linux/sysfs.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/io.h>
#include <linux/clk/at91_pmc.h>
#include <linux/clk/at91_pmc.h>
@@ -32,6 +33,11 @@
#include "generic.h"
#include "generic.h"
#include "pm.h"
#include "pm.h"


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

static void (*at91_pm_standby)(void);
static void (*at91_pm_standby)(void);


static int at91_pm_valid_state(suspend_state_t state)
static int at91_pm_valid_state(suspend_state_t state)
@@ -71,18 +77,10 @@ static int at91_pm_verify_clocks(void)
	scsr = at91_pmc_read(AT91_PMC_SCSR);
	scsr = at91_pmc_read(AT91_PMC_SCSR);


	/* USB must not be using PLLB */
	/* USB must not be using PLLB */
	if (cpu_is_at91rm9200()) {
	if ((scsr & at91_pm_data.uhp_udp_mask) != 0) {
		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");
		pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
		return 0;
		return 0;
	}
	}
	}


	/* PCK0..PCK3 must be disabled, or configured to use clk32k */
	/* PCK0..PCK3 must be disabled, or configured to use clk32k */
	for (i = 0; i < 4; i++) {
	for (i = 0; i < 4; i++) {
@@ -149,18 +147,13 @@ static int at91_pm_enter(suspend_state_t state)
			 * turning off the main oscillator; reverse on wakeup.
			 * turning off the main oscillator; reverse on wakeup.
			 */
			 */
			if (slow_clock) {
			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
#ifdef CONFIG_AT91_SLOW_CLOCK
				/* copy slow_clock handler to SRAM, and call it */
				/* copy slow_clock handler to SRAM, and call it */
				memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz);
				memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz);
#endif
#endif
				slow_clock(at91_pmc_base, at91_ramc_base[0],
				slow_clock(at91_pmc_base, at91_ramc_base[0],
					   at91_ramc_base[1], memctrl);
					   at91_ramc_base[1],
					   at91_pm_data.memctrl);
				break;
				break;
			} else {
			} else {
				pr_info("AT91: PM - no slow clock mode enabled ...\n");
				pr_info("AT91: PM - no slow clock mode enabled ...\n");
@@ -237,10 +230,29 @@ static int __init at91_pm_init(void)


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


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

	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_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)
	if (at91_cpuidle_device.dev.platform_data)
		platform_device_register(&at91_cpuidle_device);
		platform_device_register(&at91_cpuidle_device);