// SPDX-License-Identifier: GPL-2.0+
/*
 * Atheros AR71XX/9XXX USB PHY driver
 *
 * Copyright (C) 2015-2018 Alban Bedel <albeu@free.fr>
 */

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/phy/phy.h>
#include <linux/reset.h>

struct ath79_usb_phy {
	struct reset_control *reset;
	/* The suspend override logic is inverted, hence the no prefix
	 * to make the code a bit easier to understand.
	 */
	struct reset_control *no_suspend_override;
};

static int ath79_usb_phy_power_on(struct phy *phy)
{
	struct ath79_usb_phy *priv = phy_get_drvdata(phy);
	int err = 0;

	if (priv->no_suspend_override) {
		err = reset_control_assert(priv->no_suspend_override);
		if (err)
			return err;
	}

	err = reset_control_deassert(priv->reset);
	if (err && priv->no_suspend_override)
		reset_control_assert(priv->no_suspend_override);

	return err;
}

static int ath79_usb_phy_power_off(struct phy *phy)
{
	struct ath79_usb_phy *priv = phy_get_drvdata(phy);
	int err = 0;

	err = reset_control_assert(priv->reset);
	if (err)
		return err;

	if (priv->no_suspend_override) {
		err = reset_control_deassert(priv->no_suspend_override);
		if (err)
			reset_control_deassert(priv->reset);
	}

	return err;
}

static const struct phy_ops ath79_usb_phy_ops = {
	.power_on	= ath79_usb_phy_power_on,
	.power_off	= ath79_usb_phy_power_off,
	.owner		= THIS_MODULE,
};

static int ath79_usb_phy_probe(struct platform_device *pdev)
{
	struct ath79_usb_phy *priv;
	struct phy *phy;

	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->reset = devm_reset_control_get(&pdev->dev, "usb-phy");
	if (IS_ERR(priv->reset))
		return PTR_ERR(priv->reset);

	priv->no_suspend_override = devm_reset_control_get_optional(
		&pdev->dev, "usb-suspend-override");
	if (IS_ERR(priv->no_suspend_override))
		return PTR_ERR(priv->no_suspend_override);

	phy = devm_phy_create(&pdev->dev, NULL, &ath79_usb_phy_ops);
	if (IS_ERR(phy))
		return PTR_ERR(phy);

	phy_set_drvdata(phy, priv);

	return PTR_ERR_OR_ZERO(devm_of_phy_provider_register(
				&pdev->dev, of_phy_simple_xlate));
}

static const struct of_device_id ath79_usb_phy_of_match[] = {
	{ .compatible = "qca,ar7100-usb-phy" },
	{}
};
MODULE_DEVICE_TABLE(of, ath79_usb_phy_of_match);

static struct platform_driver ath79_usb_phy_driver = {
	.probe	= ath79_usb_phy_probe,
	.driver = {
		.of_match_table	= ath79_usb_phy_of_match,
		.name		= "ath79-usb-phy",
	}
};
module_platform_driver(ath79_usb_phy_driver);

MODULE_DESCRIPTION("ATH79 USB PHY driver");
MODULE_AUTHOR("Alban Bedel <albeu@free.fr>");
MODULE_LICENSE("GPL");
