#define USE_VCHIQ_ARM
 #include "interface/vchi/vchi.h"
 
-/* maximum number of components supported */
-#define VCHIQ_MMAL_MAX_COMPONENTS 4
+/*
+ * maximum number of components supported.
+ * This matches the maximum permitted by default on the VPU
+ */
+#define VCHIQ_MMAL_MAX_COMPONENTS 64
 
 /*#define FULL_MSG_DUMP 1*/
 
        /* protect accesses to context_map */
        struct mutex context_map_lock;
 
-       /* component to use next */
-       int component_idx;
        struct vchiq_mmal_component component[VCHIQ_MMAL_MAX_COMPONENTS];
 
        /* ordered workqueue to process all bulk operations */
 {
        int ret;
        int idx;                /* port index */
-       struct vchiq_mmal_component *component;
+       struct vchiq_mmal_component *component = NULL;
 
        if (mutex_lock_interruptible(&instance->vchiq_mutex))
                return -EINTR;
 
-       if (instance->component_idx == VCHIQ_MMAL_MAX_COMPONENTS) {
+       for (idx = 0; idx < VCHIQ_MMAL_MAX_COMPONENTS; idx++) {
+               if (!instance->component[idx].in_use) {
+                       component = &instance->component[idx];
+                       component->in_use = 1;
+                       break;
+               }
+       }
+
+       if (!component) {
                ret = -EINVAL;  /* todo is this correct error? */
                goto unlock;
        }
 
-       component = &instance->component[instance->component_idx];
-
        ret = create_component(instance, component, name);
        if (ret < 0) {
                pr_err("%s: failed to create component %d (Not enough GPU mem?)\n",
                        goto release_component;
        }
 
-       instance->component_idx++;
-
        *component_out = component;
 
        mutex_unlock(&instance->vchiq_mutex);
 release_component:
        destroy_component(instance, component);
 unlock:
+       if (component)
+               component->in_use = 0;
        mutex_unlock(&instance->vchiq_mutex);
 
        return ret;
 
        ret = destroy_component(instance, component);
 
+       component->in_use = 0;
+
        mutex_unlock(&instance->vchiq_mutex);
 
        return ret;