phy: qualcomm: usb-hs-28nm: Prepare clocks in init
The AHB clock must be on for qcom_snps_hsphy_init() to be able to write
the initialization sequence to the hardware, so move the clock
enablement to phy init and exit.
Fixes: 67b27dbeac
("phy: qualcomm: Add Synopsys 28nm Hi-Speed USB PHY driver")
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
This commit is contained in:
parent
6f8280cec1
commit
820eeb9de6
@ -160,18 +160,11 @@ static int qcom_snps_hsphy_power_on(struct phy *phy)
|
|||||||
ret = regulator_bulk_enable(VREG_NUM, priv->vregs);
|
ret = regulator_bulk_enable(VREG_NUM, priv->vregs);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks);
|
|
||||||
if (ret)
|
|
||||||
goto err_disable_regulator;
|
|
||||||
qcom_snps_hsphy_disable_hv_interrupts(priv);
|
qcom_snps_hsphy_disable_hv_interrupts(priv);
|
||||||
qcom_snps_hsphy_exit_retention(priv);
|
qcom_snps_hsphy_exit_retention(priv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_disable_regulator:
|
|
||||||
regulator_bulk_disable(VREG_NUM, priv->vregs);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcom_snps_hsphy_power_off(struct phy *phy)
|
static int qcom_snps_hsphy_power_off(struct phy *phy)
|
||||||
@ -180,7 +173,6 @@ static int qcom_snps_hsphy_power_off(struct phy *phy)
|
|||||||
|
|
||||||
qcom_snps_hsphy_enter_retention(priv);
|
qcom_snps_hsphy_enter_retention(priv);
|
||||||
qcom_snps_hsphy_enable_hv_interrupts(priv);
|
qcom_snps_hsphy_enable_hv_interrupts(priv);
|
||||||
clk_bulk_disable_unprepare(priv->num_clks, priv->clks);
|
|
||||||
regulator_bulk_disable(VREG_NUM, priv->vregs);
|
regulator_bulk_disable(VREG_NUM, priv->vregs);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -266,21 +258,39 @@ static int qcom_snps_hsphy_init(struct phy *phy)
|
|||||||
struct hsphy_priv *priv = phy_get_drvdata(phy);
|
struct hsphy_priv *priv = phy_get_drvdata(phy);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = qcom_snps_hsphy_reset(priv);
|
ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ret = qcom_snps_hsphy_reset(priv);
|
||||||
|
if (ret)
|
||||||
|
goto disable_clocks;
|
||||||
|
|
||||||
qcom_snps_hsphy_init_sequence(priv);
|
qcom_snps_hsphy_init_sequence(priv);
|
||||||
|
|
||||||
ret = qcom_snps_hsphy_por_reset(priv);
|
ret = qcom_snps_hsphy_por_reset(priv);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto disable_clocks;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
disable_clocks:
|
||||||
|
clk_bulk_disable_unprepare(priv->num_clks, priv->clks);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qcom_snps_hsphy_exit(struct phy *phy)
|
||||||
|
{
|
||||||
|
struct hsphy_priv *priv = phy_get_drvdata(phy);
|
||||||
|
|
||||||
|
clk_bulk_disable_unprepare(priv->num_clks, priv->clks);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct phy_ops qcom_snps_hsphy_ops = {
|
static const struct phy_ops qcom_snps_hsphy_ops = {
|
||||||
.init = qcom_snps_hsphy_init,
|
.init = qcom_snps_hsphy_init,
|
||||||
|
.exit = qcom_snps_hsphy_exit,
|
||||||
.power_on = qcom_snps_hsphy_power_on,
|
.power_on = qcom_snps_hsphy_power_on,
|
||||||
.power_off = qcom_snps_hsphy_power_off,
|
.power_off = qcom_snps_hsphy_power_off,
|
||||||
.set_mode = qcom_snps_hsphy_set_mode,
|
.set_mode = qcom_snps_hsphy_set_mode,
|
||||||
|
Loading…
Reference in New Issue
Block a user