Merge tag 'gpio-updates-for-v5.18' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / arm / mach-at91 / pm.c
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/at91_pmc.h>
19 #include <linux/platform_data/atmel.h>
20
21 #include <soc/at91/pm.h>
22
23 #include <asm/cacheflush.h>
24 #include <asm/fncpy.h>
25 #include <asm/system_misc.h>
26 #include <asm/suspend.h>
27
28 #include "generic.h"
29 #include "pm.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_offsets: 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  * struct at91_soc_pm - AT91 SoC power management data structure
65  * @config_shdwc_ws: wakeup sources configuration function for SHDWC
66  * @config_pmc_ws: wakeup srouces configuration function for PMC
67  * @ws_ids: wakup sources of_device_id array
68  * @data: PM data to be used on last phase of suspend
69  * @sfrbu_regs: SFRBU registers mapping
70  * @bu: backup unit mapped data (for backup mode)
71  * @memcs: memory chip select
72  */
73 struct at91_soc_pm {
74         int (*config_shdwc_ws)(void __iomem *shdwc, u32 *mode, u32 *polarity);
75         int (*config_pmc_ws)(void __iomem *pmc, u32 mode, u32 polarity);
76         const struct of_device_id *ws_ids;
77         struct at91_pm_bu *bu;
78         struct at91_pm_data data;
79         struct at91_pm_sfrbu_regs sfrbu_regs;
80         void *memcs;
81 };
82
83 /**
84  * enum at91_pm_iomaps: IOs that needs to be mapped for different PM modes
85  * @AT91_PM_IOMAP_SHDWC:        SHDWC controller
86  * @AT91_PM_IOMAP_SFRBU:        SFRBU controller
87  */
88 enum at91_pm_iomaps {
89         AT91_PM_IOMAP_SHDWC,
90         AT91_PM_IOMAP_SFRBU,
91 };
92
93 #define AT91_PM_IOMAP(name)     BIT(AT91_PM_IOMAP_##name)
94
95 static struct at91_soc_pm soc_pm = {
96         .data = {
97                 .standby_mode = AT91_PM_STANDBY,
98                 .suspend_mode = AT91_PM_ULP0,
99         },
100 };
101
102 static const match_table_t pm_modes __initconst = {
103         { AT91_PM_STANDBY,      "standby" },
104         { AT91_PM_ULP0,         "ulp0" },
105         { AT91_PM_ULP0_FAST,    "ulp0-fast" },
106         { AT91_PM_ULP1,         "ulp1" },
107         { AT91_PM_BACKUP,       "backup" },
108         { -1, NULL },
109 };
110
111 #define at91_ramc_read(id, field) \
112         __raw_readl(soc_pm.data.ramc[id] + field)
113
114 #define at91_ramc_write(id, field, value) \
115         __raw_writel(value, soc_pm.data.ramc[id] + field)
116
117 static int at91_pm_valid_state(suspend_state_t state)
118 {
119         switch (state) {
120                 case PM_SUSPEND_ON:
121                 case PM_SUSPEND_STANDBY:
122                 case PM_SUSPEND_MEM:
123                         return 1;
124
125                 default:
126                         return 0;
127         }
128 }
129
130 static int canary = 0xA5A5A5A5;
131
132 struct wakeup_source_info {
133         unsigned int pmc_fsmr_bit;
134         unsigned int shdwc_mr_bit;
135         bool set_polarity;
136 };
137
138 static const struct wakeup_source_info ws_info[] = {
139         { .pmc_fsmr_bit = AT91_PMC_FSTT(10),    .set_polarity = true },
140         { .pmc_fsmr_bit = AT91_PMC_RTCAL,       .shdwc_mr_bit = BIT(17) },
141         { .pmc_fsmr_bit = AT91_PMC_USBAL },
142         { .pmc_fsmr_bit = AT91_PMC_SDMMC_CD },
143         { .pmc_fsmr_bit = AT91_PMC_RTTAL },
144         { .pmc_fsmr_bit = AT91_PMC_RXLP_MCE },
145 };
146
147 static const struct of_device_id sama5d2_ws_ids[] = {
148         { .compatible = "atmel,sama5d2-gem",            .data = &ws_info[0] },
149         { .compatible = "atmel,at91rm9200-rtc",         .data = &ws_info[1] },
150         { .compatible = "atmel,sama5d3-udc",            .data = &ws_info[2] },
151         { .compatible = "atmel,at91rm9200-ohci",        .data = &ws_info[2] },
152         { .compatible = "usb-ohci",                     .data = &ws_info[2] },
153         { .compatible = "atmel,at91sam9g45-ehci",       .data = &ws_info[2] },
154         { .compatible = "usb-ehci",                     .data = &ws_info[2] },
155         { .compatible = "atmel,sama5d2-sdhci",          .data = &ws_info[3] },
156         { /* sentinel */ }
157 };
158
159 static const struct of_device_id sam9x60_ws_ids[] = {
160         { .compatible = "atmel,at91sam9x5-rtc",         .data = &ws_info[1] },
161         { .compatible = "atmel,at91rm9200-ohci",        .data = &ws_info[2] },
162         { .compatible = "usb-ohci",                     .data = &ws_info[2] },
163         { .compatible = "atmel,at91sam9g45-ehci",       .data = &ws_info[2] },
164         { .compatible = "usb-ehci",                     .data = &ws_info[2] },
165         { .compatible = "atmel,at91sam9260-rtt",        .data = &ws_info[4] },
166         { .compatible = "cdns,sam9x60-macb",            .data = &ws_info[5] },
167         { /* sentinel */ }
168 };
169
170 static const struct of_device_id sama7g5_ws_ids[] = {
171         { .compatible = "atmel,at91sam9x5-rtc",         .data = &ws_info[1] },
172         { .compatible = "microchip,sama7g5-ohci",       .data = &ws_info[2] },
173         { .compatible = "usb-ohci",                     .data = &ws_info[2] },
174         { .compatible = "atmel,at91sam9g45-ehci",       .data = &ws_info[2] },
175         { .compatible = "usb-ehci",                     .data = &ws_info[2] },
176         { .compatible = "microchip,sama7g5-sdhci",      .data = &ws_info[3] },
177         { .compatible = "atmel,at91sam9260-rtt",        .data = &ws_info[4] },
178         { /* sentinel */ }
179 };
180
181 static int at91_pm_config_ws(unsigned int pm_mode, bool set)
182 {
183         const struct wakeup_source_info *wsi;
184         const struct of_device_id *match;
185         struct platform_device *pdev;
186         struct device_node *np;
187         unsigned int mode = 0, polarity = 0, val = 0;
188
189         if (pm_mode != AT91_PM_ULP1)
190                 return 0;
191
192         if (!soc_pm.data.pmc || !soc_pm.data.shdwc || !soc_pm.ws_ids)
193                 return -EPERM;
194
195         if (!set) {
196                 writel(mode, soc_pm.data.pmc + AT91_PMC_FSMR);
197                 return 0;
198         }
199
200         if (soc_pm.config_shdwc_ws)
201                 soc_pm.config_shdwc_ws(soc_pm.data.shdwc, &mode, &polarity);
202
203         /* SHDWC.MR */
204         val = readl(soc_pm.data.shdwc + 0x04);
205
206         /* Loop through defined wakeup sources. */
207         for_each_matching_node_and_match(np, soc_pm.ws_ids, &match) {
208                 pdev = of_find_device_by_node(np);
209                 if (!pdev)
210                         continue;
211
212                 if (device_may_wakeup(&pdev->dev)) {
213                         wsi = match->data;
214
215                         /* Check if enabled on SHDWC. */
216                         if (wsi->shdwc_mr_bit && !(val & wsi->shdwc_mr_bit))
217                                 goto put_device;
218
219                         mode |= wsi->pmc_fsmr_bit;
220                         if (wsi->set_polarity)
221                                 polarity |= wsi->pmc_fsmr_bit;
222                 }
223
224 put_device:
225                 put_device(&pdev->dev);
226         }
227
228         if (mode) {
229                 if (soc_pm.config_pmc_ws)
230                         soc_pm.config_pmc_ws(soc_pm.data.pmc, mode, polarity);
231         } else {
232                 pr_err("AT91: PM: no ULP1 wakeup sources found!");
233         }
234
235         return mode ? 0 : -EPERM;
236 }
237
238 static int at91_sama5d2_config_shdwc_ws(void __iomem *shdwc, u32 *mode,
239                                         u32 *polarity)
240 {
241         u32 val;
242
243         /* SHDWC.WUIR */
244         val = readl(shdwc + 0x0c);
245         *mode |= (val & 0x3ff);
246         *polarity |= ((val >> 16) & 0x3ff);
247
248         return 0;
249 }
250
251 static int at91_sama5d2_config_pmc_ws(void __iomem *pmc, u32 mode, u32 polarity)
252 {
253         writel(mode, pmc + AT91_PMC_FSMR);
254         writel(polarity, pmc + AT91_PMC_FSPR);
255
256         return 0;
257 }
258
259 static int at91_sam9x60_config_pmc_ws(void __iomem *pmc, u32 mode, u32 polarity)
260 {
261         writel(mode, pmc + AT91_PMC_FSMR);
262
263         return 0;
264 }
265
266 /*
267  * Called after processes are frozen, but before we shutdown devices.
268  */
269 static int at91_pm_begin(suspend_state_t state)
270 {
271         int ret;
272
273         switch (state) {
274         case PM_SUSPEND_MEM:
275                 soc_pm.data.mode = soc_pm.data.suspend_mode;
276                 break;
277
278         case PM_SUSPEND_STANDBY:
279                 soc_pm.data.mode = soc_pm.data.standby_mode;
280                 break;
281
282         default:
283                 soc_pm.data.mode = -1;
284         }
285
286         ret = at91_pm_config_ws(soc_pm.data.mode, true);
287         if (ret)
288                 return ret;
289
290         if (soc_pm.data.mode == AT91_PM_BACKUP)
291                 soc_pm.bu->suspended = 1;
292         else if (soc_pm.bu)
293                 soc_pm.bu->suspended = 0;
294
295         return 0;
296 }
297
298 /*
299  * Verify that all the clocks are correct before entering
300  * slow-clock mode.
301  */
302 static int at91_pm_verify_clocks(void)
303 {
304         unsigned long scsr;
305         int i;
306
307         scsr = readl(soc_pm.data.pmc + AT91_PMC_SCSR);
308
309         /* USB must not be using PLLB */
310         if ((scsr & soc_pm.data.uhp_udp_mask) != 0) {
311                 pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
312                 return 0;
313         }
314
315         /* PCK0..PCK3 must be disabled, or configured to use clk32k */
316         for (i = 0; i < 4; i++) {
317                 u32 css;
318
319                 if ((scsr & (AT91_PMC_PCK0 << i)) == 0)
320                         continue;
321                 css = readl(soc_pm.data.pmc + AT91_PMC_PCKR(i)) & AT91_PMC_CSS;
322                 if (css != AT91_PMC_CSS_SLOW) {
323                         pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css);
324                         return 0;
325                 }
326         }
327
328         return 1;
329 }
330
331 /*
332  * Call this from platform driver suspend() to see how deeply to suspend.
333  * For example, some controllers (like OHCI) need one of the PLL clocks
334  * in order to act as a wakeup source, and those are not available when
335  * going into slow clock mode.
336  *
337  * REVISIT: generalize as clk_will_be_available(clk)?  Other platforms have
338  * the very same problem (but not using at91 main_clk), and it'd be better
339  * to add one generic API rather than lots of platform-specific ones.
340  */
341 int at91_suspend_entering_slow_clock(void)
342 {
343         return (soc_pm.data.mode >= AT91_PM_ULP0);
344 }
345 EXPORT_SYMBOL(at91_suspend_entering_slow_clock);
346
347 static void (*at91_suspend_sram_fn)(struct at91_pm_data *);
348 extern void at91_pm_suspend_in_sram(struct at91_pm_data *pm_data);
349 extern u32 at91_pm_suspend_in_sram_sz;
350
351 static int at91_suspend_finish(unsigned long val)
352 {
353         int i;
354
355         if (soc_pm.data.mode == AT91_PM_BACKUP && soc_pm.data.ramc_phy) {
356                 /*
357                  * The 1st 8 words of memory might get corrupted in the process
358                  * of DDR PHY recalibration; it is saved here in securam and it
359                  * will be restored later, after recalibration, by bootloader
360                  */
361                 for (i = 1; i < BACKUP_DDR_PHY_CALIBRATION; i++)
362                         soc_pm.bu->ddr_phy_calibration[i] =
363                                 *((unsigned int *)soc_pm.memcs + (i - 1));
364         }
365
366         flush_cache_all();
367         outer_disable();
368
369         at91_suspend_sram_fn(&soc_pm.data);
370
371         return 0;
372 }
373
374 static void at91_pm_switch_ba_to_vbat(void)
375 {
376         unsigned int offset = offsetof(struct at91_pm_sfrbu_regs, pswbu);
377         unsigned int val;
378
379         /* Just for safety. */
380         if (!soc_pm.data.sfrbu)
381                 return;
382
383         val = readl(soc_pm.data.sfrbu + offset);
384
385         /* Already on VBAT. */
386         if (!(val & soc_pm.sfrbu_regs.pswbu.state))
387                 return;
388
389         val &= ~soc_pm.sfrbu_regs.pswbu.softsw;
390         val |= soc_pm.sfrbu_regs.pswbu.key | soc_pm.sfrbu_regs.pswbu.ctrl;
391         writel(val, soc_pm.data.sfrbu + offset);
392
393         /* Wait for update. */
394         val = readl(soc_pm.data.sfrbu + offset);
395         while (val & soc_pm.sfrbu_regs.pswbu.state)
396                 val = readl(soc_pm.data.sfrbu + offset);
397 }
398
399 static void at91_pm_suspend(suspend_state_t state)
400 {
401         if (soc_pm.data.mode == AT91_PM_BACKUP) {
402                 at91_pm_switch_ba_to_vbat();
403
404                 cpu_suspend(0, at91_suspend_finish);
405
406                 /* The SRAM is lost between suspend cycles */
407                 at91_suspend_sram_fn = fncpy(at91_suspend_sram_fn,
408                                              &at91_pm_suspend_in_sram,
409                                              at91_pm_suspend_in_sram_sz);
410         } else {
411                 at91_suspend_finish(0);
412         }
413
414         outer_resume();
415 }
416
417 /*
418  * STANDBY mode has *all* drivers suspended; ignores irqs not marked as 'wakeup'
419  * event sources; and reduces DRAM power.  But otherwise it's identical to
420  * PM_SUSPEND_ON: cpu idle, and nothing fancy done with main or cpu clocks.
421  *
422  * AT91_PM_ULP0 is like STANDBY plus slow clock mode, so drivers must
423  * suspend more deeply, the master clock switches to the clk32k and turns off
424  * the main oscillator
425  *
426  * AT91_PM_BACKUP turns off the whole SoC after placing the DDR in self refresh
427  */
428 static int at91_pm_enter(suspend_state_t state)
429 {
430 #ifdef CONFIG_PINCTRL_AT91
431         /*
432          * FIXME: this is needed to communicate between the pinctrl driver and
433          * the PM implementation in the machine. Possibly part of the PM
434          * implementation should be moved down into the pinctrl driver and get
435          * called as part of the generic suspend/resume path.
436          */
437         at91_pinctrl_gpio_suspend();
438 #endif
439
440         switch (state) {
441         case PM_SUSPEND_MEM:
442         case PM_SUSPEND_STANDBY:
443                 /*
444                  * Ensure that clocks are in a valid state.
445                  */
446                 if (soc_pm.data.mode >= AT91_PM_ULP0 &&
447                     !at91_pm_verify_clocks())
448                         goto error;
449
450                 at91_pm_suspend(state);
451
452                 break;
453
454         case PM_SUSPEND_ON:
455                 cpu_do_idle();
456                 break;
457
458         default:
459                 pr_debug("AT91: PM - bogus suspend state %d\n", state);
460                 goto error;
461         }
462
463 error:
464 #ifdef CONFIG_PINCTRL_AT91
465         at91_pinctrl_gpio_resume();
466 #endif
467         return 0;
468 }
469
470 /*
471  * Called right prior to thawing processes.
472  */
473 static void at91_pm_end(void)
474 {
475         at91_pm_config_ws(soc_pm.data.mode, false);
476 }
477
478
479 static const struct platform_suspend_ops at91_pm_ops = {
480         .valid  = at91_pm_valid_state,
481         .begin  = at91_pm_begin,
482         .enter  = at91_pm_enter,
483         .end    = at91_pm_end,
484 };
485
486 static struct platform_device at91_cpuidle_device = {
487         .name = "cpuidle-at91",
488 };
489
490 /*
491  * The AT91RM9200 goes into self-refresh mode with this command, and will
492  * terminate self-refresh automatically on the next SDRAM access.
493  *
494  * Self-refresh mode is exited as soon as a memory access is made, but we don't
495  * know for sure when that happens. However, we need to restore the low-power
496  * mode if it was enabled before going idle. Restoring low-power mode while
497  * still in self-refresh is "not recommended", but seems to work.
498  */
499 static void at91rm9200_standby(void)
500 {
501         asm volatile(
502                 "b    1f\n\t"
503                 ".align    5\n\t"
504                 "1:  mcr    p15, 0, %0, c7, c10, 4\n\t"
505                 "    str    %2, [%1, %3]\n\t"
506                 "    mcr    p15, 0, %0, c7, c0, 4\n\t"
507                 :
508                 : "r" (0), "r" (soc_pm.data.ramc[0]),
509                   "r" (1), "r" (AT91_MC_SDRAMC_SRR));
510 }
511
512 /* We manage both DDRAM/SDRAM controllers, we need more than one value to
513  * remember.
514  */
515 static void at91_ddr_standby(void)
516 {
517         /* Those two values allow us to delay self-refresh activation
518          * to the maximum. */
519         u32 lpr0, lpr1 = 0;
520         u32 mdr, saved_mdr0, saved_mdr1 = 0;
521         u32 saved_lpr0, saved_lpr1 = 0;
522
523         /* LPDDR1 --> force DDR2 mode during self-refresh */
524         saved_mdr0 = at91_ramc_read(0, AT91_DDRSDRC_MDR);
525         if ((saved_mdr0 & AT91_DDRSDRC_MD) == AT91_DDRSDRC_MD_LOW_POWER_DDR) {
526                 mdr = saved_mdr0 & ~AT91_DDRSDRC_MD;
527                 mdr |= AT91_DDRSDRC_MD_DDR2;
528                 at91_ramc_write(0, AT91_DDRSDRC_MDR, mdr);
529         }
530
531         if (soc_pm.data.ramc[1]) {
532                 saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
533                 lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
534                 lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
535                 saved_mdr1 = at91_ramc_read(1, AT91_DDRSDRC_MDR);
536                 if ((saved_mdr1 & AT91_DDRSDRC_MD) == AT91_DDRSDRC_MD_LOW_POWER_DDR) {
537                         mdr = saved_mdr1 & ~AT91_DDRSDRC_MD;
538                         mdr |= AT91_DDRSDRC_MD_DDR2;
539                         at91_ramc_write(1, AT91_DDRSDRC_MDR, mdr);
540                 }
541         }
542
543         saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
544         lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
545         lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
546
547         /* self-refresh mode now */
548         at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
549         if (soc_pm.data.ramc[1])
550                 at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
551
552         cpu_do_idle();
553
554         at91_ramc_write(0, AT91_DDRSDRC_MDR, saved_mdr0);
555         at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
556         if (soc_pm.data.ramc[1]) {
557                 at91_ramc_write(0, AT91_DDRSDRC_MDR, saved_mdr1);
558                 at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
559         }
560 }
561
562 static void sama5d3_ddr_standby(void)
563 {
564         u32 lpr0;
565         u32 saved_lpr0;
566
567         saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
568         lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
569         lpr0 |= AT91_DDRSDRC_LPCB_POWER_DOWN;
570
571         at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
572
573         cpu_do_idle();
574
575         at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
576 }
577
578 /* We manage both DDRAM/SDRAM controllers, we need more than one value to
579  * remember.
580  */
581 static void at91sam9_sdram_standby(void)
582 {
583         u32 lpr0, lpr1 = 0;
584         u32 saved_lpr0, saved_lpr1 = 0;
585
586         if (soc_pm.data.ramc[1]) {
587                 saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
588                 lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
589                 lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
590         }
591
592         saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
593         lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
594         lpr0 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
595
596         /* self-refresh mode now */
597         at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
598         if (soc_pm.data.ramc[1])
599                 at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
600
601         cpu_do_idle();
602
603         at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
604         if (soc_pm.data.ramc[1])
605                 at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
606 }
607
608 static void sama7g5_standby(void)
609 {
610         int pwrtmg, ratio;
611
612         pwrtmg = readl(soc_pm.data.ramc[0] + UDDRC_PWRCTL);
613         ratio = readl(soc_pm.data.pmc + AT91_PMC_RATIO);
614
615         /*
616          * Place RAM into self-refresh after a maximum idle clocks. The maximum
617          * idle clocks is configured by bootloader in
618          * UDDRC_PWRMGT.SELFREF_TO_X32.
619          */
620         writel(pwrtmg | UDDRC_PWRCTL_SELFREF_EN,
621                soc_pm.data.ramc[0] + UDDRC_PWRCTL);
622         /* Divide CPU clock by 16. */
623         writel(ratio & ~AT91_PMC_RATIO_RATIO, soc_pm.data.pmc + AT91_PMC_RATIO);
624
625         cpu_do_idle();
626
627         /* Restore previous configuration. */
628         writel(ratio, soc_pm.data.pmc + AT91_PMC_RATIO);
629         writel(pwrtmg, soc_pm.data.ramc[0] + UDDRC_PWRCTL);
630 }
631
632 struct ramc_info {
633         void (*idle)(void);
634         unsigned int memctrl;
635 };
636
637 static const struct ramc_info ramc_infos[] __initconst = {
638         { .idle = at91rm9200_standby, .memctrl = AT91_MEMCTRL_MC},
639         { .idle = at91sam9_sdram_standby, .memctrl = AT91_MEMCTRL_SDRAMC},
640         { .idle = at91_ddr_standby, .memctrl = AT91_MEMCTRL_DDRSDR},
641         { .idle = sama5d3_ddr_standby, .memctrl = AT91_MEMCTRL_DDRSDR},
642         { .idle = sama7g5_standby, },
643 };
644
645 static const struct of_device_id ramc_ids[] __initconst = {
646         { .compatible = "atmel,at91rm9200-sdramc", .data = &ramc_infos[0] },
647         { .compatible = "atmel,at91sam9260-sdramc", .data = &ramc_infos[1] },
648         { .compatible = "atmel,at91sam9g45-ddramc", .data = &ramc_infos[2] },
649         { .compatible = "atmel,sama5d3-ddramc", .data = &ramc_infos[3] },
650         { .compatible = "microchip,sama7g5-uddrc", .data = &ramc_infos[4], },
651         { /*sentinel*/ }
652 };
653
654 static const struct of_device_id ramc_phy_ids[] __initconst = {
655         { .compatible = "microchip,sama7g5-ddr3phy", },
656         { /* Sentinel. */ },
657 };
658
659 static __init int at91_dt_ramc(bool phy_mandatory)
660 {
661         struct device_node *np;
662         const struct of_device_id *of_id;
663         int idx = 0;
664         void *standby = NULL;
665         const struct ramc_info *ramc;
666         int ret;
667
668         for_each_matching_node_and_match(np, ramc_ids, &of_id) {
669                 soc_pm.data.ramc[idx] = of_iomap(np, 0);
670                 if (!soc_pm.data.ramc[idx]) {
671                         pr_err("unable to map ramc[%d] cpu registers\n", idx);
672                         ret = -ENOMEM;
673                         of_node_put(np);
674                         goto unmap_ramc;
675                 }
676
677                 ramc = of_id->data;
678                 if (ramc) {
679                         if (!standby)
680                                 standby = ramc->idle;
681                         soc_pm.data.memctrl = ramc->memctrl;
682                 }
683
684                 idx++;
685         }
686
687         if (!idx) {
688                 pr_err("unable to find compatible ram controller node in dtb\n");
689                 ret = -ENODEV;
690                 goto unmap_ramc;
691         }
692
693         /* Lookup for DDR PHY node, if any. */
694         for_each_matching_node_and_match(np, ramc_phy_ids, &of_id) {
695                 soc_pm.data.ramc_phy = of_iomap(np, 0);
696                 if (!soc_pm.data.ramc_phy) {
697                         pr_err("unable to map ramc phy cpu registers\n");
698                         ret = -ENOMEM;
699                         of_node_put(np);
700                         goto unmap_ramc;
701                 }
702         }
703
704         if (phy_mandatory && !soc_pm.data.ramc_phy) {
705                 pr_err("DDR PHY is mandatory!\n");
706                 ret = -ENODEV;
707                 goto unmap_ramc;
708         }
709
710         if (!standby) {
711                 pr_warn("ramc no standby function available\n");
712                 return 0;
713         }
714
715         at91_cpuidle_device.dev.platform_data = standby;
716
717         return 0;
718
719 unmap_ramc:
720         while (idx)
721                 iounmap(soc_pm.data.ramc[--idx]);
722
723         return ret;
724 }
725
726 static void at91rm9200_idle(void)
727 {
728         /*
729          * Disable the processor clock.  The processor will be automatically
730          * re-enabled by an interrupt or by a reset.
731          */
732         writel(AT91_PMC_PCK, soc_pm.data.pmc + AT91_PMC_SCDR);
733 }
734
735 static void at91sam9_idle(void)
736 {
737         writel(AT91_PMC_PCK, soc_pm.data.pmc + AT91_PMC_SCDR);
738         cpu_do_idle();
739 }
740
741 static void __init at91_pm_sram_init(void)
742 {
743         struct gen_pool *sram_pool;
744         phys_addr_t sram_pbase;
745         unsigned long sram_base;
746         struct device_node *node;
747         struct platform_device *pdev = NULL;
748
749         for_each_compatible_node(node, NULL, "mmio-sram") {
750                 pdev = of_find_device_by_node(node);
751                 if (pdev) {
752                         of_node_put(node);
753                         break;
754                 }
755         }
756
757         if (!pdev) {
758                 pr_warn("%s: failed to find sram device!\n", __func__);
759                 return;
760         }
761
762         sram_pool = gen_pool_get(&pdev->dev, NULL);
763         if (!sram_pool) {
764                 pr_warn("%s: sram pool unavailable!\n", __func__);
765                 goto out_put_device;
766         }
767
768         sram_base = gen_pool_alloc(sram_pool, at91_pm_suspend_in_sram_sz);
769         if (!sram_base) {
770                 pr_warn("%s: unable to alloc sram!\n", __func__);
771                 goto out_put_device;
772         }
773
774         sram_pbase = gen_pool_virt_to_phys(sram_pool, sram_base);
775         at91_suspend_sram_fn = __arm_ioremap_exec(sram_pbase,
776                                         at91_pm_suspend_in_sram_sz, false);
777         if (!at91_suspend_sram_fn) {
778                 pr_warn("SRAM: Could not map\n");
779                 goto out_put_device;
780         }
781
782         /* Copy the pm suspend handler to SRAM */
783         at91_suspend_sram_fn = fncpy(at91_suspend_sram_fn,
784                         &at91_pm_suspend_in_sram, at91_pm_suspend_in_sram_sz);
785         return;
786
787 out_put_device:
788         put_device(&pdev->dev);
789         return;
790 }
791
792 static bool __init at91_is_pm_mode_active(int pm_mode)
793 {
794         return (soc_pm.data.standby_mode == pm_mode ||
795                 soc_pm.data.suspend_mode == pm_mode);
796 }
797
798 static int __init at91_pm_backup_scan_memcs(unsigned long node,
799                                             const char *uname, int depth,
800                                             void *data)
801 {
802         const char *type;
803         const __be32 *reg;
804         int *located = data;
805         int size;
806
807         /* Memory node already located. */
808         if (*located)
809                 return 0;
810
811         type = of_get_flat_dt_prop(node, "device_type", NULL);
812
813         /* We are scanning "memory" nodes only. */
814         if (!type || strcmp(type, "memory"))
815                 return 0;
816
817         reg = of_get_flat_dt_prop(node, "reg", &size);
818         if (reg) {
819                 soc_pm.memcs = __va((phys_addr_t)be32_to_cpu(*reg));
820                 *located = 1;
821         }
822
823         return 0;
824 }
825
826 static int __init at91_pm_backup_init(void)
827 {
828         struct gen_pool *sram_pool;
829         struct device_node *np;
830         struct platform_device *pdev;
831         int ret = -ENODEV, located = 0;
832
833         if (!IS_ENABLED(CONFIG_SOC_SAMA5D2) &&
834             !IS_ENABLED(CONFIG_SOC_SAMA7G5))
835                 return -EPERM;
836
837         if (!at91_is_pm_mode_active(AT91_PM_BACKUP))
838                 return 0;
839
840         np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam");
841         if (!np)
842                 return ret;
843
844         pdev = of_find_device_by_node(np);
845         of_node_put(np);
846         if (!pdev) {
847                 pr_warn("%s: failed to find securam device!\n", __func__);
848                 return ret;
849         }
850
851         sram_pool = gen_pool_get(&pdev->dev, NULL);
852         if (!sram_pool) {
853                 pr_warn("%s: securam pool unavailable!\n", __func__);
854                 goto securam_fail;
855         }
856
857         soc_pm.bu = (void *)gen_pool_alloc(sram_pool, sizeof(struct at91_pm_bu));
858         if (!soc_pm.bu) {
859                 pr_warn("%s: unable to alloc securam!\n", __func__);
860                 ret = -ENOMEM;
861                 goto securam_fail;
862         }
863
864         soc_pm.bu->suspended = 0;
865         soc_pm.bu->canary = __pa_symbol(&canary);
866         soc_pm.bu->resume = __pa_symbol(cpu_resume);
867         if (soc_pm.data.ramc_phy) {
868                 of_scan_flat_dt(at91_pm_backup_scan_memcs, &located);
869                 if (!located)
870                         goto securam_fail;
871
872                 /* DDR3PHY_ZQ0SR0 */
873                 soc_pm.bu->ddr_phy_calibration[0] = readl(soc_pm.data.ramc_phy +
874                                                           0x188);
875         }
876
877         return 0;
878
879 securam_fail:
880         put_device(&pdev->dev);
881         return ret;
882 }
883
884 static const struct of_device_id atmel_shdwc_ids[] = {
885         { .compatible = "atmel,sama5d2-shdwc" },
886         { .compatible = "microchip,sam9x60-shdwc" },
887         { .compatible = "microchip,sama7g5-shdwc" },
888         { /* sentinel. */ }
889 };
890
891 static void __init at91_pm_modes_init(const u32 *maps, int len)
892 {
893         struct device_node *np;
894         int ret, mode;
895
896         ret = at91_pm_backup_init();
897         if (ret) {
898                 if (soc_pm.data.standby_mode == AT91_PM_BACKUP)
899                         soc_pm.data.standby_mode = AT91_PM_ULP0;
900                 if (soc_pm.data.suspend_mode == AT91_PM_BACKUP)
901                         soc_pm.data.suspend_mode = AT91_PM_ULP0;
902         }
903
904         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC) ||
905             maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC)) {
906                 np = of_find_matching_node(NULL, atmel_shdwc_ids);
907                 if (!np) {
908                         pr_warn("%s: failed to find shdwc!\n", __func__);
909
910                         /* Use ULP0 if it doesn't needs SHDWC.*/
911                         if (!(maps[AT91_PM_ULP0] & AT91_PM_IOMAP(SHDWC)))
912                                 mode = AT91_PM_ULP0;
913                         else
914                                 mode = AT91_PM_STANDBY;
915
916                         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC))
917                                 soc_pm.data.standby_mode = mode;
918                         if (maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC))
919                                 soc_pm.data.suspend_mode = mode;
920                 } else {
921                         soc_pm.data.shdwc = of_iomap(np, 0);
922                         of_node_put(np);
923                 }
924         }
925
926         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU) ||
927             maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU)) {
928                 np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-sfrbu");
929                 if (!np) {
930                         pr_warn("%s: failed to find sfrbu!\n", __func__);
931
932                         /*
933                          * Use ULP0 if it doesn't need SHDWC or if SHDWC
934                          * was already located.
935                          */
936                         if (!(maps[AT91_PM_ULP0] & AT91_PM_IOMAP(SHDWC)) ||
937                             soc_pm.data.shdwc)
938                                 mode = AT91_PM_ULP0;
939                         else
940                                 mode = AT91_PM_STANDBY;
941
942                         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU))
943                                 soc_pm.data.standby_mode = mode;
944                         if (maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU))
945                                 soc_pm.data.suspend_mode = mode;
946                 } else {
947                         soc_pm.data.sfrbu = of_iomap(np, 0);
948                         of_node_put(np);
949                 }
950         }
951
952         /* Unmap all unnecessary. */
953         if (soc_pm.data.shdwc &&
954             !(maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC) ||
955               maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC))) {
956                 iounmap(soc_pm.data.shdwc);
957                 soc_pm.data.shdwc = NULL;
958         }
959
960         if (soc_pm.data.sfrbu &&
961             !(maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU) ||
962               maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU))) {
963                 iounmap(soc_pm.data.sfrbu);
964                 soc_pm.data.sfrbu = NULL;
965         }
966
967         return;
968 }
969
970 struct pmc_info {
971         unsigned long uhp_udp_mask;
972         unsigned long mckr;
973         unsigned long version;
974 };
975
976 static const struct pmc_info pmc_infos[] __initconst = {
977         {
978                 .uhp_udp_mask = AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP,
979                 .mckr = 0x30,
980                 .version = AT91_PMC_V1,
981         },
982
983         {
984                 .uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP,
985                 .mckr = 0x30,
986                 .version = AT91_PMC_V1,
987         },
988         {
989                 .uhp_udp_mask = AT91SAM926x_PMC_UHP,
990                 .mckr = 0x30,
991                 .version = AT91_PMC_V1,
992         },
993         {       .uhp_udp_mask = 0,
994                 .mckr = 0x30,
995                 .version = AT91_PMC_V1,
996         },
997         {
998                 .uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP,
999                 .mckr = 0x28,
1000                 .version = AT91_PMC_V2,
1001         },
1002         {
1003                 .mckr = 0x28,
1004                 .version = AT91_PMC_V2,
1005         },
1006
1007 };
1008
1009 static const struct of_device_id atmel_pmc_ids[] __initconst = {
1010         { .compatible = "atmel,at91rm9200-pmc", .data = &pmc_infos[0] },
1011         { .compatible = "atmel,at91sam9260-pmc", .data = &pmc_infos[1] },
1012         { .compatible = "atmel,at91sam9261-pmc", .data = &pmc_infos[1] },
1013         { .compatible = "atmel,at91sam9263-pmc", .data = &pmc_infos[1] },
1014         { .compatible = "atmel,at91sam9g45-pmc", .data = &pmc_infos[2] },
1015         { .compatible = "atmel,at91sam9n12-pmc", .data = &pmc_infos[1] },
1016         { .compatible = "atmel,at91sam9rl-pmc", .data = &pmc_infos[3] },
1017         { .compatible = "atmel,at91sam9x5-pmc", .data = &pmc_infos[1] },
1018         { .compatible = "atmel,sama5d3-pmc", .data = &pmc_infos[1] },
1019         { .compatible = "atmel,sama5d4-pmc", .data = &pmc_infos[1] },
1020         { .compatible = "atmel,sama5d2-pmc", .data = &pmc_infos[1] },
1021         { .compatible = "microchip,sam9x60-pmc", .data = &pmc_infos[4] },
1022         { .compatible = "microchip,sama7g5-pmc", .data = &pmc_infos[5] },
1023         { /* sentinel */ },
1024 };
1025
1026 static void __init at91_pm_modes_validate(const int *modes, int len)
1027 {
1028         u8 i, standby = 0, suspend = 0;
1029         int mode;
1030
1031         for (i = 0; i < len; i++) {
1032                 if (standby && suspend)
1033                         break;
1034
1035                 if (modes[i] == soc_pm.data.standby_mode && !standby) {
1036                         standby = 1;
1037                         continue;
1038                 }
1039
1040                 if (modes[i] == soc_pm.data.suspend_mode && !suspend) {
1041                         suspend = 1;
1042                         continue;
1043                 }
1044         }
1045
1046         if (!standby) {
1047                 if (soc_pm.data.suspend_mode == AT91_PM_STANDBY)
1048                         mode = AT91_PM_ULP0;
1049                 else
1050                         mode = AT91_PM_STANDBY;
1051
1052                 pr_warn("AT91: PM: %s mode not supported! Using %s.\n",
1053                         pm_modes[soc_pm.data.standby_mode].pattern,
1054                         pm_modes[mode].pattern);
1055                 soc_pm.data.standby_mode = mode;
1056         }
1057
1058         if (!suspend) {
1059                 if (soc_pm.data.standby_mode == AT91_PM_ULP0)
1060                         mode = AT91_PM_STANDBY;
1061                 else
1062                         mode = AT91_PM_ULP0;
1063
1064                 pr_warn("AT91: PM: %s mode not supported! Using %s.\n",
1065                         pm_modes[soc_pm.data.suspend_mode].pattern,
1066                         pm_modes[mode].pattern);
1067                 soc_pm.data.suspend_mode = mode;
1068         }
1069 }
1070
1071 static void __init at91_pm_init(void (*pm_idle)(void))
1072 {
1073         struct device_node *pmc_np;
1074         const struct of_device_id *of_id;
1075         const struct pmc_info *pmc;
1076
1077         if (at91_cpuidle_device.dev.platform_data)
1078                 platform_device_register(&at91_cpuidle_device);
1079
1080         pmc_np = of_find_matching_node_and_match(NULL, atmel_pmc_ids, &of_id);
1081         soc_pm.data.pmc = of_iomap(pmc_np, 0);
1082         of_node_put(pmc_np);
1083         if (!soc_pm.data.pmc) {
1084                 pr_err("AT91: PM not supported, PMC not found\n");
1085                 return;
1086         }
1087
1088         pmc = of_id->data;
1089         soc_pm.data.uhp_udp_mask = pmc->uhp_udp_mask;
1090         soc_pm.data.pmc_mckr_offset = pmc->mckr;
1091         soc_pm.data.pmc_version = pmc->version;
1092
1093         if (pm_idle)
1094                 arm_pm_idle = pm_idle;
1095
1096         at91_pm_sram_init();
1097
1098         if (at91_suspend_sram_fn) {
1099                 suspend_set_ops(&at91_pm_ops);
1100                 pr_info("AT91: PM: standby: %s, suspend: %s\n",
1101                         pm_modes[soc_pm.data.standby_mode].pattern,
1102                         pm_modes[soc_pm.data.suspend_mode].pattern);
1103         } else {
1104                 pr_info("AT91: PM not supported, due to no SRAM allocated\n");
1105         }
1106 }
1107
1108 void __init at91rm9200_pm_init(void)
1109 {
1110         int ret;
1111
1112         if (!IS_ENABLED(CONFIG_SOC_AT91RM9200))
1113                 return;
1114
1115         /*
1116          * Force STANDBY and ULP0 mode to avoid calling
1117          * at91_pm_modes_validate() which may increase booting time.
1118          * Platform supports anyway only STANDBY and ULP0 modes.
1119          */
1120         soc_pm.data.standby_mode = AT91_PM_STANDBY;
1121         soc_pm.data.suspend_mode = AT91_PM_ULP0;
1122
1123         ret = at91_dt_ramc(false);
1124         if (ret)
1125                 return;
1126
1127         /*
1128          * AT91RM9200 SDRAM low-power mode cannot be used with self-refresh.
1129          */
1130         at91_ramc_write(0, AT91_MC_SDRAMC_LPR, 0);
1131
1132         at91_pm_init(at91rm9200_idle);
1133 }
1134
1135 void __init sam9x60_pm_init(void)
1136 {
1137         static const int modes[] __initconst = {
1138                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
1139         };
1140         static const int iomaps[] __initconst = {
1141                 [AT91_PM_ULP1]          = AT91_PM_IOMAP(SHDWC),
1142         };
1143         int ret;
1144
1145         if (!IS_ENABLED(CONFIG_SOC_SAM9X60))
1146                 return;
1147
1148         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1149         at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1150         ret = at91_dt_ramc(false);
1151         if (ret)
1152                 return;
1153
1154         at91_pm_init(NULL);
1155
1156         soc_pm.ws_ids = sam9x60_ws_ids;
1157         soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
1158 }
1159
1160 void __init at91sam9_pm_init(void)
1161 {
1162         int ret;
1163
1164         if (!IS_ENABLED(CONFIG_SOC_AT91SAM9))
1165                 return;
1166
1167         /*
1168          * Force STANDBY and ULP0 mode to avoid calling
1169          * at91_pm_modes_validate() which may increase booting time.
1170          * Platform supports anyway only STANDBY and ULP0 modes.
1171          */
1172         soc_pm.data.standby_mode = AT91_PM_STANDBY;
1173         soc_pm.data.suspend_mode = AT91_PM_ULP0;
1174
1175         ret = at91_dt_ramc(false);
1176         if (ret)
1177                 return;
1178
1179         at91_pm_init(at91sam9_idle);
1180 }
1181
1182 void __init sama5_pm_init(void)
1183 {
1184         static const int modes[] __initconst = {
1185                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST,
1186         };
1187         int ret;
1188
1189         if (!IS_ENABLED(CONFIG_SOC_SAMA5))
1190                 return;
1191
1192         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1193         ret = at91_dt_ramc(false);
1194         if (ret)
1195                 return;
1196
1197         at91_pm_init(NULL);
1198 }
1199
1200 void __init sama5d2_pm_init(void)
1201 {
1202         static const int modes[] __initconst = {
1203                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
1204                 AT91_PM_BACKUP,
1205         };
1206         static const u32 iomaps[] __initconst = {
1207                 [AT91_PM_ULP1]          = AT91_PM_IOMAP(SHDWC),
1208                 [AT91_PM_BACKUP]        = AT91_PM_IOMAP(SHDWC) |
1209                                           AT91_PM_IOMAP(SFRBU),
1210         };
1211         int ret;
1212
1213         if (!IS_ENABLED(CONFIG_SOC_SAMA5D2))
1214                 return;
1215
1216         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1217         at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1218         ret = at91_dt_ramc(false);
1219         if (ret)
1220                 return;
1221
1222         at91_pm_init(NULL);
1223
1224         soc_pm.ws_ids = sama5d2_ws_ids;
1225         soc_pm.config_shdwc_ws = at91_sama5d2_config_shdwc_ws;
1226         soc_pm.config_pmc_ws = at91_sama5d2_config_pmc_ws;
1227
1228         soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
1229         soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
1230         soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
1231         soc_pm.sfrbu_regs.pswbu.state = BIT(3);
1232 }
1233
1234 void __init sama7_pm_init(void)
1235 {
1236         static const int modes[] __initconst = {
1237                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP1, AT91_PM_BACKUP,
1238         };
1239         static const u32 iomaps[] __initconst = {
1240                 [AT91_PM_ULP0]          = AT91_PM_IOMAP(SFRBU),
1241                 [AT91_PM_ULP1]          = AT91_PM_IOMAP(SFRBU) |
1242                                           AT91_PM_IOMAP(SHDWC),
1243                 [AT91_PM_BACKUP]        = AT91_PM_IOMAP(SFRBU) |
1244                                           AT91_PM_IOMAP(SHDWC),
1245         };
1246         int ret;
1247
1248         if (!IS_ENABLED(CONFIG_SOC_SAMA7))
1249                 return;
1250
1251         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1252
1253         ret = at91_dt_ramc(true);
1254         if (ret)
1255                 return;
1256
1257         at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1258         at91_pm_init(NULL);
1259
1260         soc_pm.ws_ids = sama7g5_ws_ids;
1261         soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
1262
1263         soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
1264         soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
1265         soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
1266         soc_pm.sfrbu_regs.pswbu.state = BIT(2);
1267 }
1268
1269 static int __init at91_pm_modes_select(char *str)
1270 {
1271         char *s;
1272         substring_t args[MAX_OPT_ARGS];
1273         int standby, suspend;
1274
1275         if (!str)
1276                 return 0;
1277
1278         s = strsep(&str, ",");
1279         standby = match_token(s, pm_modes, args);
1280         if (standby < 0)
1281                 return 0;
1282
1283         suspend = match_token(str, pm_modes, args);
1284         if (suspend < 0)
1285                 return 0;
1286
1287         soc_pm.data.standby_mode = standby;
1288         soc_pm.data.suspend_mode = suspend;
1289
1290         return 0;
1291 }
1292 early_param("atmel.pm_modes", at91_pm_modes_select);