diff --git a/src/common/input.h b/src/common/input.h
index cdacd46897..cb84f1005a 100644
--- a/src/common/input.h
+++ b/src/common/input.h
@@ -164,6 +164,16 @@ class InputDevice {
 public:
     virtual ~InputDevice() = default;
 
+    // Request input device to update if necessary
+    virtual void SoftUpdate() {
+        return;
+    }
+
+    // Force input device to update data regarless of the current state
+    virtual void ForceUpdate() {
+        return;
+    }
+
     void SetCallback(InputCallback callback_) {
         callback = std::move(callback_);
     }
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index bd0b89c056..48add394b4 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -122,6 +122,7 @@ void EmulatedController::ReloadInput() {
         Input::InputCallback button_callback{
             [this, index](Input::CallbackStatus callback) { SetButton(callback, index); }};
         button_devices[index]->SetCallback(button_callback);
+        button_devices[index]->ForceUpdate();
     }
 
     for (std::size_t index = 0; index < stick_devices.size(); ++index) {
@@ -131,6 +132,7 @@ void EmulatedController::ReloadInput() {
         Input::InputCallback stick_callback{
             [this, index](Input::CallbackStatus callback) { SetStick(callback, index); }};
         stick_devices[index]->SetCallback(stick_callback);
+        stick_devices[index]->ForceUpdate();
     }
 
     for (std::size_t index = 0; index < trigger_devices.size(); ++index) {
@@ -140,6 +142,7 @@ void EmulatedController::ReloadInput() {
         Input::InputCallback trigger_callback{
             [this, index](Input::CallbackStatus callback) { SetTrigger(callback, index); }};
         trigger_devices[index]->SetCallback(trigger_callback);
+        trigger_devices[index]->ForceUpdate();
     }
 
     for (std::size_t index = 0; index < battery_devices.size(); ++index) {
@@ -149,6 +152,7 @@ void EmulatedController::ReloadInput() {
         Input::InputCallback battery_callback{
             [this, index](Input::CallbackStatus callback) { SetBattery(callback, index); }};
         battery_devices[index]->SetCallback(battery_callback);
+        battery_devices[index]->ForceUpdate();
     }
 
     for (std::size_t index = 0; index < motion_devices.size(); ++index) {
@@ -158,6 +162,7 @@ void EmulatedController::ReloadInput() {
         Input::InputCallback motion_callback{
             [this, index](Input::CallbackStatus callback) { SetMotion(callback, index); }};
         motion_devices[index]->SetCallback(motion_callback);
+        motion_devices[index]->ForceUpdate();
     }
 }
 
@@ -843,6 +848,10 @@ AnalogSticks EmulatedController::GetSticks() const {
     if (is_configuring) {
         return {};
     }
+    // Some drivers like stick from buttons need constant refreshing
+    for (auto& device : stick_devices) {
+        device->SoftUpdate();
+    }
     return controller.analog_stick_state;
 }
 
diff --git a/src/input_common/helpers/stick_from_buttons.cpp b/src/input_common/helpers/stick_from_buttons.cpp
index 38f1507462..9101f11cee 100644
--- a/src/input_common/helpers/stick_from_buttons.cpp
+++ b/src/input_common/helpers/stick_from_buttons.cpp
@@ -200,6 +200,22 @@ public:
         TriggerOnChange(status);
     }
 
+    void ForceUpdate() override{
+        up->ForceUpdate();
+        down->ForceUpdate();
+        left->ForceUpdate();
+        right->ForceUpdate();
+        modifier->ForceUpdate();
+    }
+
+    void SoftUpdate() override {
+        Input::CallbackStatus status{
+            .type = Input::InputType::Stick,
+            .stick_status = GetStatus(),
+        };
+        TriggerOnChange(status);
+    }
+
     Input::StickStatus GetStatus() const {
         Input::StickStatus status{};
         status.x.properties = properties;
diff --git a/src/input_common/helpers/touch_from_buttons.cpp b/src/input_common/helpers/touch_from_buttons.cpp
index 2abfaf841d..bb2bad5b11 100644
--- a/src/input_common/helpers/touch_from_buttons.cpp
+++ b/src/input_common/helpers/touch_from_buttons.cpp
@@ -17,6 +17,7 @@ public:
         Input::InputCallback button_up_callback{
             [this](Input::CallbackStatus callback_) { UpdateButtonStatus(callback_); }};
         button->SetCallback(button_up_callback);
+        button->ForceUpdate();
     }
 
     Input::TouchStatus GetStatus(bool pressed) const {
diff --git a/src/input_common/input_poller.cpp b/src/input_common/input_poller.cpp
index 62ade951c9..024bd28ef1 100644
--- a/src/input_common/input_poller.cpp
+++ b/src/input_common/input_poller.cpp
@@ -45,6 +45,16 @@ public:
         };
     }
 
+    void ForceUpdate() {
+        const Input::CallbackStatus status{
+            .type = Input::InputType::Button,
+            .button_status = GetStatus(),
+        };
+
+        last_button_value = status.button_status.value;
+        TriggerOnChange(status);
+    }
+
     void OnChange() {
         const Input::CallbackStatus status{
             .type = Input::InputType::Button,
@@ -96,6 +106,16 @@ public:
         };
     }
 
+    void ForceUpdate() {
+        const Input::CallbackStatus status{
+            .type = Input::InputType::Button,
+            .button_status = GetStatus(),
+        };
+
+        last_button_value = status.button_status.value;
+        TriggerOnChange(status);
+    }
+
     void OnChange() {
         const Input::CallbackStatus status{
             .type = Input::InputType::Button,