diff mbox series

[2/2] scsi: ceva: Enable PHY and reset support

Message ID 1c0362451260fb4cae66afec405de02775b1dd47.1642601930.git.michal.simek@xilinx.com
State Superseded
Delegated to: Michal Simek
Headers show
Series [1/2] phy: zynqmp: Add support for sata and DP phy initialization | expand

Commit Message

Michal Simek Jan. 19, 2022, 2:18 p.m. UTC
Add phy and reset support for ceva sata IP. Phy and reset are optional
properties that's why detect if description is available. If not just
continue with operation.
This code was tested on Xilinx Kria SOM kv260-revA with sata connector
populated.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

 drivers/ata/sata_ceva.c | 44 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

Comments

Vladimir Oltean Jan. 31, 2022, 9:44 a.m. UTC | #1
On Wed, Jan 19, 2022 at 03:18:54PM +0100, Michal Simek wrote:
> Add phy and reset support for ceva sata IP. Phy and reset are optional
> properties that's why detect if description is available. If not just
> continue with operation.
> This code was tested on Xilinx Kria SOM kv260-revA with sata connector
> populated.
> 
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---

Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>

> 
>  drivers/ata/sata_ceva.c | 44 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 44 insertions(+)
> 
> diff --git a/drivers/ata/sata_ceva.c b/drivers/ata/sata_ceva.c
> index b71f10223da8..43bcc59cd282 100644
> --- a/drivers/ata/sata_ceva.c
> +++ b/drivers/ata/sata_ceva.c
> @@ -6,9 +6,12 @@
>  #include <common.h>
>  #include <dm.h>
>  #include <ahci.h>
> +#include <generic-phy.h>
>  #include <log.h>
> +#include <reset.h>
>  #include <scsi.h>
>  #include <asm/io.h>
> +#include <dm/device_compat.h>
>  #include <linux/ioport.h>
>  
>  /* Vendor Specific Register Offsets */
> @@ -181,6 +184,47 @@ static int sata_ceva_bind(struct udevice *dev)
>  static int sata_ceva_probe(struct udevice *dev)
>  {
>  	struct ceva_sata_priv *priv = dev_get_priv(dev);
> +	struct phy phy;
> +	int ret;
> +	struct reset_ctl_bulk resets;
> +
> +	ret = generic_phy_get_by_index(dev, 0, &phy);
> +	if (!ret) {
> +		dev_dbg(dev, "Perform PHY initialization\n");
> +		ret = generic_phy_init(&phy);
> +		if (ret)
> +			return ret;
> +	} else if (ret != -ENOENT) {
> +		dev_dbg(dev, "could not get phy (err %d)\n", ret);
> +		return ret;
> +	}
> +
> +	/* reset is optional */
> +	ret = reset_get_bulk(dev, &resets);
> +	if (ret && ret != -ENOTSUPP && ret != -ENOENT) {
> +		dev_dbg(dev, "Getting reset fails (err %d)\n", ret);
> +		return ret;
> +	}
> +
> +	/* Just trigger reset when reset is specified */
> +	if (!ret) {
> +		dev_dbg(dev, "Perform IP reset\n");
> +		ret = reset_deassert_bulk(&resets);
> +		if (ret) {
> +			dev_dbg(dev, "Reset fails (err %d)\n", ret);
> +			reset_release_bulk(&resets);
> +			return ret;
> +		}
> +	}
> +
> +	if (phy.dev) {
> +		dev_dbg(dev, "Perform PHY power on\n");
> +		ret = generic_phy_power_on(&phy);
> +		if (ret) {
> +			dev_dbg(dev, "PHY power on failed (err %d)\n", ret);
> +			return ret;
> +		}
> +	}
>  
>  	ceva_init_sata(priv);
>  
> -- 
> 2.34.1
>
diff mbox series

Patch

diff --git a/drivers/ata/sata_ceva.c b/drivers/ata/sata_ceva.c
index b71f10223da8..43bcc59cd282 100644
--- a/drivers/ata/sata_ceva.c
+++ b/drivers/ata/sata_ceva.c
@@ -6,9 +6,12 @@ 
 #include <common.h>
 #include <dm.h>
 #include <ahci.h>
+#include <generic-phy.h>
 #include <log.h>
+#include <reset.h>
 #include <scsi.h>
 #include <asm/io.h>
+#include <dm/device_compat.h>
 #include <linux/ioport.h>
 
 /* Vendor Specific Register Offsets */
@@ -181,6 +184,47 @@  static int sata_ceva_bind(struct udevice *dev)
 static int sata_ceva_probe(struct udevice *dev)
 {
 	struct ceva_sata_priv *priv = dev_get_priv(dev);
+	struct phy phy;
+	int ret;
+	struct reset_ctl_bulk resets;
+
+	ret = generic_phy_get_by_index(dev, 0, &phy);
+	if (!ret) {
+		dev_dbg(dev, "Perform PHY initialization\n");
+		ret = generic_phy_init(&phy);
+		if (ret)
+			return ret;
+	} else if (ret != -ENOENT) {
+		dev_dbg(dev, "could not get phy (err %d)\n", ret);
+		return ret;
+	}
+
+	/* reset is optional */
+	ret = reset_get_bulk(dev, &resets);
+	if (ret && ret != -ENOTSUPP && ret != -ENOENT) {
+		dev_dbg(dev, "Getting reset fails (err %d)\n", ret);
+		return ret;
+	}
+
+	/* Just trigger reset when reset is specified */
+	if (!ret) {
+		dev_dbg(dev, "Perform IP reset\n");
+		ret = reset_deassert_bulk(&resets);
+		if (ret) {
+			dev_dbg(dev, "Reset fails (err %d)\n", ret);
+			reset_release_bulk(&resets);
+			return ret;
+		}
+	}
+
+	if (phy.dev) {
+		dev_dbg(dev, "Perform PHY power on\n");
+		ret = generic_phy_power_on(&phy);
+		if (ret) {
+			dev_dbg(dev, "PHY power on failed (err %d)\n", ret);
+			return ret;
+		}
+	}
 
 	ceva_init_sata(priv);