linux/arch/arm/mach-at91/pm.c
<<
>>
Prefs
   1/*
   2 * arch/arm/mach-at91/pm.c
   3 * AT91 Power Management
   4 *
   5 * Copyright (C) 2005 David Brownell
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 */
  12
  13#include <linux/gpio.h>
  14#include <linux/suspend.h>
  15#include <linux/sched.h>
  16#include <linux/proc_fs.h>
  17#include <linux/genalloc.h>
  18#include <linux/interrupt.h>
  19#include <linux/sysfs.h>
  20#include <linux/module.h>
  21#include <linux/of.h>
  22#include <linux/of_platform.h>
  23#include <linux/of_address.h>
  24#include <linux/platform_device.h>
  25#include <linux/platform_data/atmel.h>
  26#include <linux/io.h>
  27#include <linux/clk/at91_pmc.h>
  28
  29#include <asm/irq.h>
  30#include <linux/atomic.h>
  31#include <asm/mach/time.h>
  32#include <asm/mach/irq.h>
  33#include <asm/fncpy.h>
  34#include <asm/cacheflush.h>
  35#include <asm/system_misc.h>
  36
  37#include "generic.h"
  38#include "pm.h"
  39
  40static void __iomem *pmc;
  41
  42/*
  43 * FIXME: this is needed to communicate between the pinctrl driver and
  44 * the PM implementation in the machine. Possibly part of the PM
  45 * implementation should be moved down into the pinctrl driver and get
  46 * called as part of the generic suspend/resume path.
  47 */
  48#ifdef CONFIG_PINCTRL_AT91
  49extern void at91_pinctrl_gpio_suspend(void);
  50extern void at91_pinctrl_gpio_resume(void);
  51#endif
  52
  53static struct {
  54        unsigned long uhp_udp_mask;
  55        int memctrl;
  56} at91_pm_data;
  57
  58void __iomem *at91_ramc_base[2];
  59
  60static int at91_pm_valid_state(suspend_state_t state)
  61{
  62        switch (state) {
  63                case PM_SUSPEND_ON:
  64                case PM_SUSPEND_STANDBY:
  65                case PM_SUSPEND_MEM:
  66                        return 1;
  67
  68                default:
  69                        return 0;
  70        }
  71}
  72
  73
  74static suspend_state_t target_state;
  75
  76/*
  77 * Called after processes are frozen, but before we shutdown devices.
  78 */
  79static int at91_pm_begin(suspend_state_t state)
  80{
  81        target_state = state;
  82        return 0;
  83}
  84
  85/*
  86 * Verify that all the clocks are correct before entering
  87 * slow-clock mode.
  88 */
  89static int at91_pm_verify_clocks(void)
  90{
  91        unsigned long scsr;
  92        int i;
  93
  94        scsr = readl(pmc + AT91_PMC_SCSR);
  95
  96        /* USB must not be using PLLB */
  97        if ((scsr & at91_pm_data.uhp_udp_mask) != 0) {
  98                pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
  99                return 0;
 100        }
 101
 102        /* PCK0..PCK3 must be disabled, or configured to use clk32k */
 103        for (i = 0; i < 4; i++) {
 104                u32 css;
 105
 106                if ((scsr & (AT91_PMC_PCK0 << i)) == 0)
 107                        continue;
 108                css = readl(pmc + AT91_PMC_PCKR(i)) & AT91_PMC_CSS;
 109                if (css != AT91_PMC_CSS_SLOW) {
 110                        pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css);
 111                        return 0;
 112                }
 113        }
 114
 115        return 1;
 116}
 117
 118/*
 119 * Call this from platform driver suspend() to see how deeply to suspend.
 120 * For example, some controllers (like OHCI) need one of the PLL clocks
 121 * in order to act as a wakeup source, and those are not available when
 122 * going into slow clock mode.
 123 *
 124 * REVISIT: generalize as clk_will_be_available(clk)?  Other platforms have
 125 * the very same problem (but not using at91 main_clk), and it'd be better
 126 * to add one generic API rather than lots of platform-specific ones.
 127 */
 128int at91_suspend_entering_slow_clock(void)
 129{
 130        return (target_state == PM_SUSPEND_MEM);
 131}
 132EXPORT_SYMBOL(at91_suspend_entering_slow_clock);
 133
 134static void (*at91_suspend_sram_fn)(void __iomem *pmc, void __iomem *ramc0,
 135                          void __iomem *ramc1, int memctrl);
 136
 137extern void at91_pm_suspend_in_sram(void __iomem *pmc, void __iomem *ramc0,
 138                            void __iomem *ramc1, int memctrl);
 139extern u32 at91_pm_suspend_in_sram_sz;
 140
 141static void at91_pm_suspend(suspend_state_t state)
 142{
 143        unsigned int pm_data = at91_pm_data.memctrl;
 144
 145        pm_data |= (state == PM_SUSPEND_MEM) ?
 146                                AT91_PM_MODE(AT91_PM_SLOW_CLOCK) : 0;
 147
 148        flush_cache_all();
 149        outer_disable();
 150
 151        at91_suspend_sram_fn(pmc, at91_ramc_base[0],
 152                             at91_ramc_base[1], pm_data);
 153
 154        outer_resume();
 155}
 156
 157static int at91_pm_enter(suspend_state_t state)
 158{
 159#ifdef CONFIG_PINCTRL_AT91
 160        at91_pinctrl_gpio_suspend();
 161#endif
 162        switch (state) {
 163        /*
 164         * Suspend-to-RAM is like STANDBY plus slow clock mode, so
 165         * drivers must suspend more deeply, the master clock switches
 166         * to the clk32k and turns off the main oscillator
 167         */
 168        case PM_SUSPEND_MEM:
 169                /*
 170                 * Ensure that clocks are in a valid state.
 171                 */
 172                if (!at91_pm_verify_clocks())
 173                        goto error;
 174
 175                at91_pm_suspend(state);
 176
 177                break;
 178
 179        /*
 180         * STANDBY mode has *all* drivers suspended; ignores irqs not
 181         * marked as 'wakeup' event sources; and reduces DRAM power.
 182         * But otherwise it's identical to PM_SUSPEND_ON: cpu idle, and
 183         * nothing fancy done with main or cpu clocks.
 184         */
 185        case PM_SUSPEND_STANDBY:
 186                at91_pm_suspend(state);
 187                break;
 188
 189        case PM_SUSPEND_ON:
 190                cpu_do_idle();
 191                break;
 192
 193        default:
 194                pr_debug("AT91: PM - bogus suspend state %d\n", state);
 195                goto error;
 196        }
 197
 198error:
 199        target_state = PM_SUSPEND_ON;
 200
 201#ifdef CONFIG_PINCTRL_AT91
 202        at91_pinctrl_gpio_resume();
 203#endif
 204        return 0;
 205}
 206
 207/*
 208 * Called right prior to thawing processes.
 209 */
 210static void at91_pm_end(void)
 211{
 212        target_state = PM_SUSPEND_ON;
 213}
 214
 215
 216static const struct platform_suspend_ops at91_pm_ops = {
 217        .valid  = at91_pm_valid_state,
 218        .begin  = at91_pm_begin,
 219        .enter  = at91_pm_enter,
 220        .end    = at91_pm_end,
 221};
 222
 223static struct platform_device at91_cpuidle_device = {
 224        .name = "cpuidle-at91",
 225};
 226
 227static void at91_pm_set_standby(void (*at91_standby)(void))
 228{
 229        if (at91_standby)
 230                at91_cpuidle_device.dev.platform_data = at91_standby;
 231}
 232
 233/*
 234 * The AT91RM9200 goes into self-refresh mode with this command, and will
 235 * terminate self-refresh automatically on the next SDRAM access.
 236 *
 237 * Self-refresh mode is exited as soon as a memory access is made, but we don't
 238 * know for sure when that happens. However, we need to restore the low-power
 239 * mode if it was enabled before going idle. Restoring low-power mode while
 240 * still in self-refresh is "not recommended", but seems to work.
 241 */
 242static void at91rm9200_standby(void)
 243{
 244        u32 lpr = at91_ramc_read(0, AT91_MC_SDRAMC_LPR);
 245
 246        asm volatile(
 247                "b    1f\n\t"
 248                ".align    5\n\t"
 249                "1:  mcr    p15, 0, %0, c7, c10, 4\n\t"
 250                "    str    %0, [%1, %2]\n\t"
 251                "    str    %3, [%1, %4]\n\t"
 252                "    mcr    p15, 0, %0, c7, c0, 4\n\t"
 253                "    str    %5, [%1, %2]"
 254                :
 255                : "r" (0), "r" (at91_ramc_base[0]), "r" (AT91_MC_SDRAMC_LPR),
 256                  "r" (1), "r" (AT91_MC_SDRAMC_SRR),
 257                  "r" (lpr));
 258}
 259
 260/* We manage both DDRAM/SDRAM controllers, we need more than one value to
 261 * remember.
 262 */
 263static void at91_ddr_standby(void)
 264{
 265        /* Those two values allow us to delay self-refresh activation
 266         * to the maximum. */
 267        u32 lpr0, lpr1 = 0;
 268        u32 saved_lpr0, saved_lpr1 = 0;
 269
 270        if (at91_ramc_base[1]) {
 271                saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
 272                lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
 273                lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
 274        }
 275
 276        saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
 277        lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
 278        lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
 279
 280        /* self-refresh mode now */
 281        at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
 282        if (at91_ramc_base[1])
 283                at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
 284
 285        cpu_do_idle();
 286
 287        at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
 288        if (at91_ramc_base[1])
 289                at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
 290}
 291
 292/* We manage both DDRAM/SDRAM controllers, we need more than one value to
 293 * remember.
 294 */
 295static void at91sam9_sdram_standby(void)
 296{
 297        u32 lpr0, lpr1 = 0;
 298        u32 saved_lpr0, saved_lpr1 = 0;
 299
 300        if (at91_ramc_base[1]) {
 301                saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
 302                lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
 303                lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
 304        }
 305
 306        saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
 307        lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
 308        lpr0 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
 309
 310        /* self-refresh mode now */
 311        at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
 312        if (at91_ramc_base[1])
 313                at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
 314
 315        cpu_do_idle();
 316
 317        at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
 318        if (at91_ramc_base[1])
 319                at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
 320}
 321
 322static const struct of_device_id const ramc_ids[] __initconst = {
 323        { .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby },
 324        { .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby },
 325        { .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby },
 326        { .compatible = "atmel,sama5d3-ddramc", .data = at91_ddr_standby },
 327        { /*sentinel*/ }
 328};
 329
 330static __init void at91_dt_ramc(void)
 331{
 332        struct device_node *np;
 333        const struct of_device_id *of_id;
 334        int idx = 0;
 335        const void *standby = NULL;
 336
 337        for_each_matching_node_and_match(np, ramc_ids, &of_id) {
 338                at91_ramc_base[idx] = of_iomap(np, 0);
 339                if (!at91_ramc_base[idx])
 340                        panic(pr_fmt("unable to map ramc[%d] cpu registers\n"), idx);
 341
 342                if (!standby)
 343                        standby = of_id->data;
 344
 345                idx++;
 346        }
 347
 348        if (!idx)
 349                panic(pr_fmt("unable to find compatible ram controller node in dtb\n"));
 350
 351        if (!standby) {
 352                pr_warn("ramc no standby function available\n");
 353                return;
 354        }
 355
 356        at91_pm_set_standby(standby);
 357}
 358
 359static void at91rm9200_idle(void)
 360{
 361        /*
 362         * Disable the processor clock.  The processor will be automatically
 363         * re-enabled by an interrupt or by a reset.
 364         */
 365        writel(AT91_PMC_PCK, pmc + AT91_PMC_SCDR);
 366}
 367
 368static void at91sam9_idle(void)
 369{
 370        writel(AT91_PMC_PCK, pmc + AT91_PMC_SCDR);
 371        cpu_do_idle();
 372}
 373
 374static void __init at91_pm_sram_init(void)
 375{
 376        struct gen_pool *sram_pool;
 377        phys_addr_t sram_pbase;
 378        unsigned long sram_base;
 379        struct device_node *node;
 380        struct platform_device *pdev = NULL;
 381
 382        for_each_compatible_node(node, NULL, "mmio-sram") {
 383                pdev = of_find_device_by_node(node);
 384                if (pdev) {
 385                        of_node_put(node);
 386                        break;
 387                }
 388        }
 389
 390        if (!pdev) {
 391                pr_warn("%s: failed to find sram device!\n", __func__);
 392                return;
 393        }
 394
 395        sram_pool = gen_pool_get(&pdev->dev, NULL);
 396        if (!sram_pool) {
 397                pr_warn("%s: sram pool unavailable!\n", __func__);
 398                return;
 399        }
 400
 401        sram_base = gen_pool_alloc(sram_pool, at91_pm_suspend_in_sram_sz);
 402        if (!sram_base) {
 403                pr_warn("%s: unable to alloc sram!\n", __func__);
 404                return;
 405        }
 406
 407        sram_pbase = gen_pool_virt_to_phys(sram_pool, sram_base);
 408        at91_suspend_sram_fn = __arm_ioremap_exec(sram_pbase,
 409                                        at91_pm_suspend_in_sram_sz, false);
 410        if (!at91_suspend_sram_fn) {
 411                pr_warn("SRAM: Could not map\n");
 412                return;
 413        }
 414
 415        /* Copy the pm suspend handler to SRAM */
 416        at91_suspend_sram_fn = fncpy(at91_suspend_sram_fn,
 417                        &at91_pm_suspend_in_sram, at91_pm_suspend_in_sram_sz);
 418}
 419
 420static const struct of_device_id atmel_pmc_ids[] __initconst = {
 421        { .compatible = "atmel,at91rm9200-pmc"  },
 422        { .compatible = "atmel,at91sam9260-pmc" },
 423        { .compatible = "atmel,at91sam9g45-pmc" },
 424        { .compatible = "atmel,at91sam9n12-pmc" },
 425        { .compatible = "atmel,at91sam9x5-pmc" },
 426        { .compatible = "atmel,sama5d3-pmc" },
 427        { .compatible = "atmel,sama5d2-pmc" },
 428        { /* sentinel */ },
 429};
 430
 431static void __init at91_pm_init(void (*pm_idle)(void))
 432{
 433        struct device_node *pmc_np;
 434
 435        if (at91_cpuidle_device.dev.platform_data)
 436                platform_device_register(&at91_cpuidle_device);
 437
 438        pmc_np = of_find_matching_node(NULL, atmel_pmc_ids);
 439        pmc = of_iomap(pmc_np, 0);
 440        if (!pmc) {
 441                pr_err("AT91: PM not supported, PMC not found\n");
 442                return;
 443        }
 444
 445        if (pm_idle)
 446                arm_pm_idle = pm_idle;
 447
 448        at91_pm_sram_init();
 449
 450        if (at91_suspend_sram_fn)
 451                suspend_set_ops(&at91_pm_ops);
 452        else
 453                pr_info("AT91: PM not supported, due to no SRAM allocated\n");
 454}
 455
 456void __init at91rm9200_pm_init(void)
 457{
 458        at91_dt_ramc();
 459
 460        /*
 461         * AT91RM9200 SDRAM low-power mode cannot be used with self-refresh.
 462         */
 463        at91_ramc_write(0, AT91_MC_SDRAMC_LPR, 0);
 464
 465        at91_pm_data.uhp_udp_mask = AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP;
 466        at91_pm_data.memctrl = AT91_MEMCTRL_MC;
 467
 468        at91_pm_init(at91rm9200_idle);
 469}
 470
 471void __init at91sam9260_pm_init(void)
 472{
 473        at91_dt_ramc();
 474        at91_pm_data.memctrl = AT91_MEMCTRL_SDRAMC;
 475        at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
 476        at91_pm_init(at91sam9_idle);
 477}
 478
 479void __init at91sam9g45_pm_init(void)
 480{
 481        at91_dt_ramc();
 482        at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP;
 483        at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
 484        at91_pm_init(at91sam9_idle);
 485}
 486
 487void __init at91sam9x5_pm_init(void)
 488{
 489        at91_dt_ramc();
 490        at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
 491        at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
 492        at91_pm_init(at91sam9_idle);
 493}
 494
 495void __init sama5_pm_init(void)
 496{
 497        at91_dt_ramc();
 498        at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
 499        at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
 500        at91_pm_init(NULL);
 501}
 502