From d596a1091d25e89533d08a1f96678f1c1182dc40 Mon Sep 17 00:00:00 2001
From: djstrickland <96876452+dstric-aqueduct@users.noreply.github.com>
Date: Wed, 13 Dec 2023 10:17:07 -0500
Subject: [PATCH] add `susependable` field to `embassy_usb::builder::Config`

- allow for optional override of `Suspend` event for a UsbDevice
---
 embassy-usb/src/builder.rs | 10 ++++++++++
 embassy-usb/src/lib.rs     |  8 +++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/embassy-usb/src/builder.rs b/embassy-usb/src/builder.rs
index c4705d041..ebc1283e6 100644
--- a/embassy-usb/src/builder.rs
+++ b/embassy-usb/src/builder.rs
@@ -94,6 +94,15 @@ pub struct Config<'a> {
     /// Default: 100mA
     /// Max: 500mA
     pub max_power: u16,
+
+    /// Allow the bus to be suspended.
+    ///
+    /// If set to `true`, the bus will put itself in the suspended state
+    /// when it receives a `driver::Event::Suspend` bus event. If you wish
+    /// to override this behavior, set this field to `false`.
+    ///
+    /// Default: `true`
+    pub suspendable: bool,
 }
 
 impl<'a> Config<'a> {
@@ -114,6 +123,7 @@ impl<'a> Config<'a> {
             supports_remote_wakeup: false,
             composite_with_iads: false,
             max_power: 100,
+            suspendable: true,
         }
     }
 }
diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs
index 241e33a78..ff3295871 100644
--- a/embassy-usb/src/lib.rs
+++ b/embassy-usb/src/lib.rs
@@ -471,9 +471,11 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
             }
             Event::Suspend => {
                 trace!("usb: suspend");
-                self.suspended = true;
-                for h in &mut self.handlers {
-                    h.suspended(true);
+                if self.config.suspendable {
+                    self.suspended = true;
+                    for h in &mut self.handlers {
+                        h.suspended(true);
+                    }
                 }
             }
             Event::PowerDetected => {