spm_md_mtcmos.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <platform/spm.h>
  2. int spm_mtcmos_ctrl_mdsys1(int state)
  3. {
  4. int err = 0;
  5. volatile unsigned int val;
  6. unsigned long flags;
  7. int count = 0;
  8. if (state == STA_POWER_DOWN) {
  9. spm_write(TOPAXI_PROT_EN, spm_read(TOPAXI_PROT_EN) | MD1_PROT_MASK);
  10. while ((spm_read(TOPAXI_PROT_STA1) & MD1_PROT_MASK) != MD1_PROT_MASK) {
  11. count++;
  12. if(count>1000)
  13. break;
  14. }
  15. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) | MD_SRAM_PDN);
  16. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) | PWR_ISO);
  17. val = spm_read(SPM_MD_PWR_CON);
  18. val = (val & ~PWR_RST_B) | PWR_CLK_DIS;
  19. spm_write(SPM_MD_PWR_CON, val);
  20. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) & ~(PWR_ON | PWR_ON_2ND));
  21. while ((spm_read(SPM_PWR_STATUS) & MD1_PWR_STA_MASK)
  22. || (spm_read(SPM_PWR_STATUS_2ND) & MD1_PWR_STA_MASK)) {
  23. }
  24. } else { /* STA_POWER_ON */
  25. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) | PWR_ON);
  26. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) | PWR_ON_2ND);
  27. while (!(spm_read(SPM_PWR_STATUS) & MD1_PWR_STA_MASK)
  28. || !(spm_read(SPM_PWR_STATUS_2ND) & MD1_PWR_STA_MASK)) {
  29. }
  30. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) & ~PWR_CLK_DIS);
  31. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) & ~PWR_ISO);
  32. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) | PWR_RST_B);
  33. spm_write(SPM_MD_PWR_CON, spm_read(SPM_MD_PWR_CON) & ~MD_SRAM_PDN);
  34. spm_write(TOPAXI_PROT_EN, spm_read(TOPAXI_PROT_EN) & ~MD1_PROT_MASK);
  35. while (spm_read(TOPAXI_PROT_STA1) & MD1_PROT_MASK) {
  36. }
  37. }
  38. return err;
  39. }