|
@@ -144,6 +144,7 @@
|
|
|
#define PMBR1 0x0D
|
|
|
#define GPIO_USB_4PIN_ULPI_2430C (3 << 0)
|
|
|
|
|
|
+static irqreturn_t twl4030_usb_irq(int irq, void *_twl);
|
|
|
/*
|
|
|
* If VBUS is valid or ID is ground, then we know a
|
|
|
* cable is present and we need to be runtime-enabled
|
|
@@ -395,6 +396,33 @@ static void __twl4030_phy_power(struct twl4030_usb *twl, int on)
|
|
|
WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
|
|
|
}
|
|
|
|
|
|
+static int __maybe_unused twl4030_usb_suspend(struct device *dev)
|
|
|
+{
|
|
|
+ struct twl4030_usb *twl = dev_get_drvdata(dev);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * we need enabled runtime on resume,
|
|
|
+ * so turn irq off here, so we do not get it early
|
|
|
+ * note: wakeup on usb plug works independently of this
|
|
|
+ */
|
|
|
+ dev_dbg(twl->dev, "%s\n", __func__);
|
|
|
+ disable_irq(twl->irq);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int __maybe_unused twl4030_usb_resume(struct device *dev)
|
|
|
+{
|
|
|
+ struct twl4030_usb *twl = dev_get_drvdata(dev);
|
|
|
+
|
|
|
+ dev_dbg(twl->dev, "%s\n", __func__);
|
|
|
+ enable_irq(twl->irq);
|
|
|
+ /* check whether cable status changed */
|
|
|
+ twl4030_usb_irq(0, twl);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int __maybe_unused twl4030_usb_runtime_suspend(struct device *dev)
|
|
|
{
|
|
|
struct twl4030_usb *twl = dev_get_drvdata(dev);
|
|
@@ -655,6 +683,7 @@ static const struct phy_ops ops = {
|
|
|
static const struct dev_pm_ops twl4030_usb_pm_ops = {
|
|
|
SET_RUNTIME_PM_OPS(twl4030_usb_runtime_suspend,
|
|
|
twl4030_usb_runtime_resume, NULL)
|
|
|
+ SET_SYSTEM_SLEEP_PM_OPS(twl4030_usb_suspend, twl4030_usb_resume)
|
|
|
};
|
|
|
|
|
|
static int twl4030_usb_probe(struct platform_device *pdev)
|