1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
286322f59SJean-Jacques Hiblot /*
386322f59SJean-Jacques Hiblot * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
486322f59SJean-Jacques Hiblot * Written by Jean-Jacques Hiblot <jjhiblot@ti.com>
586322f59SJean-Jacques Hiblot */
686322f59SJean-Jacques Hiblot
786322f59SJean-Jacques Hiblot #include <common.h>
886322f59SJean-Jacques Hiblot #include <dm.h>
986322f59SJean-Jacques Hiblot #include <generic-phy.h>
1086322f59SJean-Jacques Hiblot
1186322f59SJean-Jacques Hiblot struct sandbox_phy_priv {
1286322f59SJean-Jacques Hiblot bool initialized;
1386322f59SJean-Jacques Hiblot bool on;
1486322f59SJean-Jacques Hiblot bool broken;
1586322f59SJean-Jacques Hiblot };
1686322f59SJean-Jacques Hiblot
sandbox_phy_power_on(struct phy * phy)1786322f59SJean-Jacques Hiblot static int sandbox_phy_power_on(struct phy *phy)
1886322f59SJean-Jacques Hiblot {
1986322f59SJean-Jacques Hiblot struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
2086322f59SJean-Jacques Hiblot
2186322f59SJean-Jacques Hiblot if (!priv->initialized)
2286322f59SJean-Jacques Hiblot return -EIO;
2386322f59SJean-Jacques Hiblot
2486322f59SJean-Jacques Hiblot if (priv->broken)
2586322f59SJean-Jacques Hiblot return -EIO;
2686322f59SJean-Jacques Hiblot
2786322f59SJean-Jacques Hiblot priv->on = true;
2886322f59SJean-Jacques Hiblot
2986322f59SJean-Jacques Hiblot return 0;
3086322f59SJean-Jacques Hiblot }
3186322f59SJean-Jacques Hiblot
sandbox_phy_power_off(struct phy * phy)3286322f59SJean-Jacques Hiblot static int sandbox_phy_power_off(struct phy *phy)
3386322f59SJean-Jacques Hiblot {
3486322f59SJean-Jacques Hiblot struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
3586322f59SJean-Jacques Hiblot
3686322f59SJean-Jacques Hiblot if (!priv->initialized)
3786322f59SJean-Jacques Hiblot return -EIO;
3886322f59SJean-Jacques Hiblot
3986322f59SJean-Jacques Hiblot if (priv->broken)
4086322f59SJean-Jacques Hiblot return -EIO;
4186322f59SJean-Jacques Hiblot
4286322f59SJean-Jacques Hiblot /*
4386322f59SJean-Jacques Hiblot * for validation purpose, let's says that power off
4486322f59SJean-Jacques Hiblot * works only for PHY 0
4586322f59SJean-Jacques Hiblot */
4686322f59SJean-Jacques Hiblot if (phy->id)
4786322f59SJean-Jacques Hiblot return -EIO;
4886322f59SJean-Jacques Hiblot
4986322f59SJean-Jacques Hiblot priv->on = false;
5086322f59SJean-Jacques Hiblot
5186322f59SJean-Jacques Hiblot return 0;
5286322f59SJean-Jacques Hiblot }
5386322f59SJean-Jacques Hiblot
sandbox_phy_init(struct phy * phy)5486322f59SJean-Jacques Hiblot static int sandbox_phy_init(struct phy *phy)
5586322f59SJean-Jacques Hiblot {
5686322f59SJean-Jacques Hiblot struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
5786322f59SJean-Jacques Hiblot
5886322f59SJean-Jacques Hiblot priv->initialized = true;
5986322f59SJean-Jacques Hiblot priv->on = true;
6086322f59SJean-Jacques Hiblot
6186322f59SJean-Jacques Hiblot return 0;
6286322f59SJean-Jacques Hiblot }
6386322f59SJean-Jacques Hiblot
sandbox_phy_exit(struct phy * phy)6486322f59SJean-Jacques Hiblot static int sandbox_phy_exit(struct phy *phy)
6586322f59SJean-Jacques Hiblot {
6686322f59SJean-Jacques Hiblot struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
6786322f59SJean-Jacques Hiblot
6886322f59SJean-Jacques Hiblot priv->initialized = false;
6986322f59SJean-Jacques Hiblot priv->on = false;
7086322f59SJean-Jacques Hiblot
7186322f59SJean-Jacques Hiblot return 0;
7286322f59SJean-Jacques Hiblot }
7386322f59SJean-Jacques Hiblot
sandbox_phy_probe(struct udevice * dev)7486322f59SJean-Jacques Hiblot static int sandbox_phy_probe(struct udevice *dev)
7586322f59SJean-Jacques Hiblot {
7686322f59SJean-Jacques Hiblot struct sandbox_phy_priv *priv = dev_get_priv(dev);
7786322f59SJean-Jacques Hiblot
7886322f59SJean-Jacques Hiblot priv->initialized = false;
7986322f59SJean-Jacques Hiblot priv->on = false;
805204e9b8SSimon Glass priv->broken = dev_read_bool(dev, "broken");
8186322f59SJean-Jacques Hiblot
8286322f59SJean-Jacques Hiblot return 0;
8386322f59SJean-Jacques Hiblot }
8486322f59SJean-Jacques Hiblot
8586322f59SJean-Jacques Hiblot static struct phy_ops sandbox_phy_ops = {
8686322f59SJean-Jacques Hiblot .power_on = sandbox_phy_power_on,
8786322f59SJean-Jacques Hiblot .power_off = sandbox_phy_power_off,
8886322f59SJean-Jacques Hiblot .init = sandbox_phy_init,
8986322f59SJean-Jacques Hiblot .exit = sandbox_phy_exit,
9086322f59SJean-Jacques Hiblot };
9186322f59SJean-Jacques Hiblot
9286322f59SJean-Jacques Hiblot static const struct udevice_id sandbox_phy_ids[] = {
9386322f59SJean-Jacques Hiblot { .compatible = "sandbox,phy" },
9486322f59SJean-Jacques Hiblot { }
9586322f59SJean-Jacques Hiblot };
9686322f59SJean-Jacques Hiblot
9786322f59SJean-Jacques Hiblot U_BOOT_DRIVER(phy_sandbox) = {
9886322f59SJean-Jacques Hiblot .name = "phy_sandbox",
9986322f59SJean-Jacques Hiblot .id = UCLASS_PHY,
10086322f59SJean-Jacques Hiblot .of_match = sandbox_phy_ids,
10186322f59SJean-Jacques Hiblot .ops = &sandbox_phy_ops,
10286322f59SJean-Jacques Hiblot .probe = sandbox_phy_probe,
10386322f59SJean-Jacques Hiblot .priv_auto_alloc_size = sizeof(struct sandbox_phy_priv),
10486322f59SJean-Jacques Hiblot };
105