diff --git a/core/SConscript.bootloader b/core/SConscript.bootloader
index d3a7e6b5c8..0719f99870 100644
--- a/core/SConscript.bootloader
+++ b/core/SConscript.bootloader
@@ -175,7 +175,7 @@ env.Replace(
     '-fstack-protector-strong '
     +  env.get('ENV')["CPU_CCFLAGS"] + CCFLAGS_MOD,
     CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
-    LINKFLAGS=['-Tbuild/bootloader/memory.ld', '-Wl,--gc-sections', '-Wl,-Map=build/bootloader/bootloader.map', '-Wl,--warn-common', '-Wl,--print-memory-usage'],
+    LINKFLAGS=['-Tbuild/bootloader/memory.ld', '-Wl,--gc-sections', '-Wl,-Map=build/bootloader/bootloader.map', '-Wl,--warn-common', '-Wl,--print-memory-usage', '-Wl,--undefined=__errno'],
     CPPPATH=ALLPATHS,
     CPPDEFINES=[
         'BOOTLOADER',
diff --git a/core/embed/projects/bootloader/main.c b/core/embed/projects/bootloader/main.c
index c1b7ff935f..ce0c73ce6a 100644
--- a/core/embed/projects/bootloader/main.c
+++ b/core/embed/projects/bootloader/main.c
@@ -62,6 +62,10 @@
 #ifdef USE_BLE
 #include <io/ble.h>
 #endif
+#ifdef USE_POWERCTL
+#include <sys/powerctl.h>
+#include "../sys/powerctl/npm1300/npm1300.h"
+#endif
 
 #include "antiglitch.h"
 #include "bootui.h"
@@ -78,7 +82,7 @@ void failed_jump_to_firmware(void);
 CONFIDENTIAL volatile secbool dont_optimize_out_true = sectrue;
 CONFIDENTIAL void (*volatile firmware_jump_fn)(void) = failed_jump_to_firmware;
 
-static void drivers_init(secbool *touch_initialized) {
+static secbool drivers_init(secbool *touch_initialized) {
   random_delays_init();
 #ifdef USE_PVD
   pvd_init();
@@ -113,6 +117,7 @@ static void drivers_init(secbool *touch_initialized) {
   }
 #endif
 
+
 #ifdef USE_OPTIGA
   optiga_hal_init();
 #endif
@@ -128,6 +133,8 @@ static void drivers_init(secbool *touch_initialized) {
 #ifdef USE_BLE
   ble_init();
 #endif
+
+  return manufacturing_mode;
 }
 
 static void drivers_deinit(void) {
@@ -251,7 +258,7 @@ int bootloader_main(void) {
 
   system_init(&rsod_panic_handler);
 
-  drivers_init(&touch_initialized);
+  secbool manufacturing_mode = drivers_init(&touch_initialized);
 
   ui_screen_boot_stage_1(false);
 
@@ -319,6 +326,12 @@ int bootloader_main(void) {
     firmware_present_backup = firmware_present;
   }
 
+#ifdef USE_POWERCTL
+  if (sectrue != manufacturing_mode || sectrue != firmware_present) {
+    npm1300_set_charging(true);
+  }
+#endif
+
 #if PRODUCTION && !defined STM32U5
   // for STM32U5, this check is moved to boardloader
   ensure_bootloader_min_version();
diff --git a/core/embed/projects/kernel/main.c b/core/embed/projects/kernel/main.c
index 146652b240..2ef5cbd49f 100644
--- a/core/embed/projects/kernel/main.c
+++ b/core/embed/projects/kernel/main.c
@@ -59,6 +59,7 @@
 
 #ifdef USE_POWERCTL
 #include <sys/powerctl.h>
+#include "../sys/powerctl/npm1300/npm1300.h"
 #endif
 
 #ifdef USE_PVD
@@ -92,6 +93,7 @@
 void drivers_init() {
 #ifdef USE_POWERCTL
   powerctl_init();
+  npm1300_set_charging(true);
 #endif
 
 #ifdef USE_TAMPER