davicom.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Davicom PHY drivers
  4. *
  5. * Copyright 2010-2011 Freescale Semiconductor, Inc.
  6. * author Andy Fleming
  7. */
  8. #include <common.h>
  9. #include <phy.h>
  10. #define MIIM_DM9161_SCR 0x10
  11. #define MIIM_DM9161_SCR_INIT 0x0610
  12. /* DM9161 Specified Configuration and Status Register */
  13. #define MIIM_DM9161_SCSR 0x11
  14. #define MIIM_DM9161_SCSR_100F 0x8000
  15. #define MIIM_DM9161_SCSR_100H 0x4000
  16. #define MIIM_DM9161_SCSR_10F 0x2000
  17. #define MIIM_DM9161_SCSR_10H 0x1000
  18. /* DM9161 10BT Configuration/Status */
  19. #define MIIM_DM9161_10BTCSR 0x12
  20. #define MIIM_DM9161_10BTCSR_INIT 0x7800
  21. /* Davicom DM9161E */
  22. static int dm9161_config(struct phy_device *phydev)
  23. {
  24. phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_ISOLATE);
  25. /* Do not bypass the scrambler/descrambler */
  26. phy_write(phydev, MDIO_DEVAD_NONE, MIIM_DM9161_SCR,
  27. MIIM_DM9161_SCR_INIT);
  28. /* Clear 10BTCSR to default */
  29. phy_write(phydev, MDIO_DEVAD_NONE, MIIM_DM9161_10BTCSR,
  30. MIIM_DM9161_10BTCSR_INIT);
  31. genphy_config_aneg(phydev);
  32. return 0;
  33. }
  34. static int dm9161_parse_status(struct phy_device *phydev)
  35. {
  36. int mii_reg;
  37. mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_DM9161_SCSR);
  38. if (mii_reg & (MIIM_DM9161_SCSR_100F | MIIM_DM9161_SCSR_100H))
  39. phydev->speed = SPEED_100;
  40. else
  41. phydev->speed = SPEED_10;
  42. if (mii_reg & (MIIM_DM9161_SCSR_100F | MIIM_DM9161_SCSR_10F))
  43. phydev->duplex = DUPLEX_FULL;
  44. else
  45. phydev->duplex = DUPLEX_HALF;
  46. return 0;
  47. }
  48. static int dm9161_startup(struct phy_device *phydev)
  49. {
  50. int ret;
  51. ret = genphy_update_link(phydev);
  52. if (ret)
  53. return ret;
  54. return dm9161_parse_status(phydev);
  55. }
  56. static struct phy_driver DM9161_driver = {
  57. .name = "Davicom DM9161E",
  58. .uid = 0x181b880,
  59. .mask = 0xffffff0,
  60. .features = PHY_BASIC_FEATURES,
  61. .config = &dm9161_config,
  62. .startup = &dm9161_startup,
  63. .shutdown = &genphy_shutdown,
  64. };
  65. int phy_davicom_init(void)
  66. {
  67. phy_register(&DM9161_driver);
  68. return 0;
  69. }