Merge tag 'drm-misc-next-2021-10-14' of git://anongit.freedesktop.org/drm/drm-misc...
[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 struct ramc_info {
609         void (*idle)(void);
610         unsigned int memctrl;
611 };
612
613 static const struct ramc_info ramc_infos[] __initconst = {
614         { .idle = at91rm9200_standby, .memctrl = AT91_MEMCTRL_MC},
615         { .idle = at91sam9_sdram_standby, .memctrl = AT91_MEMCTRL_SDRAMC},
616         { .idle = at91_ddr_standby, .memctrl = AT91_MEMCTRL_DDRSDR},
617         { .idle = sama5d3_ddr_standby, .memctrl = AT91_MEMCTRL_DDRSDR},
618 };
619
620 static const struct of_device_id ramc_ids[] __initconst = {
621         { .compatible = "atmel,at91rm9200-sdramc", .data = &ramc_infos[0] },
622         { .compatible = "atmel,at91sam9260-sdramc", .data = &ramc_infos[1] },
623         { .compatible = "atmel,at91sam9g45-ddramc", .data = &ramc_infos[2] },
624         { .compatible = "atmel,sama5d3-ddramc", .data = &ramc_infos[3] },
625         { .compatible = "microchip,sama7g5-uddrc", },
626         { /*sentinel*/ }
627 };
628
629 static const struct of_device_id ramc_phy_ids[] __initconst = {
630         { .compatible = "microchip,sama7g5-ddr3phy", },
631         { /* Sentinel. */ },
632 };
633
634 static __init int at91_dt_ramc(bool phy_mandatory)
635 {
636         struct device_node *np;
637         const struct of_device_id *of_id;
638         int idx = 0;
639         void *standby = NULL;
640         const struct ramc_info *ramc;
641         int ret;
642
643         for_each_matching_node_and_match(np, ramc_ids, &of_id) {
644                 soc_pm.data.ramc[idx] = of_iomap(np, 0);
645                 if (!soc_pm.data.ramc[idx]) {
646                         pr_err("unable to map ramc[%d] cpu registers\n", idx);
647                         ret = -ENOMEM;
648                         goto unmap_ramc;
649                 }
650
651                 ramc = of_id->data;
652                 if (ramc) {
653                         if (!standby)
654                                 standby = ramc->idle;
655                         soc_pm.data.memctrl = ramc->memctrl;
656                 }
657
658                 idx++;
659         }
660
661         if (!idx) {
662                 pr_err("unable to find compatible ram controller node in dtb\n");
663                 ret = -ENODEV;
664                 goto unmap_ramc;
665         }
666
667         /* Lookup for DDR PHY node, if any. */
668         for_each_matching_node_and_match(np, ramc_phy_ids, &of_id) {
669                 soc_pm.data.ramc_phy = of_iomap(np, 0);
670                 if (!soc_pm.data.ramc_phy) {
671                         pr_err("unable to map ramc phy cpu registers\n");
672                         ret = -ENOMEM;
673                         goto unmap_ramc;
674                 }
675         }
676
677         if (phy_mandatory && !soc_pm.data.ramc_phy) {
678                 pr_err("DDR PHY is mandatory!\n");
679                 ret = -ENODEV;
680                 goto unmap_ramc;
681         }
682
683         if (!standby) {
684                 pr_warn("ramc no standby function available\n");
685                 return 0;
686         }
687
688         at91_cpuidle_device.dev.platform_data = standby;
689
690         return 0;
691
692 unmap_ramc:
693         while (idx)
694                 iounmap(soc_pm.data.ramc[--idx]);
695
696         return ret;
697 }
698
699 static void at91rm9200_idle(void)
700 {
701         /*
702          * Disable the processor clock.  The processor will be automatically
703          * re-enabled by an interrupt or by a reset.
704          */
705         writel(AT91_PMC_PCK, soc_pm.data.pmc + AT91_PMC_SCDR);
706 }
707
708 static void at91sam9_idle(void)
709 {
710         writel(AT91_PMC_PCK, soc_pm.data.pmc + AT91_PMC_SCDR);
711         cpu_do_idle();
712 }
713
714 static void __init at91_pm_sram_init(void)
715 {
716         struct gen_pool *sram_pool;
717         phys_addr_t sram_pbase;
718         unsigned long sram_base;
719         struct device_node *node;
720         struct platform_device *pdev = NULL;
721
722         for_each_compatible_node(node, NULL, "mmio-sram") {
723                 pdev = of_find_device_by_node(node);
724                 if (pdev) {
725                         of_node_put(node);
726                         break;
727                 }
728         }
729
730         if (!pdev) {
731                 pr_warn("%s: failed to find sram device!\n", __func__);
732                 return;
733         }
734
735         sram_pool = gen_pool_get(&pdev->dev, NULL);
736         if (!sram_pool) {
737                 pr_warn("%s: sram pool unavailable!\n", __func__);
738                 goto out_put_device;
739         }
740
741         sram_base = gen_pool_alloc(sram_pool, at91_pm_suspend_in_sram_sz);
742         if (!sram_base) {
743                 pr_warn("%s: unable to alloc sram!\n", __func__);
744                 goto out_put_device;
745         }
746
747         sram_pbase = gen_pool_virt_to_phys(sram_pool, sram_base);
748         at91_suspend_sram_fn = __arm_ioremap_exec(sram_pbase,
749                                         at91_pm_suspend_in_sram_sz, false);
750         if (!at91_suspend_sram_fn) {
751                 pr_warn("SRAM: Could not map\n");
752                 goto out_put_device;
753         }
754
755         /* Copy the pm suspend handler to SRAM */
756         at91_suspend_sram_fn = fncpy(at91_suspend_sram_fn,
757                         &at91_pm_suspend_in_sram, at91_pm_suspend_in_sram_sz);
758         return;
759
760 out_put_device:
761         put_device(&pdev->dev);
762         return;
763 }
764
765 static bool __init at91_is_pm_mode_active(int pm_mode)
766 {
767         return (soc_pm.data.standby_mode == pm_mode ||
768                 soc_pm.data.suspend_mode == pm_mode);
769 }
770
771 static int __init at91_pm_backup_scan_memcs(unsigned long node,
772                                             const char *uname, int depth,
773                                             void *data)
774 {
775         const char *type;
776         const __be32 *reg;
777         int *located = data;
778         int size;
779
780         /* Memory node already located. */
781         if (*located)
782                 return 0;
783
784         type = of_get_flat_dt_prop(node, "device_type", NULL);
785
786         /* We are scanning "memory" nodes only. */
787         if (!type || strcmp(type, "memory"))
788                 return 0;
789
790         reg = of_get_flat_dt_prop(node, "reg", &size);
791         if (reg) {
792                 soc_pm.memcs = __va((phys_addr_t)be32_to_cpu(*reg));
793                 *located = 1;
794         }
795
796         return 0;
797 }
798
799 static int __init at91_pm_backup_init(void)
800 {
801         struct gen_pool *sram_pool;
802         struct device_node *np;
803         struct platform_device *pdev;
804         int ret = -ENODEV, located = 0;
805
806         if (!IS_ENABLED(CONFIG_SOC_SAMA5D2) &&
807             !IS_ENABLED(CONFIG_SOC_SAMA7G5))
808                 return -EPERM;
809
810         if (!at91_is_pm_mode_active(AT91_PM_BACKUP))
811                 return 0;
812
813         np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam");
814         if (!np)
815                 return ret;
816
817         pdev = of_find_device_by_node(np);
818         of_node_put(np);
819         if (!pdev) {
820                 pr_warn("%s: failed to find securam device!\n", __func__);
821                 return ret;
822         }
823
824         sram_pool = gen_pool_get(&pdev->dev, NULL);
825         if (!sram_pool) {
826                 pr_warn("%s: securam pool unavailable!\n", __func__);
827                 goto securam_fail;
828         }
829
830         soc_pm.bu = (void *)gen_pool_alloc(sram_pool, sizeof(struct at91_pm_bu));
831         if (!soc_pm.bu) {
832                 pr_warn("%s: unable to alloc securam!\n", __func__);
833                 ret = -ENOMEM;
834                 goto securam_fail;
835         }
836
837         soc_pm.bu->suspended = 0;
838         soc_pm.bu->canary = __pa_symbol(&canary);
839         soc_pm.bu->resume = __pa_symbol(cpu_resume);
840         if (soc_pm.data.ramc_phy) {
841                 of_scan_flat_dt(at91_pm_backup_scan_memcs, &located);
842                 if (!located)
843                         goto securam_fail;
844
845                 /* DDR3PHY_ZQ0SR0 */
846                 soc_pm.bu->ddr_phy_calibration[0] = readl(soc_pm.data.ramc_phy +
847                                                           0x188);
848         }
849
850         return 0;
851
852 securam_fail:
853         put_device(&pdev->dev);
854         return ret;
855 }
856
857 static const struct of_device_id atmel_shdwc_ids[] = {
858         { .compatible = "atmel,sama5d2-shdwc" },
859         { .compatible = "microchip,sam9x60-shdwc" },
860         { .compatible = "microchip,sama7g5-shdwc" },
861         { /* sentinel. */ }
862 };
863
864 static void __init at91_pm_modes_init(const u32 *maps, int len)
865 {
866         struct device_node *np;
867         int ret, mode;
868
869         ret = at91_pm_backup_init();
870         if (ret) {
871                 if (soc_pm.data.standby_mode == AT91_PM_BACKUP)
872                         soc_pm.data.standby_mode = AT91_PM_ULP0;
873                 if (soc_pm.data.suspend_mode == AT91_PM_BACKUP)
874                         soc_pm.data.suspend_mode = AT91_PM_ULP0;
875         }
876
877         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC) ||
878             maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC)) {
879                 np = of_find_matching_node(NULL, atmel_shdwc_ids);
880                 if (!np) {
881                         pr_warn("%s: failed to find shdwc!\n", __func__);
882
883                         /* Use ULP0 if it doesn't needs SHDWC.*/
884                         if (!(maps[AT91_PM_ULP0] & AT91_PM_IOMAP(SHDWC)))
885                                 mode = AT91_PM_ULP0;
886                         else
887                                 mode = AT91_PM_STANDBY;
888
889                         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC))
890                                 soc_pm.data.standby_mode = mode;
891                         if (maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC))
892                                 soc_pm.data.suspend_mode = mode;
893                 } else {
894                         soc_pm.data.shdwc = of_iomap(np, 0);
895                         of_node_put(np);
896                 }
897         }
898
899         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU) ||
900             maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU)) {
901                 np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-sfrbu");
902                 if (!np) {
903                         pr_warn("%s: failed to find sfrbu!\n", __func__);
904
905                         /*
906                          * Use ULP0 if it doesn't need SHDWC or if SHDWC
907                          * was already located.
908                          */
909                         if (!(maps[AT91_PM_ULP0] & AT91_PM_IOMAP(SHDWC)) ||
910                             soc_pm.data.shdwc)
911                                 mode = AT91_PM_ULP0;
912                         else
913                                 mode = AT91_PM_STANDBY;
914
915                         if (maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU))
916                                 soc_pm.data.standby_mode = mode;
917                         if (maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU))
918                                 soc_pm.data.suspend_mode = mode;
919                 } else {
920                         soc_pm.data.sfrbu = of_iomap(np, 0);
921                         of_node_put(np);
922                 }
923         }
924
925         /* Unmap all unnecessary. */
926         if (soc_pm.data.shdwc &&
927             !(maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SHDWC) ||
928               maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SHDWC))) {
929                 iounmap(soc_pm.data.shdwc);
930                 soc_pm.data.shdwc = NULL;
931         }
932
933         if (soc_pm.data.sfrbu &&
934             !(maps[soc_pm.data.standby_mode] & AT91_PM_IOMAP(SFRBU) ||
935               maps[soc_pm.data.suspend_mode] & AT91_PM_IOMAP(SFRBU))) {
936                 iounmap(soc_pm.data.sfrbu);
937                 soc_pm.data.sfrbu = NULL;
938         }
939
940         return;
941 }
942
943 struct pmc_info {
944         unsigned long uhp_udp_mask;
945         unsigned long mckr;
946         unsigned long version;
947 };
948
949 static const struct pmc_info pmc_infos[] __initconst = {
950         {
951                 .uhp_udp_mask = AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP,
952                 .mckr = 0x30,
953                 .version = AT91_PMC_V1,
954         },
955
956         {
957                 .uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP,
958                 .mckr = 0x30,
959                 .version = AT91_PMC_V1,
960         },
961         {
962                 .uhp_udp_mask = AT91SAM926x_PMC_UHP,
963                 .mckr = 0x30,
964                 .version = AT91_PMC_V1,
965         },
966         {       .uhp_udp_mask = 0,
967                 .mckr = 0x30,
968                 .version = AT91_PMC_V1,
969         },
970         {
971                 .uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP,
972                 .mckr = 0x28,
973                 .version = AT91_PMC_V2,
974         },
975         {
976                 .mckr = 0x28,
977                 .version = AT91_PMC_V2,
978         },
979
980 };
981
982 static const struct of_device_id atmel_pmc_ids[] __initconst = {
983         { .compatible = "atmel,at91rm9200-pmc", .data = &pmc_infos[0] },
984         { .compatible = "atmel,at91sam9260-pmc", .data = &pmc_infos[1] },
985         { .compatible = "atmel,at91sam9261-pmc", .data = &pmc_infos[1] },
986         { .compatible = "atmel,at91sam9263-pmc", .data = &pmc_infos[1] },
987         { .compatible = "atmel,at91sam9g45-pmc", .data = &pmc_infos[2] },
988         { .compatible = "atmel,at91sam9n12-pmc", .data = &pmc_infos[1] },
989         { .compatible = "atmel,at91sam9rl-pmc", .data = &pmc_infos[3] },
990         { .compatible = "atmel,at91sam9x5-pmc", .data = &pmc_infos[1] },
991         { .compatible = "atmel,sama5d3-pmc", .data = &pmc_infos[1] },
992         { .compatible = "atmel,sama5d4-pmc", .data = &pmc_infos[1] },
993         { .compatible = "atmel,sama5d2-pmc", .data = &pmc_infos[1] },
994         { .compatible = "microchip,sam9x60-pmc", .data = &pmc_infos[4] },
995         { .compatible = "microchip,sama7g5-pmc", .data = &pmc_infos[5] },
996         { /* sentinel */ },
997 };
998
999 static void __init at91_pm_modes_validate(const int *modes, int len)
1000 {
1001         u8 i, standby = 0, suspend = 0;
1002         int mode;
1003
1004         for (i = 0; i < len; i++) {
1005                 if (standby && suspend)
1006                         break;
1007
1008                 if (modes[i] == soc_pm.data.standby_mode && !standby) {
1009                         standby = 1;
1010                         continue;
1011                 }
1012
1013                 if (modes[i] == soc_pm.data.suspend_mode && !suspend) {
1014                         suspend = 1;
1015                         continue;
1016                 }
1017         }
1018
1019         if (!standby) {
1020                 if (soc_pm.data.suspend_mode == AT91_PM_STANDBY)
1021                         mode = AT91_PM_ULP0;
1022                 else
1023                         mode = AT91_PM_STANDBY;
1024
1025                 pr_warn("AT91: PM: %s mode not supported! Using %s.\n",
1026                         pm_modes[soc_pm.data.standby_mode].pattern,
1027                         pm_modes[mode].pattern);
1028                 soc_pm.data.standby_mode = mode;
1029         }
1030
1031         if (!suspend) {
1032                 if (soc_pm.data.standby_mode == AT91_PM_ULP0)
1033                         mode = AT91_PM_STANDBY;
1034                 else
1035                         mode = AT91_PM_ULP0;
1036
1037                 pr_warn("AT91: PM: %s mode not supported! Using %s.\n",
1038                         pm_modes[soc_pm.data.suspend_mode].pattern,
1039                         pm_modes[mode].pattern);
1040                 soc_pm.data.suspend_mode = mode;
1041         }
1042 }
1043
1044 static void __init at91_pm_init(void (*pm_idle)(void))
1045 {
1046         struct device_node *pmc_np;
1047         const struct of_device_id *of_id;
1048         const struct pmc_info *pmc;
1049
1050         if (at91_cpuidle_device.dev.platform_data)
1051                 platform_device_register(&at91_cpuidle_device);
1052
1053         pmc_np = of_find_matching_node_and_match(NULL, atmel_pmc_ids, &of_id);
1054         soc_pm.data.pmc = of_iomap(pmc_np, 0);
1055         of_node_put(pmc_np);
1056         if (!soc_pm.data.pmc) {
1057                 pr_err("AT91: PM not supported, PMC not found\n");
1058                 return;
1059         }
1060
1061         pmc = of_id->data;
1062         soc_pm.data.uhp_udp_mask = pmc->uhp_udp_mask;
1063         soc_pm.data.pmc_mckr_offset = pmc->mckr;
1064         soc_pm.data.pmc_version = pmc->version;
1065
1066         if (pm_idle)
1067                 arm_pm_idle = pm_idle;
1068
1069         at91_pm_sram_init();
1070
1071         if (at91_suspend_sram_fn) {
1072                 suspend_set_ops(&at91_pm_ops);
1073                 pr_info("AT91: PM: standby: %s, suspend: %s\n",
1074                         pm_modes[soc_pm.data.standby_mode].pattern,
1075                         pm_modes[soc_pm.data.suspend_mode].pattern);
1076         } else {
1077                 pr_info("AT91: PM not supported, due to no SRAM allocated\n");
1078         }
1079 }
1080
1081 void __init at91rm9200_pm_init(void)
1082 {
1083         int ret;
1084
1085         if (!IS_ENABLED(CONFIG_SOC_AT91RM9200))
1086                 return;
1087
1088         /*
1089          * Force STANDBY and ULP0 mode to avoid calling
1090          * at91_pm_modes_validate() which may increase booting time.
1091          * Platform supports anyway only STANDBY and ULP0 modes.
1092          */
1093         soc_pm.data.standby_mode = AT91_PM_STANDBY;
1094         soc_pm.data.suspend_mode = AT91_PM_ULP0;
1095
1096         ret = at91_dt_ramc(false);
1097         if (ret)
1098                 return;
1099
1100         /*
1101          * AT91RM9200 SDRAM low-power mode cannot be used with self-refresh.
1102          */
1103         at91_ramc_write(0, AT91_MC_SDRAMC_LPR, 0);
1104
1105         at91_pm_init(at91rm9200_idle);
1106 }
1107
1108 void __init sam9x60_pm_init(void)
1109 {
1110         static const int modes[] __initconst = {
1111                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
1112         };
1113         static const int iomaps[] __initconst = {
1114                 [AT91_PM_ULP1]          = AT91_PM_IOMAP(SHDWC),
1115         };
1116         int ret;
1117
1118         if (!IS_ENABLED(CONFIG_SOC_SAM9X60))
1119                 return;
1120
1121         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1122         at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1123         ret = at91_dt_ramc(false);
1124         if (ret)
1125                 return;
1126
1127         at91_pm_init(NULL);
1128
1129         soc_pm.ws_ids = sam9x60_ws_ids;
1130         soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
1131 }
1132
1133 void __init at91sam9_pm_init(void)
1134 {
1135         int ret;
1136
1137         if (!IS_ENABLED(CONFIG_SOC_AT91SAM9))
1138                 return;
1139
1140         /*
1141          * Force STANDBY and ULP0 mode to avoid calling
1142          * at91_pm_modes_validate() which may increase booting time.
1143          * Platform supports anyway only STANDBY and ULP0 modes.
1144          */
1145         soc_pm.data.standby_mode = AT91_PM_STANDBY;
1146         soc_pm.data.suspend_mode = AT91_PM_ULP0;
1147
1148         ret = at91_dt_ramc(false);
1149         if (ret)
1150                 return;
1151
1152         at91_pm_init(at91sam9_idle);
1153 }
1154
1155 void __init sama5_pm_init(void)
1156 {
1157         static const int modes[] __initconst = {
1158                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST,
1159         };
1160         int ret;
1161
1162         if (!IS_ENABLED(CONFIG_SOC_SAMA5))
1163                 return;
1164
1165         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1166         ret = at91_dt_ramc(false);
1167         if (ret)
1168                 return;
1169
1170         at91_pm_init(NULL);
1171 }
1172
1173 void __init sama5d2_pm_init(void)
1174 {
1175         static const int modes[] __initconst = {
1176                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
1177                 AT91_PM_BACKUP,
1178         };
1179         static const u32 iomaps[] __initconst = {
1180                 [AT91_PM_ULP1]          = AT91_PM_IOMAP(SHDWC),
1181                 [AT91_PM_BACKUP]        = AT91_PM_IOMAP(SHDWC) |
1182                                           AT91_PM_IOMAP(SFRBU),
1183         };
1184         int ret;
1185
1186         if (!IS_ENABLED(CONFIG_SOC_SAMA5D2))
1187                 return;
1188
1189         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1190         at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1191         ret = at91_dt_ramc(false);
1192         if (ret)
1193                 return;
1194
1195         at91_pm_init(NULL);
1196
1197         soc_pm.ws_ids = sama5d2_ws_ids;
1198         soc_pm.config_shdwc_ws = at91_sama5d2_config_shdwc_ws;
1199         soc_pm.config_pmc_ws = at91_sama5d2_config_pmc_ws;
1200
1201         soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
1202         soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
1203         soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
1204         soc_pm.sfrbu_regs.pswbu.state = BIT(3);
1205 }
1206
1207 void __init sama7_pm_init(void)
1208 {
1209         static const int modes[] __initconst = {
1210                 AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP1, AT91_PM_BACKUP,
1211         };
1212         static const u32 iomaps[] __initconst = {
1213                 [AT91_PM_ULP0]          = AT91_PM_IOMAP(SFRBU),
1214                 [AT91_PM_ULP1]          = AT91_PM_IOMAP(SFRBU) |
1215                                           AT91_PM_IOMAP(SHDWC),
1216                 [AT91_PM_BACKUP]        = AT91_PM_IOMAP(SFRBU) |
1217                                           AT91_PM_IOMAP(SHDWC),
1218         };
1219         int ret;
1220
1221         if (!IS_ENABLED(CONFIG_SOC_SAMA7))
1222                 return;
1223
1224         at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
1225
1226         ret = at91_dt_ramc(true);
1227         if (ret)
1228                 return;
1229
1230         at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
1231         at91_pm_init(NULL);
1232
1233         soc_pm.ws_ids = sama7g5_ws_ids;
1234         soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
1235
1236         soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
1237         soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
1238         soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
1239         soc_pm.sfrbu_regs.pswbu.state = BIT(2);
1240 }
1241
1242 static int __init at91_pm_modes_select(char *str)
1243 {
1244         char *s;
1245         substring_t args[MAX_OPT_ARGS];
1246         int standby, suspend;
1247
1248         if (!str)
1249                 return 0;
1250
1251         s = strsep(&str, ",");
1252         standby = match_token(s, pm_modes, args);
1253         if (standby < 0)
1254                 return 0;
1255
1256         suspend = match_token(str, pm_modes, args);
1257         if (suspend < 0)
1258                 return 0;
1259
1260         soc_pm.data.standby_mode = standby;
1261         soc_pm.data.suspend_mode = suspend;
1262
1263         return 0;
1264 }
1265 early_param("atmel.pm_modes", at91_pm_modes_select);