1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * arch/arm/mach-at91/pm_slow_clock.S 4 * 5 * Copyright (C) 2006 Savin Zlobec 6 * 7 * AT91SAM9 support: 8 * Copyright (C) 2007 Anti Sullin <anti.sullin 9 */ 10 #include <linux/linkage.h> 11 #include <linux/clk/at91_pmc.h> 12 #include "pm.h" 13 #include "pm_data-offsets.h" 14 15 #ifdef CONFIG_CPU_V7 16 .arch armv7-a 17 #endif 18 19 #define SRAMC_SELF_FRESH_ACTIVE 0x01 20 #define SRAMC_SELF_FRESH_EXIT 0x00 21 22 pmc .req r0 23 tmp1 .req r4 24 tmp2 .req r5 25 tmp3 .req r6 26 27 /* 28 * Wait until master clock is ready (after swi 29 * 30 * @r_mckid: register holding master clock 31 * 32 * Side effects: overwrites r7, r8 33 */ 34 .macro wait_mckrdy r_mckid 35 #ifdef CONFIG_SOC_SAMA7 36 cmp \r_mckid, #0 37 beq 1f 38 mov r7, #AT91_PMC_MCKXRDY 39 b 2f 40 #endif 41 1: mov r7, #AT91_PMC_MCKRDY 42 2: ldr r8, [pmc, #AT91_PMC_SR] 43 and r8, r7 44 cmp r8, r7 45 bne 2b 46 .endm 47 48 /* 49 * Wait until master oscillator has stabilized 50 * 51 * Side effects: overwrites r7 52 */ 53 .macro wait_moscrdy 54 1: ldr r7, [pmc, #AT91_PMC_SR] 55 tst r7, #AT91_PMC_MOSCS 56 beq 1b 57 .endm 58 59 /* 60 * Wait for main oscillator selection is done 61 * 62 * Side effects: overwrites r7 63 */ 64 .macro wait_moscsels 65 1: ldr r7, [pmc, #AT91_PMC_SR] 66 tst r7, #AT91_PMC_MOSCSELS 67 beq 1b 68 .endm 69 70 /* 71 * Put the processor to enter the idle state 72 * 73 * Side effects: overwrites r7 74 */ 75 .macro at91_cpu_idle 76 77 #if defined(CONFIG_CPU_V7) 78 mov r7, #AT91_PMC_PCK 79 str r7, [pmc, #AT91_PMC_SCDR] 80 81 dsb 82 83 wfi @ Wait For Interrupt 84 #else 85 mcr p15, 0, tmp1, c7, c0, 4 86 #endif 87 88 .endm 89 90 /** 91 * Set state for 2.5V low power regulator 92 * @ena: 0 - disable regulator 93 * 1 - enable regulator 94 * 95 * Side effects: overwrites r7, r8, r9, r10 96 */ 97 .macro at91_2_5V_reg_set_low_power ena 98 #ifdef CONFIG_SOC_SAMA7 99 ldr r7, .sfrbu 100 mov r8, #\ena 101 ldr r9, [r7, #AT91_SFRBU_25LDOCR] 102 orr r9, r9, #AT91_SFRBU_25LDOCR_LP 103 cmp r8, #1 104 beq lp_done_\ena 105 bic r9, r9, #AT91_SFRBU_25LDOCR_LP 106 lp_done_\ena: 107 ldr r10, =AT91_SFRBU_25LDOCR_LDOAN 108 orr r9, r9, r10 109 str r9, [r7, #AT91_SFRBU_25LDOCR] 110 #endif 111 .endm 112 113 .macro at91_backup_set_lpm reg 114 #ifdef CONFIG_SOC_SAMA7 115 orr \reg, \reg, #0x200000 116 #endif 117 .endm 118 119 .text 120 121 .arm 122 123 #ifdef CONFIG_SOC_SAMA7 124 /** 125 * Enable self-refresh 126 * 127 * Side effects: overwrites r2, r3, tmp1, tmp2 128 */ 129 .macro at91_sramc_self_refresh_ena 130 ldr r2, .sramc_base 131 ldr r3, .sramc_phy_base 132 ldr r7, .pm_mode 133 134 dsb 135 136 /* Disable all AXI ports. */ 137 ldr tmp1, [r2, #UDDRC_PCTRL_0] 138 bic tmp1, tmp1, #0x1 139 str tmp1, [r2, #UDDRC_PCTRL_0] 140 141 ldr tmp1, [r2, #UDDRC_PCTRL_1] 142 bic tmp1, tmp1, #0x1 143 str tmp1, [r2, #UDDRC_PCTRL_1] 144 145 ldr tmp1, [r2, #UDDRC_PCTRL_2] 146 bic tmp1, tmp1, #0x1 147 str tmp1, [r2, #UDDRC_PCTRL_2] 148 149 ldr tmp1, [r2, #UDDRC_PCTRL_3] 150 bic tmp1, tmp1, #0x1 151 str tmp1, [r2, #UDDRC_PCTRL_3] 152 153 ldr tmp1, [r2, #UDDRC_PCTRL_4] 154 bic tmp1, tmp1, #0x1 155 str tmp1, [r2, #UDDRC_PCTRL_4] 156 157 sr_ena_1: 158 /* Wait for all ports to disable. */ 159 ldr tmp1, [r2, #UDDRC_PSTAT] 160 ldr tmp2, =UDDRC_PSTAT_ALL_PORTS 161 tst tmp1, tmp2 162 bne sr_ena_1 163 164 /* Switch to self-refresh. */ 165 ldr tmp1, [r2, #UDDRC_PWRCTL] 166 orr tmp1, tmp1, #UDDRC_PWRCTL_SELF 167 str tmp1, [r2, #UDDRC_PWRCTL] 168 169 sr_ena_2: 170 /* Wait for self-refresh enter. */ 171 ldr tmp1, [r2, #UDDRC_STAT] 172 bic tmp1, tmp1, #~UDDRC_STAT_SELFR 173 cmp tmp1, #UDDRC_STAT_SELFREF_TYPE 174 bne sr_ena_2 175 176 /* Disable DX DLLs for non-backup mode 177 cmp r7, #AT91_PM_BACKUP 178 beq sr_ena_3 179 180 /* Do not soft reset the AC DLL. */ 181 ldr tmp1, [r3, DDR3PHY_ACDLLCR] 182 bic tmp1, tmp1, DDR3PHY_ACDLLCR_DL 183 str tmp1, [r3, DDR3PHY_ACDLLCR] 184 185 /* Disable DX DLLs. */ 186 ldr tmp1, [r3, #DDR3PHY_DX0DLLCR] 187 orr tmp1, tmp1, #DDR3PHY_DXDLLCR_D 188 str tmp1, [r3, #DDR3PHY_DX0DLLCR] 189 190 ldr tmp1, [r3, #DDR3PHY_DX1DLLCR] 191 orr tmp1, tmp1, #DDR3PHY_DXDLLCR_D 192 str tmp1, [r3, #DDR3PHY_DX1DLLCR] 193 194 sr_ena_3: 195 /* Power down DDR PHY data receivers. 196 ldr tmp1, [r3, #DDR3PHY_DXCCR] 197 orr tmp1, tmp1, #DDR3PHY_DXCCR_DXP 198 str tmp1, [r3, #DDR3PHY_DXCCR] 199 200 /* Power down ADDR/CMD IO. */ 201 ldr tmp1, [r3, #DDR3PHY_ACIOCR] 202 orr tmp1, tmp1, #DDR3PHY_ACIORC_AC 203 orr tmp1, tmp1, #DDR3PHY_ACIOCR_CK 204 orr tmp1, tmp1, #DDR3PHY_ACIOCR_CS 205 str tmp1, [r3, #DDR3PHY_ACIOCR] 206 207 /* Power down ODT. */ 208 ldr tmp1, [r3, #DDR3PHY_DSGCR] 209 orr tmp1, tmp1, #DDR3PHY_DSGCR_ODT 210 str tmp1, [r3, #DDR3PHY_DSGCR] 211 .endm 212 213 /** 214 * Disable self-refresh 215 * 216 * Side effects: overwrites r2, r3, tmp1, tmp2 217 */ 218 .macro at91_sramc_self_refresh_dis 219 ldr r2, .sramc_base 220 ldr r3, .sramc_phy_base 221 222 /* Power up DDR PHY data receivers. */ 223 ldr tmp1, [r3, #DDR3PHY_DXCCR] 224 bic tmp1, tmp1, #DDR3PHY_DXCCR_DXP 225 str tmp1, [r3, #DDR3PHY_DXCCR] 226 227 /* Power up the output of CK and CS pi 228 ldr tmp1, [r3, #DDR3PHY_ACIOCR] 229 bic tmp1, tmp1, #DDR3PHY_ACIORC_AC 230 bic tmp1, tmp1, #DDR3PHY_ACIOCR_CK 231 bic tmp1, tmp1, #DDR3PHY_ACIOCR_CS 232 str tmp1, [r3, #DDR3PHY_ACIOCR] 233 234 /* Power up ODT. */ 235 ldr tmp1, [r3, #DDR3PHY_DSGCR] 236 bic tmp1, tmp1, #DDR3PHY_DSGCR_ODT 237 str tmp1, [r3, #DDR3PHY_DSGCR] 238 239 /* Enable DX DLLs. */ 240 ldr tmp1, [r3, #DDR3PHY_DX0DLLCR] 241 bic tmp1, tmp1, #DDR3PHY_DXDLLCR_D 242 str tmp1, [r3, #DDR3PHY_DX0DLLCR] 243 244 ldr tmp1, [r3, #DDR3PHY_DX1DLLCR] 245 bic tmp1, tmp1, #DDR3PHY_DXDLLCR_D 246 str tmp1, [r3, #DDR3PHY_DX1DLLCR] 247 248 /* Enable quasi-dynamic programming. * 249 mov tmp1, #0 250 str tmp1, [r2, #UDDRC_SWCTRL] 251 252 /* De-assert SDRAM initialization. */ 253 ldr tmp1, [r2, #UDDRC_DFIMISC] 254 bic tmp1, tmp1, #UDDRC_DFIMISC_DFI 255 str tmp1, [r2, #UDDRC_DFIMISC] 256 257 /* Quasi-dynamic programming done. */ 258 mov tmp1, #UDDRC_SWCTRL_SW_DONE 259 str tmp1, [r2, #UDDRC_SWCTRL] 260 261 sr_dis_1: 262 ldr tmp1, [r2, #UDDRC_SWSTAT] 263 tst tmp1, #UDDRC_SWSTAT_SW_DONE_AC 264 beq sr_dis_1 265 266 /* DLL soft-reset + DLL lock wait + IT 267 mov tmp1, #(DDR3PHY_PIR_INIT | DDR 268 DDR3PHY_PIR_DLLLOCK | 269 str tmp1, [r3, #DDR3PHY_PIR] 270 271 sr_dis_4: 272 /* Wait for it. */ 273 ldr tmp1, [r3, #DDR3PHY_PGSR] 274 tst tmp1, #DDR3PHY_PGSR_IDONE 275 beq sr_dis_4 276 277 /* Enable quasi-dynamic programming. * 278 mov tmp1, #0 279 str tmp1, [r2, #UDDRC_SWCTRL] 280 281 /* Assert PHY init complete enable sig 282 ldr tmp1, [r2, #UDDRC_DFIMISC] 283 orr tmp1, tmp1, #UDDRC_DFIMISC_DFI 284 str tmp1, [r2, #UDDRC_DFIMISC] 285 286 /* Programming is done. Set sw_done. * 287 mov tmp1, #UDDRC_SWCTRL_SW_DONE 288 str tmp1, [r2, #UDDRC_SWCTRL] 289 290 sr_dis_5: 291 /* Wait for it. */ 292 ldr tmp1, [r2, #UDDRC_SWSTAT] 293 tst tmp1, #UDDRC_SWSTAT_SW_DONE_AC 294 beq sr_dis_5 295 296 /* Trigger self-refresh exit. */ 297 ldr tmp1, [r2, #UDDRC_PWRCTL] 298 bic tmp1, tmp1, #UDDRC_PWRCTL_SELF 299 str tmp1, [r2, #UDDRC_PWRCTL] 300 301 sr_dis_6: 302 /* Wait for self-refresh exit done. */ 303 ldr tmp1, [r2, #UDDRC_STAT] 304 bic tmp1, tmp1, #~UDDRC_STAT_OPMOD 305 cmp tmp1, #UDDRC_STAT_OPMODE_NORMA 306 bne sr_dis_6 307 308 /* Enable all AXI ports. */ 309 ldr tmp1, [r2, #UDDRC_PCTRL_0] 310 orr tmp1, tmp1, #0x1 311 str tmp1, [r2, #UDDRC_PCTRL_0] 312 313 ldr tmp1, [r2, #UDDRC_PCTRL_1] 314 orr tmp1, tmp1, #0x1 315 str tmp1, [r2, #UDDRC_PCTRL_1] 316 317 ldr tmp1, [r2, #UDDRC_PCTRL_2] 318 orr tmp1, tmp1, #0x1 319 str tmp1, [r2, #UDDRC_PCTRL_2] 320 321 ldr tmp1, [r2, #UDDRC_PCTRL_3] 322 orr tmp1, tmp1, #0x1 323 str tmp1, [r2, #UDDRC_PCTRL_3] 324 325 ldr tmp1, [r2, #UDDRC_PCTRL_4] 326 orr tmp1, tmp1, #0x1 327 str tmp1, [r2, #UDDRC_PCTRL_4] 328 329 dsb 330 .endm 331 #else 332 /** 333 * Enable self-refresh 334 * 335 * register usage: 336 * @r1: memory type 337 * @r2: base address of the sram controll 338 * @r3: temporary 339 */ 340 .macro at91_sramc_self_refresh_ena 341 ldr r1, .memtype 342 ldr r2, .sramc_base 343 344 cmp r1, #AT91_MEMCTRL_MC 345 bne sr_ena_ddrc_sf 346 347 /* Active SDRAM self-refresh mode */ 348 mov r3, #1 349 str r3, [r2, #AT91_MC_SDRAMC_SRR] 350 b sr_ena_exit 351 352 sr_ena_ddrc_sf: 353 cmp r1, #AT91_MEMCTRL_DDRSDR 354 bne sr_ena_sdramc_sf 355 356 /* 357 * DDR Memory controller 358 */ 359 360 /* LPDDR1 --> force DDR2 mode during s 361 ldr r3, [r2, #AT91_DDRSDRC_MDR] 362 str r3, .saved_sam9_mdr 363 bic r3, r3, #~AT91_DDRSDRC_MD 364 cmp r3, #AT91_DDRSDRC_MD_LOW_POWER 365 ldreq r3, [r2, #AT91_DDRSDRC_MDR] 366 biceq r3, r3, #AT91_DDRSDRC_MD 367 orreq r3, r3, #AT91_DDRSDRC_MD_DDR2 368 streq r3, [r2, #AT91_DDRSDRC_MDR] 369 370 /* Active DDRC self-refresh mode */ 371 ldr r3, [r2, #AT91_DDRSDRC_LPR] 372 str r3, .saved_sam9_lpr 373 bic r3, r3, #AT91_DDRSDRC_LPCB 374 orr r3, r3, #AT91_DDRSDRC_LPCB_SEL 375 str r3, [r2, #AT91_DDRSDRC_LPR] 376 377 /* If using the 2nd ddr controller */ 378 ldr r2, .sramc1_base 379 cmp r2, #0 380 beq sr_ena_no_2nd_ddrc 381 382 ldr r3, [r2, #AT91_DDRSDRC_MDR] 383 str r3, .saved_sam9_mdr1 384 bic r3, r3, #~AT91_DDRSDRC_MD 385 cmp r3, #AT91_DDRSDRC_MD_LOW_POWER 386 ldreq r3, [r2, #AT91_DDRSDRC_MDR] 387 biceq r3, r3, #AT91_DDRSDRC_MD 388 orreq r3, r3, #AT91_DDRSDRC_MD_DDR2 389 streq r3, [r2, #AT91_DDRSDRC_MDR] 390 391 /* Active DDRC self-refresh mode */ 392 ldr r3, [r2, #AT91_DDRSDRC_LPR] 393 str r3, .saved_sam9_lpr1 394 bic r3, r3, #AT91_DDRSDRC_LPCB 395 orr r3, r3, #AT91_DDRSDRC_LPCB_SEL 396 str r3, [r2, #AT91_DDRSDRC_LPR] 397 398 sr_ena_no_2nd_ddrc: 399 b sr_ena_exit 400 401 /* 402 * SDRAMC Memory controller 403 */ 404 sr_ena_sdramc_sf: 405 /* Active SDRAMC self-refresh mode */ 406 ldr r3, [r2, #AT91_SDRAMC_LPR] 407 str r3, .saved_sam9_lpr 408 bic r3, r3, #AT91_SDRAMC_LPCB 409 orr r3, r3, #AT91_SDRAMC_LPCB_SELF 410 str r3, [r2, #AT91_SDRAMC_LPR] 411 412 ldr r3, .saved_sam9_lpr 413 str r3, [r2, #AT91_SDRAMC_LPR] 414 415 sr_ena_exit: 416 .endm 417 418 /** 419 * Disable self-refresh 420 * 421 * register usage: 422 * @r1: memory type 423 * @r2: base address of the sram controll 424 * @r3: temporary 425 */ 426 .macro at91_sramc_self_refresh_dis 427 ldr r1, .memtype 428 ldr r2, .sramc_base 429 430 cmp r1, #AT91_MEMCTRL_MC 431 bne sr_dis_ddrc_exit_sf 432 433 /* 434 * at91rm9200 Memory controller 435 */ 436 437 /* 438 * For exiting the self-refresh mode, 439 * automatically exit the self-refres 440 */ 441 b sr_dis_exit 442 443 sr_dis_ddrc_exit_sf: 444 cmp r1, #AT91_MEMCTRL_DDRSDR 445 bne sdramc_exit_sf 446 447 /* DDR Memory controller */ 448 449 /* Restore MDR in case of LPDDR1 */ 450 ldr r3, .saved_sam9_mdr 451 str r3, [r2, #AT91_DDRSDRC_MDR] 452 /* Restore LPR on AT91 with DDRAM */ 453 ldr r3, .saved_sam9_lpr 454 str r3, [r2, #AT91_DDRSDRC_LPR] 455 456 /* If using the 2nd ddr controller */ 457 ldr r2, .sramc1_base 458 cmp r2, #0 459 ldrne r3, .saved_sam9_mdr1 460 strne r3, [r2, #AT91_DDRSDRC_MDR] 461 ldrne r3, .saved_sam9_lpr1 462 strne r3, [r2, #AT91_DDRSDRC_LPR] 463 464 b sr_dis_exit 465 466 sdramc_exit_sf: 467 /* SDRAMC Memory controller */ 468 ldr r3, .saved_sam9_lpr 469 str r3, [r2, #AT91_SDRAMC_LPR] 470 471 sr_dis_exit: 472 .endm 473 #endif 474 475 .macro at91_pm_ulp0_mode 476 ldr pmc, .pmc_base 477 ldr tmp2, .pm_mode 478 ldr tmp3, .mckr_offset 479 480 /* Check if ULP0 fast variant has been 481 cmp tmp2, #AT91_PM_ULP0_FAST 482 bne 0f 483 484 /* Set highest prescaler for power sav 485 ldr tmp1, [pmc, tmp3] 486 bic tmp1, tmp1, #AT91_PMC_PRES 487 orr tmp1, tmp1, #AT91_PMC_PRES_64 488 str tmp1, [pmc, tmp3] 489 490 mov tmp3, #0 491 wait_mckrdy tmp3 492 b 1f 493 494 0: 495 /* Turn off the crystal oscillator */ 496 ldr tmp1, [pmc, #AT91_CKGR_MOR] 497 bic tmp1, tmp1, #AT91_PMC_MOSCEN 498 orr tmp1, tmp1, #AT91_PMC_KEY 499 str tmp1, [pmc, #AT91_CKGR_MOR] 500 501 /* Save RC oscillator state */ 502 ldr tmp1, [pmc, #AT91_PMC_SR] 503 str tmp1, .saved_osc_status 504 tst tmp1, #AT91_PMC_MOSCRCS 505 bne 1f 506 507 /* Turn off RC oscillator */ 508 ldr tmp1, [pmc, #AT91_CKGR_MOR] 509 bic tmp1, tmp1, #AT91_PMC_MOSCRCEN 510 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 511 orr tmp1, tmp1, #AT91_PMC_KEY 512 str tmp1, [pmc, #AT91_CKGR_MOR] 513 514 /* Wait main RC disabled done */ 515 2: ldr tmp1, [pmc, #AT91_PMC_SR] 516 tst tmp1, #AT91_PMC_MOSCRCS 517 bne 2b 518 519 /* Wait for interrupt */ 520 1: at91_cpu_idle 521 522 /* Check if ULP0 fast variant has been 523 cmp tmp2, #AT91_PM_ULP0_FAST 524 bne 5f 525 526 /* Set lowest prescaler for fast resum 527 ldr tmp3, .mckr_offset 528 ldr tmp1, [pmc, tmp3] 529 bic tmp1, tmp1, #AT91_PMC_PRES 530 str tmp1, [pmc, tmp3] 531 532 mov tmp3, #0 533 wait_mckrdy tmp3 534 b 6f 535 536 5: /* Restore RC oscillator state */ 537 ldr tmp1, .saved_osc_status 538 tst tmp1, #AT91_PMC_MOSCRCS 539 beq 4f 540 541 /* Turn on RC oscillator */ 542 ldr tmp1, [pmc, #AT91_CKGR_MOR] 543 orr tmp1, tmp1, #AT91_PMC_MOSCRCEN 544 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 545 orr tmp1, tmp1, #AT91_PMC_KEY 546 str tmp1, [pmc, #AT91_CKGR_MOR] 547 548 /* Wait main RC stabilization */ 549 3: ldr tmp1, [pmc, #AT91_PMC_SR] 550 tst tmp1, #AT91_PMC_MOSCRCS 551 beq 3b 552 553 /* Turn on the crystal oscillator */ 554 4: ldr tmp1, [pmc, #AT91_CKGR_MOR] 555 orr tmp1, tmp1, #AT91_PMC_MOSCEN 556 orr tmp1, tmp1, #AT91_PMC_KEY 557 str tmp1, [pmc, #AT91_CKGR_MOR] 558 559 wait_moscrdy 560 6: 561 .endm 562 563 /** 564 * Note: This procedure only applies on the pl 565 * the external crystal oscillator as a main c 566 */ 567 .macro at91_pm_ulp1_mode 568 ldr pmc, .pmc_base 569 ldr tmp2, .mckr_offset 570 mov tmp3, #0 571 572 /* Save RC oscillator state and check 573 ldr tmp1, [pmc, #AT91_PMC_SR] 574 str tmp1, .saved_osc_status 575 tst tmp1, #AT91_PMC_MOSCRCS 576 bne 2f 577 578 /* Enable RC oscillator */ 579 ldr tmp1, [pmc, #AT91_CKGR_MOR] 580 orr tmp1, tmp1, #AT91_PMC_MOSCRCEN 581 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 582 orr tmp1, tmp1, #AT91_PMC_KEY 583 str tmp1, [pmc, #AT91_CKGR_MOR] 584 585 /* Wait main RC stabilization */ 586 1: ldr tmp1, [pmc, #AT91_PMC_SR] 587 tst tmp1, #AT91_PMC_MOSCRCS 588 beq 1b 589 590 /* Switch the main clock source to 12- 591 2: ldr tmp1, [pmc, #AT91_CKGR_MOR] 592 bic tmp1, tmp1, #AT91_PMC_MOSCSEL 593 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 594 orr tmp1, tmp1, #AT91_PMC_KEY 595 str tmp1, [pmc, #AT91_CKGR_MOR] 596 597 wait_moscsels 598 599 /* Disable the crystal oscillator */ 600 ldr tmp1, [pmc, #AT91_CKGR_MOR] 601 bic tmp1, tmp1, #AT91_PMC_MOSCEN 602 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 603 orr tmp1, tmp1, #AT91_PMC_KEY 604 str tmp1, [pmc, #AT91_CKGR_MOR] 605 606 /* Switch the master clock source to m 607 ldr tmp1, [pmc, tmp2] 608 bic tmp1, tmp1, #AT91_PMC_CSS 609 orr tmp1, tmp1, #AT91_PMC_CSS_MAIN 610 str tmp1, [pmc, tmp2] 611 612 wait_mckrdy tmp3 613 614 /* Enter the ULP1 mode by set WAITMODE 615 ldr tmp1, [pmc, #AT91_CKGR_MOR] 616 orr tmp1, tmp1, #AT91_PMC_WAITMODE 617 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 618 orr tmp1, tmp1, #AT91_PMC_KEY 619 str tmp1, [pmc, #AT91_CKGR_MOR] 620 621 /* Quirk for SAM9X60's PMC */ 622 nop 623 nop 624 625 wait_mckrdy tmp3 626 627 /* Enable the crystal oscillator */ 628 ldr tmp1, [pmc, #AT91_CKGR_MOR] 629 orr tmp1, tmp1, #AT91_PMC_MOSCEN 630 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 631 orr tmp1, tmp1, #AT91_PMC_KEY 632 str tmp1, [pmc, #AT91_CKGR_MOR] 633 634 wait_moscrdy 635 636 /* Switch the master clock source to s 637 ldr tmp1, [pmc, tmp2] 638 bic tmp1, tmp1, #AT91_PMC_CSS 639 str tmp1, [pmc, tmp2] 640 641 wait_mckrdy tmp3 642 643 /* Switch main clock source to crystal 644 ldr tmp1, [pmc, #AT91_CKGR_MOR] 645 orr tmp1, tmp1, #AT91_PMC_MOSCSEL 646 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 647 orr tmp1, tmp1, #AT91_PMC_KEY 648 str tmp1, [pmc, #AT91_CKGR_MOR] 649 650 wait_moscsels 651 652 /* Switch the master clock source to m 653 ldr tmp1, [pmc, tmp2] 654 bic tmp1, tmp1, #AT91_PMC_CSS 655 orr tmp1, tmp1, #AT91_PMC_CSS_MAIN 656 str tmp1, [pmc, tmp2] 657 658 wait_mckrdy tmp3 659 660 /* Restore RC oscillator state */ 661 ldr tmp1, .saved_osc_status 662 tst tmp1, #AT91_PMC_MOSCRCS 663 bne 3f 664 665 /* Disable RC oscillator */ 666 ldr tmp1, [pmc, #AT91_CKGR_MOR] 667 bic tmp1, tmp1, #AT91_PMC_MOSCRCEN 668 bic tmp1, tmp1, #AT91_PMC_KEY_MASK 669 orr tmp1, tmp1, #AT91_PMC_KEY 670 str tmp1, [pmc, #AT91_CKGR_MOR] 671 672 /* Wait RC oscillator disable done */ 673 4: ldr tmp1, [pmc, #AT91_PMC_SR] 674 tst tmp1, #AT91_PMC_MOSCRCS 675 bne 4b 676 677 3: 678 .endm 679 680 .macro at91_plla_disable 681 /* Save PLLA setting and disable it */ 682 ldr tmp1, .pmc_version 683 cmp tmp1, #AT91_PMC_V1 684 beq 1f 685 686 #ifdef CONFIG_HAVE_AT91_SAM9X60_PLL 687 /* Save PLLA settings. */ 688 ldr tmp2, [pmc, #AT91_PMC_PLL_UPDT 689 bic tmp2, tmp2, #AT91_PMC_PLL_UPDT 690 str tmp2, [pmc, #AT91_PMC_PLL_UPDT 691 692 /* save div. */ 693 mov tmp1, #0 694 ldr tmp2, [pmc, #AT91_PMC_PLL_CTRL 695 bic tmp2, tmp2, #0xffffff00 696 orr tmp1, tmp1, tmp2 697 698 /* save mul. */ 699 ldr tmp2, [pmc, #AT91_PMC_PLL_CTRL 700 bic tmp2, tmp2, #0xffffff 701 orr tmp1, tmp1, tmp2 702 str tmp1, .saved_pllar 703 704 /* step 2. */ 705 ldr tmp1, [pmc, #AT91_PMC_PLL_UPDT 706 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 707 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 708 str tmp1, [pmc, #AT91_PMC_PLL_UPDT 709 710 /* step 3. */ 711 ldr tmp1, [pmc, #AT91_PMC_PLL_CTRL 712 bic tmp1, tmp1, #AT91_PMC_PLL_CTRL 713 orr tmp1, tmp1, #AT91_PMC_PLL_CTRL 714 str tmp1, [pmc, #AT91_PMC_PLL_CTRL 715 716 /* step 4. */ 717 ldr tmp1, [pmc, #AT91_PMC_PLL_UPDT 718 orr tmp1, tmp1, #AT91_PMC_PLL_UPDT 719 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 720 str tmp1, [pmc, #AT91_PMC_PLL_UPDT 721 722 /* step 5. */ 723 ldr tmp1, [pmc, #AT91_PMC_PLL_CTRL 724 bic tmp1, tmp1, #AT91_PMC_PLL_CTRL 725 str tmp1, [pmc, #AT91_PMC_PLL_CTRL 726 727 /* step 7. */ 728 ldr tmp1, [pmc, #AT91_PMC_PLL_UPDT 729 orr tmp1, tmp1, #AT91_PMC_PLL_UPDT 730 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 731 str tmp1, [pmc, #AT91_PMC_PLL_UPDT 732 733 b 2f 734 #endif 735 736 1: /* Save PLLA setting and disable it */ 737 ldr tmp1, [pmc, #AT91_CKGR_PLLAR] 738 str tmp1, .saved_pllar 739 740 /* Disable PLLA. */ 741 mov tmp1, #AT91_PMC_PLLCOUNT 742 orr tmp1, tmp1, #(1 << 29) 743 str tmp1, [pmc, #AT91_CKGR_PLLAR] 744 2: 745 .endm 746 747 .macro at91_plla_enable 748 ldr tmp2, .saved_pllar 749 ldr tmp3, .pmc_version 750 cmp tmp3, #AT91_PMC_V1 751 beq 4f 752 753 #ifdef CONFIG_HAVE_AT91_SAM9X60_PLL 754 /* step 1. */ 755 ldr tmp1, [pmc, #AT91_PMC_PLL_UPDT 756 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 757 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 758 str tmp1, [pmc, #AT91_PMC_PLL_UPDT 759 760 /* step 2. */ 761 ldr tmp1, =AT91_PMC_PLL_ACR_DEFAUL 762 str tmp1, [pmc, #AT91_PMC_PLL_ACR] 763 764 /* step 3. */ 765 ldr tmp1, [pmc, #AT91_PMC_PLL_CTRL 766 mov tmp3, tmp2 767 bic tmp3, tmp3, #0xffffff 768 orr tmp1, tmp1, tmp3 769 str tmp1, [pmc, #AT91_PMC_PLL_CTRL 770 771 /* step 8. */ 772 ldr tmp1, [pmc, #AT91_PMC_PLL_UPDT 773 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 774 orr tmp1, tmp1, #AT91_PMC_PLL_UPDT 775 str tmp1, [pmc, #AT91_PMC_PLL_UPDT 776 777 /* step 9. */ 778 ldr tmp1, [pmc, #AT91_PMC_PLL_CTRL 779 orr tmp1, tmp1, #AT91_PMC_PLL_CTRL 780 orr tmp1, tmp1, #AT91_PMC_PLL_CTRL 781 orr tmp1, tmp1, #AT91_PMC_PLL_CTRL 782 bic tmp1, tmp1, #0xff 783 mov tmp3, tmp2 784 bic tmp3, tmp3, #0xffffff00 785 orr tmp1, tmp1, tmp3 786 str tmp1, [pmc, #AT91_PMC_PLL_CTRL 787 788 /* step 10. */ 789 ldr tmp1, [pmc, #AT91_PMC_PLL_UPDT 790 orr tmp1, tmp1, #AT91_PMC_PLL_UPDT 791 bic tmp1, tmp1, #AT91_PMC_PLL_UPDT 792 str tmp1, [pmc, #AT91_PMC_PLL_UPDT 793 794 /* step 11. */ 795 3: ldr tmp1, [pmc, #AT91_PMC_PLL_ISR0 796 tst tmp1, #0x1 797 beq 3b 798 b 2f 799 #endif 800 801 /* Restore PLLA setting */ 802 4: str tmp2, [pmc, #AT91_CKGR_PLLAR] 803 804 /* Enable PLLA. */ 805 tst tmp2, #(AT91_PMC_MUL & 0xff00 806 bne 1f 807 tst tmp2, #(AT91_PMC_MUL & ~0xff00 808 beq 2f 809 810 1: ldr tmp1, [pmc, #AT91_PMC_SR] 811 tst tmp1, #AT91_PMC_LOCKA 812 beq 1b 813 2: 814 .endm 815 816 /** 817 * at91_mckx_ps_enable: save MCK1..4 settings 818 * 819 * Side effects: overwrites tmp1, tmp2 820 */ 821 .macro at91_mckx_ps_enable 822 #ifdef CONFIG_SOC_SAMA7 823 ldr pmc, .pmc_base 824 825 /* There are 4 MCKs we need to handle: 826 mov tmp1, #1 827 e_loop: cmp tmp1, #5 828 beq e_done 829 830 /* Write MCK ID to retrieve the settin 831 str tmp1, [pmc, #AT91_PMC_MCR_V2] 832 ldr tmp2, [pmc, #AT91_PMC_MCR_V2] 833 834 e_save_mck1: 835 cmp tmp1, #1 836 bne e_save_mck2 837 str tmp2, .saved_mck1 838 b e_ps 839 840 e_save_mck2: 841 cmp tmp1, #2 842 bne e_save_mck3 843 str tmp2, .saved_mck2 844 b e_ps 845 846 e_save_mck3: 847 cmp tmp1, #3 848 bne e_save_mck4 849 str tmp2, .saved_mck3 850 b e_ps 851 852 e_save_mck4: 853 str tmp2, .saved_mck4 854 855 e_ps: 856 /* Use CSS=MAINCK and DIV=1. */ 857 bic tmp2, tmp2, #AT91_PMC_MCR_V2_C 858 bic tmp2, tmp2, #AT91_PMC_MCR_V2_D 859 orr tmp2, tmp2, #AT91_PMC_MCR_V2_C 860 orr tmp2, tmp2, #AT91_PMC_MCR_V2_D 861 str tmp2, [pmc, #AT91_PMC_MCR_V2] 862 863 wait_mckrdy tmp1 864 865 add tmp1, tmp1, #1 866 b e_loop 867 868 e_done: 869 #endif 870 .endm 871 872 /** 873 * at91_mckx_ps_restore: restore MCK1..4 setti 874 * 875 * Side effects: overwrites tmp1, tmp2 876 */ 877 .macro at91_mckx_ps_restore 878 #ifdef CONFIG_SOC_SAMA7 879 ldr pmc, .pmc_base 880 881 /* There are 4 MCKs we need to handle: 882 mov tmp1, #1 883 r_loop: cmp tmp1, #5 884 beq r_done 885 886 r_save_mck1: 887 cmp tmp1, #1 888 bne r_save_mck2 889 ldr tmp2, .saved_mck1 890 b r_ps 891 892 r_save_mck2: 893 cmp tmp1, #2 894 bne r_save_mck3 895 ldr tmp2, .saved_mck2 896 b r_ps 897 898 r_save_mck3: 899 cmp tmp1, #3 900 bne r_save_mck4 901 ldr tmp2, .saved_mck3 902 b r_ps 903 904 r_save_mck4: 905 ldr tmp2, .saved_mck4 906 907 r_ps: 908 /* Write MCK ID to retrieve the settin 909 str tmp1, [pmc, #AT91_PMC_MCR_V2] 910 ldr tmp3, [pmc, #AT91_PMC_MCR_V2] 911 912 /* We need to restore CSS and DIV. */ 913 bic tmp3, tmp3, #AT91_PMC_MCR_V2_C 914 bic tmp3, tmp3, #AT91_PMC_MCR_V2_D 915 orr tmp3, tmp3, tmp2 916 bic tmp3, tmp3, #AT91_PMC_MCR_V2_I 917 orr tmp3, tmp3, tmp1 918 orr tmp3, tmp3, #AT91_PMC_MCR_V2_C 919 str tmp2, [pmc, #AT91_PMC_MCR_V2] 920 921 wait_mckrdy tmp1 922 923 add tmp1, tmp1, #1 924 b r_loop 925 r_done: 926 #endif 927 .endm 928 929 .macro at91_ulp_mode 930 at91_mckx_ps_enable 931 932 ldr pmc, .pmc_base 933 ldr tmp2, .mckr_offset 934 ldr tmp3, .pm_mode 935 936 /* Save Master clock setting */ 937 ldr tmp1, [pmc, tmp2] 938 str tmp1, .saved_mckr 939 940 /* 941 * Set master clock source to: 942 * - MAINCK if using ULP0 fast variant 943 * - slow clock, otherwise 944 */ 945 bic tmp1, tmp1, #AT91_PMC_CSS 946 cmp tmp3, #AT91_PM_ULP0_FAST 947 bne save_mck 948 orr tmp1, tmp1, #AT91_PMC_CSS_MAIN 949 save_mck: 950 str tmp1, [pmc, tmp2] 951 952 mov tmp3, #0 953 wait_mckrdy tmp3 954 955 at91_plla_disable 956 957 /* Enable low power mode for 2.5V regu 958 at91_2_5V_reg_set_low_power 1 959 960 ldr tmp3, .pm_mode 961 cmp tmp3, #AT91_PM_ULP1 962 beq ulp1_mode 963 964 at91_pm_ulp0_mode 965 b ulp_exit 966 967 ulp1_mode: 968 at91_pm_ulp1_mode 969 b ulp_exit 970 971 ulp_exit: 972 /* Disable low power mode for 2.5V reg 973 at91_2_5V_reg_set_low_power 0 974 975 ldr pmc, .pmc_base 976 977 at91_plla_enable 978 979 /* 980 * Restore master clock setting 981 */ 982 ldr tmp1, .mckr_offset 983 ldr tmp2, .saved_mckr 984 str tmp2, [pmc, tmp1] 985 986 mov tmp3, #0 987 wait_mckrdy tmp3 988 989 at91_mckx_ps_restore 990 .endm 991 992 .macro at91_backup_mode 993 /* Switch the master clock source to s 994 ldr pmc, .pmc_base 995 ldr tmp2, .mckr_offset 996 ldr tmp1, [pmc, tmp2] 997 bic tmp1, tmp1, #AT91_PMC_CSS 998 str tmp1, [pmc, tmp2] 999 1000 mov tmp3, #0 1001 wait_mckrdy tmp3 1002 1003 /*BUMEN*/ 1004 ldr r0, .sfrbu 1005 mov tmp1, #0x1 1006 str tmp1, [r0, #0x10] 1007 1008 /* Wait for it. */ 1009 1: ldr tmp1, [r0, #0x10] 1010 tst tmp1, #0x1 1011 beq 1b 1012 1013 /* Shutdown */ 1014 ldr r0, .shdwc 1015 mov tmp1, #0xA5000000 1016 add tmp1, tmp1, #0x1 1017 at91_backup_set_lpm tmp1 1018 str tmp1, [r0, #0] 1019 .endm 1020 1021 /* 1022 * void at91_suspend_sram_fn(struct at91_pm_d 1023 * @input param: 1024 * @r0: base address of struct at91_pm_d 1025 */ 1026 /* at91_pm_suspend_in_sram must be 8-byte ali 1027 .align 3 1028 ENTRY(at91_pm_suspend_in_sram) 1029 /* Save registers on stack */ 1030 stmfd sp!, {r4 - r12, lr} 1031 1032 /* Drain write buffer */ 1033 mov tmp1, #0 1034 mcr p15, 0, tmp1, c7, c10, 4 1035 1036 /* Flush tlb. */ 1037 mov r4, #0 1038 mcr p15, 0, r4, c8, c7, 0 1039 1040 ldr tmp1, [r0, #PM_DATA_PMC_MCKR_ 1041 str tmp1, .mckr_offset 1042 ldr tmp1, [r0, #PM_DATA_PMC_VERSI 1043 str tmp1, .pmc_version 1044 ldr tmp1, [r0, #PM_DATA_MEMCTRL] 1045 str tmp1, .memtype 1046 ldr tmp1, [r0, #PM_DATA_MODE] 1047 str tmp1, .pm_mode 1048 1049 /* 1050 * ldrne below are here to preload th 1051 * to RAM may be limited while in sel 1052 */ 1053 ldr tmp1, [r0, #PM_DATA_PMC] 1054 str tmp1, .pmc_base 1055 cmp tmp1, #0 1056 ldrne tmp2, [tmp1, #0] 1057 1058 ldr tmp1, [r0, #PM_DATA_RAMC0] 1059 str tmp1, .sramc_base 1060 cmp tmp1, #0 1061 ldrne tmp2, [tmp1, #0] 1062 1063 ldr tmp1, [r0, #PM_DATA_RAMC1] 1064 str tmp1, .sramc1_base 1065 cmp tmp1, #0 1066 ldrne tmp2, [tmp1, #0] 1067 1068 #ifndef CONFIG_SOC_SAM_V4_V5 1069 /* ldrne below are here to preload th 1070 ldr tmp1, [r0, #PM_DATA_RAMC_PHY] 1071 str tmp1, .sramc_phy_base 1072 cmp tmp1, #0 1073 ldrne tmp2, [tmp1, #0] 1074 1075 ldr tmp1, [r0, #PM_DATA_SHDWC] 1076 str tmp1, .shdwc 1077 cmp tmp1, #0 1078 ldrne tmp2, [tmp1, #0] 1079 1080 ldr tmp1, [r0, #PM_DATA_SFRBU] 1081 str tmp1, .sfrbu 1082 cmp tmp1, #0 1083 ldrne tmp2, [tmp1, #0x10] 1084 #endif 1085 1086 /* Active the self-refresh mode */ 1087 at91_sramc_self_refresh_ena 1088 1089 ldr r0, .pm_mode 1090 cmp r0, #AT91_PM_STANDBY 1091 beq standby 1092 cmp r0, #AT91_PM_BACKUP 1093 beq backup_mode 1094 1095 at91_ulp_mode 1096 b exit_suspend 1097 1098 standby: 1099 /* Wait for interrupt */ 1100 ldr pmc, .pmc_base 1101 at91_cpu_idle 1102 b exit_suspend 1103 1104 backup_mode: 1105 at91_backup_mode 1106 1107 exit_suspend: 1108 /* Exit the self-refresh mode */ 1109 at91_sramc_self_refresh_dis 1110 1111 /* Restore registers, and return */ 1112 ldmfd sp!, {r4 - r12, pc} 1113 ENDPROC(at91_pm_suspend_in_sram) 1114 1115 .pmc_base: 1116 .word 0 1117 .sramc_base: 1118 .word 0 1119 .sramc1_base: 1120 .word 0 1121 .sramc_phy_base: 1122 .word 0 1123 .shdwc: 1124 .word 0 1125 .sfrbu: 1126 .word 0 1127 .memtype: 1128 .word 0 1129 .pm_mode: 1130 .word 0 1131 .mckr_offset: 1132 .word 0 1133 .pmc_version: 1134 .word 0 1135 .saved_mckr: 1136 .word 0 1137 .saved_pllar: 1138 .word 0 1139 .saved_sam9_lpr: 1140 .word 0 1141 .saved_sam9_lpr1: 1142 .word 0 1143 .saved_sam9_mdr: 1144 .word 0 1145 .saved_sam9_mdr1: 1146 .word 0 1147 .saved_osc_status: 1148 .word 0 1149 #ifdef CONFIG_SOC_SAMA7 1150 .saved_mck1: 1151 .word 0 1152 .saved_mck2: 1153 .word 0 1154 .saved_mck3: 1155 .word 0 1156 .saved_mck4: 1157 .word 0 1158 #endif 1159 1160 ENTRY(at91_pm_suspend_in_sram_sz) 1161 .word .-at91_pm_suspend_in_sram
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.