Restore mutability of references
diff --git a/examples/ble_scanning.rs b/examples/ble_scanning.rs
index 8a871e8..8ee5567 100644
--- a/examples/ble_scanning.rs
+++ b/examples/ble_scanning.rs
@@ -18,7 +18,7 @@
 #[libtock::main]
 async fn main() -> TockResult<()> {
     let Hardware {
-        mut led_driver,
+        led_driver,
         mut ble_scanning_driver,
         ..
     } = libtock::retrieve_hardware()?;
@@ -35,7 +35,7 @@
             .and_then(|msg| {
                 led_driver
                     .get(msg.nr as usize)
-                    .map(|mut led| led.set_state(msg.st))
+                    .map(|led| led.set_state(msg.st))
             });
     });
 
diff --git a/examples/blink.rs b/examples/blink.rs
index 649a1bd..b18bf20 100644
--- a/examples/blink.rs
+++ b/examples/blink.rs
@@ -7,7 +7,7 @@
 #[libtock::main]
 async fn main() -> TockResult<()> {
     let Hardware {
-        mut led_driver,
+        led_driver,
         timer_context,
         ..
     } = libtock::retrieve_hardware()?;
@@ -19,7 +19,7 @@
     // to the number of LEDs on the board.
     let mut count: usize = 0;
     loop {
-        for mut led in led_driver.all() {
+        for led in led_driver.all() {
             let i = led.number();
             if count & (1 << i) == (1 << i) {
                 led.on()?;
diff --git a/examples/blink_random.rs b/examples/blink_random.rs
index 3fc2d2d..9817282 100644
--- a/examples/blink_random.rs
+++ b/examples/blink_random.rs
@@ -37,7 +37,7 @@
 // Takes the 4 least-significant bits of x, and turn the 4 leds on/off accordingly.
 fn blink_nibble(x: u8, led_driver: &mut LedDriver) -> TockResult<()> {
     for i in 0..4 {
-        let mut led = led_driver.get(i).unwrap();
+        let led = led_driver.get(i).unwrap();
         if (x >> i) & 1 != 0 {
             led.on()?;
         } else {
diff --git a/examples/button_leds.rs b/examples/button_leds.rs
index bdf18ba..8739e9f 100644
--- a/examples/button_leds.rs
+++ b/examples/button_leds.rs
@@ -8,7 +8,7 @@
 #[libtock::main]
 async fn main() -> TockResult<()> {
     let Hardware {
-        mut led_driver,
+        led_driver,
         button_driver,
         ..
     } = libtock::retrieve_hardware()?;
diff --git a/examples/gpio.rs b/examples/gpio.rs
index 4de6085..6fc8f6c 100644
--- a/examples/gpio.rs
+++ b/examples/gpio.rs
@@ -9,11 +9,11 @@
 async fn main() -> TockResult<()> {
     let Hardware {
         timer_context,
-        mut gpio_driver,
+        gpio_driver,
         ..
     } = libtock::retrieve_hardware()?;
     let pin = gpio_driver.pin(0)?;
-    let mut pin = pin.open_for_write()?;
+    let pin = pin.open_for_write()?;
     let mut driver = timer_context.create_timer_driver();
     let timer_driver = driver.activate()?;
 
diff --git a/examples/gpio_read.rs b/examples/gpio_read.rs
index f3e6a8c..a4c9587 100644
--- a/examples/gpio_read.rs
+++ b/examples/gpio_read.rs
@@ -1,7 +1,6 @@
 #![no_std]
 
 use core::fmt::Write;
-use libtock::gpio::GpioPinUnitialized;
 use libtock::gpio::InputMode;
 use libtock::result::TockResult;
 use libtock::timer::Duration;
@@ -13,10 +12,11 @@
     let Hardware {
         console_driver,
         timer_context,
+        gpio_driver,
         ..
     } = libtock::retrieve_hardware()?;
     let mut console = console_driver.create_console();
-    let pin = GpioPinUnitialized::new(0);
+    let pin = gpio_driver.pin(0)?;
     let pin = pin.open_for_read(None, InputMode::PullDown)?;
     let mut driver = timer_context.create_timer_driver();
     let timer_driver = driver.activate()?;
diff --git a/examples/hardware_test.rs b/examples/hardware_test.rs
index f9c4c04..b33681c 100644
--- a/examples/hardware_test.rs
+++ b/examples/hardware_test.rs
@@ -38,7 +38,7 @@
 async fn main() -> TockResult<()> {
     let Hardware {
         console_driver,
-        mut gpio_driver,
+        gpio_driver,
         mut timer_context,
         ..
     } = libtock::retrieve_hardware()?;
diff --git a/examples/seven_segment.rs b/examples/seven_segment.rs
index d6b913a..9125f2f 100644
--- a/examples/seven_segment.rs
+++ b/examples/seven_segment.rs
@@ -1,7 +1,6 @@
 #![no_std]
 
 use libtock::electronics::ShiftRegister;
-use libtock::gpio::GpioPinUnitialized;
 use libtock::result::TockResult;
 use libtock::timer::Duration;
 use libtock::Hardware;
@@ -25,11 +24,15 @@
 // Example works on a shift register on P0.03, P0.04, P0.28
 #[libtock::main]
 async fn main() -> TockResult<()> {
-    let Hardware { timer_context, .. } = libtock::retrieve_hardware()?;
+    let Hardware {
+        timer_context,
+        gpio_driver,
+        ..
+    } = libtock::retrieve_hardware()?;
     let mut shift_register = ShiftRegister::new(
-        GpioPinUnitialized::new(0).open_for_write()?,
-        GpioPinUnitialized::new(1).open_for_write()?,
-        GpioPinUnitialized::new(2).open_for_write()?,
+        gpio_driver.pin(0)?.open_for_write()?,
+        gpio_driver.pin(1)?.open_for_write()?,
+        gpio_driver.pin(2)?.open_for_write()?,
     );
 
     let mut driver = timer_context.create_timer_driver();
diff --git a/examples/simple_ble.rs b/examples/simple_ble.rs
index 7dadd96..a0bd16c 100644
--- a/examples/simple_ble.rs
+++ b/examples/simple_ble.rs
@@ -17,13 +17,13 @@
 #[libtock::main]
 async fn main() -> TockResult<()> {
     let Hardware {
-        mut led_driver,
+        led_driver,
         timer_context,
         mut ble_advertising_driver,
         ..
     } = libtock::retrieve_hardware()?;
 
-    let mut led = led_driver.get(0).unwrap();
+    let led = led_driver.get(0).unwrap();
 
     let uuid: [u8; 2] = [0x00, 0x18];
 
diff --git a/examples/timer_parallel.rs b/examples/timer_parallel.rs
index e0b42c9..e379df3 100644
--- a/examples/timer_parallel.rs
+++ b/examples/timer_parallel.rs
@@ -22,7 +22,7 @@
 #[libtock::main]
 async fn main() -> TockResult<()> {
     let Hardware {
-        mut led_driver,
+        led_driver,
         timer_context,
         ..
     } = libtock::retrieve_hardware()?;
diff --git a/src/gpio.rs b/src/gpio.rs
index e8e0373..c42b43d 100644
--- a/src/gpio.rs
+++ b/src/gpio.rs
@@ -27,7 +27,7 @@
 }
 
 impl GpioDriver {
-    pub fn all_pins<'a>(&'a mut self) -> TockResult<GpioIter<'a>> {
+    pub fn all_pins<'a>(&'a self) -> TockResult<GpioIter<'a>> {
         let number = self.number_of_pins()?;
         Ok(GpioIter {
             curr_gpio: 0,
@@ -36,7 +36,7 @@
         })
     }
 
-    pub fn pin<'a>(&'a mut self, pin: usize) -> TockResult<GpioPinUnitialized<'a>> {
+    pub fn pin<'a>(&'a self, pin: usize) -> TockResult<GpioPinUnitialized<'a>> {
         let number = self.number_of_pins()?;
         if pin < number {
             Ok(GpioPinUnitialized {
@@ -125,13 +125,6 @@
 }
 
 impl<'a> GpioPinUnitialized<'a> {
-    pub fn new(number: usize) -> GpioPinUnitialized<'a> {
-        GpioPinUnitialized {
-            number,
-            phantom: PhantomData,
-        }
-    }
-
     pub fn open_for_write(self) -> TockResult<GpioPinWrite<'a>> {
         syscalls::command(DRIVER_NUMBER, command_nr::ENABLE_OUTPUT, self.number, 0)?;
         Ok(GpioPinWrite {
@@ -189,15 +182,15 @@
 }
 
 impl<'a> GpioPinWrite<'a> {
-    pub fn set_low(&mut self) -> TockResult<()> {
+    pub fn set_low(&self) -> TockResult<()> {
         syscalls::command(DRIVER_NUMBER, command_nr::SET_LOW, self.number, 0)?;
         Ok(())
     }
-    pub fn set_high(&mut self) -> TockResult<()> {
+    pub fn set_high(&self) -> TockResult<()> {
         syscalls::command(DRIVER_NUMBER, command_nr::SET_HIGH, self.number, 0)?;
         Ok(())
     }
-    pub fn toggle(&mut self) -> TockResult<()> {
+    pub fn toggle(&self) -> TockResult<()> {
         syscalls::command(DRIVER_NUMBER, command_nr::TOGGLE, self.number, 0)?;
         Ok(())
     }
diff --git a/src/lang_items.rs b/src/lang_items.rs
index b43b43f..58d1de3 100644
--- a/src/lang_items.rs
+++ b/src/lang_items.rs
@@ -47,7 +47,7 @@
     // Flash all LEDs (if available).
     executor::block_on(async {
         let Hardware {
-            mut led_driver,
+            led_driver,
             timer_context,
             ..
         } = crate::retrieve_hardware_unsafe();
@@ -55,13 +55,13 @@
         let timer_driver = driver.activate().ok();
 
         loop {
-            for mut led in led_driver.all() {
+            for led in led_driver.all() {
                 let _ = led.on();
             }
             if let Some(ref timer_driver) = timer_driver {
                 let _ = timer_driver.sleep(Duration::from_ms(100)).await;
             }
-            for mut led in led_driver.all() {
+            for led in led_driver.all() {
                 let _ = led.off();
             }
             if let Some(ref timer_driver) = timer_driver {
@@ -77,7 +77,7 @@
 unsafe fn cycle_leds(_: Layout) -> ! {
     executor::block_on(async {
         let Hardware {
-            mut led_driver,
+            led_driver,
             timer_context,
             ..
         } = crate::retrieve_hardware_unsafe();
@@ -85,13 +85,13 @@
         let timer_driver = driver.activate().ok();
 
         loop {
-            for mut led in led_driver.all() {
+            for led in led_driver.all() {
                 let _ = led.on();
             }
             if let Some(ref timer_driver) = timer_driver {
                 let _ = timer_driver.sleep(Duration::from_ms(100)).await;
             }
-            for mut led in led_driver.all() {
+            for led in led_driver.all() {
                 let _ = led.off();
             }
             if let Some(ref timer_driver) = timer_driver {
diff --git a/src/led.rs b/src/led.rs
index ae2a2d4..b8c669a 100644
--- a/src/led.rs
+++ b/src/led.rs
@@ -21,7 +21,7 @@
 }
 
 impl LedDriver {
-    pub fn get(&mut self, led_num: usize) -> Option<Led> {
+    pub fn get(&self, led_num: usize) -> Option<Led> {
         if led_num < self.count().ok().unwrap() {
             Some(Led {
                 led_num,
@@ -36,7 +36,7 @@
         command(DRIVER_NUMBER, command_nr::COUNT, 0, 0).map_err(Into::into)
     }
 
-    pub fn all(&mut self) -> LedIter {
+    pub fn all(&self) -> LedIter {
         LedIter {
             curr_led: 0,
             led_count: self.count().unwrap_or(0),
@@ -49,7 +49,7 @@
 /// present, the iterator will be empty.
 
 impl<'a> Led<'a> {
-    pub fn set_state(&mut self, state: bool) -> TockResult<()> {
+    pub fn set_state(&self, state: bool) -> TockResult<()> {
         if state {
             self.on()
         } else {
@@ -57,17 +57,17 @@
         }
     }
 
-    pub fn on(&mut self) -> TockResult<()> {
+    pub fn on(&self) -> TockResult<()> {
         command(DRIVER_NUMBER, command_nr::ON, self.led_num, 0)?;
         Ok(())
     }
 
-    pub fn off(&mut self) -> TockResult<()> {
+    pub fn off(&self) -> TockResult<()> {
         command(DRIVER_NUMBER, command_nr::OFF, self.led_num, 0)?;
         Ok(())
     }
 
-    pub fn toggle(&mut self) -> TockResult<()> {
+    pub fn toggle(&self) -> TockResult<()> {
         command(DRIVER_NUMBER, command_nr::TOGGLE, self.led_num, 0)?;
         Ok(())
     }