/* USB wakeup registers */ #define USB_WAKEUP_CTRL 0x00
/* Global wakeup interrupt enable, also used to clear interrupt */ #define USB_WAKEUP_EN BIT(31) /* Wakeup from connect or disconnect, only for superspeed */ #define USB_WAKEUP_SS_CONN BIT(5) /* 0 select vbus_valid, 1 select sessvld */ #define USB_WAKEUP_VBUS_SRC_SESS_VAL BIT(4) /* Enable signal for wake up from u3 state */ #define USB_WAKEUP_U3_EN BIT(3) /* Enable signal for wake up from id change */ #define USB_WAKEUP_ID_EN BIT(2) /* Enable signal for wake up from vbus change */ #define USB_WAKEUP_VBUS_EN BIT(1) /* Enable signal for wake up from dp/dm change */ #define USB_WAKEUP_DPDM_EN BIT(0)
if (device_property_read_bool(dev, "fsl,permanently-attached"))
value |= (USB_CTRL0_USB2_FIXED | USB_CTRL0_USB3_FIXED); else
value &= ~(USB_CTRL0_USB2_FIXED | USB_CTRL0_USB3_FIXED);
if (device_property_read_bool(dev, "fsl,disable-port-power-control"))
value &= ~(USB_CTRL0_PORTPWR_EN); else
value |= USB_CTRL0_PORTPWR_EN;
writel(value, dwc3_imx->glue_base + USB_CTRL0);
value = readl(dwc3_imx->glue_base + USB_CTRL1); if (device_property_read_bool(dev, "fsl,over-current-active-low"))
value |= USB_CTRL1_OC_POLARITY; else
value &= ~USB_CTRL1_OC_POLARITY;
if (device_property_read_bool(dev, "fsl,power-active-low"))
value |= USB_CTRL1_PWR_POLARITY; else
value &= ~USB_CTRL1_PWR_POLARITY;
if (!node) {
dev_err(dev, "device node not found\n"); return -EINVAL;
}
dwc3_imx = devm_kzalloc(dev, sizeof(*dwc3_imx), GFP_KERNEL); if (!dwc3_imx) return -ENOMEM;
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);
res = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (!res) {
dev_warn(dev, "Base address for glue layer missing. Continuing without, some features are missing though.");
} else {
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), "Failed to get hsio clk\n");
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), "Failed to get suspend clk\n");
if (device_may_wakeup(dwc3_imx->dev)) {
disable_irq_wake(dwc3_imx->irq);
} else {
ret = clk_prepare_enable(dwc3_imx->suspend_clk); if (ret) return ret;
}
ret = clk_prepare_enable(dwc3_imx->hsio_clk); if (ret) {
clk_disable_unprepare(dwc3_imx->suspend_clk); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.