xref: /openbmc/linux/arch/arm/mach-at91/pm.c (revision 88021836)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * arch/arm/mach-at91/pm.c
4  * AT91 Power Management
5  *
6  * Copyright (C) 2005 David Brownell
7  */
8 
9 #include <linux/genalloc.h>
10 #include <linux/io.h>
11 #include <linux/of_address.h>
12 #include <linux/of.h>
13 #include <linux/of_fdt.h>
14 #include <linux/of_platform.h>
15 #include <linux/parser.h>
16 #include <linux/suspend.h>
17 
18 #include <linux/clk.h>
19 #include <linux/clk/at91_pmc.h>
20 #include <linux/platform_data/atmel.h>
21 
22 #include <asm/cacheflush.h>
23 #include <asm/fncpy.h>
24 #include <asm/system_misc.h>
25 #include <asm/suspend.h>
26 
27 #include "generic.h"
28 #include "pm.h"
29 #include "sam_secure.h"
30 
31 #define BACKUP_DDR_PHY_CALIBRATION	(9)
32 
33 /**
34  * struct at91_pm_bu - AT91 power management backup unit data structure
35  * @suspended: true if suspended to backup mode
36  * @reserved: reserved
37  * @canary: canary data for memory checking after exit from backup mode
38  * @resume: resume API
39  * @ddr_phy_calibration: DDR PHY calibration data: ZQ0CR0, first 8 words
40  * of the memory
41  */
42 struct at91_pm_bu {
43 	int suspended;
44 	unsigned long reserved;
45 	phys_addr_t canary;
46 	phys_addr_t resume;
47 	unsigned long ddr_phy_calibration[BACKUP_DDR_PHY_CALIBRATION];
48 };
49 
50 /**
51  * struct at91_pm_sfrbu_regs - registers mapping for SFRBU
52  * @pswbu: power switch BU control registers
53  */
54 struct at91_pm_sfrbu_regs {
55 	struct {
56 		u32 key;
57 		u32 ctrl;
58 		u32 state;
59 		u32 softsw;
60 	} pswbu;
61 };
62 
63 /**
64  * enum at91_pm_eth_clk - Ethernet clock indexes
65  * @AT91_PM_ETH_PCLK: pclk index
66  * @AT91_PM_ETH_HCLK: hclk index
67  * @AT91_PM_ETH_MAX_CLK: max index
68  */
69 enum at91_pm_eth_clk {
70 	AT91_PM_ETH_PCLK,
71 	AT91_PM_ETH_HCLK,
72 	AT91_PM_ETH_MAX_CLK,
73 };
74 
75 /**
76  * enum at91_pm_eth - Ethernet controller indexes
77  * @AT91_PM_G_ETH: gigabit Ethernet controller index
78  * @AT91_PM_E_ETH: megabit Ethernet controller index
79  * @AT91_PM_MAX_ETH: max index
80  */
81 enum at91_pm_eth {
82 	AT91_PM_G_ETH,
83 	AT91_PM_E_ETH,
84 	AT91_PM_MAX_ETH,
85 };
86 
87 /**
88  * struct at91_pm_quirk_eth - AT91 PM Ethernet quirks
89  * @dev: Ethernet device
90  * @np: Ethernet device node
91  * @clks: Ethernet clocks
92  * @modes: power management mode that this quirk applies to
93  * @dns_modes: do not suspend modes: stop suspending if Ethernet is configured
94  *	       as wakeup source but buggy and no other wakeup source is
95  *	       available
96  */
97 struct at91_pm_quirk_eth {
98 	struct device *dev;
99 	struct device_node *np;
100 	struct clk_bulk_data clks[AT91_PM_ETH_MAX_CLK];
101 	u32 modes;
102 	u32 dns_modes;
103 };
104 
105 /**
106  * struct at91_pm_quirks - AT91 PM quirks
107  * @eth: Ethernet quirks
108  */
109 struct at91_pm_quirks {
110 	struct at91_pm_quirk_eth eth[AT91_PM_MAX_ETH];
111 };
112 
113 /**
114  * struct at91_soc_pm - AT91 SoC power management data structure
115  * @config_shdwc_ws: wakeup sources configuration function for SHDWC
116  * @config_pmc_ws: wakeup srouces configuration function for PMC
117  * @ws_ids: wakup sources of_device_id array
118  * @bu: backup unit mapped data (for backup mode)
119  * @quirks: PM quirks
120  * @data: PM data to be used on last phase of suspend
121  * @sfrbu_regs: SFRBU registers mapping
122  * @memcs: memory chip select
123  */
124 struct at91_soc_pm {
125 	int (*config_shdwc_ws)(void __iomem *shdwc, u32 *mode, u32 *polarity);
126 	int (*config_pmc_ws)(void __iomem *pmc, u32 mode, u32 polarity);
127 	const struct of_device_id *ws_ids;
128 	struct at91_pm_bu *bu;
129 	struct at91_pm_quirks quirks;
130 	struct at91_pm_data data;
131 	struct at91_pm_sfrbu_regs sfrbu_regs;
132 	void *memcs;
133 };
134 
135 /**
136  * enum at91_pm_iomaps - IOs that needs to be mapped for different PM modes
137  * @AT91_PM_IOMAP_SHDWC:	SHDWC controller
138  * @AT91_PM_IOMAP_SFRBU:	SFRBU controller
139  * @AT91_PM_IOMAP_ETHC:		Ethernet controller
140  */
141 enum at91_pm_iomaps {
142 	AT91_PM_IOMAP_SHDWC,
143 	AT91_PM_IOMAP_SFRBU,
144 	AT91_PM_IOMAP_ETHC,
145 };
146 
147 #define AT91_PM_IOMAP(name)	BIT(AT91_PM_IOMAP_##name)
148 
149 static struct at91_soc_pm soc_pm = {
150 	.data = {
151 		.standby_mode = AT91_PM_STANDBY,
152 		.suspend_mode = AT91_PM_ULP0,
153 	},
154 };
155 
156 static const match_table_t pm_modes __initconst = {
157 	{ AT91_PM_STANDBY,	"standby" },
158 	{ AT91_PM_ULP0,		"ulp0" },
159 	{ AT91_PM_ULP0_FAST,    "ulp0-fast" },
160 	{ AT91_PM_ULP1,		"ulp1" },
161 	{ AT91_PM_BACKUP,	"backup" },
162 	{ -1, NULL },
163 };
164 
165 #define at91_ramc_read(id, field) \
166 	__raw_readl(soc_pm.data.ramc[id] + field)
167 
168 #define at91_ramc_write(id, field, value) \
169 	__raw_writel(value, soc_pm.data.ramc[id] + field)
170 
171 static int at91_pm_valid_state(suspend_state_t state)
172 {
173 	switch (state) {
174 		case PM_SUSPEND_ON:
175 		case PM_SUSPEND_STANDBY:
176 		case PM_SUSPEND_MEM:
177 			return 1;
178 
179 		default:
180 			return 0;
181 	}
182 }
183 
184 static int canary = 0xA5A5A5A5;
185 
186 struct wakeup_source_info {
187 	unsigned int pmc_fsmr_bit;
188 	unsigned int shdwc_mr_bit;
189 	bool set_polarity;
190 };
191 
192 static const struct wakeup_source_info ws_info[] = {
193 	{ .pmc_fsmr_bit = AT91_PMC_FSTT(10),	.set_polarity = true },
194 	{ .pmc_fsmr_bit = AT91_PMC_RTCAL,	.shdwc_mr_bit = BIT(17) },
195 	{ .pmc_fsmr_bit = AT91_PMC_USBAL },
196 	{ .pmc_fsmr_bit = AT91_PMC_SDMMC_CD },
197 	{ .pmc_fsmr_bit = AT91_PMC_RTTAL },
198 	{ .pmc_fsmr_bit = AT91_PMC_RXLP_MCE },
199 };
200 
201 static const struct of_device_id sama5d2_ws_ids[] = {
202 	{ .compatible = "atmel,sama5d2-gem",		.data = &ws_info[0] },
203 	{ .compatible = "atmel,sama5d2-rtc",		.data = &ws_info[1] },
204 	{ .compatible = "atmel,sama5d3-udc",		.data = &ws_info[2] },
205 	{ .compatible = "atmel,at91rm9200-ohci",	.data = &ws_info[2] },
206 	{ .compatible = "usb-ohci",			.data = &ws_info[2] },
207 	{ .compatible = "atmel,at91sam9g45-ehci",	.data = &ws_info[2] },
208 	{ .compatible = "usb-ehci",			.data = &ws_info[2] },
209 	{ .compatible = "atmel,sama5d2-sdhci",		.data = &ws_info[3] },
210 	{ /* sentinel */ }
211 };
212 
213 static const struct of_device_id sam9x60_ws_ids[] = {
214 	{ .compatible = "microchip,sam9x60-rtc",	.data = &ws_info[1] },
215 	{ .compatible = "atmel,at91rm9200-ohci",	.data = &ws_info[2] },
216 	{ .compatible = "usb-ohci",			.data = &ws_info[2] },
217 	{ .compatible = "atmel,at91sam9g45-ehci",	.data = &ws_info[2] },
218 	{ .compatible = "usb-ehci",			.data = &ws_info[2] },
219 	{ .compatible = "microchip,sam9x60-rtt",	.data = &ws_info[4] },
220 	{ .compatible = "cdns,sam9x60-macb",		.data = &ws_info[5] },
221 	{ /* sentinel */ }
222 };
223 
224 static const struct of_device_id sama7g5_ws_ids[] = {
225 	{ .compatible = "microchip,sama7g5-rtc",	.data = &ws_info[1] },
226 	{ .compatible = "microchip,sama7g5-ohci",	.data = &ws_info[2] },
227 	{ .compatible = "usb-ohci",			.data = &ws_info[2] },
228 	{ .compatible = "atmel,at91sam9g45-ehci",	.data = &ws_info[2] },
229 	{ .compatible = "usb-ehci",			.data = &ws_info[2] },
230 	{ .compatible = "microchip,sama7g5-sdhci",	.data = &ws_info[3] },
231 	{ .compatible = "microchip,sama7g5-rtt",	.data = &ws_info[4] },
232 	{ /* sentinel */ }
233 };
234 
235 static int at91_pm_config_ws(unsigned int pm_mode, bool set)
236 {
237 	const struct wakeup_source_info *wsi;
238 	const struct of_device_id *match;
239 	struct platform_device *pdev;
240 	struct device_node *np;
241 	unsigned int mode = 0, polarity = 0, val = 0;
242 
243 	if (pm_mode != AT91_PM_ULP1)
244 		return 0;
245 
246 	if (!soc_pm.data.pmc || !soc_pm.data.shdwc || !soc_pm.ws_ids)
247 		return -EPERM;
248 
249 	if (!set) {
250 		writel(mode, soc_pm.data.pmc + AT91_PMC_FSMR);
251 		return 0;
252 	}
253 
254 	if (soc_pm.config_shdwc_ws)
255 		soc_pm.config_shdwc_ws(soc_pm.data.shdwc, &mode, &polarity);
256 
257 	/* SHDWC.MR */
258 	val = readl(soc_pm.data.shdwc + 0x04);
259 
260 	/* Loop through defined wakeup sources. */
261 	for_each_matching_node_and_match(np, soc_pm.ws_ids, &match) {
262 		pdev = of_find_device_by_node(np);
263 		if (!pdev)
264 			continue;
265 
266 		if (device_may_wakeup(&pdev->dev)) {
267 			wsi = match->data;
268 
269 			/* Check if enabled on SHDWC. */
270 			if (wsi->shdwc_mr_bit && !(val & wsi->shdwc_mr_bit))
271 				goto put_device;
272 
273 			mode |= wsi->pmc_fsmr_bit;
274 			if (wsi->set_polarity)
275 				polarity |= wsi->pmc_fsmr_bit;
276 		}
277 
278 put_device:
279 		put_device(&pdev->dev);
280 	}
281 
282 	if (mode) {
283 		if (soc_pm.config_pmc_ws)
284 			soc_pm.config_pmc_ws(soc_pm.data.pmc, mode, polarity);
285 	} else {
286 		pr_err("AT91: PM: no ULP1 wakeup sources found!");
287 	}
288 
289 	return mode ? 0 : -EPERM;
290 }
291 
292 static int at91_sama5d2_config_shdwc_ws(void __iomem *shdwc, u32 *mode,
293 					u32 *polarity)
294 {
295 	u32 val;
296 
297 	/* SHDWC.WUIR */
298 	val = readl(shdwc + 0x0c);
299 	*mode |= (val & 0x3ff);
300 	*polarity |= ((val >> 16) & 0x3ff);
301 
302 	return 0;
303 }
304 
305 static int at91_sama5d2_config_pmc_ws(void __iomem *pmc, u32 mode, u32 polarity)
306 {
307 	writel(mode, pmc + AT91_PMC_FSMR);
308 	writel(polarity, pmc + AT91_PMC_FSPR);
309 
310 	return 0;
311 }
312 
313 static int at91_sam9x60_config_pmc_ws(void __iomem *pmc, u32 mode, u32 polarity)
314 {
315 	writel(mode, pmc + AT91_PMC_FSMR);
316 
317 	return 0;
318 }
319 
320 static bool at91_pm_eth_quirk_is_valid(struct at91_pm_quirk_eth *eth)
321 {
322 	struct platform_device *pdev;
323 
324 	/* Interface NA in DT. */
325 	if (!eth->np)
326 		return false;
327 
328 	/* No quirks for this interface and current suspend mode. */
329 	if (!(eth->modes & BIT(soc_pm.data.mode)))
330 		return false;
331 
332 	if (!eth->dev) {
333 		/* Driver not probed. */
334 		pdev = of_find_device_by_node(eth->np);
335 		if (!pdev)
336 			return false;
337 		/* put_device(eth->dev) is called at the end of suspend. */
338 		eth->dev = &pdev->dev;
339 	}
340 
341 	/* No quirks if device isn't a wakeup source. */
342 	if (!device_may_wakeup(eth->dev))
343 		return false;
344 
345 	return true;
346 }
347 
348 static int at91_pm_config_quirks(bool suspend)
349 {
350 	struct at91_pm_quirk_eth *eth;
351 	int i, j, ret, tmp;
352 
353 	/*
354 	 * Ethernet IPs who's device_node pointers are stored into
355 	 * soc_pm.quirks.eth[].np cannot handle WoL packets while in ULP0, ULP1
356 	 * or both due to a hardware bug. If they receive WoL packets while in
357 	 * ULP0 or ULP1 IPs could stop working or the whole system could stop
358 	 * working. We cannot handle this scenario in the ethernet driver itself
359 	 * as the driver is common to multiple vendors and also we only know
360 	 * here, in this file, if we suspend to ULP0 or ULP1 mode. Thus handle
361 	 * these scenarios here, as quirks.
362 	 */
363 	for (i = 0; i < AT91_PM_MAX_ETH; i++) {
364 		eth = &soc_pm.quirks.eth[i];
365 
366 		if (!at91_pm_eth_quirk_is_valid(eth))
367 			continue;
368 
369 		/*
370 		 * For modes in dns_modes mask the system blocks if quirk is not
371 		 * applied but if applied the interface doesn't act at WoL
372 		 * events. Thus take care to avoid suspending if this interface
373 		 * is the only configured wakeup source.
374 		 */
375 		if (suspend && eth->dns_modes & BIT(soc_pm.data.mode)) {
376 			int ws_count = 0;
377 #ifdef CONFIG_PM_SLEEP
378 			struct wakeup_source *ws;
379 
380 			for_each_wakeup_source(ws) {
381 				if (ws->dev == eth->dev)
382 					continue;
383 
384 				ws_count++;
385 				break;
386 			}
387 #endif
388 
389 			/*
390 			 * Checking !ws is good for all platforms with issues
391 			 * even when both G_ETH and E_ETH are available as dns_modes
392 			 * is populated only on G_ETH interface.
393 			 */
394 			if (!ws_count) {
395 				pr_err("AT91: PM: Ethernet cannot resume from WoL!");
396 				ret = -EPERM;
397 				put_device(eth->dev);
398 				eth->dev = NULL;
399 				/* No need to revert clock settings for this eth. */
400 				i--;
401 				goto clk_unconfigure;
402 			}
403 		}
404 
405 		if (suspend) {
406 			clk_bulk_disable_unprepare(AT91_PM_ETH_MAX_CLK, eth->clks);
407 		} else {
408 			ret = clk_bulk_prepare_enable(AT91_PM_ETH_MAX_CLK,
409 						      eth->clks);
410 			if (ret)
411 				goto clk_unconfigure;
412 			/*
413 			 * Release the reference to eth->dev taken in
414 			 * at91_pm_eth_quirk_is_valid().
415 			 */
416 			put_device(eth->dev);
417 			eth->dev = NULL;
418 		}
419 	}
420 
421 	return 0;
422 
423 clk_unconfigure:
424 	/*
425 	 * In case of resume we reach this point if clk_prepare_enable() failed.
426 	 * we don't want to revert the previous clk_prepare_enable() for the
427 	 * other IP.
428 	 */
429 	for (j = i; j >= 0; j--) {
430 		eth = &soc_pm.quirks.eth[j];
431 		if (suspend) {
432 			if (!at91_pm_eth_quirk_is_valid(eth))
433 				continue;
434 
435 			tmp = clk_bulk_prepare_enable(AT91_PM_ETH_MAX_CLK, eth->clks);
436 			if (tmp) {
437 				pr_err("AT91: PM: failed to enable %s clocks\n",
438 				       j == AT91_PM_G_ETH ? "geth" : "eth");
439 			}
440 		}
441 
442 		/*
443 		 * Release the reference to eth->dev taken in
444 		 * at91_pm_eth_quirk_is_valid().
445 		 */
446 		put_device(eth->dev);
447 		eth->dev = NULL;
448 	}
449 
450 	return ret;
451 }
452 
453 /*
454  * Called after processes are frozen, but before we shutdown devices.
455  */
456 static int at91_pm_begin(suspend_state_t state)
457 {
458 	int ret;
459 
460 	switch (state) {
461 	case PM_SUSPEND_MEM:
462 		soc_pm.data.mode = soc_pm.data.suspend_mode;
463 		break;
464 
465 	case PM_SUSPEND_STANDBY:
466 		soc_pm.data.mode = soc_pm.data.standby_mode;
467 		break;
468 
469 	default:
470 		soc_pm.data.mode = -1;
471 	}
472 
473 	ret = at91_pm_config_ws(soc_pm.data.mode, true);
474 	if (ret)
475 		return ret;
476 
477 	if (soc_pm.data.mode == AT91_PM_BACKUP)
478 		soc_pm.bu->suspended = 1;
479 	else if (soc_pm.bu)
480 		soc_pm.bu->suspended = 0;
481 
482 	return 0;
483 }
484 
485 /*
486  * Verify that all the clocks are correct before entering
487  * slow-clock mode.
488  */
489 static int at91_pm_verify_clocks(void)
490 {
491 	unsigned long scsr;
492 	int i;
493 
494 	scsr = readl(soc_pm.data.pmc + AT91_PMC_SCSR);
495 
496 	/* USB must not be using PLLB */
497 	if ((scsr & soc_pm.data.uhp_udp_mask) != 0) {
498 		pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
499 		return 0;
500 	}
501 
502 	/* PCK0..PCK3 must be disabled, or configured to use clk32k */
503 	for (i = 0; i < 4; i++) {
504 		u32 css;
505 
506 		if ((scsr & (AT91_PMC_PCK0 << i)) == 0)
507 			continue;
508 		css = readl(soc_pm.data.pmc + AT91_PMC_PCKR(i)) & AT91_PMC_CSS;
509 		if (css != AT91_PMC_CSS_SLOW) {
510 			pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css);
511 			return 0;
512 		}
513 	}
514 
515 	return 1;
516 }
517 
518 /*
519  * Call this from platform driver suspend() to see how deeply to suspend.
520  * For example, some controllers (like OHCI) need one of the PLL clocks
521  * in order to act as a wakeup source, and those are not available when
522  * going into slow clock mode.
523  *
524  * REVISIT: generalize as clk_will_be_available(clk)?  Other platforms have
525  * the very same problem (but not using at91 main_clk), and it'd be better
526  * to add one generic API rather than lots of platform-specific ones.
527  */
528 int at91_suspend_entering_slow_clock(void)
529 {
530 	return (soc_pm.data.mode >= AT91_PM_ULP0);
531 }
532 EXPORT_SYMBOL(at91_suspend_entering_slow_clock);
533 
534 static void (*at91_suspend_sram_fn)(struct at91_pm_data *);
535 extern void at91_pm_suspend_in_sram(struct at91_pm_data *pm_data);
536 extern u32 at91_pm_suspend_in_sram_sz;
537 
538 static int at91_suspend_finish(unsigned long val)
539 {
540 	unsigned char modified_gray_code[] = {
541 		0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x04, 0x05, 0x0c, 0x0d,
542 		0x0e, 0x0f, 0x0a, 0x0b, 0x08, 0x09, 0x18, 0x19, 0x1a, 0x1b,
543 		0x1e, 0x1f, 0x1c, 0x1d, 0x14, 0x15, 0x16, 0x17, 0x12, 0x13,
544 		0x10, 0x11,
545 	};
546 	unsigned int tmp, index;
547 	int i;
548 
549 	if (soc_pm.data.mode == AT91_PM_BACKUP && soc_pm.data.ramc_phy) {
550 		/*
551 		 * Bootloader will perform DDR recalibration and will try to
552 		 * restore the ZQ0SR0 with the value saved here. But the
553 		 * calibration is buggy and restoring some values from ZQ0SR0
554 		 * is forbidden and risky thus we need to provide processed
555 		 * values for these (modified gray code values).
556 		 */
557 		tmp = readl(soc_pm.data.ramc_phy + DDR3PHY_ZQ0SR0);
558 
559 		/* Store pull-down output impedance select. */
560 		index = (tmp >> DDR3PHY_ZQ0SR0_PDO_OFF) & 0x1f;
561 		soc_pm.bu->ddr_phy_calibration[0] = modified_gray_code[index];
562 
563 		/* Store pull-up output impedance select. */
564 		index = (tmp >> DDR3PHY_ZQ0SR0_PUO_OFF) & 0x1f;
565 		soc_pm.bu->ddr_phy_calibration[0] |= modified_gray_code[index];
566 
567 		/* Store pull-down on-die termination impedance select. */
568 		index = (tmp >> DDR3PHY_ZQ0SR0_PDODT_OFF) & 0x1f;
569 		soc_pm.bu->ddr_phy_calibration[0] |= modified_gray_code[index];
570 
571 		/* Store pull-up on-die termination impedance select. */
572 		index = (tmp >> DDR3PHY_ZQ0SRO_PUODT_OFF) & 0x1f;
573 		soc_pm.bu->ddr_phy_calibration[0] |= modified_gray_code[index];
574 
575 		/*
576 		 * The 1st 8 words of memory might get corrupted in the process
577 		 * of DDR PHY recalibration; it is saved here in securam and it
578 		 * will be restored later, after recalibration, by bootloader
579 		 */
580 		for (i = 1; i < BACKUP_DDR_PHY_CALIBRATION; i++)
581 			soc_pm.bu->ddr_phy_calibration[i] =
582 				*((unsigned int *)soc_pm.memcs + (i - 1));
583 	}
584 
585 	flush_cache_all();
586 	outer_disable();
587 
588 	at91_suspend_sram_fn(&soc_pm.data);
589 
590 	return 0;
591 }
592 
593 static void at91_pm_switch_ba_to_vbat(void)
594 {
595 	unsigned int offset = offsetof(struct at91_pm_sfrbu_regs, pswbu);
596 	unsigned int val;
597 
598 	/* Just for safety. */
599 	if (!soc_pm.data.sfrbu)
600 		return;
601 
602 	val = readl(soc_pm.data.sfrbu + offset);
603 
604 	/* Already on VBAT. */
605 	if (!(val & soc_pm.sfrbu_regs.pswbu.state))
606 		return;
607 
608 	val &= ~soc_pm.sfrbu_regs.pswbu.softsw;
609 	val |= soc_pm.sfrbu_regs.pswbu.key | soc_pm.sfrbu_regs.pswbu.ctrl;
610 	writel(val, soc_pm.data.sfrbu + offset);
611 
612 	/* Wait for update. */
613 	val = readl(soc_pm.data.sfrbu + offset);
614 	while (val & soc_pm.sfrbu_regs.pswbu.state)
615 		val = readl(soc_pm.data.sfrbu + offset);
616 }
617 
618 static void at91_pm_suspend(suspend_state_t state)
619 {
620 	if (soc_pm.data.mode == AT91_PM_BACKUP) {
621 		at91_pm_switch_ba_to_vbat();
622 
623 		cpu_suspend(0, at91_suspend_finish);
624 
625 		/* The SRAM is lost between suspend cycles */
626 		at91_suspend_sram_fn = fncpy(at91_suspend_sram_fn,
627 					     &at91_pm_suspend_in_sram,
628 					     at91_pm_suspend_in_sram_sz);
629 	} else {
630 		at91_suspend_finish(0);
631 	}
632 
633 	outer_resume();
634 }
635 
636 /*
637  * STANDBY mode has *all* drivers suspended; ignores irqs not marked as 'wakeup'
638  * event sources; and reduces DRAM power.  But otherwise it's identical to
639  * PM_SUSPEND_ON: cpu idle, and nothing fancy done with main or cpu clocks.
640  *
641  * AT91_PM_ULP0 is like STANDBY plus slow clock mode, so drivers must
642  * suspend more deeply, the master clock switches to the clk32k and turns off
643  * the main oscillator
644  *
645  * AT91_PM_BACKUP turns off the whole SoC after placing the DDR in self refresh
646  */
647 static int at91_pm_enter(suspend_state_t state)
648 {
649 	int ret;
650 
651 	ret = at91_pm_config_quirks(true);
652 	if (ret)
653 		return ret;
654 
655 	switch (state) {
656 	case PM_SUSPEND_MEM:
657 	case PM_SUSPEND_STANDBY:
658 		/*
659 		 * Ensure that clocks are in a valid state.
660 		 */
661 		if (soc_pm.data.mode >= AT91_PM_ULP0 &&
662 		    !at91_pm_verify_clocks())
663 			goto error;
664 
665 		at91_pm_suspend(state);
666 
667 		break;
668 
669 	case PM_SUSPEND_ON:
670 		cpu_do_idle();
671 		break;
672 
673 	default:
674 		pr_debug("AT91: PM - bogus suspend state %d\n", state);
675 		goto error;
676 	}
677 
678 error:
679 	at91_pm_config_quirks(false);
680 	return 0;
681 }
682 
683 /*
684  * Called right prior to thawing processes.
685  */
686 static void at91_pm_end(void)
687 {
688 	at91_pm_config_ws(soc_pm.data.mode, false);
689 }
690 
691 
692 static const struct platform_suspend_ops at91_pm_ops = {
693 	.valid	= at91_pm_valid_state,
694 	.begin	= at91_pm_begin,
695 	.enter	= at91_pm_enter,
696 	.end	= at91_pm_end,
697 };
698 
699 static struct platform_device at91_cpuidle_device = {
700 	.name = "cpuidle-at91",
701 };
702 
703 /*
704  * The AT91RM9200 goes into self-refresh mode with this command, and will
705  * terminate self-refresh automatically on the next SDRAM access.
706  *
707  * Self-refresh mode is exited as soon as a memory access is made, but we don't
708  * know for sure when that happens. However, we need to restore the low-power
709  * mode if it was enabled before going idle. Restoring low-power mode while
710  * still in self-refresh is "not recommended", but seems to work.
711  */
712 static void at91rm9200_standby(void)
713 {
714 	asm volatile(
715 		"b    1f\n\t"
716 		".align    5\n\t"
717 		"1:  mcr    p15, 0, %0, c7, c10, 4\n\t"
718 		"    str    %2, [%1, %3]\n\t"
719 		"    mcr    p15, 0, %0, c7, c0, 4\n\t"
720 		:
721 		: "r" (0), "r" (soc_pm.data.ramc[0]),
722 		  "r" (1), "r" (AT91_MC_SDRAMC_SRR));
723 }
724 
725 /* We manage both DDRAM/SDRAM controllers, we need more than one value to
726  * remember.
727  */
728 static void at91_ddr_standby(void)
729 {
730 	/* Those two values allow us to delay self-refresh activation
731 	 * to the maximum. */
732 	u32 lpr0, lpr1 = 0;
733 	u32 mdr, saved_mdr0, saved_mdr1 = 0;
734 	u32 saved_lpr0, saved_lpr1 = 0;
735 
736 	/* LPDDR1 --> force DDR2 mode during self-refresh */
737 	saved_mdr0 = at91_ramc_read(0, AT91_DDRSDRC_MDR);
738 	if ((saved_mdr0 & AT91_DDRSDRC_MD) == AT91_DDRSDRC_MD_LOW_POWER_DDR) {
739 		mdr = saved_mdr0 & ~AT91_DDRSDRC_MD;
740 		mdr |= AT91_DDRSDRC_MD_DDR2;
741 		at91_ramc_write(0, AT91_DDRSDRC_MDR, mdr);
742 	}
743 
744 	if (soc_pm.data.ramc[1]) {
745 		saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
746 		lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
747 		lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
748 		saved_mdr1 = at91_ramc_read(1, AT91_DDRSDRC_MDR);
749 		if ((saved_mdr1 & AT91_DDRSDRC_MD) == AT91_DDRSDRC_MD_LOW_POWER_DDR) {
750 			mdr = saved_mdr1 & ~AT91_DDRSDRC_MD;
751 			mdr |= AT91_DDRSDRC_MD_DDR2;
752 			at91_ramc_write(1, AT91_DDRSDRC_MDR, mdr);
753 		}
754 	}
755 
756 	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
757 	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
758 	lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
759 
760 	/* self-refresh mode now */
761 	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
762 	if (soc_pm.data.ramc[1])
763 		at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
764 
765 	cpu_do_idle();
766 
767 	at91_ramc_write(0, AT91_DDRSDRC_MDR, saved_mdr0);
768 	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
769 	if (soc_pm.data.ramc[1]) {
770 		at91_ramc_write(0, AT91_DDRSDRC_MDR, saved_mdr1);
771 		at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
772 	}
773 }
774 
775 static void sama5d3_ddr_standby(void)
776 {
777 	u32 lpr0;
778 	u32 saved_lpr0;
779 
780 	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
781 	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
782 	lpr0 |= AT91_DDRSDRC_LPCB_POWER_DOWN;
783 
784 	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
785 
786 	cpu_do_idle();
787 
788 	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
789 }
790 
791 /* We manage both DDRAM/SDRAM controllers, we need more than one value to
792  * remember.
793  */
794 static void at91sam9_sdram_standby(void)
795 {
796 	u32 lpr0, lpr1 = 0;
797 	u32 saved_lpr0, saved_lpr1 = 0;
798 
799 	if (soc_pm.data.ramc[1]) {
800 		saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
801 		lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
802 		lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
803 	}
804 
805 	saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
806 	lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
807 	lpr0 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
808 
809 	/* self-refresh mode now */
810 	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
811 	if (soc_pm.data.ramc[1])
812 		at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
813 
814 	cpu_do_idle();
815 
816 	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
817 	if (soc_pm.data.ramc[1])
818 		at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
819 }
820 
821 static void sama7g5_standby(void)
822 {
823 	int pwrtmg, ratio;
824 
825 	pwrtmg = readl(soc_pm.data.ramc[0] + UDDRC_PWRCTL);
826 	ratio = readl(soc_pm.data.pmc + AT91_PMC_RATIO);
827 
828 	/*
829 	 * Place RAM into self-refresh after a maximum idle clocks. The maximum
830 	 * idle clocks is configured by bootloader in
831 	 * UDDRC_PWRMGT.SELFREF_TO_X32.
832 	 */
833 	writel(pwrtmg | UDDRC_PWRCTL_SELFREF_EN,
834 	       soc_pm.data.ramc[0] + UDDRC_PWRCTL);
835 	/* Divide CPU clock by 16. */
836 	writel(ratio & ~AT91_PMC_RATIO_RATIO, soc_pm.data.pmc + AT91_PMC_RATIO);
837 
838 	cpu_do_idle();
839 
840 	/* Restore previous configuration. */
841 	writel(ratio, soc_pm.data.pmc + AT91_PMC_RATIO);
842 	writel(pwrtmg, soc_pm.data.ramc[0] + UDDRC_PWRCTL);
843 }
844 
845 struct ramc_info {
846 	void (*idle)(void);
847 	unsigned int memctrl;
848 };
849 
850 static const struct ramc_info ramc_infos[] __initconst = {
851 	{ .idle = at91rm9200_standby, .memctrl = AT91_MEMCTRL_MC},
852 	{ .idle = at91sam9_sdram_standby, .memctrl = AT91_MEMCTRL_SDRAMC},
853 	{ .idle = at91_ddr_standby, .memctrl = AT91_MEMCTRL_DDRSDR},
854 	{ .idle = sama5d3_ddr_standby, .memctrl = AT91_MEMCTRL_DDRSDR},
855 	{ .idle = sama7g5_standby, },
856 };
857 
858 static const struct of_device_id ramc_ids[] __initconst = {
859 	{ .compatible = "atmel,at91rm9200-sdramc", .data = &ramc_infos[0] },
860 	{ .compatible = "atmel,at91sam9260-sdramc", .data = &ramc_infos[1] },
861 	{ .compatible = "atmel,at91sam9g45-ddramc", .data = &ramc_infos[2] },
862 	{ .compatible = "atmel,sama5d3-ddramc", .data = &ramc_infos[3] },
863 	{ .compatible = "microchip,sama7g5-uddrc", .data = &ramc_infos[4], },
864 	{ /*sentinel*/ }
865 };
866 
867 static const struct of_device_id ramc_phy_ids[] __initconst = {
868 	{ .compatible = "microchip,sama7g5-ddr3phy", },
869 	{ /* Sentinel. */ },
870 };
871 
872 static __init int at91_dt_ramc(bool phy_mandatory)
873 {
874 	struct device_node *np;
875 	const struct of_device_id *of_id;
876 	int idx = 0;
877 	void *standby = NULL;
878 	const struct ramc_info *ramc;
879 	int ret;
880 
881 	for_each_matching_node_and_match(np, ramc_ids, &of_id) {
882 		soc_pm.data.ramc[idx] = of_iomap(np, 0);
883 		if (!soc_pm.data.ramc[idx]) {
884 			pr_err("unable to map ramc[%d] cpu registers\n", idx);
885 			ret = -ENOMEM;
886 			of_node_put(np);
887 			goto unmap_ramc;
888 		}
889 
890 		ramc = of_id->data;
891 		if (ramc) {
892 			if (!standby)
893 				standby = ramc->idle;
894 			soc_pm.data.memctrl = ramc->memctrl;
895 		}
896 
897 		idx++;
898 	}
899 
900 	if (!idx) {
901 		pr_err("unable to find compatible ram controller node in dtb\n");
902 		ret = -ENODEV;
903 		goto unmap_ramc;
904 	}
905 
906 	/* Lookup for DDR PHY node, if any. */
907 	for_each_matching_node_and_match(np, ramc_phy_ids, &of_id) {
908 		soc_pm.data.ramc_phy = of_iomap(np, 0);
909 		if (!soc_pm.data.ramc_phy) {
910 			pr_err("unable to map ramc phy cpu registers\n");
911 			ret = -ENOMEM;
912 			of_node_put(np);
913 			goto unmap_ramc;
914 		}
915 	}
916 
917 	if (phy_mandatory && !soc_pm.data.ramc_phy) {
918 		pr_err("DDR PHY is mandatory!\n");
919 		ret = -ENODEV;
920 		goto unmap_ramc;
921 	}
922 
923 	if (!standby) {
924 		pr_warn("ramc no standby function available\n");
925 		return 0;
926 	}
927 
928 	at91_cpuidle_device.dev.platform_data = standby;
929 
930 	return 0;
931 
932 unmap_ramc:
933 	while (idx)
934 		iounmap(soc_pm.data.ramc[--idx]);
935 
936 	return ret;
937 }
938 
939 static void at91rm9200_idle(void)
940 {
941 	/*
942 	 * Disable the processor clock.  The processor will be automatically
943 	 * re-enabled by an interrupt or by a reset.
944 	 */
945 	writel(AT91_PMC_PCK, soc_pm.data.pmc + AT91_PMC_SCDR);
946 }
947 
948 static void at91sam9_idle(void)
949 {
950 	writel(AT91_PMC_PCK, soc_pm.data.pmc + AT91_PMC_SCDR);
951 	cpu_do_idle();
952 }
953 
954 static void __init at91_pm_sram_init(void)
955 {
956 	struct gen_pool *sram_pool;
957 	phys_addr_t sram_pbase;
958 	unsigned long sram_base;
959 	struct device_node *node;
960 	struct platform_device *pdev = NULL;
961 
962 	for_each_compatible_node(node, NULL, "mmio-sram") {
963 		pdev = of_find_device_by_node(node);
964 		if (pdev) {
965 			of_node_put(node);
966 			break;
967 		}
968 	}
969 
970 	if (!pdev) {
971 		pr_warn("%s: failed to find sram device!\n", __func__);
972 		return;
973 	}
974 
975 	sram_pool = gen_pool_get(&pdev->dev, NULL);
976 	if (!sram_pool) {
977 		pr_warn("%s: sram pool unavailable!\n", __func__);
978 		goto out_put_device;
979 	}
980 
981 	sram_base = gen_pool_alloc(sram_pool, at91_pm_suspend_in_sram_sz);
982 	if (!sram_base) {
983 		pr_warn("%s: unable to alloc sram!\n", __func__);
984 		goto out_put_device;
985 	}
986 
987 	sram_pbase = gen_pool_virt_to_phys(sram_pool, sram_base);
988 	at91_suspend_sram_fn = __arm_ioremap_exec(sram_pbase,
989 					at91_pm_suspend_in_sram_sz, false);
990 	if (!at91_suspend_sram_fn) {
991 		pr_warn("SRAM: Could not map\n");
992 		goto out_put_device;
993 	}
994 
995 	/* Copy the pm suspend handler to SRAM */
996 	at91_suspend_sram_fn = fncpy(at91_suspend_sram_fn,
997 			&at91_pm_suspend_in_sram, at91_pm_suspend_in_sram_sz);
998 	return;
999 
1000 out_put_device:
1001 	put_device(&pdev->dev);
1002 	return;
1003 }
1004 
1005 static bool __init at91_is_pm_mode_active(int pm_mode)
1006 {
1007 	return (soc_pm.data.standby_mode == pm_mode ||
1008 		soc_pm.data.suspend_mode == pm_mode);
1009 }
1010 
1011 static int __init at91_pm_backup_scan_memcs(unsigned long node,
1012 					    const char *uname, int depth,
1013 					    void *data)
1014 {
1015 	const char *type;
1016 	const __be32 *reg;
1017 	int *located = data;
1018 	int size;
1019 
1020 	/* Memory node already located. */
1021 	if (*located)
1022 		return 0;
1023 
1024 	type = of_get_flat_dt_prop(node, "device_type", NULL);
1025 
1026 	/* We are scanning "memory" nodes only. */
1027 	if (!type || strcmp(type, "memory"))
1028 		return 0;
1029 
1030 	reg = of_get_flat_dt_prop(node, "reg", &size);
1031 	if (reg) {
1032 		soc_pm.memcs = __va((phys_addr_t)be32_to_cpu(*reg));
1033 		*located = 1;
1034 	}
1035 
1036 	return 0;
1037 }
1038 
1039 static int __init at91_pm_backup_init(void)
1040 {
1041 	struct gen_pool *sram_pool;
1042 	struct device_node *np;
1043 	struct platform_device *pdev;
1044 	int ret = -ENODEV, located = 0;
1045 
1046 	if (!IS_ENABLED(CONFIG_SOC_SAMA5D2) &&
1047 	    !IS_ENABLED(CONFIG_SOC_SAMA7G5))
1048 		return -EPERM;
1049 
1050 	if (!at91_is_pm_mode_active(AT91_PM_BACKUP))
1051 		return 0;
1052 
1053 	np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam");
1054 	if (!np)
1055 		return ret;
1056 
1057 	pdev = of_find_device_by_node(np);
1058 	of_node_put(np);
1059 	if (!pdev) {
1060 		pr_warn("%s: failed to find securam device!\n", __func__);
1061 		return ret;
1062 	}
1063 
1064 	sram_pool = gen_pool_get(&pdev->dev, NULL);
1065 	if (!sram_pool) {
1066 		pr_warn("%s: securam pool unavailable!\n", __func__);
1067 		goto securam_fail;
1068 	}
1069 
1070 	soc_pm.bu = (void *)gen_pool_alloc(sram_pool, sizeof(struct at91_pm_bu));
1071 	if (!soc_pm.bu) {
1072 		pr_warn("%s: unable to alloc securam!\n", __func__);
1073 		ret = -ENOMEM;
1074 		goto securam_fail;
1075 	}
1076 
1077 	soc_pm.bu->suspended = 0;
1078 	soc_pm.bu->canary = __pa_symbol(&canary);
1079 	soc_pm.bu->resume = __pa_symbol(cpu_resume);
1080 	if (soc_pm.data.ramc_phy) {
1081 		of_scan_flat_dt(at91_pm_backup_scan_memcs, &located);
1082 		if (!located)
1083 			goto securam_fail;
1084 	}
1085 
1086 	return 0;
1087 
1088 securam_fail:
1089 	put_device(&pdev->dev);
1090 	return ret;
1091 }
1092 
1093 static void __init at91_pm_secure_init(void)
1094 {
1095 	int suspend_mode;
1096 	struct arm_smccc_res res;
1097 
1098 	suspend_mode = soc_pm.data.suspend_mode;
1099 
1100 	res = sam_smccc_call(SAMA5_SMC_SIP_SET_SUSPEND_MODE,
1101 			     suspend_mode, 0);
1102 	if (res.a0 == 0) {
1103 		pr_info("AT91: Secure PM: suspend mode set to %s\n",
1104 			pm_modes[suspend_mode].pattern);
1105 		return;
1106 	}
1107 
1108 	pr_warn("AT91: Secure PM: %s mode not supported !\n",
1109 		pm_modes[suspend_mode].pattern);
1110 
1111 	res = sam_smccc_call(SAMA5_SMC_SIP_GET_SUSPEND_MODE, 0, 0);
1112 	if (res.a0 == 0) {
1113 		pr_warn("AT91: Secure PM: failed to get default mode\n");
1114 		return;
1115 	}
1116 
1117 	pr_info("AT91: Secure PM: using default suspend mode %s\n",
1118 		pm_modes[suspend_mode].pattern);
1119 
1120 	soc_pm.data.suspend_mode = res.a1;
1121 }
1122 static const struct of_device_id atmel_shdwc_ids[] = {
1123 	{ .compatible = "atmel,sama5d2-shdwc" },
1124 	{ .compatible = "microchip,sam9x60-shdwc" },
1125 	{ .compatible = "microchip,sama7g5-shdwc" },
1126 	{ /* sentinel. */ }
1127 };
1128 
1129 static const struct of_device_id gmac_ids[] __initconst = {
1130 	{ .compatible = "atmel,sama5d3-gem" },
1131 	{ .compatible = "atmel,sama5d2-gem" },
1132 	{ .compatible = "atmel,sama5d29-gem" },
1133 	{ .compatible = "microchip,sama7g5-gem" },
1134 	{ },
1135 };
1136 
1137 static const struct of_device_id emac_ids[] __initconst = {
1138 	{ .compatible = "atmel,sama5d3-macb" },
1139 	{ .compatible = "microchip,sama7g5-emac" },
1140 	{ },
1141 };
1142 
1143 /*
1144  * Replaces _mode_to_replace with a supported mode that doesn't depend
1145  * on controller pointed by _map_bitmask
1146  * @_maps: u32 array containing AT91_PM_IOMAP() flags and indexed by AT91
1147  * PM mode
1148  * @_map_bitmask: AT91_PM_IOMAP() bitmask; if _mode_to_replace depends on
1149  * controller represented by _map_bitmask, _mode_to_replace needs to be
1150  * updated
1151  * @_mode_to_replace: standby_mode or suspend_mode that need to be
1152  * updated
1153  * @_mode_to_check: standby_mode or suspend_mode; this is needed here
1154  * to avoid having standby_mode and suspend_mode set with the same AT91
1155  * PM mode
1156  */
1157 #define AT91_PM_REPLACE_MODE(_maps, _map_bitmask, _mode_to_replace,	\
1158 			     _mode_to_check)				\
1159 	do {								\
1160 		if (((_maps)[(_mode_to_replace)]) & (_map_bitmask)) {	\
1161 			int _mode_to_use, _mode_complementary;		\
1162 			/* Use ULP0 if it doesn't need _map_bitmask. */	\
1163 			if (!((_maps)[AT91_PM_ULP0] & (_map_bitmask))) {\
1164 				_mode_to_use = AT91_PM_ULP0;		\
1165 				_mode_complementary = AT91_PM_STANDBY;	\
1166 			} else {					\
1167 				_mode_to_use = AT91_PM_STANDBY;		\
1168 				_mode_complementary = AT91_PM_STANDBY;	\
1169 			}						\
1170 									\
1171 			if ((_mode_to_check) != _mode_to_use)		\
1172 				(_mode_to_replace) = _mode_to_use;	\
1173 			else						\
1174 				(_mode_to_replace) = _mode_complementary;\
1175 		}							\
1176 	} while (0)
1177 
1178 /*
1179  * Replaces standby and suspend modes with default supported modes:
1180  * ULP0 and STANDBY.
1181  * @_maps: u32 array indexed by AT91 PM mode containing AT91_PM_IOMAP()
1182  * flags
1183  * @_map: controller specific name; standby and suspend mode need to be
1184  * replaced in order to not depend on this controller
1185  */
1186 #define AT91_PM_REPLACE_MODES(_maps, _map)				\
1187 	do {								\
1188 		AT91_PM_REPLACE_MODE((_maps), BIT(AT91_PM_IOMAP_##_map),\
1189 				     (soc_pm.data.standby_mode),	\
1190 				     (soc_pm.data.suspend_mode));	\
1191 		AT91_PM_REPLACE_MODE((_maps), BIT(AT91_PM_IOMAP_##_map),\
1192 				     (soc_pm.data.suspend_mode),	\
1193 				     (soc_pm.data.standby_mode));	\
1194 	} while (0)
1195 
1196 static int __init at91_pm_get_eth_clks(struct device_node *np,
1197 				       struct clk_bulk_data *clks)
1198 {
1199 	clks[AT91_PM_ETH_PCLK].clk = of_clk_get_by_name(np, "pclk");
1200 	if (IS_ERR(clks[AT91_PM_ETH_PCLK].clk))
1201 		return PTR_ERR(clks[AT91_PM_ETH_PCLK].clk);
1202 
1203 	clks[AT91_PM_ETH_HCLK].clk = of_clk_get_by_name(np, "hclk");
1204 	if (IS_ERR(clks[AT91_PM_ETH_HCLK].clk))
1205 		return PTR_ERR(clks[AT91_PM_ETH_HCLK].clk);
1206 
1207 	return 0;
1208 }
1209 
1210 static int __init at91_pm_eth_clks_empty(struct clk_bulk_data *clks)
1211 {
1212 	return IS_ERR(clks[AT91_PM_ETH_PCLK].clk) ||
1213 	       IS_ERR(clks[AT91_PM_ETH_HCLK].clk);
1214 }
1215 
1216 static void __init at91_pm_modes_init(const u32 *maps, int len)
1217 {
1218 	struct at91_pm_quirk_eth *gmac = &soc_pm.quirks.eth[AT91_PM_G_ETH];
1219 	struct at91_pm_quirk_eth *emac = &soc_pm.quirks.eth[AT91_PM_E_ETH];
1220 	struct device_node *np;
1221 	int ret;
1222 
1223 	ret = at91_pm_backup_init();
1224 	if (ret) {
1225 		if (soc_pm.data.standby_mode == AT91_PM_BACKUP)
1226 			soc_pm.data.standby_mode = AT91_PM_ULP0;
1227 		if (soc_pm.data.suspend_mode == AT91_PM_BACKUP)
1228 			soc_pm.data.suspend_mode = AT91_PM_ULP0;
1229 	}
1230 
1231 	if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC) ||
1232 	    maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC)) {
1233 		np = of_find_matching_node(NULL, atmel_shdwc_ids);
1234 		if (!np) {
1235 			pr_warn("%s: failed to find shdwc!\n", __func__);
1236 			AT91_PM_REPLACE_MODES(maps, SHDWC);
1237 		} else {
1238 			soc_pm.data.shdwc = of_iomap(np, 0);
1239 			of_node_put(np);
1240 		}
1241 	}
1242 
1243 	if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU) ||
1244 	    maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU)) {
1245 		np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-sfrbu");
1246 		if (!np) {
1247 			pr_warn("%s: failed to find sfrbu!\n", __func__);
1248 			AT91_PM_REPLACE_MODES(maps, SFRBU);
1249 		} else {
1250 			soc_pm.data.sfrbu = of_iomap(np, 0);
1251 			of_node_put(np);
1252 		}
1253 	}
1254 
1255 	if ((at91_is_pm_mode_active(AT91_PM_ULP1) ||
1256 	     at91_is_pm_mode_active(AT91_PM_ULP0) ||
1257 	     at91_is_pm_mode_active(AT91_PM_ULP0_FAST)) &&
1258 	    (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(ETHC) ||
1259 	     maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(ETHC))) {
1260 		np = of_find_matching_node(NULL, gmac_ids);
1261 		if (!np) {
1262 			np = of_find_matching_node(NULL, emac_ids);
1263 			if (np)
1264 				goto get_emac_clks;
1265 			AT91_PM_REPLACE_MODES(maps, ETHC);
1266 			goto unmap_unused_nodes;
1267 		} else {
1268 			gmac->np = np;
1269 			at91_pm_get_eth_clks(np, gmac->clks);
1270 		}
1271 
1272 		np = of_find_matching_node(NULL, emac_ids);
1273 		if (!np) {
1274 			if (at91_pm_eth_clks_empty(gmac->clks))
1275 				AT91_PM_REPLACE_MODES(maps, ETHC);
1276 		} else {
1277 get_emac_clks:
1278 			emac->np = np;
1279 			ret = at91_pm_get_eth_clks(np, emac->clks);
1280 			if (ret && at91_pm_eth_clks_empty(gmac->clks)) {
1281 				of_node_put(gmac->np);
1282 				of_node_put(emac->np);
1283 				gmac->np = NULL;
1284 				emac->np = NULL;
1285 			}
1286 		}
1287 	}
1288 
1289 unmap_unused_nodes:
1290 	/* Unmap all unnecessary. */
1291 	if (soc_pm.data.shdwc &&
1292 	    !(maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC) ||
1293 	      maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC))) {
1294 		iounmap(soc_pm.data.shdwc);
1295 		soc_pm.data.shdwc = NULL;
1296 	}
1297 
1298 	if (soc_pm.data.sfrbu &&
1299 	    !(maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU) ||
1300 	      maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU))) {
1301 		iounmap(soc_pm.data.sfrbu);
1302 		soc_pm.data.sfrbu = NULL;
1303 	}
1304 
1305 	return;
1306 }
1307 
1308 struct pmc_info {
1309 	unsigned long uhp_udp_mask;
1310 	unsigned long mckr;
1311 	unsigned long version;
1312 };
1313 
1314 static const struct pmc_info pmc_infos[] __initconst = {
1315 	{
1316 		.uhp_udp_mask = AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP,
1317 		.mckr = 0x30,
1318 		.version = AT91_PMC_V1,
1319 	},
1320 
1321 	{
1322 		.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP,
1323 		.mckr = 0x30,
1324 		.version = AT91_PMC_V1,
1325 	},
1326 	{
1327 		.uhp_udp_mask = AT91SAM926x_PMC_UHP,
1328 		.mckr = 0x30,
1329 		.version = AT91_PMC_V1,
1330 	},
1331 	{	.uhp_udp_mask = 0,
1332 		.mckr = 0x30,
1333 		.version = AT91_PMC_V1,
1334 	},
1335 	{
1336 		.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP,
1337 		.mckr = 0x28,
1338 		.version = AT91_PMC_V2,
1339 	},
1340 	{
1341 		.mckr = 0x28,
1342 		.version = AT91_PMC_V2,
1343 	},
1344 
1345 };
1346 
1347 static const struct of_device_id atmel_pmc_ids[] __initconst = {
1348 	{ .compatible = "atmel,at91rm9200-pmc", .data = &pmc_infos[0] },
1349 	{ .compatible = "atmel,at91sam9260-pmc", .data = &pmc_infos[1] },
1350 	{ .compatible = "atmel,at91sam9261-pmc", .data = &pmc_infos[1] },
1351 	{ .compatible = "atmel,at91sam9263-pmc", .data = &pmc_infos[1] },
1352 	{ .compatible = "atmel,at91sam9g45-pmc", .data = &pmc_infos[2] },
1353 	{ .compatible = "atmel,at91sam9n12-pmc", .data = &pmc_infos[1] },
1354 	{ .compatible = "atmel,at91sam9rl-pmc", .data = &pmc_infos[3] },
1355 	{ .compatible = "atmel,at91sam9x5-pmc", .data = &pmc_infos[1] },
1356 	{ .compatible = "atmel,sama5d3-pmc", .data = &pmc_infos[1] },
1357 	{ .compatible = "atmel,sama5d4-pmc", .data = &pmc_infos[1] },
1358 	{ .compatible = "atmel,sama5d2-pmc", .data = &pmc_infos[1] },
1359 	{ .compatible = "microchip,sam9x60-pmc", .data = &pmc_infos[4] },
1360 	{ .compatible = "microchip,sama7g5-pmc", .data = &pmc_infos[5] },
1361 	{ /* sentinel */ },
1362 };
1363 
1364 static void __init at91_pm_modes_validate(const int *modes, int len)
1365 {
1366 	u8 i, standby = 0, suspend = 0;
1367 	int mode;
1368 
1369 	for (i = 0; i < len; i++) {
1370 		if (standby && suspend)
1371 			break;
1372 
1373 		if (modes[i] == soc_pm.data.standby_mode && !standby) {
1374 			standby = 1;
1375 			continue;
1376 		}
1377 
1378 		if (modes[i] == soc_pm.data.suspend_mode && !suspend) {
1379 			suspend = 1;
1380 			continue;
1381 		}
1382 	}
1383 
1384 	if (!standby) {
1385 		if (soc_pm.data.suspend_mode == AT91_PM_STANDBY)
1386 			mode = AT91_PM_ULP0;
1387 		else
1388 			mode = AT91_PM_STANDBY;
1389 
1390 		pr_warn("AT91: PM: %s mode not supported! Using %s.\n",
1391 			pm_modes[soc_pm.data.standby_mode].pattern,
1392 			pm_modes[mode].pattern);
1393 		soc_pm.data.standby_mode = mode;
1394 	}
1395 
1396 	if (!suspend) {
1397 		if (soc_pm.data.standby_mode == AT91_PM_ULP0)
1398 			mode = AT91_PM_STANDBY;
1399 		else
1400 			mode = AT91_PM_ULP0;
1401 
1402 		pr_warn("AT91: PM: %s mode not supported! Using %s.\n",
1403 			pm_modes[soc_pm.data.suspend_mode].pattern,
1404 			pm_modes[mode].pattern);
1405 		soc_pm.data.suspend_mode = mode;
1406 	}
1407 }
1408 
1409 static void __init at91_pm_init(void (*pm_idle)(void))
1410 {
1411 	struct device_node *pmc_np;
1412 	const struct of_device_id *of_id;
1413 	const struct pmc_info *pmc;
1414 
1415 	if (at91_cpuidle_device.dev.platform_data)
1416 		platform_device_register(&at91_cpuidle_device);
1417 
1418 	pmc_np = of_find_matching_node_and_match(NULL, atmel_pmc_ids, &of_id);
1419 	soc_pm.data.pmc = of_iomap(pmc_np, 0);
1420 	of_node_put(pmc_np);
1421 	if (!soc_pm.data.pmc) {
1422 		pr_err("AT91: PM not supported, PMC not found\n");
1423 		return;
1424 	}
1425 
1426 	pmc = of_id->data;
1427 	soc_pm.data.uhp_udp_mask = pmc->uhp_udp_mask;
1428 	soc_pm.data.pmc_mckr_offset = pmc->mckr;
1429 	soc_pm.data.pmc_version = pmc->version;
1430 
1431 	if (pm_idle)
1432 		arm_pm_idle = pm_idle;
1433 
1434 	at91_pm_sram_init();
1435 
1436 	if (at91_suspend_sram_fn) {
1437 		suspend_set_ops(&at91_pm_ops);
1438 		pr_info("AT91: PM: standby: %s, suspend: %s\n",
1439 			pm_modes[soc_pm.data.standby_mode].pattern,
1440 			pm_modes[soc_pm.data.suspend_mode].pattern);
1441 	} else {
1442 		pr_info("AT91: PM not supported, due to no SRAM allocated\n");
1443 	}
1444 }
1445 
1446 void __init at91rm9200_pm_init(void)
1447 {
1448 	int ret;
1449 
1450 	if (!IS_ENABLED(CONFIG_SOC_AT91RM9200))
1451 		return;
1452 
1453 	/*
1454 	 * Force STANDBY and ULP0 mode to avoid calling
1455 	 * at91_pm_modes_validate() which may increase booting time.
1456 	 * Platform supports anyway only STANDBY and ULP0 modes.
1457 	 */
1458 	soc_pm.data.standby_mode = AT91_PM_STANDBY;
1459 	soc_pm.data.suspend_mode = AT91_PM_ULP0;
1460 
1461 	ret = at91_dt_ramc(false);
1462 	if (ret)
1463 		return;
1464 
1465 	/*
1466 	 * AT91RM9200 SDRAM low-power mode cannot be used with self-refresh.
1467 	 */
1468 	at91_ramc_write(0, AT91_MC_SDRAMC_LPR, 0);
1469 
1470 	at91_pm_init(at91rm9200_idle);
1471 }
1472 
1473 void __init sam9x60_pm_init(void)
1474 {
1475 	static const int modes[] __initconst = {
1476 		AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
1477 	};
1478 	static const int iomaps[] __initconst = {
1479 		[AT91_PM_ULP1]		= AT91_PM_IOMAP(SHDWC),
1480 	};
1481 	int ret;
1482 
1483 	if (!IS_ENABLED(CONFIG_SOC_SAM9X60))
1484 		return;
1485 
1486 	at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1487 	at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1488 	ret = at91_dt_ramc(false);
1489 	if (ret)
1490 		return;
1491 
1492 	at91_pm_init(NULL);
1493 
1494 	soc_pm.ws_ids = sam9x60_ws_ids;
1495 	soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
1496 }
1497 
1498 void __init at91sam9_pm_init(void)
1499 {
1500 	int ret;
1501 
1502 	if (!IS_ENABLED(CONFIG_SOC_AT91SAM9))
1503 		return;
1504 
1505 	/*
1506 	 * Force STANDBY and ULP0 mode to avoid calling
1507 	 * at91_pm_modes_validate() which may increase booting time.
1508 	 * Platform supports anyway only STANDBY and ULP0 modes.
1509 	 */
1510 	soc_pm.data.standby_mode = AT91_PM_STANDBY;
1511 	soc_pm.data.suspend_mode = AT91_PM_ULP0;
1512 
1513 	ret = at91_dt_ramc(false);
1514 	if (ret)
1515 		return;
1516 
1517 	at91_pm_init(at91sam9_idle);
1518 }
1519 
1520 void __init sama5_pm_init(void)
1521 {
1522 	static const int modes[] __initconst = {
1523 		AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST,
1524 	};
1525 	static const u32 iomaps[] __initconst = {
1526 		[AT91_PM_ULP0]		= AT91_PM_IOMAP(ETHC),
1527 		[AT91_PM_ULP0_FAST]	= AT91_PM_IOMAP(ETHC),
1528 	};
1529 	int ret;
1530 
1531 	if (!IS_ENABLED(CONFIG_SOC_SAMA5))
1532 		return;
1533 
1534 	at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1535 	at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1536 	ret = at91_dt_ramc(false);
1537 	if (ret)
1538 		return;
1539 
1540 	at91_pm_init(NULL);
1541 
1542 	/* Quirks applies to ULP0, ULP0 fast and ULP1 modes. */
1543 	soc_pm.quirks.eth[AT91_PM_G_ETH].modes = BIT(AT91_PM_ULP0) |
1544 						 BIT(AT91_PM_ULP0_FAST) |
1545 						 BIT(AT91_PM_ULP1);
1546 	/* Do not suspend in ULP0, ULP0 fast if GETH is the only wakeup source. */
1547 	soc_pm.quirks.eth[AT91_PM_G_ETH].dns_modes = BIT(AT91_PM_ULP0) |
1548 						     BIT(AT91_PM_ULP0_FAST);
1549 }
1550 
1551 void __init sama5d2_pm_init(void)
1552 {
1553 	static const int modes[] __initconst = {
1554 		AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
1555 		AT91_PM_BACKUP,
1556 	};
1557 	static const u32 iomaps[] __initconst = {
1558 		[AT91_PM_ULP0]		= AT91_PM_IOMAP(ETHC),
1559 		[AT91_PM_ULP0_FAST]	= AT91_PM_IOMAP(ETHC),
1560 		[AT91_PM_ULP1]		= AT91_PM_IOMAP(SHDWC) |
1561 					  AT91_PM_IOMAP(ETHC),
1562 		[AT91_PM_BACKUP]	= AT91_PM_IOMAP(SHDWC) |
1563 					  AT91_PM_IOMAP(SFRBU),
1564 	};
1565 	int ret;
1566 
1567 	if (!IS_ENABLED(CONFIG_SOC_SAMA5D2))
1568 		return;
1569 
1570 	if (IS_ENABLED(CONFIG_ATMEL_SECURE_PM)) {
1571 		pr_warn("AT91: Secure PM: ignoring standby mode\n");
1572 		at91_pm_secure_init();
1573 		return;
1574 	}
1575 
1576 	at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1577 	at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1578 	ret = at91_dt_ramc(false);
1579 	if (ret)
1580 		return;
1581 
1582 	at91_pm_init(NULL);
1583 
1584 	soc_pm.ws_ids = sama5d2_ws_ids;
1585 	soc_pm.config_shdwc_ws = at91_sama5d2_config_shdwc_ws;
1586 	soc_pm.config_pmc_ws = at91_sama5d2_config_pmc_ws;
1587 
1588 	soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
1589 	soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
1590 	soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
1591 	soc_pm.sfrbu_regs.pswbu.state = BIT(3);
1592 
1593 	/* Quirk applies to ULP0, ULP0 fast and ULP1 modes. */
1594 	soc_pm.quirks.eth[AT91_PM_G_ETH].modes = BIT(AT91_PM_ULP0) |
1595 						 BIT(AT91_PM_ULP0_FAST) |
1596 						 BIT(AT91_PM_ULP1);
1597 	/*
1598 	 * Do not suspend in ULP0, ULP0 fast if GETH is the only wakeup
1599 	 * source.
1600 	 */
1601 	soc_pm.quirks.eth[AT91_PM_G_ETH].dns_modes = BIT(AT91_PM_ULP0) |
1602 						     BIT(AT91_PM_ULP0_FAST);
1603 }
1604 
1605 void __init sama7_pm_init(void)
1606 {
1607 	static const int modes[] __initconst = {
1608 		AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP1, AT91_PM_BACKUP,
1609 	};
1610 	static const u32 iomaps[] __initconst = {
1611 		[AT91_PM_ULP0]		= AT91_PM_IOMAP(SFRBU),
1612 		[AT91_PM_ULP1]		= AT91_PM_IOMAP(SFRBU) |
1613 					  AT91_PM_IOMAP(SHDWC) |
1614 					  AT91_PM_IOMAP(ETHC),
1615 		[AT91_PM_BACKUP]	= AT91_PM_IOMAP(SFRBU) |
1616 					  AT91_PM_IOMAP(SHDWC),
1617 	};
1618 	int ret;
1619 
1620 	if (!IS_ENABLED(CONFIG_SOC_SAMA7))
1621 		return;
1622 
1623 	at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1624 
1625 	ret = at91_dt_ramc(true);
1626 	if (ret)
1627 		return;
1628 
1629 	at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1630 	at91_pm_init(NULL);
1631 
1632 	soc_pm.ws_ids = sama7g5_ws_ids;
1633 	soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
1634 
1635 	soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
1636 	soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
1637 	soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
1638 	soc_pm.sfrbu_regs.pswbu.state = BIT(2);
1639 
1640 	/* Quirks applies to ULP1 for both Ethernet interfaces. */
1641 	soc_pm.quirks.eth[AT91_PM_E_ETH].modes = BIT(AT91_PM_ULP1);
1642 	soc_pm.quirks.eth[AT91_PM_G_ETH].modes = BIT(AT91_PM_ULP1);
1643 }
1644 
1645 static int __init at91_pm_modes_select(char *str)
1646 {
1647 	char *s;
1648 	substring_t args[MAX_OPT_ARGS];
1649 	int standby, suspend;
1650 
1651 	if (!str)
1652 		return 0;
1653 
1654 	s = strsep(&str, ",");
1655 	standby = match_token(s, pm_modes, args);
1656 	if (standby < 0)
1657 		return 0;
1658 
1659 	suspend = match_token(str, pm_modes, args);
1660 	if (suspend < 0)
1661 		return 0;
1662 
1663 	soc_pm.data.standby_mode = standby;
1664 	soc_pm.data.suspend_mode = suspend;
1665 
1666 	return 0;
1667 }
1668 early_param("atmel.pm_modes", at91_pm_modes_select);
1669