mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 21:53:44 +00:00
phy: cadence-torrent: add suspend and resume support
Add suspend and resume support. The already_configured flag is cleared during the suspend stage to force the PHY initialization during the resume stage. Co-developed-by: Théo Lebrun <theo.lebrun@bootlin.com> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Signed-off-by: Thomas Richard <thomas.richard@bootlin.com> Link: https://lore.kernel.org/r/20240412-j7200-phy-s2r-v1-8-f15815833974@bootlin.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
81472a55ed
commit
0da27ed080
@ -3095,6 +3095,62 @@ static struct cdns_torrent_vals sgmii_qsgmii_xcvr_diag_ln_vals = {
|
||||
.num_regs = ARRAY_SIZE(sgmii_qsgmii_xcvr_diag_ln_regs),
|
||||
};
|
||||
|
||||
static int cdns_torrent_phy_suspend_noirq(struct device *dev)
|
||||
{
|
||||
struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
reset_control_assert(cdns_phy->phy_rst);
|
||||
reset_control_assert(cdns_phy->apb_rst);
|
||||
for (i = 0; i < cdns_phy->nsubnodes; i++)
|
||||
reset_control_assert(cdns_phy->phys[i].lnk_rst);
|
||||
|
||||
if (cdns_phy->already_configured)
|
||||
cdns_phy->already_configured = 0;
|
||||
else {
|
||||
clk_disable_unprepare(cdns_phy->clk1);
|
||||
clk_disable_unprepare(cdns_phy->clk);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cdns_torrent_phy_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(dev);
|
||||
int node = cdns_phy->nsubnodes;
|
||||
int ret, i;
|
||||
|
||||
ret = cdns_torrent_clk(cdns_phy);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Enable APB */
|
||||
reset_control_deassert(cdns_phy->apb_rst);
|
||||
|
||||
if (cdns_phy->nsubnodes > 1) {
|
||||
ret = cdns_torrent_phy_configure_multilink(cdns_phy);
|
||||
if (ret)
|
||||
goto put_lnk_rst;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
put_lnk_rst:
|
||||
for (i = 0; i < node; i++)
|
||||
reset_control_assert(cdns_phy->phys[i].lnk_rst);
|
||||
reset_control_assert(cdns_phy->apb_rst);
|
||||
|
||||
clk_disable_unprepare(cdns_phy->clk1);
|
||||
clk_disable_unprepare(cdns_phy->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEFINE_NOIRQ_DEV_PM_OPS(cdns_torrent_phy_pm_ops,
|
||||
cdns_torrent_phy_suspend_noirq,
|
||||
cdns_torrent_phy_resume_noirq);
|
||||
|
||||
/* USB and DP link configuration */
|
||||
static struct cdns_reg_pairs usb_dp_link_cmn_regs[] = {
|
||||
{0x0002, PHY_PLL_CFG},
|
||||
@ -5332,6 +5388,7 @@ static struct platform_driver cdns_torrent_phy_driver = {
|
||||
.driver = {
|
||||
.name = "cdns-torrent-phy",
|
||||
.of_match_table = cdns_torrent_phy_of_match,
|
||||
.pm = pm_sleep_ptr(&cdns_torrent_phy_pm_ops),
|
||||
}
|
||||
};
|
||||
module_platform_driver(cdns_torrent_phy_driver);
|
||||
|
Loading…
Reference in New Issue
Block a user