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