cpld.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2014 Freescale Semiconductor
  4. *
  5. * Freescale T2080RDB board-specific CPLD controlling supports.
  6. */
  7. #include <common.h>
  8. #include <command.h>
  9. #include "cpld.h"
  10. u8 cpld_read(unsigned int reg)
  11. {
  12. void *p = (void *)CONFIG_SYS_CPLD_BASE;
  13. return in_8(p + reg);
  14. }
  15. void cpld_write(unsigned int reg, u8 value)
  16. {
  17. void *p = (void *)CONFIG_SYS_CPLD_BASE;
  18. out_8(p + reg, value);
  19. }
  20. /* Set the boot bank to the alternate bank */
  21. void cpld_set_altbank(void)
  22. {
  23. u8 reg = CPLD_READ(flash_csr);
  24. reg = (reg & ~CPLD_BANK_SEL_MASK) | CPLD_LBMAP_ALTBANK;
  25. CPLD_WRITE(flash_csr, reg);
  26. CPLD_WRITE(reset_ctl, CPLD_LBMAP_RESET);
  27. }
  28. /* Set the boot bank to the default bank */
  29. void cpld_set_defbank(void)
  30. {
  31. u8 reg = CPLD_READ(flash_csr);
  32. reg = (reg & ~CPLD_BANK_SEL_MASK) | CPLD_LBMAP_DFLTBANK;
  33. CPLD_WRITE(flash_csr, reg);
  34. CPLD_WRITE(reset_ctl, CPLD_LBMAP_RESET);
  35. }
  36. int do_cpld(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  37. {
  38. int rc = 0;
  39. if (argc <= 1)
  40. return cmd_usage(cmdtp);
  41. if (strcmp(argv[1], "reset") == 0) {
  42. if (strcmp(argv[2], "altbank") == 0)
  43. cpld_set_altbank();
  44. else
  45. cpld_set_defbank();
  46. } else {
  47. rc = cmd_usage(cmdtp);
  48. }
  49. return rc;
  50. }
  51. U_BOOT_CMD(
  52. cpld, CONFIG_SYS_MAXARGS, 1, do_cpld,
  53. "Reset the board or alternate bank",
  54. "reset: reset to default bank\n"
  55. "cpld reset altbank: reset to alternate bank\n"
  56. );