psu_spl_init.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2018 Xilinx, Inc.
  4. *
  5. * Michal Simek <michal.simek@xilinx.com>
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/psu_init_gpl.h>
  10. #include <linux/delay.h>
  11. #define PSU_MASK_POLL_TIME 1100000
  12. int __maybe_unused mask_pollonvalue(unsigned long add, u32 mask, u32 value)
  13. {
  14. int i = 0;
  15. while ((__raw_readl(add) & mask) != value) {
  16. if (i == PSU_MASK_POLL_TIME)
  17. return 0;
  18. i++;
  19. }
  20. return 1;
  21. }
  22. __weak int mask_poll(u32 add, u32 mask)
  23. {
  24. int i = 0;
  25. unsigned long addr = add;
  26. while (!(__raw_readl(addr) & mask)) {
  27. if (i == PSU_MASK_POLL_TIME)
  28. return 0;
  29. i++;
  30. }
  31. return 1;
  32. }
  33. __weak u32 mask_read(u32 add, u32 mask)
  34. {
  35. unsigned long addr = add;
  36. return __raw_readl(addr) & mask;
  37. }
  38. __weak void mask_delay(u32 delay)
  39. {
  40. udelay(delay);
  41. }
  42. __weak void psu_mask_write(unsigned long offset, unsigned long mask,
  43. unsigned long val)
  44. {
  45. unsigned long regval = 0;
  46. regval = readl(offset);
  47. regval &= ~(mask);
  48. regval |= (val & mask);
  49. writel(regval, offset);
  50. }
  51. __weak void prog_reg(unsigned long addr, unsigned long mask,
  52. unsigned long shift, unsigned long value)
  53. {
  54. int rdata = 0;
  55. rdata = readl(addr);
  56. rdata = rdata & (~mask);
  57. rdata = rdata | (value << shift);
  58. writel(rdata, addr);
  59. }
  60. __weak int psu_init(void)
  61. {
  62. /*
  63. * This function is overridden by the one in
  64. * board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
  65. */
  66. return -1;
  67. }
  68. __weak unsigned long psu_post_config_data(void)
  69. {
  70. /*
  71. * This function is overridden by the one in
  72. * board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
  73. */
  74. return 0;
  75. }