summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/stm32/usb.c23
-rw-r--r--common/hooks.c3
-rw-r--r--core/cortex-m/ec.lds.S6
-rw-r--r--core/cortex-m0/ec.lds.S6
-rw-r--r--core/minute-ia/ec.lds.S6
-rw-r--r--core/nds32/ec.lds.S6
-rw-r--r--include/hooks.h10
-rw-r--r--include/link_defs.h4
-rw-r--r--include/usb_api.h7
9 files changed, 70 insertions, 1 deletions
diff --git a/chip/stm32/usb.c b/chip/stm32/usb.c
index 57e629a3d1..560ca3da2d 100644
--- a/chip/stm32/usb.c
+++ b/chip/stm32/usb.c
@@ -379,10 +379,16 @@ static void usb_reset(void)
}
#ifdef CONFIG_USB_SUSPEND
+static void usb_pm_change_notify_hooks(void)
+{
+ hook_notify(HOOK_USB_PM_CHANGE);
+}
+DECLARE_DEFERRED(usb_pm_change_notify_hooks);
+
/* See RM0091 Reference Manual 30.5.5 Suspend/Resume events */
static void usb_suspend(void)
{
- CPRINTF("SUS\n");
+ CPRINTF("SUS%d\n", remote_wakeup_enabled);
/*
* usb_suspend can be called from hook task, make sure no interrupt is
@@ -400,6 +406,8 @@ static void usb_suspend(void)
/* USB is not in use anymore, we can (hopefully) sleep now. */
enable_sleep(SLEEP_MASK_USB_DEVICE);
+
+ hook_call_deferred(&usb_pm_change_notify_hooks_data, 0);
}
static void usb_resume_deferred(void)
@@ -410,6 +418,8 @@ static void usb_resume_deferred(void)
CPRINTF("RSMd %d %04x\n", state, STM32_USB_CNTR);
if (state == 2 || state == 3)
usb_suspend();
+ else
+ hook_call_deferred(&usb_pm_change_notify_hooks_data, 0);
}
DECLARE_DEFERRED(usb_resume_deferred);
@@ -440,6 +450,8 @@ static void usb_resume(void)
*/
if (state == 2 || state == 3)
hook_call_deferred(&usb_resume_deferred_data, 3 * MSEC);
+ else
+ hook_call_deferred(&usb_pm_change_notify_hooks_data, 0);
}
#ifdef CONFIG_USB_REMOTE_WAKEUP
@@ -536,6 +548,15 @@ int usb_is_suspended(void)
return 0;
}
+
+int usb_is_remote_wakeup_enabled(void)
+{
+#ifdef CONFIG_USB_REMOTE_WAKEUP
+ return remote_wakeup_enabled;
+#else
+ return 0;
+#endif
+}
#endif /* CONFIG_USB_SUSPEND */
#if defined(CONFIG_USB_SUSPEND) && defined(CONFIG_USB_REMOTE_WAKEUP)
diff --git a/common/hooks.c b/common/hooks.c
index d83c7a36c8..6b4bb8873d 100644
--- a/common/hooks.c
+++ b/common/hooks.c
@@ -50,6 +50,9 @@ static const struct hook_ptrs hook_list[] = {
#ifdef CONFIG_CASE_CLOSED_DEBUG_V1
{__hooks_ccd_change, __hooks_ccd_change_end},
#endif
+#ifdef CONFIG_USB_SUSPEND
+ {__hooks_usb_change, __hooks_usb_change_end},
+#endif
{__hooks_tick, __hooks_tick_end},
{__hooks_second, __hooks_second_end},
};
diff --git a/core/cortex-m/ec.lds.S b/core/cortex-m/ec.lds.S
index 64fb132462..5e84b56db0 100644
--- a/core/cortex-m/ec.lds.S
+++ b/core/cortex-m/ec.lds.S
@@ -204,6 +204,12 @@ SECTIONS
__hooks_ccd_change_end = .;
#endif
+#ifdef CONFIG_USB_SUSPEND
+ __hooks_usb_change = .;
+ KEEP(*(.rodata.HOOK_USB_PM_CHANGE))
+ __hooks_usb_change_end = .;
+#endif
+
__hooks_tick = .;
KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
diff --git a/core/cortex-m0/ec.lds.S b/core/cortex-m0/ec.lds.S
index a43499ab27..ce4ef3849d 100644
--- a/core/cortex-m0/ec.lds.S
+++ b/core/cortex-m0/ec.lds.S
@@ -139,6 +139,12 @@ SECTIONS
KEEP(*(.rodata.HOOK_BATTERY_SOC_CHANGE))
__hooks_battery_soc_change_end = .;
+#ifdef CONFIG_USB_SUSPEND
+ __hooks_usb_change = .;
+ KEEP(*(.rodata.HOOK_USB_PM_CHANGE))
+ __hooks_usb_change_end = .;
+#endif
+
__hooks_tick = .;
KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
diff --git a/core/minute-ia/ec.lds.S b/core/minute-ia/ec.lds.S
index 7357737189..5c8f9d6fce 100644
--- a/core/minute-ia/ec.lds.S
+++ b/core/minute-ia/ec.lds.S
@@ -110,6 +110,12 @@ SECTIONS
KEEP(*(.rodata.HOOK_BATTERY_SOC_CHANGE))
__hooks_battery_soc_change_end = .;
+#ifdef CONFIG_USB_SUSPEND
+ __hooks_usb_change = .;
+ KEEP(*(.rodata.HOOK_USB_PM_CHANGE))
+ __hooks_usb_change_end = .;
+#endif
+
__hooks_tick = .;
KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
diff --git a/core/nds32/ec.lds.S b/core/nds32/ec.lds.S
index df4a7aeaa8..c2897343e6 100644
--- a/core/nds32/ec.lds.S
+++ b/core/nds32/ec.lds.S
@@ -137,6 +137,12 @@ SECTIONS
KEEP(*(.rodata.HOOK_BATTERY_SOC_CHANGE))
__hooks_battery_soc_change_end = .;
+#ifdef CONFIG_USB_SUSPEND
+ __hooks_usb_change = .;
+ KEEP(*(.rodata.HOOK_USB_PM_CHANGE))
+ __hooks_usb_change_end = .;
+#endif
+
__hooks_tick = .;
KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
diff --git a/include/hooks.h b/include/hooks.h
index 04206efde7..ee1d2bc475 100644
--- a/include/hooks.h
+++ b/include/hooks.h
@@ -171,6 +171,16 @@ enum hook_type {
HOOK_CCD_CHANGE,
#endif
+#ifdef CONFIG_USB_SUSPEND
+ /*
+ * Called when there is a change in USB power management status
+ * (suspended or resumed).
+ *
+ * Hook routines are called from HOOKS task.
+ */
+ HOOK_USB_PM_CHANGE,
+#endif
+
/*
* Periodic tick, every HOOK_TICK_INTERVAL.
*
diff --git a/include/link_defs.h b/include/link_defs.h
index 9e621ebce7..c12a350924 100644
--- a/include/link_defs.h
+++ b/include/link_defs.h
@@ -58,6 +58,10 @@ extern const struct hook_data __hooks_battery_soc_change_end[];
extern const struct hook_data __hooks_ccd_change[];
extern const struct hook_data __hooks_ccd_change_end[];
#endif
+#ifdef CONFIG_USB_SUSPEND
+extern const struct hook_data __hooks_usb_change[];
+extern const struct hook_data __hooks_usb_change_end[];
+#endif
extern const struct hook_data __hooks_tick[];
extern const struct hook_data __hooks_tick_end[];
extern const struct hook_data __hooks_second[];
diff --git a/include/usb_api.h b/include/usb_api.h
index 8778dcc54e..7ebf25b135 100644
--- a/include/usb_api.h
+++ b/include/usb_api.h
@@ -49,6 +49,13 @@ void usb_release(void);
int usb_is_suspended(void);
/*
+ * Returns true if USB remote wakeup is currently enabled by host.
+ * Requires CONFIG_USB_SUSPEND to be defined, always return 0 if
+ * CONFIG_USB_REMOTE_WAKEUP is not defined.
+ */
+int usb_is_remote_wakeup_enabled(void);
+
+/*
* Preserve in non-volatile memory the state of the USB hardware registers
* which cannot be simply re-initialized when powered up again.
*/