blob: b159147a765bbea8b39dc22a2d50c50fb1597bb2 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +02002/*
Nishanth Menoneaa39c62023-11-01 15:56:03 -05003 * Copyright (C) 2017 Texas Instruments Incorporated - https://www.ti.com/
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +02004 * Written by Jean-Jacques Hiblot <jjhiblot@ti.com>
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +02005 */
6
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +02007#include <dm.h>
8#include <generic-phy.h>
9
Patrice Chotard030dd072020-07-28 09:13:32 +020010#define DRIVER_DATA 0x12345678
11
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +020012struct sandbox_phy_priv {
13 bool initialized;
14 bool on;
15 bool broken;
16};
17
18static int sandbox_phy_power_on(struct phy *phy)
19{
20 struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
21
22 if (!priv->initialized)
23 return -EIO;
24
25 if (priv->broken)
26 return -EIO;
27
28 priv->on = true;
29
30 return 0;
31}
32
33static int sandbox_phy_power_off(struct phy *phy)
34{
35 struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
36
37 if (!priv->initialized)
38 return -EIO;
39
40 if (priv->broken)
41 return -EIO;
42
43 /*
44 * for validation purpose, let's says that power off
45 * works only for PHY 0
46 */
47 if (phy->id)
48 return -EIO;
49
50 priv->on = false;
51
52 return 0;
53}
54
55static int sandbox_phy_init(struct phy *phy)
56{
57 struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
58
59 priv->initialized = true;
60 priv->on = true;
61
62 return 0;
63}
64
65static int sandbox_phy_exit(struct phy *phy)
66{
67 struct sandbox_phy_priv *priv = dev_get_priv(phy->dev);
68
69 priv->initialized = false;
70 priv->on = false;
71
72 return 0;
73}
74
Patrice Chotard030dd072020-07-28 09:13:32 +020075static int sandbox_phy_bind(struct udevice *dev)
76{
77 if (dev_get_driver_data(dev) != DRIVER_DATA)
78 return -ENODATA;
79
80 return 0;
81}
82
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +020083static int sandbox_phy_probe(struct udevice *dev)
84{
85 struct sandbox_phy_priv *priv = dev_get_priv(dev);
86
87 priv->initialized = false;
88 priv->on = false;
Simon Glasscfe0c902017-05-18 20:09:48 -060089 priv->broken = dev_read_bool(dev, "broken");
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +020090
91 return 0;
92}
93
94static struct phy_ops sandbox_phy_ops = {
95 .power_on = sandbox_phy_power_on,
96 .power_off = sandbox_phy_power_off,
97 .init = sandbox_phy_init,
98 .exit = sandbox_phy_exit,
99};
100
101static const struct udevice_id sandbox_phy_ids[] = {
Patrice Chotard030dd072020-07-28 09:13:32 +0200102 { .compatible = "sandbox,phy_no_driver_data",
103 },
104
105 { .compatible = "sandbox,phy",
106 .data = DRIVER_DATA
107 },
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +0200108 { }
109};
110
111U_BOOT_DRIVER(phy_sandbox) = {
112 .name = "phy_sandbox",
113 .id = UCLASS_PHY,
Patrice Chotard030dd072020-07-28 09:13:32 +0200114 .bind = sandbox_phy_bind,
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +0200115 .of_match = sandbox_phy_ids,
116 .ops = &sandbox_phy_ops,
117 .probe = sandbox_phy_probe,
Simon Glass8a2b47f2020-12-03 16:55:17 -0700118 .priv_auto = sizeof(struct sandbox_phy_priv),
Jean-Jacques Hiblot7e9db022017-04-24 11:51:28 +0200119};