diff --git a/repos/base/run/platform_drv.inc b/repos/base/run/platform_drv.inc
index d7de2f343a..7b88fdc3d3 100644
--- a/repos/base/run/platform_drv.inc
+++ b/repos/base/run/platform_drv.inc
@@ -65,16 +65,6 @@ proc acpi_drv_name { } {
 	return acpi_drv
 }
 
-##
-# Return name of the gpio driver
-#
-proc gpio_drv { } {
-	if {[have_spec rpi]}     { return rpi_gpio_drv     }
-	if {[have_spec imx53]}   { return imx53_gpio_drv   }
-	if {[have_spec imx6]}    { return imx6_gpio_drv    }
-	return no_gpio_drv_available
-}
-
 proc platform_drv_build_components {} {
 	set drv_build_components ""
 	lappend_if [have_platform_drv] drv_build_components drivers/platform
diff --git a/repos/dde_linux/run/usb_hid.run b/repos/dde_linux/run/usb_hid.run
index e149b7ee82..b4c28420b1 100644
--- a/repos/dde_linux/run/usb_hid.run
+++ b/repos/dde_linux/run/usb_hid.run
@@ -72,8 +72,6 @@ set build_components {
 	server/dynamic_rom
 }
 
-lappend_if [have_spec gpio] build_components drivers/gpio
-
 source ${genode_dir}/repos/base/run/platform_drv.inc
 append_platform_drv_build_components
 
@@ -190,7 +188,6 @@ set boot_modules {
 }
 
 append boot_modules [usb_drv_binary]
-lappend_if [have_spec gpio] boot_modules [gpio_drv]
 
 append_platform_drv_boot_modules
 
diff --git a/repos/dde_linux/run/usb_hid_raw.run b/repos/dde_linux/run/usb_hid_raw.run
index b90f9a4b2d..1251f756c2 100644
--- a/repos/dde_linux/run/usb_hid_raw.run
+++ b/repos/dde_linux/run/usb_hid_raw.run
@@ -142,8 +142,6 @@ set build_components {
 	server/report_rom
 }
 
-lappend_if [have_spec  gpio] build_components drivers/gpio
-
 source ${genode_dir}/repos/base/run/platform_drv.inc
 if { [have_spec x86] } { append_platform_drv_build_components
 } else                 { append build_components  { drivers/platform }
@@ -174,14 +172,6 @@ append config {
 	<default caps="100"/>
 }
 
-append_if [have_spec gpio] config "
-	<start name=\"[gpio_drv]\" caps=\"150\">
-		<resource name=\"RAM\" quantum=\"4M\"/>
-		<provides><service name=\"Gpio\"/></provides>
-		<config/>
-	</start>
-"
-
 if { [have_spec x86] } { append_platform_drv_config
 } else {
 append config "<start name=\"[platform_drv_binary_non_x86]\">"
@@ -291,7 +281,6 @@ set boot_modules {
 }
 
 append boot_modules " [usb_host_drv_binary] "
-lappend_if [have_spec gpio] boot_modules [gpio_drv]
 
 if {[have_spec x86]} { append_platform_drv_boot_modules
 } else { append boot_modules " [platform_drv_binary_non_x86] " }
diff --git a/repos/dde_linux/run/usb_net.run b/repos/dde_linux/run/usb_net.run
index c40cdbb223..e0394e1733 100644
--- a/repos/dde_linux/run/usb_net.run
+++ b/repos/dde_linux/run/usb_net.run
@@ -19,8 +19,6 @@ set build_components {
 	lib/vfs/lwip
 }
 
-lappend_if [have_spec gpio] build_components drivers/gpio
-
 source ${genode_dir}/repos/base/run/platform_drv.inc
 append_platform_drv_build_components
 
@@ -49,13 +47,6 @@ append config {
 	</default-route>
 	<default caps="200"/>}
 
-append_if [have_spec gpio] config "
-	<start name=\"[gpio_drv]\">
-		<resource name=\"RAM\" quantum=\"4M\"/>
-		<provides><service name=\"Gpio\"/></provides>
-		<config/>
-	</start>"
-
 append_platform_drv_config
 
 append config {
@@ -116,7 +107,6 @@ set boot_modules {
 }
 
 append boot_modules [usb_host_drv_binary]
-lappend_if [have_spec gpio] boot_modules [gpio_drv]
 
 append_platform_drv_boot_modules
 
diff --git a/repos/dde_linux/run/usb_terminal.run b/repos/dde_linux/run/usb_terminal.run
index 8e6537b26e..1917d98b13 100644
--- a/repos/dde_linux/run/usb_terminal.run
+++ b/repos/dde_linux/run/usb_terminal.run
@@ -87,8 +87,6 @@ set boot_modules {
 	usb_terminal
 }
 
-lappend_if [have_spec gpio] boot_modules [gpio_drv]
-
 append_platform_drv_boot_modules
 
 build_boot_image $boot_modules
diff --git a/repos/os/recipes/raw/drivers_interactive-imx53_qsb/drivers.config b/repos/os/recipes/raw/drivers_interactive-imx53_qsb/drivers.config
index e888030a52..168f409f7c 100644
--- a/repos/os/recipes/raw/drivers_interactive-imx53_qsb/drivers.config
+++ b/repos/os/recipes/raw/drivers_interactive-imx53_qsb/drivers.config
@@ -35,25 +35,6 @@
 		</route>
 	</start>
 
-	<start name="imx53_gpio_drv" caps="200">
-		<resource name="RAM" quantum="4M"/>
-		<provides><service name="Gpio"/></provides>
-		<config>
-			<gpio num="1" mode="O" value="1"/>
-			<gpio num="88" mode="O" value="1"/>
-		</config>
-		<route>
-			<service name="Platform"> <child name="platform_drv"/> </service>
-			<service name="IO_MEM">   <parent/> </service>
-			<service name="ROM">      <parent/> </service>
-			<service name="PD">       <parent/> </service>
-			<service name="CPU">      <parent/> </service>
-			<service name="LOG">      <parent/> </service>
-			<service name="IRQ">      <parent/> </service>
-			<service name="Timer">    <parent/> </service>
-		</route>
-	</start>
-
 	<start name="fb_drv" caps="120">
 		<binary name="imx53_fb_drv"/>
 		<resource name="RAM" quantum="4M"/>
diff --git a/repos/os/run/gpio_led.run b/repos/os/run/gpio_led.run
index 05a771a786..bf6dd5385d 100644
--- a/repos/os/run/gpio_led.run
+++ b/repos/os/run/gpio_led.run
@@ -1,7 +1,7 @@
 #
 # Build
 #
-if {[have_spec gpio] == 0} {
+if {[have_spec rpi] == 0} {
 	puts "Runs only on platforms with GPIO"
 	exit 0
 }
@@ -41,10 +41,8 @@ append config {
 		<provides><service name="Timer"/></provides>
 	</start>}
 
-append config "
-	<start name=\"[gpio_drv]\">"
-
 append config {
+		<start name="rpi_gpio_drv">
 		<resource name="RAM" quantum="1M"/>
 		<provides><service name="Gpio"/></provides>
 		<config>
@@ -68,10 +66,9 @@ set boot_modules {
 	core ld.lib.so init
 	timer
 	led_gpio_drv
+	rpi_gpio_drv
 }
 
-append boot_modules [gpio_drv]
-
 build_boot_image $boot_modules
 
 run_genode_until forever
diff --git a/repos/os/run/gpio_signal.run b/repos/os/run/gpio_signal.run
index d13b13b0bb..1b142fa78c 100644
--- a/repos/os/run/gpio_signal.run
+++ b/repos/os/run/gpio_signal.run
@@ -1,7 +1,7 @@
 #
 # Build
 #
-if {[have_spec gpio] == 0} {
+if {[have_spec rpi] == 0} {
 	puts "Runs only on platforms with GPIO"
 	exit 0
 }
@@ -41,10 +41,9 @@ append config {
 		<provides><service name="Timer"/></provides>
 	</start>}
 
-append config "
-	<start name=\"[gpio_drv]\">"
 
 append config {
+		<start name="rpi_gpio_drv"/>
 		<resource name="RAM" quantum="1M"/>
 		<provides><service name="Gpio"/></provides>
 		<config async_events="0">
@@ -73,7 +72,7 @@ set boot_modules {
 	signal_gpio_drv
 }
 
-append boot_modules [gpio_drv]
+append boot_modules rpi_gpio_drv
 
 build_boot_image $boot_modules
 
diff --git a/repos/os/run/tz_vmm.run b/repos/os/run/tz_vmm.run
index d31f176cf8..f16bea3513 100644
--- a/repos/os/run/tz_vmm.run
+++ b/repos/os/run/tz_vmm.run
@@ -143,10 +143,29 @@ set config {
 	<default caps="100"/>}
 
 append_if $trusted_led config {
-	<start name="imx53_gpio_drv">
+	<start name="platform_drv" caps="150">
+		<resource name="RAM" quantum="1M"/>
+		<provides> <service name="Platform"/> </provides>
+		<config>
+			<device name="gpio">
+				<io_mem address="0x53f90000" size="0x4000"/>
+				<irq number="56"/>
+				<irq number="57"/>
+			</device>
+			<policy label="imx_gpio_drv -> ">
+				<device name="gpio"/>
+			</policy>
+		</config>
+	</start>
+
+	<start name="imx_gpio_drv">
 		<resource name="RAM" quantum="3M"/>
 		<provides><service name="Gpio"/></provides>
 		<config/>
+		<route>
+			<service name="Platform"><child name="platform_drv" /></service>
+			<any-service><parent/><any-child/></any-service>
+		</route>
 	</start>}
 
 append_if $mmc_rootfs config {
@@ -164,6 +183,11 @@ append_if $mmc_rootfs config {
 	<start name="imx53_sd_card_drv">
 		<resource name="RAM" quantum="3M"/>
 		<provides><service name="Block"/></provides>
+		<route>
+			<service name="Platform"> <child name="imx53_platform_drv"/> </service>
+			<service name="Regulator"> <child name="imx53_platform_drv"/> </service>
+			<any-service><parent/><any-child/></any-service>
+		</route>
 	</start>
 	<start name="part_block">
 		<resource name="RAM" quantum="10M" />
@@ -266,7 +290,8 @@ if { $mmc_rootfs } {
 }
 cd ..
 
-lappend_if $trusted_led boot_modules imx53_gpio_drv
+lappend_if $trusted_led boot_modules imx_gpio_drv
+lappend_if $trusted_led boot_modules platform_drv
 
 build_boot_image [join $boot_modules " "]
 
diff --git a/repos/os/run/usb_block.run b/repos/os/run/usb_block.run
index 350408f08d..3121bc95d1 100644
--- a/repos/os/run/usb_block.run
+++ b/repos/os/run/usb_block.run
@@ -13,8 +13,6 @@ set build_components {
 	test/block/bench
 }
 
-lappend_if [have_spec gpio] build_components drivers/gpio
-
 source ${genode_dir}/repos/base/run/platform_drv.inc
 append_platform_drv_build_components
 
@@ -46,13 +44,6 @@ set config {
 
 append_platform_drv_config
 
-append_if [have_spec gpio] config "
-	<start name=\"[gpio_drv]\">
-		<resource name=\"RAM\" quantum=\"4M\"/>
-		<provides><service name=\"Gpio\"/></provides>
-		<config/>
-	</start>"
-
 append config {
 	<start name="timer">
 		<resource name="RAM" quantum="1M"/>
@@ -138,7 +129,6 @@ set boot_modules {
 }
 
 append boot_modules [usb_host_drv_binary]
-lappend_if [have_spec gpio] boot_modules [gpio_drv]
 
 append_platform_drv_boot_modules
 
diff --git a/repos/os/src/drivers/gpio/imx53/board.h b/repos/os/src/drivers/gpio/imx53/board.h
deleted file mode 100644
index b78ce03af4..0000000000
--- a/repos/os/src/drivers/gpio/imx53/board.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * \brief  Gpio driver for the i.MX53
- * \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
- * \date   2018-02-22
- */
-
-/*
- * Copyright (C) 2018 Genode Labs GmbH
- *
- * This file is part of the Genode OS framework, which is distributed
- * under the terms of the GNU Affero General Public License version 3.
- */
-
-#ifndef _DRIVERS__GPIO__SPEC__IMX53__BOARD_H_
-#define _DRIVERS__GPIO__SPEC__IMX53__BOARD_H_
-
-/* Genode includes */
-#include <drivers/defs/imx53.h>
-
-namespace Board { using namespace Imx53; }
-
-#endif /* _DRIVERS__GPIO__SPEC__IMX53__BOARD_H_ */
diff --git a/repos/os/src/drivers/gpio/imx53/target.mk b/repos/os/src/drivers/gpio/imx53/target.mk
deleted file mode 100644
index 7a1472d274..0000000000
--- a/repos/os/src/drivers/gpio/imx53/target.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-TARGET   = imx53_gpio_drv
-REQUIRES = arm_v7
-SRC_CC   = main.cc
-LIBS     = base
-INC_DIR += $(PRG_DIR) $(REP_DIR)/src/drivers/gpio/imx
-
-vpath main.cc $(REP_DIR)/src/drivers/gpio/imx
diff --git a/repos/os/src/drivers/gpio/imx6/board.h b/repos/os/src/drivers/gpio/imx6/board.h
deleted file mode 100644
index 77c99331b0..0000000000
--- a/repos/os/src/drivers/gpio/imx6/board.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * \brief  Gpio driver for the i.MX6 SoCs
- * \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
- * \date   2018-02-22
- */
-
-/*
- * Copyright (C) 2018 Genode Labs GmbH
- *
- * This file is part of the Genode OS framework, which is distributed
- * under the terms of the GNU Affero General Public License version 3.
- */
-
-#ifndef _DRIVERS__GPIO__SPEC__IMX6__BOARD_H_
-#define _DRIVERS__GPIO__SPEC__IMX6__BOARD_H_
-
-/* Genode includes */
-#include <drivers/defs/imx6.h>
-
-namespace Board { using namespace Imx6; }
-
-#endif /* _DRIVERS__GPIO__SPEC__IMX6__BOARD_H_ */
diff --git a/repos/os/src/drivers/gpio/imx6/target.mk b/repos/os/src/drivers/gpio/imx6/target.mk
deleted file mode 100644
index 9309358456..0000000000
--- a/repos/os/src/drivers/gpio/imx6/target.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-TARGET   = imx6_gpio_drv
-REQUIRES = arm_v7
-SRC_CC   = main.cc
-LIBS     = base
-INC_DIR += $(PRG_DIR) $(REP_DIR)/src/drivers/gpio/imx
-
-vpath main.cc $(REP_DIR)/src/drivers/gpio/imx
diff --git a/repos/os/src/server/tz_vmm/spec/usb_armory/vm.h b/repos/os/src/server/tz_vmm/spec/usb_armory/vm.h
index 7795272d1b..c8323f24b3 100644
--- a/repos/os/src/server/tz_vmm/spec/usb_armory/vm.h
+++ b/repos/os/src/server/tz_vmm/spec/usb_armory/vm.h
@@ -30,7 +30,7 @@ class Genode::Vm : public Vm_base
 
 		enum { DTB_OFFSET = 0x1000000 };
 
-		Gpio::Connection  _led { _env, 123 };
+		Gpio::Connection  _led { _env, 28 };
 
 
 		/*************