[devmgr] composite device part 3

Change-Id: I55f8ba240d36a2553e80e68bbc842e0c2fb344f4
diff --git a/system/core/devmgr/devmgr-binding.c b/system/core/devmgr/devmgr-binding.c
index a3eb1a3..409d4b3 100644
--- a/system/core/devmgr/devmgr-binding.c
+++ b/system/core/devmgr/devmgr-binding.c
@@ -150,7 +150,7 @@
     ctx.binding = binding->bindings;
     ctx.binding_size = binding->bindcount * sizeof(zx_bind_inst_t);
     ctx.name = "dependency";
-    ctx.autobind = 1;
+    ctx.autobind = 0;
     return is_bindable(&ctx);
 }
 
diff --git a/system/core/devmgr/devmgr-coordinator.c b/system/core/devmgr/devmgr-coordinator.c
index 6b458a0..cc8e675 100644
--- a/system/core/devmgr/devmgr-coordinator.c
+++ b/system/core/devmgr/devmgr-coordinator.c
@@ -386,7 +386,8 @@
         device_t* dev = containerof(work, device_t, work);
         dc_handle_new_device(dev);
         // check if the new device satisfied any pending composite devices
-        list_for_every_entry(&list_devices_pending, dev, device_t, anode) {
+        device_t* temp;
+        list_for_every_entry_safe(&list_devices_pending, dev, temp, device_t, anode) {
             dc_handle_new_composite_device(dev);
         }
         break;
@@ -696,7 +697,9 @@
         dev->deps = deps;
         src = data + msg->datalen + sizeof(uint32_t);
         for (i = 0; i < dep_count; i++) {
-            memcpy(&deps->bindcount, src, sizeof(uint32_t));
+            len = sizeof(uint32_t);
+            memcpy(&deps->bindcount, src, len);
+            src += len;
             deps->bindings = (zx_bind_inst_t*)dst;
             len = deps->bindcount * sizeof(zx_bind_inst_t);
             memcpy(dst, src, len);
@@ -1452,10 +1455,12 @@
         device_t* other;
         satisfied = false;
         list_for_every_entry(&list_devices, other, device_t, anode) {
-            if (dc_is_bindable(&dev->deps[i], other->protocol_id,
+            if (other->protocol_id == ZX_PROTOCOL_I2C_BUS) {
+                //printf("devcoord: dev='%s' satisfies dependency %u for dev='%s'?\n",
+                //       other->name, i, dev->name);
+            }
+            if (dc_is_bindable(dev->deps + i, other->protocol_id,
                                other->props, other->prop_count)) {
-                log(SPEW, "devcoord: dev='%s' satisfies dependency %u for dev='%s'\n",
-                    other->name, i, dev->name);
                 satisfied = true;
             }
         }
@@ -1464,6 +1469,13 @@
         }
     }
     printf("devcoord: dependencies for dev='%s' satisfied %d\n", dev->name, satisfied);
+    if (satisfied) {
+        list_delete(&dev->anode);
+        list_add_tail(&list_devices, &dev->anode);
+        devfs_advertise(dev);
+        dc_notify(dev, DEVMGR_OP_DEVICE_ADDED);
+        dc_handle_new_device(dev);
+    }
 }
 
 // device binding program that pure (parentless)
diff --git a/system/dev/bus/acpi/bus-acpi.c b/system/dev/bus/acpi/bus-acpi.c
index 520d568..0f36c75 100644
--- a/system/dev/bus/acpi/bus-acpi.c
+++ b/system/dev/bus/acpi/bus-acpi.c
@@ -556,14 +556,12 @@
     }
 
     // BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_I2C_BUS)
-    binding->bindings[0].op = BINDINST_CC(COND_NE) | BINDINST_OP(OP_ABORT) |
-                              BINDINST_PB(BIND_PROTOCOL);
+    binding->bindings[0].op = (COND_NE << 28) | (OP_ABORT << 24) | BINDINST_PB(BIND_PROTOCOL);
     binding->bindings[0].arg = ZX_PROTOCOL_I2C_BUS;
 
     // BI_MATCH_IF(NE, BIND_PCI_BDF_ADDR, <b:d.f>)
     // TODO Only support a single PCI bus for now
-    binding->bindings[1].op = BINDINST_CC(COND_EQ) | BINDINST_OP(OP_MATCH) |
-                              BINDINST_PB(BIND_PCI_BDF_ADDR);
+    binding->bindings[1].op = (COND_EQ << 28) | (OP_MATCH << 24) | BINDINST_PB(BIND_PCI_BDF_ADDR);
     binding->bindings[1].arg = BIND_PCI_BDF_PACK(0, (addr >> 16), (addr & 0xffff));
 
     binding->bindcount = 2;
diff --git a/system/ulib/ddk/include/ddk/protodefs.h b/system/ulib/ddk/include/ddk/protodefs.h
index 784e6eb..15a7461 100644
--- a/system/ulib/ddk/include/ddk/protodefs.h
+++ b/system/ulib/ddk/include/ddk/protodefs.h
@@ -53,6 +53,7 @@
 DDK_PROTOCOL_DEF(TEST,           'pTST', "test", 0)
 DDK_PROTOCOL_DEF(PLATFORM_BUS,   'pPBU', "platform-bus", 0)
 DDK_PROTOCOL_DEF(PLATFORM_DEV,   'pPDV', "platform-dev", 0)
+// TODO different than I2C to not conflict with platform-bus work for now
 DDK_PROTOCOL_DEF(I2C_BUS,        'pI2B', "i2c-bus", 0)
 DDK_PROTOCOL_DEF(I2C_HID,        'pIHD', "i2c-hid", 0)
 // Protocol definition at garnet/magma/src/magma_util/platform/zircon/zircon_platform_ioctl.h