mdio_sandbox.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2019
  4. * Alex Marginean, NXP
  5. */
  6. #include <dm.h>
  7. #include <errno.h>
  8. #include <miiphy.h>
  9. #define SANDBOX_PHY_ADDR 5
  10. #define SANDBOX_PHY_REG_CNT 2
  11. struct mdio_sandbox_priv {
  12. int enabled;
  13. u16 reg[SANDBOX_PHY_REG_CNT];
  14. };
  15. static int mdio_sandbox_read(struct udevice *dev, int addr, int devad, int reg)
  16. {
  17. struct mdio_sandbox_priv *priv = dev_get_priv(dev);
  18. if (!priv->enabled)
  19. return -ENODEV;
  20. if (addr != SANDBOX_PHY_ADDR)
  21. return -ENODEV;
  22. if (devad != MDIO_DEVAD_NONE)
  23. return -ENODEV;
  24. if (reg < 0 || reg >= SANDBOX_PHY_REG_CNT)
  25. return -ENODEV;
  26. return priv->reg[reg];
  27. }
  28. static int mdio_sandbox_write(struct udevice *dev, int addr, int devad, int reg,
  29. u16 val)
  30. {
  31. struct mdio_sandbox_priv *priv = dev_get_priv(dev);
  32. if (!priv->enabled)
  33. return -ENODEV;
  34. if (addr != SANDBOX_PHY_ADDR)
  35. return -ENODEV;
  36. if (devad != MDIO_DEVAD_NONE)
  37. return -ENODEV;
  38. if (reg < 0 || reg >= SANDBOX_PHY_REG_CNT)
  39. return -ENODEV;
  40. priv->reg[reg] = val;
  41. return 0;
  42. }
  43. static int mdio_sandbox_reset(struct udevice *dev)
  44. {
  45. struct mdio_sandbox_priv *priv = dev_get_priv(dev);
  46. int i;
  47. for (i = 0; i < SANDBOX_PHY_REG_CNT; i++)
  48. priv->reg[i] = 0;
  49. return 0;
  50. }
  51. static const struct mdio_ops mdio_sandbox_ops = {
  52. .read = mdio_sandbox_read,
  53. .write = mdio_sandbox_write,
  54. .reset = mdio_sandbox_reset,
  55. };
  56. static int mdio_sandbox_probe(struct udevice *dev)
  57. {
  58. struct mdio_sandbox_priv *priv = dev_get_priv(dev);
  59. priv->enabled = 1;
  60. return 0;
  61. }
  62. static const struct udevice_id mdio_sandbox_ids[] = {
  63. { .compatible = "sandbox,mdio" },
  64. { }
  65. };
  66. U_BOOT_DRIVER(mdio_sandbox) = {
  67. .name = "mdio_sandbox",
  68. .id = UCLASS_MDIO,
  69. .of_match = mdio_sandbox_ids,
  70. .probe = mdio_sandbox_probe,
  71. .ops = &mdio_sandbox_ops,
  72. .priv_auto_alloc_size = sizeof(struct mdio_sandbox_priv),
  73. };