diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index f865e3f5fc02dba9f841d5ddfb440883e766f2eb..924f209c0ec1fd89d46cdd06754cceb721026456 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -703,7 +703,8 @@ void Controller_NPad::VibrateController(const std::vector<DeviceHandle>& vibrati
 
         // TODO: Vibrate left/right vibration motors independently if possible.
         button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay(
-            vibration_values[i].amp_high, vibration_values[i].amp_low,
+            vibration_values[i].amp_high * Settings::values.vibration_strength.GetValue() / 100,
+            vibration_values[i].amp_low * Settings::values.vibration_strength.GetValue() / 100,
             vibration_values[i].freq_high, vibration_values[i].freq_low);
 
         latest_vibration_values[npad_index][device_index] = vibration_values[i];
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index aadbc3932d28325e9bc628609bf3724e96c41165..6e39aebb50017f9c53c27f86a3956f1d00930868 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -150,6 +150,7 @@ void RestoreGlobalState() {
     values.players.SetGlobal(true);
     values.use_docked_mode.SetGlobal(true);
     values.vibration_enabled.SetGlobal(true);
+    values.vibration_strength.SetGlobal(true);
     values.motion_enabled.SetGlobal(true);
 }
 
diff --git a/src/core/settings.h b/src/core/settings.h
index edd2a00ca41d31f246abb4d5d58113fdf43ca53c..496f477473de137384b0f74a64b77fd85c02a190 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -170,6 +170,7 @@ struct Values {
     Setting<bool> use_docked_mode;
 
     Setting<bool> vibration_enabled;
+    Setting<int> vibration_strength;
 
     Setting<bool> motion_enabled;
     std::string motion_device;
diff --git a/src/yuzu/applets/controller.cpp b/src/yuzu/applets/controller.cpp
index 7697fe4341bd902027b2f46bc3419cc818c07749..196b4f16308e45ccd39a297686579579fbe76a98 100644
--- a/src/yuzu/applets/controller.cpp
+++ b/src/yuzu/applets/controller.cpp
@@ -266,6 +266,8 @@ void QtControllerSelectorDialog::ApplyConfiguration() {
     OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode.GetValue());
 
     Settings::values.vibration_enabled.SetValue(ui->vibrationGroup->isChecked());
+    Settings::values.vibration_strength.SetValue(ui->vibrationSpin->value());
+    Settings::values.motion_enabled.SetValue(ui->motionGroup->isChecked());
 }
 
 void QtControllerSelectorDialog::LoadConfiguration() {
@@ -281,6 +283,8 @@ void QtControllerSelectorDialog::LoadConfiguration() {
     UpdateDockedState(Settings::values.players.GetValue()[8].connected);
 
     ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue());
+    ui->vibrationSpin->setValue(Settings::values.vibration_strength.GetValue());
+    ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue());
 }
 
 void QtControllerSelectorDialog::CallConfigureInputDialog() {
diff --git a/src/yuzu/applets/controller.ui b/src/yuzu/applets/controller.ui
index 2ab69a2d37ba972cce2530926afa433852e59b59..cc27b8ef45050531c04992f24d6327a72b275946 100644
--- a/src/yuzu/applets/controller.ui
+++ b/src/yuzu/applets/controller.ui
@@ -2349,7 +2349,7 @@
                <number>1</number>
               </property>
               <property name="maximum">
-               <number>200</number>
+               <number>100</number>
               </property>
               <property name="value">
                <number>100</number>
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 296c58f58b3595cfd75bc943f64f56006ee0325e..820ef4098089c21386bd868cfadcb60714dec875 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -493,6 +493,8 @@ void Config::ReadControlValues() {
     ReadSettingGlobal(Settings::values.use_docked_mode, QStringLiteral("use_docked_mode"), false);
     ReadSettingGlobal(Settings::values.vibration_enabled, QStringLiteral("vibration_enabled"),
                       true);
+    ReadSettingGlobal(Settings::values.vibration_strength, QStringLiteral("vibration_strength"),
+                      100);
     ReadSettingGlobal(Settings::values.motion_enabled, QStringLiteral("motion_enabled"), true);
 
     qt_config->endGroup();
@@ -1150,6 +1152,8 @@ void Config::SaveControlValues() {
     WriteSettingGlobal(QStringLiteral("use_docked_mode"), Settings::values.use_docked_mode, false);
     WriteSettingGlobal(QStringLiteral("vibration_enabled"), Settings::values.vibration_enabled,
                        true);
+    WriteSettingGlobal(QStringLiteral("vibration_strength"), Settings::values.vibration_strength,
+                       100);
     WriteSettingGlobal(QStringLiteral("motion_enabled"), Settings::values.motion_enabled, true);
     WriteSetting(QStringLiteral("motion_device"),
                  QString::fromStdString(Settings::values.motion_device),
diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp
index 9a4de4c5d5edbd3559c9f10d686ed8a04a1092dd..84df547b9cda02ebc3f86d3831b5485ed019428f 100644
--- a/src/yuzu/configuration/configure_input.cpp
+++ b/src/yuzu/configuration/configure_input.cpp
@@ -186,6 +186,7 @@ void ConfigureInput::ApplyConfiguration() {
     OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode.GetValue());
 
     Settings::values.vibration_enabled.SetValue(ui->vibrationGroup->isChecked());
+    Settings::values.vibration_strength.SetValue(ui->vibrationSpin->value());
     Settings::values.motion_enabled.SetValue(ui->motionGroup->isChecked());
 }
 
@@ -206,6 +207,7 @@ void ConfigureInput::LoadConfiguration() {
     UpdateDockedState(Settings::values.players.GetValue()[8].connected);
 
     ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue());
+    ui->vibrationSpin->setValue(Settings::values.vibration_strength.GetValue());
     ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue());
 }
 
diff --git a/src/yuzu/configuration/configure_input.ui b/src/yuzu/configuration/configure_input.ui
index b74481bdaf9653eab695be859ceccdd05fa8409f..cbd67d4c71386db148e3e9ebdb2df82906601cd4 100644
--- a/src/yuzu/configuration/configure_input.ui
+++ b/src/yuzu/configuration/configure_input.ui
@@ -215,7 +215,7 @@
             <number>1</number>
            </property>
            <property name="maximum">
-            <number>200</number>
+            <number>100</number>
            </property>
            <property name="value">
             <number>100</number>
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index feee02fcdcc5bb5c296c0572a4093eeaa42de9aa..209350837c505917de7c37443b09c642bc01fd0b 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -290,6 +290,8 @@ void Config::ReadValues() {
 
     Settings::values.vibration_enabled.SetValue(
         sdl2_config->GetBoolean("ControlsGeneral", "vibration_enabled", true));
+    Settings::values.vibration_strength.SetValue(
+        sdl2_config->GetInteger("ControlsGeneral", "vibration_strength", 100));
     Settings::values.motion_enabled.SetValue(
         sdl2_config->GetBoolean("ControlsGeneral", "motion_enabled", true));
     Settings::values.touchscreen.enabled =
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index 796e27df4b8857543ce9810bc349392884165c81..53057c01ca8743c4773aa5f3c9d55e3c0aca136c 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -65,6 +65,13 @@ button_screenshot=
 lstick=
 rstick=
 
+# Whether to enable or disable vibration
+# 0: Disabled, 1 (default): Enabled
+vibration_enabled=
+
+# Vibration strength percentage (Default: 100)
+vibration_strength=
+
 # for motion input, the following devices are available:
 #  - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
 #      - "update_period": update period in milliseconds (default to 100)
diff --git a/src/yuzu_tester/config.cpp b/src/yuzu_tester/config.cpp
index 3a8a333f0196dc5707c5c0ba68587d03d4d70426..437302520e81df282bf6f559f0c6efa84e7ab1ce 100644
--- a/src/yuzu_tester/config.cpp
+++ b/src/yuzu_tester/config.cpp
@@ -76,6 +76,7 @@ void Config::ReadValues() {
     }
 
     Settings::values.vibration_enabled.SetValue(true);
+    Settings::values.vibration_strength.SetValue(100);
     Settings::values.motion_enabled.SetValue(true);
     Settings::values.touchscreen.enabled = "";
     Settings::values.touchscreen.device = "";