pll.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright 2007-2008 Analog Devices Inc.
  3. *
  4. * Licensed under the GPL-2 or later.
  5. */
  6. #ifndef _MACH_PLL_H
  7. #define _MACH_PLL_H
  8. #include <asm/blackfin.h>
  9. #include <asm/irqflags.h>
  10. /* Writing to PLL_CTL initiates a PLL relock sequence. */
  11. static __inline__ void bfin_write_PLL_CTL(unsigned int val)
  12. {
  13. unsigned long flags, iwr0, iwr1, iwr2;
  14. if (val == bfin_read_PLL_CTL())
  15. return;
  16. local_irq_save_hw(flags);
  17. /* Enable the PLL Wakeup bit in SIC IWR */
  18. iwr0 = bfin_read32(SIC_IWR0);
  19. iwr1 = bfin_read32(SIC_IWR1);
  20. iwr2 = bfin_read32(SIC_IWR2);
  21. /* Only allow PPL Wakeup) */
  22. bfin_write32(SIC_IWR0, IWR_ENABLE(0));
  23. bfin_write32(SIC_IWR1, 0);
  24. bfin_write32(SIC_IWR2, 0);
  25. bfin_write16(PLL_CTL, val);
  26. SSYNC();
  27. asm("IDLE;");
  28. bfin_write32(SIC_IWR0, iwr0);
  29. bfin_write32(SIC_IWR1, iwr1);
  30. bfin_write32(SIC_IWR2, iwr2);
  31. local_irq_restore_hw(flags);
  32. }
  33. /* Writing to VR_CTL initiates a PLL relock sequence. */
  34. static __inline__ void bfin_write_VR_CTL(unsigned int val)
  35. {
  36. unsigned long flags, iwr0, iwr1, iwr2;
  37. if (val == bfin_read_VR_CTL())
  38. return;
  39. local_irq_save_hw(flags);
  40. /* Enable the PLL Wakeup bit in SIC IWR */
  41. iwr0 = bfin_read32(SIC_IWR0);
  42. iwr1 = bfin_read32(SIC_IWR1);
  43. iwr2 = bfin_read32(SIC_IWR2);
  44. /* Only allow PPL Wakeup) */
  45. bfin_write32(SIC_IWR0, IWR_ENABLE(0));
  46. bfin_write32(SIC_IWR1, 0);
  47. bfin_write32(SIC_IWR2, 0);
  48. bfin_write16(VR_CTL, val);
  49. SSYNC();
  50. asm("IDLE;");
  51. bfin_write32(SIC_IWR0, iwr0);
  52. bfin_write32(SIC_IWR1, iwr1);
  53. bfin_write32(SIC_IWR2, iwr2);
  54. local_irq_restore_hw(flags);
  55. }
  56. #endif /* _MACH_PLL_H */