// 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		0

struct mdio_sandbox_priv {
	int enabled;
	u16 reg;
};

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 != SANDBOX_PHY_REG)
		return -ENODEV;

	return priv->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 != SANDBOX_PHY_REG)
		return -ENODEV;

	priv->reg = val;

	return 0;
}

static int mdio_sandbox_reset(struct udevice *dev)
{
	struct mdio_sandbox_priv *priv = dev_get_priv(dev);

	priv->reg = 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_alloc_size = sizeof(struct mdio_sandbox_priv),
};
