mpc8308.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2014
  4. * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
  5. */
  6. #include <common.h>
  7. #include <command.h>
  8. #include <asm/processor.h>
  9. #include <asm/io.h>
  10. #include <asm/global_data.h>
  11. #include "mpc8308.h"
  12. #include <gdsys_fpga.h>
  13. #define REFLECTION_TESTPATTERN 0xdede
  14. #define REFLECTION_TESTPATTERN_INV (~REFLECTION_TESTPATTERN & 0xffff)
  15. #ifdef CONFIG_SYS_FPGA_NO_RFL_HI
  16. #define REFLECTION_TESTREG reflection_low
  17. #else
  18. #define REFLECTION_TESTREG reflection_high
  19. #endif
  20. DECLARE_GLOBAL_DATA_PTR;
  21. int get_fpga_state(unsigned dev)
  22. {
  23. return gd->arch.fpga_state[dev];
  24. }
  25. int board_early_init_f(void)
  26. {
  27. unsigned k;
  28. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
  29. gd->arch.fpga_state[k] = 0;
  30. return 0;
  31. }
  32. int board_early_init_r(void)
  33. {
  34. unsigned k;
  35. unsigned ctr;
  36. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
  37. gd->arch.fpga_state[k] = 0;
  38. /*
  39. * reset FPGA
  40. */
  41. mpc8308_init();
  42. mpc8308_set_fpga_reset(1);
  43. mpc8308_setup_hw();
  44. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
  45. ctr = 0;
  46. while (!mpc8308_get_fpga_done(k)) {
  47. udelay(100000);
  48. if (ctr++ > 5) {
  49. gd->arch.fpga_state[k] |=
  50. FPGA_STATE_DONE_FAILED;
  51. break;
  52. }
  53. }
  54. }
  55. udelay(10);
  56. mpc8308_set_fpga_reset(0);
  57. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
  58. /*
  59. * wait for fpga out of reset
  60. */
  61. ctr = 0;
  62. while (1) {
  63. u16 val;
  64. FPGA_SET_REG(k, reflection_low, REFLECTION_TESTPATTERN);
  65. FPGA_GET_REG(k, REFLECTION_TESTREG, &val);
  66. if (val == REFLECTION_TESTPATTERN_INV)
  67. break;
  68. udelay(100000);
  69. if (ctr++ > 5) {
  70. gd->arch.fpga_state[k] |=
  71. FPGA_STATE_REFLECTION_FAILED;
  72. break;
  73. }
  74. }
  75. }
  76. return 0;
  77. }