imx8mm_venice.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2021 Gateworks Corporation
  4. */
  5. #include <common.h>
  6. #include <init.h>
  7. #include <led.h>
  8. #include <linux/delay.h>
  9. #include <miiphy.h>
  10. #include <netdev.h>
  11. #include <asm/arch/clock.h>
  12. #include <asm/arch/sys_proto.h>
  13. #include <asm/io.h>
  14. #include <asm/unaligned.h>
  15. #include "gsc.h"
  16. DECLARE_GLOBAL_DATA_PTR;
  17. int board_phys_sdram_size(phys_size_t *size)
  18. {
  19. const fdt64_t *val;
  20. int offset;
  21. int len;
  22. /* get size from dt which SPL updated per EEPROM config */
  23. offset = fdt_path_offset(gd->fdt_blob, "/memory");
  24. if (offset < 0)
  25. return -EINVAL;
  26. val = fdt_getprop(gd->fdt_blob, offset, "reg", &len);
  27. if (len < sizeof(*val) * 2)
  28. return -EINVAL;
  29. *size = get_unaligned_be64(&val[1]);
  30. return 0;
  31. }
  32. int board_fit_config_name_match(const char *name)
  33. {
  34. int i = 0;
  35. const char *dtb;
  36. static char init;
  37. char buf[32];
  38. do {
  39. dtb = gsc_get_dtb_name(i++, buf, sizeof(buf));
  40. if (!strcmp(dtb, name)) {
  41. if (!init++)
  42. printf("DTB : %s\n", name);
  43. return 0;
  44. }
  45. } while (dtb);
  46. return -1;
  47. }
  48. #if (IS_ENABLED(CONFIG_FEC_MXC))
  49. static int setup_fec(void)
  50. {
  51. struct iomuxc_gpr_base_regs *gpr =
  52. (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
  53. /* Use 125M anatop REF_CLK1 for ENET1, not from external */
  54. clrsetbits_le32(&gpr->gpr[1], 0x2000, 0);
  55. return 0;
  56. }
  57. int board_phy_config(struct phy_device *phydev)
  58. {
  59. unsigned short val;
  60. switch (phydev->phy_id) {
  61. case 0x2000a231: /* TI DP83867 GbE PHY */
  62. puts("DP83867 ");
  63. /* LED configuration */
  64. val = 0;
  65. val |= 0x5 << 4; /* LED1(Amber;Speed) : 1000BT link */
  66. val |= 0xb << 8; /* LED2(Green;Link/Act): blink for TX/RX act */
  67. phy_write(phydev, MDIO_DEVAD_NONE, 24, val);
  68. break;
  69. }
  70. if (phydev->drv->config)
  71. phydev->drv->config(phydev);
  72. return 0;
  73. }
  74. #endif // IS_ENABLED(CONFIG_FEC_MXC)
  75. int board_init(void)
  76. {
  77. gsc_init(1);
  78. if (IS_ENABLED(CONFIG_FEC_MXC))
  79. setup_fec();
  80. gsc_hwmon();
  81. return 0;
  82. }
  83. int board_late_init(void)
  84. {
  85. const char *str;
  86. char env[32];
  87. int ret, i;
  88. u8 enetaddr[6];
  89. char fdt[64];
  90. led_default_state();
  91. /* Set board serial/model */
  92. env_set_ulong("serial#", gsc_get_serial());
  93. env_set("model", gsc_get_model());
  94. /* Set fdt_file vars */
  95. i = 0;
  96. do {
  97. str = gsc_get_dtb_name(i, fdt, sizeof(fdt));
  98. if (str) {
  99. sprintf(env, "fdt_file%d", i + 1);
  100. strcat(fdt, ".dtb");
  101. env_set(env, fdt);
  102. }
  103. i++;
  104. } while (str);
  105. /* Set mac addrs */
  106. i = 0;
  107. do {
  108. if (i)
  109. sprintf(env, "eth%daddr", i);
  110. else
  111. sprintf(env, "ethaddr");
  112. str = env_get(env);
  113. if (!str) {
  114. ret = gsc_getmac(i, enetaddr);
  115. if (!ret)
  116. eth_env_set_enetaddr(env, enetaddr);
  117. }
  118. i++;
  119. } while (!ret);
  120. return 0;
  121. }
  122. int board_mmc_get_env_dev(int devno)
  123. {
  124. return devno;
  125. }
  126. int ft_board_setup(void *blob, struct bd_info *bd)
  127. {
  128. /* set board model dt prop */
  129. fdt_setprop_string(blob, 0, "board", gsc_get_model());
  130. return 0;
  131. }