libsel4platsupport: Update 'new_io_ops'

This commit updates the 'new_io_ops' function in regards to the addition
of the IRQ interfaces in the I/O ops interface. An additional call has
been added to initialise the IRQ interface with the I/O mapper and
malloc interface. Also add in clean-up functionality when some of the
interfaces fail to initialise.
diff --git a/libsel4platsupport/include/sel4platsupport/io.h b/libsel4platsupport/include/sel4platsupport/io.h
index e947030..34fc824 100644
--- a/libsel4platsupport/include/sel4platsupport/io.h
+++ b/libsel4platsupport/include/sel4platsupport/io.h
@@ -16,6 +16,7 @@
 #include <vspace/vspace.h>
 #include <platsupport/io.h>
 #include <simple/simple.h>
+#include <sel4platsupport/irq.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -67,11 +68,12 @@
  *
  * @param vspace VSpace interface to use for mapping
  * @param vka VKA interface for allocating physical frames, and any extra objects or cslots
+ * @param simple A simple interface to access init caps from
  * @param io_ops Interface to fill in
  *
  * @return returns 0 on success
  */
-int sel4platsupport_new_io_ops(vspace_t *vspace, vka_t *vka, ps_io_ops_t *io_ops);
+int sel4platsupport_new_io_ops(vspace_t *vspace, vka_t *vka, simple_t *simple, ps_io_ops_t *io_ops);
 
 /* Initialise all arch-specific io ops for this platform
  *
diff --git a/libsel4platsupport/src/io.c b/libsel4platsupport/src/io.c
index 52b6944..bb0b0d3 100644
--- a/libsel4platsupport/src/io.c
+++ b/libsel4platsupport/src/io.c
@@ -344,23 +344,39 @@
 #endif
 }
 
-int sel4platsupport_new_io_ops(vspace_t *vspace, vka_t *vka, ps_io_ops_t *io_ops)
+int sel4platsupport_new_io_ops(vspace_t *vspace, vka_t *vka, simple_t *simple, ps_io_ops_t *io_ops)
 {
     memset(io_ops, 0, sizeof(ps_io_ops_t));
 
-    int err = sel4platsupport_new_io_mapper(vspace, vka, &io_ops->io_mapper);
-    if (err) {
-        return err;
+    int error = 0;
+
+    /* Initialise the interfaces which do not require memory allocation/need to be initialised first */
+    error = sel4platsupport_new_malloc_ops(&io_ops->malloc_ops)
+#ifdef ARCH_ARM
+            || clock_sys_init(io_ops, &io_ops->clock_sys)
+#ifdef CONFIG_PLAT_TK1
+            || gpio_sys_init(io_ops, &gpio_sys)
+#endif
+            || mux_sys_init(io_ops, get_mux_dependencies(), &io_ops->mux_sys)
+#endif
+            ;
+    if (error) {
+        return error;
     }
 
-#ifdef ARCH_ARM
-    clock_sys_init(io_ops, &io_ops->clock_sys);
-#ifdef CONFIG_PLAT_TK1
-    gpio_sys_init(io_ops, &gpio_sys);
-#endif
-    mux_sys_init(io_ops, get_mux_dependencies(), &io_ops->mux_sys);
-#endif
+    /* Now allocate the IO-specific interfaces (the ones that can be found in this file) */
+    error = sel4platsupport_new_io_mapper(vspace, vka, &io_ops->io_mapper);
+    if (error) {
+        return error;
+    }
 
-    sel4platsupport_new_malloc_ops(&io_ops->malloc_ops);
-    return err;
+    error = sel4platsupport_new_irq_ops(&io_ops->irq_ops, vka, simple, DEFAULT_IRQ_INTERFACE_CONFIG,
+                                        &io_ops->malloc_ops);
+    if (error) {
+        free(io_ops->io_mapper.cookie);
+        io_ops->io_mapper.cookie = NULL;
+        return error;
+    }
+
+    return 0;
 }