From bfc5929f50c766a88c3c5120aa3210d3f1f21f5c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=ABl=20Schulz-Andres?= <joel@systemscape.de>
Date: Fri, 24 May 2024 13:46:55 +0200
Subject: [PATCH 1/5] gpiov1: Do not call set_speed for AFType::Input

Co-authored-by: Toby Fleming <tobywf@users.noreply.github.com>
---
 embassy-stm32/src/gpio.rs   | 5 +++++
 embassy-stm32/src/macros.rs | 6 +++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs
index 214813a42..81cb09b24 100644
--- a/embassy-stm32/src/gpio.rs
+++ b/embassy-stm32/src/gpio.rs
@@ -661,6 +661,11 @@ pub(crate) trait SealedPin {
         self.set_as_analog();
     }
 
+    /// Sets the speed of the output pin.
+    ///
+    /// This should never be called for AFType::Input on the STM32F1 series, since MODE and
+    /// CNF bits are not independent. If the CNF bits are altered afterwards as well, this
+    /// will put the pin into output mode.
     #[inline]
     fn set_speed(&self, speed: Speed) {
         let pin = self._pin() as usize;
diff --git a/embassy-stm32/src/macros.rs b/embassy-stm32/src/macros.rs
index 7f8076043..8166dff6a 100644
--- a/embassy-stm32/src/macros.rs
+++ b/embassy-stm32/src/macros.rs
@@ -106,7 +106,11 @@ macro_rules! new_pin {
     ($name:ident, $aftype:expr, $speed:expr, $pull:expr) => {{
         let pin = $name.into_ref();
         pin.set_as_af_pull(pin.af_num(), $aftype, $pull);
-        pin.set_speed($speed);
+        // Do not call set_speed on AFType::Input, as MODE and CNF bits are not independent
+        // for gpio_v1
+        if $aftype != crate::gpio::low_level::AFType::Input {
+            pin.set_speed($speed);
+        }
         Some(pin.map_into())
     }};
 }

From 32a75cb7641faa8231d04a3ac53e9acac6a95d8f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=ABl=20Schulz-Andres?= <joel@systemscape.de>
Date: Fri, 24 May 2024 13:53:19 +0200
Subject: [PATCH 2/5] Fix naming

---
 embassy-stm32/src/macros.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/embassy-stm32/src/macros.rs b/embassy-stm32/src/macros.rs
index 8166dff6a..8ffa50021 100644
--- a/embassy-stm32/src/macros.rs
+++ b/embassy-stm32/src/macros.rs
@@ -108,7 +108,7 @@ macro_rules! new_pin {
         pin.set_as_af_pull(pin.af_num(), $aftype, $pull);
         // Do not call set_speed on AFType::Input, as MODE and CNF bits are not independent
         // for gpio_v1
-        if $aftype != crate::gpio::low_level::AFType::Input {
+        if $aftype != crate::gpio::AFType::Input {
             pin.set_speed($speed);
         }
         Some(pin.map_into())

From fab434ae844d6fd64a5cdd282d47515a29e952e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=ABl=20Schulz-Andres?= <joel@systemscape.de>
Date: Fri, 24 May 2024 14:09:29 +0200
Subject: [PATCH 3/5] Use match instead of if

---
 embassy-stm32/src/macros.rs | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/embassy-stm32/src/macros.rs b/embassy-stm32/src/macros.rs
index 8ffa50021..2458d089f 100644
--- a/embassy-stm32/src/macros.rs
+++ b/embassy-stm32/src/macros.rs
@@ -108,9 +108,10 @@ macro_rules! new_pin {
         pin.set_as_af_pull(pin.af_num(), $aftype, $pull);
         // Do not call set_speed on AFType::Input, as MODE and CNF bits are not independent
         // for gpio_v1
-        if $aftype != crate::gpio::AFType::Input {
-            pin.set_speed($speed);
-        }
+        match $aftype {
+            crate::gpio::AFType::Input => {},
+            _ => pin.set_speed($speed);
+        };
         Some(pin.map_into())
     }};
 }

From c4b3488f7ff747da776310ef0f9099329b5a069e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=ABl=20Schulz-Andres?= <joel@systemscape.de>
Date: Fri, 24 May 2024 14:12:01 +0200
Subject: [PATCH 4/5] Add body to match statement

---
 embassy-stm32/src/macros.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/embassy-stm32/src/macros.rs b/embassy-stm32/src/macros.rs
index 2458d089f..2d3040b08 100644
--- a/embassy-stm32/src/macros.rs
+++ b/embassy-stm32/src/macros.rs
@@ -110,7 +110,7 @@ macro_rules! new_pin {
         // for gpio_v1
         match $aftype {
             crate::gpio::AFType::Input => {},
-            _ => pin.set_speed($speed);
+            _ => {pin.set_speed($speed);},
         };
         Some(pin.map_into())
     }};

From e1d2ba07a79561cf18b30e905a28d0ff0744cb58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=ABl=20Schulz-Andres?= <joel@systemscape.de>
Date: Fri, 24 May 2024 14:15:10 +0200
Subject: [PATCH 5/5] Formatting

---
 embassy-stm32/src/macros.rs | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/embassy-stm32/src/macros.rs b/embassy-stm32/src/macros.rs
index 2d3040b08..dcd25cbe9 100644
--- a/embassy-stm32/src/macros.rs
+++ b/embassy-stm32/src/macros.rs
@@ -109,8 +109,10 @@ macro_rules! new_pin {
         // Do not call set_speed on AFType::Input, as MODE and CNF bits are not independent
         // for gpio_v1
         match $aftype {
-            crate::gpio::AFType::Input => {},
-            _ => {pin.set_speed($speed);},
+            crate::gpio::AFType::Input => {}
+            _ => {
+                pin.set_speed($speed);
+            }
         };
         Some(pin.map_into())
     }};