mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-21 18:53:06 +00:00
41575d8e4c
This construct is quite long-winded. In earlier days it made some sense since auto-allocation was a strange concept. But with driver model now used pretty universally, we can shorten this to 'auto'. This reduces verbosity and makes it easier to read. Coincidentally it also ensures that every declaration is on one line, thus making dtoc's job easier. Signed-off-by: Simon Glass <sjg@chromium.org>
94 lines
1.8 KiB
C
94 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 = sizeof(struct mdio_sandbox_priv),
|
|
};
|