Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ * Written by Jean-Jacques Hiblot <jjhiblot@ti.com> */ #include <common.h> #include <dm.h> #include <generic-phy.h> struct sandbox_phy_priv { bool initialized; bool on; bool broken; }; static int sandbox_phy_power_on(struct phy *phy) { struct sandbox_phy_priv *priv = dev_get_priv(phy->dev); if (!priv->initialized) return -EIO; if (priv->broken) return -EIO; priv->on = true; return 0; } static int sandbox_phy_power_off(struct phy *phy) { struct sandbox_phy_priv *priv = dev_get_priv(phy->dev); if (!priv->initialized) return -EIO; if (priv->broken) return -EIO; /* * for validation purpose, let's says that power off * works only for PHY 0 */ if (phy->id) return -EIO; priv->on = false; return 0; } static int sandbox_phy_init(struct phy *phy) { struct sandbox_phy_priv *priv = dev_get_priv(phy->dev); priv->initialized = true; priv->on = true; return 0; } static int sandbox_phy_exit(struct phy *phy) { struct sandbox_phy_priv *priv = dev_get_priv(phy->dev); priv->initialized = false; priv->on = false; return 0; } static int sandbox_phy_probe(struct udevice *dev) { struct sandbox_phy_priv *priv = dev_get_priv(dev); priv->initialized = false; priv->on = false; priv->broken = dev_read_bool(dev, "broken"); return 0; } static struct phy_ops sandbox_phy_ops = { .power_on = sandbox_phy_power_on, .power_off = sandbox_phy_power_off, .init = sandbox_phy_init, .exit = sandbox_phy_exit, }; static const struct udevice_id sandbox_phy_ids[] = { { .compatible = "sandbox,phy" }, { } }; U_BOOT_DRIVER(phy_sandbox) = { .name = "phy_sandbox", .id = UCLASS_PHY, .of_match = sandbox_phy_ids, .ops = &sandbox_phy_ops, .probe = sandbox_phy_probe, .priv_auto_alloc_size = sizeof(struct sandbox_phy_priv), }; |