davicom.c 1.9 KB

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