Lines Matching +full:syscon +full:- +full:wakeup
1 // SPDX-License-Identifier: GPL-2.0
3 * dwc3-am62.c - TI specific Glue layer for AM62 DWC3 USB Controller
5 * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com
12 #include <linux/mfd/syscon.h>
57 /* WAKEUP CONFIG register bits */
70 /* WAKEUP STAT register bits */
116 struct regmap *syscon; member
140 return readl((am62->usbss) + offset); in dwc3_ti_readl()
145 writel(value, (am62->usbss) + offset); in dwc3_ti_writel()
150 struct device *dev = am62->dev; in phy_syscon_pll_refclk()
151 struct device_node *node = dev->of_node; in phy_syscon_pll_refclk()
153 struct regmap *syscon; in phy_syscon_pll_refclk() local
156 syscon = syscon_regmap_lookup_by_phandle(node, "ti,syscon-phy-pll-refclk"); in phy_syscon_pll_refclk()
157 if (IS_ERR(syscon)) { in phy_syscon_pll_refclk()
158 dev_err(dev, "unable to get ti,syscon-phy-pll-refclk regmap\n"); in phy_syscon_pll_refclk()
159 return PTR_ERR(syscon); in phy_syscon_pll_refclk()
162 am62->syscon = syscon; in phy_syscon_pll_refclk()
164 ret = of_parse_phandle_with_fixed_args(node, "ti,syscon-phy-pll-refclk", 1, in phy_syscon_pll_refclk()
169 am62->offset = args.args[0]; in phy_syscon_pll_refclk()
172 ret = regmap_update_bits(am62->syscon, am62->offset, PHY_CORE_VOLTAGE_MASK, 0); in phy_syscon_pll_refclk()
178 ret = regmap_update_bits(am62->syscon, am62->offset, PHY_PLL_REFCLK_MASK, am62->rate_code); in phy_syscon_pll_refclk()
189 struct device *dev = &pdev->dev; in dwc3_ti_probe()
190 struct device_node *node = pdev->dev.of_node; in dwc3_ti_probe()
199 return -ENOMEM; in dwc3_ti_probe()
201 am62->dev = dev; in dwc3_ti_probe()
204 am62->usbss = devm_platform_ioremap_resource(pdev, 0); in dwc3_ti_probe()
205 if (IS_ERR(am62->usbss)) { in dwc3_ti_probe()
207 return PTR_ERR(am62->usbss); in dwc3_ti_probe()
210 am62->usb2_refclk = devm_clk_get(dev, "ref"); in dwc3_ti_probe()
211 if (IS_ERR(am62->usb2_refclk)) { in dwc3_ti_probe()
213 return PTR_ERR(am62->usb2_refclk); in dwc3_ti_probe()
217 rate = clk_get_rate(am62->usb2_refclk); in dwc3_ti_probe()
226 return -EINVAL; in dwc3_ti_probe()
229 am62->rate_code = i; in dwc3_ti_probe()
231 /* Read the syscon property and set the rate code */ in dwc3_ti_probe()
248 am62->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider"); in dwc3_ti_probe()
250 if (am62->vbus_divider) in dwc3_ti_probe()
261 clk_prepare_enable(am62->usb2_refclk); in dwc3_ti_probe()
275 /* Device has capability to wakeup system from sleep */ in dwc3_ti_probe()
279 dev_err(dev, "couldn't enable device as a wakeup source: %d\n", ret); in dwc3_ti_probe()
289 clk_disable_unprepare(am62->usb2_refclk); in dwc3_ti_probe()
297 struct device *dev = &pdev->dev; in dwc3_ti_remove()
325 /* Set wakeup config enable bits */ in dwc3_ti_suspend_common()
333 * and in U2/L3 state else it causes spurious wake-up. in dwc3_ti_suspend_common()
337 /* clear wakeup status so we know what caused the wake up */ in dwc3_ti_suspend_common()
341 clk_disable_unprepare(am62->usb2_refclk); in dwc3_ti_suspend_common()
351 clk_prepare_enable(am62->usb2_refclk); in dwc3_ti_resume_common()
354 /* Clear wakeup config enable bits */ in dwc3_ti_resume_common()
359 am62->wakeup_stat = reg; in dwc3_ti_resume_common()
373 { .compatible = "ti,am62-usb"},
382 .name = "dwc3-am62",
390 MODULE_ALIAS("platform:dwc3-am62");
391 MODULE_AUTHOR("Aswath Govindraju <a-govindraju@ti.com>");