sysctl.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "chip.h"
  2. static int get_rst_reg_and_bitoff(enum soft_rst_n reset_dev, uint32_t *reg, uint8_t *bitoff)
  3. {
  4. switch (reset_dev/32) {
  5. case 0:
  6. *reg = REGS_SYSCTL_BASE + SYS_SOFTRESET_CTL;
  7. break;
  8. case 1:
  9. *reg = REGS_SYSCTL_BASE + SYS_SOFTRESET_CTL1;
  10. break;
  11. case 2:
  12. *reg = REGS_SYSCTL_BASE + SYS_SOFTRESET_CTL2;
  13. break;
  14. default:
  15. printf ("illegal reset device (%d)\n", reset_dev);
  16. return -1;
  17. }
  18. *bitoff = reset_dev%32;
  19. return 0;
  20. }
  21. void vSysctlConfigure(uint32_t regoffset, uint32_t bitoffset, uint32_t mask, uint32_t val)
  22. {
  23. uint32_t tmp = readl(REGS_SYSCTL_BASE + regoffset);
  24. tmp &= ~(mask << bitoffset);
  25. tmp |= val << bitoffset;
  26. writel(tmp, REGS_SYSCTL_BASE + regoffset);
  27. }
  28. void sys_soft_reset (enum soft_rst_n reset_dev)
  29. {
  30. uint8_t mask;
  31. volatile uint32_t *reg;
  32. if (get_rst_reg_and_bitoff(reset_dev, (uint32_t *)&reg, &mask) != 0)
  33. return;
  34. portENTER_CRITICAL();
  35. *reg &= ~(1 << mask);
  36. udelay (10);
  37. *reg |= (1 << mask);
  38. udelay (10);
  39. portEXIT_CRITICAL();
  40. }
  41. void sys_soft_reset_from_isr (enum soft_rst_n reset_dev)
  42. {
  43. uint8_t mask;
  44. volatile uint32_t *reg;
  45. if (get_rst_reg_and_bitoff(reset_dev, (uint32_t *)&reg, &mask) != 0)
  46. return;
  47. *reg &= ~(1 << mask);
  48. udelay (10);
  49. *reg |= (1 << mask);
  50. udelay (10);
  51. }