Remove SubscribableCallback
diff --git a/src/callback.rs b/src/callback.rs
index 0d0d6fc..95d4e04 100644
--- a/src/callback.rs
+++ b/src/callback.rs
@@ -38,10 +38,6 @@
     }
 }
 
-pub(crate) trait SubscribableCallback {
-    fn call_rust(&mut self, arg1: usize, arg2: usize, arg3: usize);
-}
-
 #[must_use = "Subscriptions risk being dropped too early. Drop them manually."]
 pub struct CallbackSubscription<'a> {
     driver_number: usize,
diff --git a/src/simple_ble.rs b/src/simple_ble.rs
index 8298cce..2876bce 100644
--- a/src/simple_ble.rs
+++ b/src/simple_ble.rs
@@ -1,6 +1,6 @@
 use crate::ble_composer::BlePayload;
 use crate::callback::CallbackSubscription;
-use crate::callback::SubscribableCallback;
+use crate::callback::Consumer;
 use crate::result::TockResult;
 use crate::shared_memory::SharedMemory;
 use crate::syscalls;
@@ -79,9 +79,9 @@
     }
 }
 
-impl<CB: FnMut(usize, usize)> SubscribableCallback for BleCallback<CB> {
-    fn call_rust(&mut self, arg1: usize, arg2: usize, _: usize) {
-        (self.callback)(arg1, arg2);
+impl<CB: FnMut(usize, usize)> Consumer<BleCallback<CB>> for BleCallback<CB> {
+    fn consume(data: &mut BleCallback<CB>, arg1: usize, arg2: usize, _: usize) {
+        (data.callback)(arg1, arg2);
     }
 }
 
@@ -104,8 +104,11 @@
         &'a mut self,
         callback: &'a mut BleCallback<CB>,
     ) -> TockResult<CallbackSubscription> {
-        let subscription =
-            syscalls::subscribe_cb(DRIVER_NUMBER, subscribe_nr::BLE_PASSIVE_SCAN_SUB, callback)?;
+        let subscription = syscalls::subscribe::<BleCallback<CB>, _>(
+            DRIVER_NUMBER,
+            subscribe_nr::BLE_PASSIVE_SCAN_SUB,
+            callback,
+        )?;
         syscalls::command(DRIVER_NUMBER, command_nr::PASSIVE_SCAN, 1, 0)?;
         Ok(subscription)
     }
diff --git a/src/syscalls/mod.rs b/src/syscalls/mod.rs
index 2aafe6e..c0289e5 100644
--- a/src/syscalls/mod.rs
+++ b/src/syscalls/mod.rs
@@ -8,7 +8,6 @@
 
 use crate::callback::CallbackSubscription;
 use crate::callback::Consumer;
-use crate::callback::SubscribableCallback;
 use crate::result::AllowError;
 use crate::result::CommandError;
 use crate::result::SubscribeError;
@@ -34,22 +33,6 @@
     }
 }
 
-pub(crate) fn subscribe_cb<CB: SubscribableCallback>(
-    driver_number: usize,
-    subscribe_number: usize,
-    callback: &mut CB,
-) -> Result<CallbackSubscription, SubscribeError> {
-    subscribe::<SubscribableCallbackConsumer, _>(driver_number, subscribe_number, callback)
-}
-
-struct SubscribableCallbackConsumer;
-
-impl<CB: SubscribableCallback> Consumer<CB> for SubscribableCallbackConsumer {
-    fn consume(data: &mut CB, arg1: usize, arg2: usize, arg3: usize) {
-        data.call_rust(arg1, arg2, arg3);
-    }
-}
-
 pub fn subscribe<C: Consumer<T>, T>(
     driver_number: usize,
     subscribe_number: usize,
diff --git a/src/timer.rs b/src/timer.rs
index 7319109..946c6e5 100644
--- a/src/timer.rs
+++ b/src/timer.rs
@@ -1,7 +1,7 @@
 //! Async timer driver. Can be used for (non-busy)  sleeping.
 
 use crate::callback::CallbackSubscription;
-use crate::callback::SubscribableCallback;
+use crate::callback::Consumer;
 use crate::futures;
 use crate::result::OtherError;
 use crate::result::TockError;
@@ -33,12 +33,14 @@
     phantom: PhantomData<&'a mut ()>,
 }
 
-impl<CB: FnMut(ClockValue, Alarm)> SubscribableCallback for WithCallback<'_, CB> {
-    fn call_rust(&mut self, clock_value: usize, alarm_id: usize, _: usize) {
-        (self.callback)(
+struct TimerEventConsumer;
+
+impl<CB: FnMut(ClockValue, Alarm)> Consumer<WithCallback<'_, CB>> for TimerEventConsumer {
+    fn consume(data: &mut WithCallback<CB>, clock_value: usize, alarm_id: usize, _: usize) {
+        (data.callback)(
             ClockValue {
                 num_ticks: clock_value as isize,
-                clock_frequency: self.clock_frequency,
+                clock_frequency: data.clock_frequency,
             },
             Alarm { alarm_id },
         );
@@ -61,8 +63,11 @@
             hz: clock_frequency,
         };
 
-        let subscription =
-            syscalls::subscribe_cb(DRIVER_NUMBER, subscribe_nr::SUBSCRIBE_CALLBACK, self)?;
+        let subscription = syscalls::subscribe::<TimerEventConsumer, _>(
+            DRIVER_NUMBER,
+            subscribe_nr::SUBSCRIBE_CALLBACK,
+            self,
+        )?;
 
         Ok(Timer {
             num_notifications,
@@ -331,8 +336,10 @@
 
 struct Callback;
 
-impl SubscribableCallback for Callback {
-    fn call_rust(&mut self, _: usize, _: usize, _: usize) {}
+struct ParallelTimerConsumer;
+
+impl<'a> Consumer<Callback> for ParallelTimerConsumer {
+    fn consume(_: &mut Callback, _: usize, _: usize, _: usize) {}
 }
 
 /// Activated time driver. Updates current time in the context and manages
@@ -358,7 +365,7 @@
     /// Activate the timer driver, will return a ParallelSleepDriver which
     /// can used to sleep.
     pub fn activate(&'a mut self) -> TockResult<ParallelSleepDriver<'a>> {
-        let subscription = syscalls::subscribe_cb(
+        let subscription = syscalls::subscribe::<ParallelTimerConsumer, _>(
             DRIVER_NUMBER,
             subscribe_nr::SUBSCRIBE_CALLBACK,
             &mut self.callback,