misc.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright 2013 Stefan Roese <sr@denx.de>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <asm/arch/sys_proto.h>
  8. #include <linux/errno.h>
  9. #include <asm/io.h>
  10. #include <asm/imx-common/regs-common.h>
  11. /* 1 second delay should be plenty of time for block reset. */
  12. #define RESET_MAX_TIMEOUT 1000000
  13. #define MXS_BLOCK_SFTRST (1 << 31)
  14. #define MXS_BLOCK_CLKGATE (1 << 30)
  15. int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned
  16. int timeout)
  17. {
  18. while (--timeout) {
  19. if ((readl(&reg->reg) & mask) == mask)
  20. break;
  21. udelay(1);
  22. }
  23. return !timeout;
  24. }
  25. int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned
  26. int timeout)
  27. {
  28. while (--timeout) {
  29. if ((readl(&reg->reg) & mask) == 0)
  30. break;
  31. udelay(1);
  32. }
  33. return !timeout;
  34. }
  35. int mxs_reset_block(struct mxs_register_32 *reg)
  36. {
  37. /* Clear SFTRST */
  38. writel(MXS_BLOCK_SFTRST, &reg->reg_clr);
  39. if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
  40. return 1;
  41. /* Clear CLKGATE */
  42. writel(MXS_BLOCK_CLKGATE, &reg->reg_clr);
  43. /* Set SFTRST */
  44. writel(MXS_BLOCK_SFTRST, &reg->reg_set);
  45. /* Wait for CLKGATE being set */
  46. if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
  47. return 1;
  48. /* Clear SFTRST */
  49. writel(MXS_BLOCK_SFTRST, &reg->reg_clr);
  50. if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
  51. return 1;
  52. /* Clear CLKGATE */
  53. writel(MXS_BLOCK_CLKGATE, &reg->reg_clr);
  54. if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
  55. return 1;
  56. return 0;
  57. }