pmc405.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * (C) Copyright 2001-2003
  3. * Stefan Roese, DENX Software Engineering, sr@denx.de.
  4. *
  5. * (C) Copyright 2005-2009
  6. * Matthias Fuchs, esd gmbh germany, matthias.fuchs@esd-electronics.com
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <asm/processor.h>
  12. #include <asm/io.h>
  13. #include <command.h>
  14. #include <malloc.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. extern void lxt971_no_sleep(void);
  17. int board_early_init_f (void)
  18. {
  19. /*
  20. * IRQ 0-15 405GP internally generated; active high; level sensitive
  21. * IRQ 16 405GP internally generated; active low; level sensitive
  22. * IRQ 17-24 RESERVED
  23. * IRQ 25 (EXT IRQ 0) CAN0; active low; level sensitive
  24. * IRQ 26 (EXT IRQ 1) SER0 ; active low; level sensitive
  25. * IRQ 27 (EXT IRQ 2) SER1; active low; level sensitive
  26. * IRQ 28 (EXT IRQ 3) FPGA 0; active low; level sensitive
  27. * IRQ 29 (EXT IRQ 4) FPGA 1; active low; level sensitive
  28. * IRQ 30 (EXT IRQ 5) PCI INTA; active low; level sensitive
  29. * IRQ 31 (EXT IRQ 6) COMPACT FLASH; active high; level sensitive
  30. */
  31. mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
  32. mtdcr(UIC0ER, 0x00000000); /* disable all ints */
  33. mtdcr(UIC0CR, 0x00000000); /* set all to be non-critical*/
  34. mtdcr(UIC0PR, 0xFFFFFF81); /* set int polarities */
  35. mtdcr(UIC0TR, 0x10000000); /* set int trigger levels */
  36. mtdcr(UIC0VCR, 0x00000001); /* set vect base=0, INT0 highest priority */
  37. mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
  38. /*
  39. * EBC Configuration Register:
  40. * set ready timeout to 512 ebc-clks -> ca. 15 us
  41. */
  42. mtebc (EBC0_CFG, 0xa8400000);
  43. /*
  44. * Setup GPIO pins
  45. */
  46. mtdcr(CPC0_CR0, mfdcr(CPC0_CR0) | ((CONFIG_SYS_FPGA_INIT |
  47. CONFIG_SYS_FPGA_DONE |
  48. CONFIG_SYS_XEREADY |
  49. CONFIG_SYS_NONMONARCH |
  50. CONFIG_SYS_REV1_2) << 5));
  51. if (!(in_be32((void *)GPIO0_IR) & CONFIG_SYS_REV1_2)) {
  52. /* rev 1.2 boards */
  53. mtdcr(CPC0_CR0, mfdcr(CPC0_CR0) | ((CONFIG_SYS_INTA_FAKE |
  54. CONFIG_SYS_SELF_RST) << 5));
  55. }
  56. out_be32((void *)GPIO0_OR, CONFIG_SYS_VPEN);
  57. /* setup for output */
  58. out_be32((void *)GPIO0_TCR, CONFIG_SYS_FPGA_PRG | CONFIG_SYS_FPGA_CLK |
  59. CONFIG_SYS_FPGA_DATA | CONFIG_SYS_XEREADY | CONFIG_SYS_VPEN);
  60. /*
  61. * - check if rev1_2 is low, then:
  62. * - set/reset CONFIG_SYS_INTA_FAKE/CONFIG_SYS_SELF_RST
  63. * in TCR to assert INTA# or SELFRST#
  64. */
  65. return 0;
  66. }
  67. int misc_init_r (void)
  68. {
  69. /* adjust flash start and offset */
  70. gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
  71. gd->bd->bi_flashoffset = 0;
  72. /* deassert EREADY# */
  73. out_be32((void *)GPIO0_OR,
  74. in_be32((void *)GPIO0_OR) | CONFIG_SYS_XEREADY);
  75. return (0);
  76. }
  77. ushort pmc405_pci_subsys_deviceid(void)
  78. {
  79. ulong val;
  80. val = in_be32((void *)GPIO0_IR);
  81. if (!(val & CONFIG_SYS_REV1_2)) { /* low=rev1.2 */
  82. /* check monarch# signal */
  83. if (val & CONFIG_SYS_NONMONARCH)
  84. return CONFIG_SYS_PCI_SUBSYS_DEVICEID_NONMONARCH;
  85. return CONFIG_SYS_PCI_SUBSYS_DEVICEID_MONARCH;
  86. }
  87. return CONFIG_SYS_PCI_SUBSYS_DEVICEID_NONMONARCH;
  88. }
  89. /*
  90. * Check Board Identity
  91. */
  92. int checkboard (void)
  93. {
  94. ulong val;
  95. char str[64];
  96. int i = getenv_f("serial#", str, sizeof(str));
  97. puts ("Board: ");
  98. if (i == -1)
  99. puts ("### No HW ID - assuming PMC405");
  100. else
  101. puts(str);
  102. val = in_be32((void *)GPIO0_IR);
  103. if (!(val & CONFIG_SYS_REV1_2)) { /* low=rev1.2 */
  104. puts(" rev1.2 (");
  105. if (val & CONFIG_SYS_NONMONARCH) /* monarch# signal */
  106. puts("non-");
  107. puts("monarch)");
  108. } else
  109. puts(" <=rev1.1");
  110. putc ('\n');
  111. return 0;
  112. }
  113. void reset_phy(void)
  114. {
  115. #ifdef CONFIG_LXT971_NO_SLEEP
  116. /*
  117. * Disable sleep mode in LXT971
  118. */
  119. lxt971_no_sleep();
  120. #endif
  121. }