p1023.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * Copyright 2011 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <phy.h>
  8. #include <fm_eth.h>
  9. #include <asm/io.h>
  10. #include <asm/immap_85xx.h>
  11. #include <asm/fsl_serdes.h>
  12. static u32 port_to_devdisr[] = {
  13. [FM1_DTSEC1] = MPC85xx_DEVDISR_TSEC1,
  14. [FM1_DTSEC2] = MPC85xx_DEVDISR_TSEC2,
  15. };
  16. static int is_device_disabled(enum fm_port port)
  17. {
  18. ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  19. u32 devdisr = in_be32(&gur->devdisr);
  20. return port_to_devdisr[port] & devdisr;
  21. }
  22. void fman_disable_port(enum fm_port port)
  23. {
  24. ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  25. /* don't allow disabling of DTSEC1 as its needed for MDIO */
  26. if (port == FM1_DTSEC1)
  27. return;
  28. setbits_be32(&gur->devdisr, port_to_devdisr[port]);
  29. }
  30. void fman_enable_port(enum fm_port port)
  31. {
  32. ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  33. clrbits_be32(&gur->devdisr, port_to_devdisr[port]);
  34. }
  35. phy_interface_t fman_port_enet_if(enum fm_port port)
  36. {
  37. ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  38. u32 pordevsr = in_be32(&gur->pordevsr);
  39. if (is_device_disabled(port))
  40. return PHY_INTERFACE_MODE_NONE;
  41. /* DTSEC1 can be SGMII, RGMII or RMII */
  42. if (port == FM1_DTSEC1) {
  43. if (is_serdes_configured(SGMII_FM1_DTSEC1))
  44. return PHY_INTERFACE_MODE_SGMII;
  45. if (pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS) {
  46. if (pordevsr & MPC85xx_PORDEVSR_TSEC1_PRTC)
  47. return PHY_INTERFACE_MODE_RGMII;
  48. else
  49. return PHY_INTERFACE_MODE_RMII;
  50. }
  51. }
  52. /* DTSEC2 only supports SGMII or RGMII */
  53. if (port == FM1_DTSEC2) {
  54. if (is_serdes_configured(SGMII_FM1_DTSEC2))
  55. return PHY_INTERFACE_MODE_SGMII;
  56. if (pordevsr & MPC85xx_PORDEVSR_SGMII2_DIS)
  57. return PHY_INTERFACE_MODE_RGMII;
  58. }
  59. return PHY_INTERFACE_MODE_NONE;
  60. }