xref: /openbmc/u-boot/drivers/phy/sandbox-phy.c (revision e8f80a5a)
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