spm_md_mtcmos.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. }
  40. int spm_mtcmos_ctrl_mdsys2(int state)
  41. {
  42. int err = 0;
  43. volatile unsigned int val;
  44. unsigned long flags;
  45. int count = 0;
  46. if (state == STA_POWER_DOWN) {
  47. spm_write(TOPAXI_PROT_EN, spm_read(TOPAXI_PROT_EN) | MD2_PROT_MASK);
  48. while ((spm_read(TOPAXI_PROT_STA1) & MD2_PROT_MASK) != MD2_PROT_MASK) {
  49. count++;
  50. if(count>1000)
  51. break;
  52. }
  53. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) | MD_SRAM_PDN);
  54. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) | PWR_ISO);
  55. val = spm_read(SPM_C2K_PWR_CON);
  56. val = (val & ~PWR_RST_B) | PWR_CLK_DIS;
  57. spm_write(SPM_C2K_PWR_CON, val);
  58. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) & ~(PWR_ON | PWR_ON_2ND));
  59. while ((spm_read(SPM_PWR_STATUS) & MD2_PWR_STA_MASK)
  60. || (spm_read(SPM_PWR_STATUS_2ND) & MD2_PWR_STA_MASK)) {
  61. }
  62. } else { /* STA_POWER_ON */
  63. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) | PWR_ON);
  64. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) | PWR_ON_2ND);
  65. while (!(spm_read(SPM_PWR_STATUS) & MD2_PWR_STA_MASK)
  66. || !(spm_read(SPM_PWR_STATUS_2ND) & MD2_PWR_STA_MASK)) {
  67. }
  68. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) & ~PWR_CLK_DIS);
  69. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) & ~PWR_ISO);
  70. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) | PWR_RST_B);
  71. spm_write(SPM_C2K_PWR_CON, spm_read(SPM_C2K_PWR_CON) & ~MD_SRAM_PDN);
  72. spm_write(TOPAXI_PROT_EN, spm_read(TOPAXI_PROT_EN) & ~MD2_PROT_MASK);
  73. while (spm_read(TOPAXI_PROT_STA1) & MD2_PROT_MASK) {
  74. }
  75. }
  76. return err;
  77. }