diff options
Diffstat (limited to 'roms/u-boot/drivers/net/mdio_sandbox.c')
-rw-r--r-- | roms/u-boot/drivers/net/mdio_sandbox.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/roms/u-boot/drivers/net/mdio_sandbox.c b/roms/u-boot/drivers/net/mdio_sandbox.c new file mode 100644 index 000000000..2b50ffc3a --- /dev/null +++ b/roms/u-boot/drivers/net/mdio_sandbox.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2019 + * Alex Marginean, NXP + */ + +#include <dm.h> +#include <errno.h> +#include <miiphy.h> + +#define SANDBOX_PHY_ADDR 5 +#define SANDBOX_PHY_REG_CNT 2 + +struct mdio_sandbox_priv { + int enabled; + u16 reg[SANDBOX_PHY_REG_CNT]; +}; + +static int mdio_sandbox_read(struct udevice *dev, int addr, int devad, int reg) +{ + struct mdio_sandbox_priv *priv = dev_get_priv(dev); + + if (!priv->enabled) + return -ENODEV; + + if (addr != SANDBOX_PHY_ADDR) + return -ENODEV; + if (devad != MDIO_DEVAD_NONE) + return -ENODEV; + if (reg < 0 || reg >= SANDBOX_PHY_REG_CNT) + return -ENODEV; + + return priv->reg[reg]; +} + +static int mdio_sandbox_write(struct udevice *dev, int addr, int devad, int reg, + u16 val) +{ + struct mdio_sandbox_priv *priv = dev_get_priv(dev); + + if (!priv->enabled) + return -ENODEV; + + if (addr != SANDBOX_PHY_ADDR) + return -ENODEV; + if (devad != MDIO_DEVAD_NONE) + return -ENODEV; + if (reg < 0 || reg >= SANDBOX_PHY_REG_CNT) + return -ENODEV; + + priv->reg[reg] = val; + + return 0; +} + +static int mdio_sandbox_reset(struct udevice *dev) +{ + struct mdio_sandbox_priv *priv = dev_get_priv(dev); + int i; + + for (i = 0; i < SANDBOX_PHY_REG_CNT; i++) + priv->reg[i] = 0; + + return 0; +} + +static const struct mdio_ops mdio_sandbox_ops = { + .read = mdio_sandbox_read, + .write = mdio_sandbox_write, + .reset = mdio_sandbox_reset, +}; + +static int mdio_sandbox_probe(struct udevice *dev) +{ + struct mdio_sandbox_priv *priv = dev_get_priv(dev); + + priv->enabled = 1; + + return 0; +} + +static const struct udevice_id mdio_sandbox_ids[] = { + { .compatible = "sandbox,mdio" }, + { } +}; + +U_BOOT_DRIVER(mdio_sandbox) = { + .name = "mdio_sandbox", + .id = UCLASS_MDIO, + .of_match = mdio_sandbox_ids, + .probe = mdio_sandbox_probe, + .ops = &mdio_sandbox_ops, + .priv_auto = sizeof(struct mdio_sandbox_priv), +}; |