diff --git a/CMakeLists.txt b/CMakeLists.txt
index e208715d77..2c1c3d560e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -274,9 +274,9 @@ if (ENABLE_SDL2)
         target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}")
         target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}")
     else()
-        find_package(SDL2 2.0.12)
+        find_package(SDL2 2.0.14)
 
-        if(SDL2_FOUND)
+        if (SDL2_FOUND)
             # Some installations don't set SDL2_LIBRARIES
             if("${SDL2_LIBRARIES}" STREQUAL "")
                 message(WARNING "SDL2_LIBRARIES wasn't set, manually setting to SDL2::SDL2")
@@ -286,10 +286,10 @@ if (ENABLE_SDL2)
             include_directories(SYSTEM ${SDL2_INCLUDE_DIRS})
             add_library(SDL2 INTERFACE)
             target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARIES}")
+        else()
+            message(STATUS "SDL2 2.0.14 or newer not found, falling back to externals.")
         endif()
     endif()
-else()
-    set(SDL2_FOUND NO)
 endif()
 
 # Install any missing dependencies with conan install
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 6e4591b4e0..e044d9730c 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -46,8 +46,7 @@ add_library(unicorn-headers INTERFACE)
 target_include_directories(unicorn-headers INTERFACE ./unicorn/include)
 
 # SDL2
-if (NOT SDL2_FOUND)
-    set(SDL2_FOUND YES)
+if (NOT SDL2_FOUND AND ENABLE_SDL2)
     add_subdirectory(SDL EXCLUDE_FROM_ALL)
 endif()
 
diff --git a/externals/SDL b/externals/SDL
index 983bbf9ef3..4cd981609b 160000
--- a/externals/SDL
+++ b/externals/SDL
@@ -1 +1 @@
-Subproject commit 983bbf9ef3e572a073a6f5877faf1c0b4803527c
+Subproject commit 4cd981609b50ed273d80c635c1ca4c1e5518fb21
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index c3cfe7efc5..de53e1fda1 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -62,7 +62,7 @@ else()
     )
 endif()
 
-if(SDL2_FOUND)
+if (ENABLE_SDL2)
     target_sources(input_common PRIVATE
         sdl/sdl_impl.cpp
         sdl/sdl_impl.h
diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp
index 9418e78fa2..f682a6db40 100644
--- a/src/input_common/sdl/sdl_impl.cpp
+++ b/src/input_common/sdl/sdl_impl.cpp
@@ -17,7 +17,17 @@
 #include <unordered_map>
 #include <utility>
 #include <vector>
+
+// Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#endif
 #include <SDL.h>
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
 #include "common/logging/log.h"
 #include "common/param_package.h"
 #include "common/settings_input.h"
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 2f984d1b86..7e1d5f3791 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -4,7 +4,17 @@
 
 #include <memory>
 #include <sstream>
+
+// Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#endif
 #include <SDL.h>
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
 #include <inih/cpp/INIReader.h>
 #include "common/file_util.h"
 #include "common/logging/log.h"
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
index ce8b7c2183..3bb555a6ba 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
@@ -2,7 +2,16 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+// Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#endif
 #include <SDL.h>
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
 #include "common/logging/log.h"
 #include "common/scm_rev.h"
 #include "core/core.h"
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
index a765fa7b3a..3c49a300ba 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
@@ -5,8 +5,18 @@
 #include <algorithm>
 #include <cstdlib>
 #include <string>
+
 #define SDL_MAIN_HANDLED
+// Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#endif
 #include <SDL.h>
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
 #include <fmt/format.h>
 #include <glad/glad.h>
 #include "common/assert.h"
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp
index dfd53e2858..3401ad4b49 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp
@@ -16,7 +16,15 @@
 #include "yuzu_cmd/emu_window/emu_window_sdl2_vk.h"
 
 // Include these late to avoid polluting everything with Xlib macros
+// Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#endif
 #include <SDL.h>
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 #include <SDL_syswm.h>
 
 EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(InputCommon::InputSubsystem* input_subsystem)