mpc8308.c 1.7 KB

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