Commit e68c2a8a authored by Kunihiko Hayashi's avatar Kunihiko Hayashi Committed by Kishon Vijay Abraham I
Browse files

phy: uniphier-usb3hs: Add legacy SoC support for Pro5



Add legacy SoC support that needs to manage gio clock and reset.
This supports Pro5.

Signed-off-by: default avatarKunihiko Hayashi <hayashi.kunihiko@socionext.com>
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
parent 9376fa63
Loading
Loading
Loading
Loading
+53 −15
Original line number Diff line number Diff line
@@ -66,13 +66,14 @@ struct uniphier_u3hsphy_trim_param {
struct uniphier_u3hsphy_priv {
	struct device *dev;
	void __iomem *base;
	struct clk *clk, *clk_parent, *clk_ext;
	struct reset_control *rst, *rst_parent;
	struct clk *clk, *clk_parent, *clk_ext, *clk_parent_gio;
	struct reset_control *rst, *rst_parent, *rst_parent_gio;
	struct regulator *vbus;
	const struct uniphier_u3hsphy_soc_data *data;
};

struct uniphier_u3hsphy_soc_data {
	bool is_legacy;
	int nparams;
	const struct uniphier_u3hsphy_param param[MAX_PHY_PARAMS];
	u32 config0;
@@ -256,11 +257,20 @@ static int uniphier_u3hsphy_init(struct phy *phy)
	if (ret)
		return ret;

	ret = reset_control_deassert(priv->rst_parent);
	ret = clk_prepare_enable(priv->clk_parent_gio);
	if (ret)
		goto out_clk_disable;

	if (!priv->data->config0 && !priv->data->config1)
	ret = reset_control_deassert(priv->rst_parent);
	if (ret)
		goto out_clk_gio_disable;

	ret = reset_control_deassert(priv->rst_parent_gio);
	if (ret)
		goto out_rst_assert;

	if ((priv->data->is_legacy)
	    || (!priv->data->config0 && !priv->data->config1))
		return 0;

	config0 = priv->data->config0;
@@ -280,6 +290,8 @@ static int uniphier_u3hsphy_init(struct phy *phy)

out_rst_assert:
	reset_control_assert(priv->rst_parent);
out_clk_gio_disable:
	clk_disable_unprepare(priv->clk_parent_gio);
out_clk_disable:
	clk_disable_unprepare(priv->clk_parent);

@@ -290,7 +302,9 @@ static int uniphier_u3hsphy_exit(struct phy *phy)
{
	struct uniphier_u3hsphy_priv *priv = phy_get_drvdata(phy);

	reset_control_assert(priv->rst_parent_gio);
	reset_control_assert(priv->rst_parent);
	clk_disable_unprepare(priv->clk_parent_gio);
	clk_disable_unprepare(priv->clk_parent);

	return 0;
@@ -325,14 +339,11 @@ static int uniphier_u3hsphy_probe(struct platform_device *pdev)
	if (IS_ERR(priv->base))
		return PTR_ERR(priv->base);

	if (!priv->data->is_legacy) {
		priv->clk = devm_clk_get(dev, "phy");
		if (IS_ERR(priv->clk))
			return PTR_ERR(priv->clk);

	priv->clk_parent = devm_clk_get(dev, "link");
	if (IS_ERR(priv->clk_parent))
		return PTR_ERR(priv->clk_parent);

		priv->clk_ext = devm_clk_get_optional(dev, "phy-ext");
		if (IS_ERR(priv->clk_ext))
			return PTR_ERR(priv->clk_ext);
@@ -341,6 +352,21 @@ static int uniphier_u3hsphy_probe(struct platform_device *pdev)
		if (IS_ERR(priv->rst))
			return PTR_ERR(priv->rst);

	} else {
		priv->clk_parent_gio = devm_clk_get(dev, "gio");
		if (IS_ERR(priv->clk_parent_gio))
			return PTR_ERR(priv->clk_parent_gio);

		priv->rst_parent_gio =
			devm_reset_control_get_shared(dev, "gio");
		if (IS_ERR(priv->rst_parent_gio))
			return PTR_ERR(priv->rst_parent_gio);
	}

	priv->clk_parent = devm_clk_get(dev, "link");
	if (IS_ERR(priv->clk_parent))
		return PTR_ERR(priv->clk_parent);

	priv->rst_parent = devm_reset_control_get_shared(dev, "link");
	if (IS_ERR(priv->rst_parent))
		return PTR_ERR(priv->rst_parent);
@@ -362,11 +388,18 @@ static int uniphier_u3hsphy_probe(struct platform_device *pdev)
	return PTR_ERR_OR_ZERO(phy_provider);
}

static const struct uniphier_u3hsphy_soc_data uniphier_pro5_data = {
	.is_legacy = true,
	.nparams = 0,
};

static const struct uniphier_u3hsphy_soc_data uniphier_pxs2_data = {
	.is_legacy = false,
	.nparams = 0,
};

static const struct uniphier_u3hsphy_soc_data uniphier_ld20_data = {
	.is_legacy = false,
	.nparams = 2,
	.param = {
		{ LS_SLEW, 1 },
@@ -378,6 +411,7 @@ static const struct uniphier_u3hsphy_soc_data uniphier_ld20_data = {
};

static const struct uniphier_u3hsphy_soc_data uniphier_pxs3_data = {
	.is_legacy = false,
	.nparams = 0,
	.trim_func = uniphier_u3hsphy_trim_ld20,
	.config0 = 0x92316680,
@@ -385,6 +419,10 @@ static const struct uniphier_u3hsphy_soc_data uniphier_pxs3_data = {
};

static const struct of_device_id uniphier_u3hsphy_match[] = {
	{
		.compatible = "socionext,uniphier-pro5-usb3-hsphy",
		.data = &uniphier_pro5_data,
	},
	{
		.compatible = "socionext,uniphier-pxs2-usb3-hsphy",
		.data = &uniphier_pxs2_data,