diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp
index 2f0ab6b2a7..0ef2403440 100644
--- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp
+++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp
@@ -22,8 +22,8 @@ void JoyconCommonProtocol::SetNonBlocking() {
 }
 
 DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& controller_type) {
-    std::vector<u8> buffer;
-    const auto result = ReadSPI(SpiAddress::DEVICE_TYPE, 1, buffer);
+    std::array<u8, 1> buffer{};
+    const auto result = ReadRawSPI(SpiAddress::DEVICE_TYPE, buffer);
     controller_type = ControllerType::None;
 
     if (result == DriverResult::Success) {
@@ -148,11 +148,13 @@ DriverResult JoyconCommonProtocol::SendVibrationReport(std::span<const u8> buffe
     return SendData(local_buffer);
 }
 
-DriverResult JoyconCommonProtocol::ReadSPI(SpiAddress addr, u8 size, std::vector<u8>& output) {
+DriverResult JoyconCommonProtocol::ReadRawSPI(SpiAddress addr, std::span<u8> output) {
+    constexpr std::size_t HeaderSize = 20;
     constexpr std::size_t MaxTries = 10;
+    const auto size = output.size();
     std::size_t tries = 0;
-    std::array<u8, 5> buffer = {0x00, 0x00, 0x00, 0x00, size};
-    std::vector<u8> local_buffer(size + 20);
+    std::array<u8, 5> buffer = {0x00, 0x00, 0x00, 0x00, static_cast<u8>(size)};
+    std::vector<u8> local_buffer{};
 
     buffer[0] = static_cast<u8>(static_cast<u16>(addr) & 0x00FF);
     buffer[1] = static_cast<u8>((static_cast<u16>(addr) & 0xFF00) >> 8);
@@ -167,8 +169,12 @@ DriverResult JoyconCommonProtocol::ReadSPI(SpiAddress addr, u8 size, std::vector
         }
     } while (local_buffer[15] != buffer[0] || local_buffer[16] != buffer[1]);
 
+    if (local_buffer.size() < size + HeaderSize) {
+        return DriverResult::WrongReply;
+    }
+
     // Remove header from output
-    output = std::vector<u8>(local_buffer.begin() + 20, local_buffer.begin() + 20 + size);
+    memcpy(output.data(), local_buffer.data() + HeaderSize, size);
     return DriverResult::Success;
 }
 
diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.h b/src/input_common/helpers/joycon_protocol/common_protocol.h
index 675eacf68b..75d3f20a46 100644
--- a/src/input_common/helpers/joycon_protocol/common_protocol.h
+++ b/src/input_common/helpers/joycon_protocol/common_protocol.h
@@ -97,26 +97,26 @@ public:
     /**
      * Reads the SPI memory stored on the joycon
      * @param Initial address location
-     * @param size in bytes to be read
      * @returns output buffer containing the responce
      */
-    DriverResult ReadSPI(SpiAddress addr, u8 size, std::vector<u8>& output);
+    DriverResult ReadRawSPI(SpiAddress addr, std::span<u8> output);
 
+    /**
+     * Reads the SPI memory stored on the joycon
+     * @param Initial address location
+     * @returns output object containing the responce
+     */
     template <typename Output>
-        requires(std::is_trivially_copyable_v<Output>)
-    DriverResult ReadSPI(SpiAddress addr, Output& output) {
-        std::vector<u8> buffer;
+    requires std::is_trivially_copyable_v<Output> DriverResult ReadSPI(SpiAddress addr,
+                                                                       Output& output) {
+        std::array<u8, sizeof(Output)> buffer;
         output = {};
 
-        const auto result = ReadSPI(addr, sizeof(Output), buffer);
+        const auto result = ReadRawSPI(addr, buffer);
         if (result != DriverResult::Success) {
             return result;
         }
 
-        if (buffer.size() != sizeof(Output)) {
-            return DriverResult::WrongReply;
-        }
-
         std::memcpy(&output, buffer.data(), sizeof(Output));
         return DriverResult::Success;
     }
diff --git a/src/input_common/helpers/joycon_protocol/generic_functions.cpp b/src/input_common/helpers/joycon_protocol/generic_functions.cpp
index 4763ba3e65..484c208e6a 100644
--- a/src/input_common/helpers/joycon_protocol/generic_functions.cpp
+++ b/src/input_common/helpers/joycon_protocol/generic_functions.cpp
@@ -71,8 +71,8 @@ DriverResult GenericProtocol::GetBattery(u32& battery_level) {
 
 DriverResult GenericProtocol::GetColor(Color& color) {
     ScopedSetBlocking sb(this);
-    std::vector<u8> buffer;
-    const auto result = ReadSPI(SpiAddress::COLOR_DATA, 12, buffer);
+    std::array<u8, 12> buffer{};
+    const auto result = ReadRawSPI(SpiAddress::COLOR_DATA, buffer);
 
     color = {};
     if (result == DriverResult::Success) {
@@ -87,8 +87,8 @@ DriverResult GenericProtocol::GetColor(Color& color) {
 
 DriverResult GenericProtocol::GetSerialNumber(SerialNumber& serial_number) {
     ScopedSetBlocking sb(this);
-    std::vector<u8> buffer;
-    const auto result = ReadSPI(SpiAddress::SERIAL_NUMBER, 16, buffer);
+    std::array<u8, 16> buffer{};
+    const auto result = ReadRawSPI(SpiAddress::SERIAL_NUMBER, buffer);
 
     serial_number = {};
     if (result == DriverResult::Success) {