405ep.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * (C) Copyright 2010
  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 "405ep.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. mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
  33. mtdcr(UIC0ER, 0x00000000); /* disable all ints */
  34. mtdcr(UIC0CR, 0x00000000); /* set all to be non-critical */
  35. mtdcr(UIC0PR, 0xFFFFFF80); /* set int polarities */
  36. mtdcr(UIC0TR, 0x10000000); /* set int trigger levels */
  37. mtdcr(UIC0VCR, 0x00000001); /* set vect base=0,INT0 highest prio */
  38. mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
  39. /*
  40. * EBC Configuration Register: set ready timeout to 512 ebc-clks
  41. * -> ca. 15 us
  42. */
  43. mtebc(EBC0_CFG, 0xa8400000); /* ebc always driven */
  44. return 0;
  45. }
  46. int board_early_init_r(void)
  47. {
  48. unsigned k;
  49. unsigned ctr;
  50. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
  51. gd->arch.fpga_state[k] = 0;
  52. /*
  53. * reset FPGA
  54. */
  55. gd405ep_init();
  56. gd405ep_set_fpga_reset(1);
  57. gd405ep_setup_hw();
  58. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
  59. ctr = 0;
  60. while (!gd405ep_get_fpga_done(k)) {
  61. udelay(100000);
  62. if (ctr++ > 5) {
  63. gd->arch.fpga_state[k] |=
  64. FPGA_STATE_DONE_FAILED;
  65. break;
  66. }
  67. }
  68. }
  69. udelay(10);
  70. gd405ep_set_fpga_reset(0);
  71. for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
  72. /*
  73. * wait for fpga out of reset
  74. */
  75. ctr = 0;
  76. while (1) {
  77. u16 val;
  78. FPGA_SET_REG(k, reflection_low, REFLECTION_TESTPATTERN);
  79. FPGA_GET_REG(k, REFLECTION_TESTREG, &val);
  80. if (val == REFLECTION_TESTPATTERN_INV)
  81. break;
  82. udelay(100000);
  83. if (ctr++ > 5) {
  84. gd->arch.fpga_state[k] |=
  85. FPGA_STATE_REFLECTION_FAILED;
  86. break;
  87. }
  88. }
  89. }
  90. return 0;
  91. }