dwc3_imx
static void dwc3_imx_wakeup_enable(struct dwc3_imx *dwc_imx, pm_message_t msg)
static void dwc3_imx_wakeup_disable(struct dwc3_imx *dwc_imx)
struct dwc3_imx *dwc_imx = data;
struct dwc3_imx *dwc_imx;
static void dwc3_imx_suspend(struct dwc3_imx *dwc_imx, pm_message_t msg)
static void dwc3_imx_resume(struct dwc3_imx *dwc_imx, pm_message_t msg)
struct dwc3_imx *dwc_imx = to_dwc3_imx(dwc);
struct dwc3_imx *dwc_imx = to_dwc3_imx(dwc);
struct dwc3_imx *dwc_imx = to_dwc3_imx(dwc);
struct dwc3_imx *dwc_imx = to_dwc3_imx(dwc);
#define to_dwc3_imx(d) container_of((d), struct dwc3_imx, dwc)
static void dwc3_imx_get_property(struct dwc3_imx *dwc_imx)
static void dwc3_imx_configure_glue(struct dwc3_imx *dwc_imx)
static void dwc3_imx8mp_wakeup_enable(struct dwc3_imx8mp *dwc3_imx,
struct dwc3 *dwc3 = platform_get_drvdata(dwc3_imx->dwc3_pdev);
val = readl(dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);
writel(val, dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);
static void dwc3_imx8mp_wakeup_disable(struct dwc3_imx8mp *dwc3_imx)
val = readl(dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);
writel(val, dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);
struct dwc3_imx8mp *dwc3_imx = _dwc3_imx;
struct dwc3 *dwc = platform_get_drvdata(dwc3_imx->dwc3_pdev);
if (!dwc3_imx->pm_suspended)
disable_irq_nosync(dwc3_imx->irq);
dwc3_imx->wakeup_pending = true;
struct dwc3_imx8mp *dwc3_imx;
dwc3_imx = devm_kzalloc(dev, sizeof(*dwc3_imx), GFP_KERNEL);
if (!dwc3_imx)
platform_set_drvdata(pdev, dwc3_imx);
dwc3_imx->dev = dev;
dwc3_imx->hsio_blk_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dwc3_imx->hsio_blk_base))
return PTR_ERR(dwc3_imx->hsio_blk_base);
dwc3_imx->glue_base = devm_ioremap_resource(dev, res);
if (IS_ERR(dwc3_imx->glue_base))
return PTR_ERR(dwc3_imx->glue_base);
dwc3_imx->hsio_clk = devm_clk_get_enabled(dev, "hsio");
if (IS_ERR(dwc3_imx->hsio_clk))
return dev_err_probe(dev, PTR_ERR(dwc3_imx->hsio_clk),
dwc3_imx->suspend_clk = devm_clk_get_enabled(dev, "suspend");
if (IS_ERR(dwc3_imx->suspend_clk))
return dev_err_probe(dev, PTR_ERR(dwc3_imx->suspend_clk),
dwc3_imx->irq = irq;
imx8mp_configure_glue(dwc3_imx);
dwc3_imx->dwc3_pdev = of_find_device_by_node(dwc3_np);
if (!dwc3_imx->dwc3_pdev) {
dwc3 = platform_get_drvdata(dwc3_imx->dwc3_pdev);
IRQF_ONESHOT, dev_name(dev), dwc3_imx);
put_device(&dwc3_imx->dwc3_pdev->dev);
struct dwc3_imx8mp *dwc3_imx = platform_get_drvdata(pdev);
put_device(&dwc3_imx->dwc3_pdev->dev);
static int dwc3_imx8mp_suspend(struct dwc3_imx8mp *dwc3_imx, pm_message_t msg)
if (dwc3_imx->pm_suspended)
if (PMSG_IS_AUTO(msg) || device_may_wakeup(dwc3_imx->dev))
dwc3_imx8mp_wakeup_enable(dwc3_imx, msg);
dwc3_imx->pm_suspended = true;
static int dwc3_imx8mp_resume(struct dwc3_imx8mp *dwc3_imx, pm_message_t msg)
struct dwc3 *dwc = platform_get_drvdata(dwc3_imx->dwc3_pdev);
if (!dwc3_imx->pm_suspended)
dwc3_imx8mp_wakeup_disable(dwc3_imx);
dwc3_imx->pm_suspended = false;
imx8mp_configure_glue(dwc3_imx);
if (dwc3_imx->wakeup_pending) {
dwc3_imx->wakeup_pending = false;
enable_irq(dwc3_imx->irq);
struct dwc3_imx8mp *dwc3_imx = dev_get_drvdata(dev);
ret = dwc3_imx8mp_suspend(dwc3_imx, PMSG_SUSPEND);
if (device_may_wakeup(dwc3_imx->dev)) {
enable_irq_wake(dwc3_imx->irq);
clk_disable_unprepare(dwc3_imx->suspend_clk);
clk_disable_unprepare(dwc3_imx->hsio_clk);
struct dwc3_imx8mp *dwc3_imx = dev_get_drvdata(dev);
if (device_may_wakeup(dwc3_imx->dev)) {
disable_irq_wake(dwc3_imx->irq);
ret = clk_prepare_enable(dwc3_imx->suspend_clk);
ret = clk_prepare_enable(dwc3_imx->hsio_clk);
clk_disable_unprepare(dwc3_imx->suspend_clk);
ret = dwc3_imx8mp_resume(dwc3_imx, PMSG_RESUME);
struct dwc3_imx8mp *dwc3_imx = dev_get_drvdata(dev);
return dwc3_imx8mp_suspend(dwc3_imx, PMSG_AUTO_SUSPEND);
struct dwc3_imx8mp *dwc3_imx = dev_get_drvdata(dev);
return dwc3_imx8mp_resume(dwc3_imx, PMSG_AUTO_RESUME);
static void imx8mp_configure_glue(struct dwc3_imx8mp *dwc3_imx)
struct device *dev = dwc3_imx->dev;
if (!dwc3_imx->glue_base)
value = readl(dwc3_imx->glue_base + USB_CTRL0);
writel(value, dwc3_imx->glue_base + USB_CTRL0);
value = readl(dwc3_imx->glue_base + USB_CTRL1);
writel(value, dwc3_imx->glue_base + USB_CTRL1);