diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index 149cfde817cb..0399d8714fd0 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -984,6 +984,8 @@ static int sun50i_a64_ccu_probe(struct p if (IS_ERR(reg)) return PTR_ERR(reg); + platform_set_drvdata(pdev, reg); + /* Force the pll-audio variable divider to 3 */ val = readl(reg + SUN50I_A64_PLL_AUDIO_REG); val &= ~GENMASK(19, 16); @@ -1031,12 +1031,36 @@ static const struct of_device_id sun50i_ { } }; +#define USBPHY_CFG_REG 0x0cc + +static int sun50i_a64_ccu_suspend(struct device *dev) +{ + void __iomem *reg = dev_get_drvdata(dev); + + writel(readl(reg + USBPHY_CFG_REG) | 0xa00000, reg + USBPHY_CFG_REG); + + return 0; +} + +static int sun50i_a64_ccu_resume(struct device *dev) +{ + void __iomem *reg = dev_get_drvdata(dev); + + writel(readl(reg + USBPHY_CFG_REG) & ~0xa00000, reg + USBPHY_CFG_REG); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(sun50i_a64_ccu_pm_ops, + sun50i_a64_ccu_suspend, sun50i_a64_ccu_resume); + static struct platform_driver sun50i_a64_ccu_driver = { .probe = sun50i_a64_ccu_probe, .driver = { .name = "sun50i-a64-ccu", .suppress_bind_attrs = true, .of_match_table = sun50i_a64_ccu_ids, + .pm = &sun50i_a64_ccu_pm_ops, }, }; builtin_platform_driver(sun50i_a64_ccu_driver);