psc.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2010-11-13 weety first version
  9. */
  10. #include "dm36x.h"
  11. /* ------------------------------------------------------------------------ *
  12. * psc_change_state( id, state ) *
  13. * id = Domain #ID *
  14. * state = ( ENABLE, DISABLE, SYNCRESET, RESET ) *
  15. * ( =3 , =2 , =1 , =0 ) *
  16. * ------------------------------------------------------------------------ */
  17. void psc_change_state(int id, int state)
  18. {
  19. rt_uint32_t mdstat, mdctl;
  20. if (id > DAVINCI_DM365_LPSC_KALEIDO)
  21. return;
  22. mdstat = PSC_MDSTAT_BASE + (id * 4);
  23. mdctl = PSC_MDCTL_BASE + (id * 4);
  24. /*
  25. * Step 0 - Ignore request if the state is already set as is
  26. */
  27. if ((readl(mdstat) & 0x1f) == state)
  28. return;
  29. /*
  30. * Step 1 - Wait for PTSTAT.GOSTAT to clear
  31. */
  32. while (readl(PSC_PTSTAT) & 1) ;
  33. /*
  34. * Step 2 - Set MDCTLx.NEXT to new state
  35. */
  36. writel(readl(mdctl) & (~0x1f), mdctl);
  37. writel(readl(mdctl) | state, mdctl);
  38. /*
  39. * Step 3 - Start power transition ( set PTCMD.GO to 1 )
  40. */
  41. writel(readl(PSC_PTCMD) | 1, PSC_PTCMD);
  42. /*
  43. * Step 4 - Wait for PTSTAT.GOSTAT to clear
  44. */
  45. while (readl(PSC_PTSTAT) & 1) ;
  46. }