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