95 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
// 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_alloc_size = sizeof(struct mdio_sandbox_priv),
 | 
						|
};
 |