cpld.c 1.4 KB

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