[dev][platform-bus] Remove support for proxying custom protocols

Now that platform bus is proxying the Sysmem and Amlogic Canvas protocols,
this support is no longer needed.

This is another step toward integrating composite device support
into the platform bus.

Bug: ZX-3746

TEST: astro boots into full UI.

Change-Id: Ibee574d2d36ac53134820f16486d28d2fcae5828
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index b80bbe1..aa4b0b4 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -78,7 +78,6 @@
     "//zircon/public/banjo/ddk-protocol-pciroot:ddk-protocol-pciroot_sdk($banjo_toolchain)",
     "//zircon/public/banjo/ddk-protocol-platform-bus:ddk-protocol-platform-bus_sdk($banjo_toolchain)",
     "//zircon/public/banjo/ddk-protocol-platform-device:ddk-protocol-platform-device_sdk($banjo_toolchain)",
-    "//zircon/public/banjo/ddk-protocol-platform-proxy:ddk-protocol-platform-proxy_sdk($banjo_toolchain)",
     "//zircon/public/banjo/ddk-protocol-rawnand:ddk-protocol-rawnand_sdk($banjo_toolchain)",
     "//zircon/public/banjo/ddk-protocol-scpi:ddk-protocol-scpi_sdk($banjo_toolchain)",
     "//zircon/public/banjo/ddk-protocol-sdhci:ddk-protocol-sdhci_sdk($banjo_toolchain)",
diff --git a/zircon/system/banjo/ddk-protocol-platform-bus/platform-bus.banjo b/zircon/system/banjo/ddk-protocol-platform-bus/platform-bus.banjo
index 9940a55..4381b00 100644
--- a/zircon/system/banjo/ddk-protocol-platform-bus/platform-bus.banjo
+++ b/zircon/system/banjo/ddk-protocol-platform-bus/platform-bus.banjo
@@ -90,9 +90,6 @@
     /// This is only used in cases where children of a platform device also need to access
     /// platform bus resources.
     vector<PbusDev> child;
-    /// Extra protocols to be provided to this platform device and its children.
-    /// These fields are only used for the top level `pbus_dev_t`.
-    vector<uint32> protocol;
 };
 
 /// Subset of pdev_board_info_t to be set by the board driver.
@@ -102,12 +99,6 @@
 };
 
 [Layout = "ddk-callback"]
-interface PlatformProxyCb {
-    Callback(vector<voidptr> req, vector<handle> req_handle) -> (vector<voidptr> resp,
-                                                                 vector<handle> resp_handle);
-};
-
-[Layout = "ddk-callback"]
 interface PbusSysSuspend {
     Callback(uint32 flags) -> (zx.status out_status);
 };
@@ -127,7 +118,7 @@
     ProtocolDeviceAdd(uint32 proto_id, PbusDev dev) -> (zx.status s);
     /// Called by protocol implementation drivers to register their protocol
     /// with the platform bus.
-    RegisterProtocol(uint32 proto_id, vector<voidptr> protocol, PlatformProxyCb proxy_cb)
+    RegisterProtocol(uint32 proto_id, vector<voidptr> protocol)
 -> (zx.status s);
     /// Board drivers may use this to get information about the board, and to
     /// differentiate between multiple boards that they support.
diff --git a/zircon/system/banjo/ddk-protocol-platform-proxy/BUILD.gn b/zircon/system/banjo/ddk-protocol-platform-proxy/BUILD.gn
deleted file mode 100644
index fe72aa3..0000000
--- a/zircon/system/banjo/ddk-protocol-platform-proxy/BUILD.gn
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("$zx/public/gn/banjo.gni")
-
-banjo_library("ddk-protocol-platform-proxy") {
-  sources = [
-    "platform-proxy.banjo",
-  ]
-}
diff --git a/zircon/system/banjo/ddk-protocol-platform-proxy/platform-proxy.banjo b/zircon/system/banjo/ddk-protocol-platform-proxy/platform-proxy.banjo
deleted file mode 100644
index dc135c7..0000000
--- a/zircon/system/banjo/ddk-protocol-platform-proxy/platform-proxy.banjo
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library ddk.protocol.platform.proxy;
-
-using zx;
-
-const uint32 PLATFORM_PROXY_MAX_DATA = 4096;
-
-/// Header for RPC requests.
-struct PlatformProxyReq {
-    uint32 txid;
-    uint32 device_id;
-    uint32 proto_id;
-    uint32 op;
-};
-
-/// Header for RPC responses.
-struct PlatformProxyRsp {
-    uint32 txid;
-    zx.status status;
-};
-
-[Layout = "ddk-protocol"]
-interface PlatformProxy {
-    /// Used by protocol client drivers to register their local protocol implementation
-    /// with the platform proxy driver.
-    RegisterProtocol(uint32 proto_id, vector<voidptr> protocol) -> (zx.status s);
-    /// Used by protocol client drivers to proxy a protocol call to the protocol implementation
-    /// driver in the platform bus driver's devhost.
-    Proxy(vector<voidptr> req, vector<handle> req_handle) -> (zx.status s, vector<voidptr> resp,
-                                                              vector<handle> resp_handle);
-};
diff --git a/zircon/system/dev/board/astro/astro-display.c b/zircon/system/dev/board/astro/astro-display.c
index d7f6d68..a668394 100644
--- a/zircon/system/dev/board/astro/astro-display.c
+++ b/zircon/system/dev/board/astro/astro-display.c
@@ -104,11 +104,6 @@
     },
 };
 
-static const uint32_t display_protocols[] = {
-    ZX_PROTOCOL_SYSMEM,
-    ZX_PROTOCOL_AMLOGIC_CANVAS,
-};
-
 static const pbus_mmio_t dsi_mmios[] = {
     {
         // DSI Host Controller
@@ -144,8 +139,6 @@
     .mmio_count =countof(dsi_mmios),
     .child_list = display_dev,
     .child_count = countof(display_dev),
-    .protocol_list = display_protocols,
-    .protocol_count = countof(display_protocols),
 };
 
 zx_status_t aml_display_init(aml_bus_t* bus) {
diff --git a/zircon/system/dev/board/astro/astro-video.c b/zircon/system/dev/board/astro/astro-video.c
index 0ac315e..9401088d 100644
--- a/zircon/system/dev/board/astro/astro-video.c
+++ b/zircon/system/dev/board/astro/astro-video.c
@@ -63,10 +63,6 @@
     },
 };
 
-static const uint32_t astro_video_protocols[] = {
-    ZX_PROTOCOL_AMLOGIC_CANVAS,
-};
-
 static const pbus_dev_t video_dev = {
     .name = "aml-video",
     .vid = PDEV_VID_AMLOGIC,
@@ -78,8 +74,6 @@
     .bti_count = countof(astro_video_btis),
     .irq_list = astro_video_irqs,
     .irq_count = countof(astro_video_irqs),
-    .protocol_list = astro_video_protocols,
-    .protocol_count = countof(astro_video_protocols),
 };
 
 zx_status_t aml_video_init(aml_bus_t* bus) {
diff --git a/zircon/system/dev/board/hikey960/hikey960-devices.c b/zircon/system/dev/board/hikey960/hikey960-devices.c
index a204350..110cc97 100644
--- a/zircon/system/dev/board/hikey960/hikey960-devices.c
+++ b/zircon/system/dev/board/hikey960/hikey960-devices.c
@@ -57,10 +57,6 @@
     },
 };
 
-static const uint32_t display_protocols[] = {
-    ZX_PROTOCOL_SYSMEM,
-};
-
 static const pbus_mmio_t ufs_mmios[] = {
     {
         .base = MMIO_UFS_CFG_BASE,
@@ -209,8 +205,6 @@
     .gpio_count = countof(display_gpios),
     .bti_list = display_btis,
     .bti_count = countof(display_btis),
-    .protocol_list = display_protocols,
-    .protocol_count = countof(display_protocols),
 };
 
 zx_status_t hikey960_add_devices(hikey960_t* hikey) {
diff --git a/zircon/system/dev/board/hikey960/hikey960.c b/zircon/system/dev/board/hikey960/hikey960.c
index d660277..988869e 100644
--- a/zircon/system/dev/board/hikey960/hikey960.c
+++ b/zircon/system/dev/board/hikey960/hikey960.c
@@ -50,9 +50,8 @@
     if (status != ZX_OK) {
         goto fail;
     }
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
     status = pbus_register_protocol(&hikey->pbus, ZX_PROTOCOL_GPIO_IMPL, &hikey->gpio,
-                                    sizeof(hikey->gpio), &kCallback);
+                                    sizeof(hikey->gpio));
     if (status != ZX_OK) {
         goto fail;
     }
diff --git a/zircon/system/dev/board/mt8167s_ref/mt8167-display.cpp b/zircon/system/dev/board/mt8167s_ref/mt8167-display.cpp
index 6f21a48..9bae7aa 100644
--- a/zircon/system/dev/board/mt8167s_ref/mt8167-display.cpp
+++ b/zircon/system/dev/board/mt8167s_ref/mt8167-display.cpp
@@ -75,9 +75,6 @@
         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
     },
 };
-constexpr uint32_t display_protocols[] = {
-    ZX_PROTOCOL_SYSMEM,
-};
 
 static pbus_dev_t display_dev = []() {
     pbus_dev_t dev = {};
@@ -106,8 +103,6 @@
     dev.mmio_count =countof(dsi_mmios);
     dev.child_list = &display_dev;
     dev.child_count = 1;
-    dev.protocol_list = display_protocols;
-    dev.protocol_count = countof(display_protocols);
     return dev;
 }();
 } // namespace
diff --git a/zircon/system/dev/board/sherlock/sherlock-display.cpp b/zircon/system/dev/board/sherlock/sherlock-display.cpp
index 2ab00d0..b2863fa 100644
--- a/zircon/system/dev/board/sherlock/sherlock-display.cpp
+++ b/zircon/system/dev/board/sherlock/sherlock-display.cpp
@@ -102,11 +102,6 @@
     },
 };
 
-static const uint32_t display_protocols[] = {
-    ZX_PROTOCOL_SYSMEM,
-    ZX_PROTOCOL_AMLOGIC_CANVAS,
-};
-
 constexpr pbus_mmio_t dsi_mmios[] = {
     {
         // DSI Host Controller
@@ -143,8 +138,6 @@
     dev.mmio_count =countof(dsi_mmios);
     dev.child_list = &display_dev;
     dev.child_count = 1;
-    dev.protocol_list = display_protocols;
-    dev.protocol_count = countof(display_protocols);
     return dev;
 }();
 
diff --git a/zircon/system/dev/board/sherlock/sherlock-video.cpp b/zircon/system/dev/board/sherlock/sherlock-video.cpp
index 8c15b5e..ee3d419 100644
--- a/zircon/system/dev/board/sherlock/sherlock-video.cpp
+++ b/zircon/system/dev/board/sherlock/sherlock-video.cpp
@@ -65,10 +65,6 @@
     },
 };
 
-static const uint32_t sherlock_video_protocols[] = {
-    ZX_PROTOCOL_AMLOGIC_CANVAS,
-};
-
 static pbus_dev_t video_dev = []() {
     pbus_dev_t dev;
     dev.name = "aml-video";
@@ -81,8 +77,6 @@
     dev.bti_count = countof(sherlock_video_btis);
     dev.irq_list = sherlock_video_irqs;
     dev.irq_count = countof(sherlock_video_irqs);
-    dev.protocol_list = sherlock_video_protocols;
-    dev.protocol_count = countof(sherlock_video_protocols);
     return dev;
 }();
 
diff --git a/zircon/system/dev/board/test/test/gpio.cpp b/zircon/system/dev/board/test/test/gpio.cpp
index 69e8fe4..490d0d2 100644
--- a/zircon/system/dev/board/test/test/gpio.cpp
+++ b/zircon/system/dev/board/test/test/gpio.cpp
@@ -60,9 +60,7 @@
         .ops = &gpio_impl_protocol_ops_,
         .ctx = this,
     };
-    constexpr platform_proxy_cb_t kCallback = {nullptr, nullptr};
-    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto),
-                                    &kCallback);
+    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "%s pbus_register_protocol failed %d\n", __func__, status);
         return status;
diff --git a/zircon/system/dev/board/vim/vim-display.cpp b/zircon/system/dev/board/vim/vim-display.cpp
index 961ac26..5436718 100644
--- a/zircon/system/dev/board/vim/vim-display.cpp
+++ b/zircon/system/dev/board/vim/vim-display.cpp
@@ -76,11 +76,6 @@
     },
 };
 
-static const uint32_t vim_display_protocols[] = {
-    ZX_PROTOCOL_SYSMEM,
-    ZX_PROTOCOL_AMLOGIC_CANVAS,
-};
-
 zx_status_t Vim::DisplayInit() {
     zx_status_t status;
     pbus_dev_t display_dev = {};
@@ -96,8 +91,6 @@
     display_dev.gpio_count = countof(vim_display_gpios);
     display_dev.bti_list = vim_display_btis;
     display_dev.bti_count = countof(vim_display_btis);
-    display_dev.protocol_list = vim_display_protocols;
-    display_dev.protocol_count = countof(vim_display_protocols);
 
     // enable this #if 0 in order to enable the SPDIF out pin for VIM2 (GPIO H4, pad M22)
 #if 0
diff --git a/zircon/system/dev/board/vim/vim-video.cpp b/zircon/system/dev/board/vim/vim-video.cpp
index cbf9de9..5ae1ee1 100644
--- a/zircon/system/dev/board/vim/vim-video.cpp
+++ b/zircon/system/dev/board/vim/vim-video.cpp
@@ -64,10 +64,6 @@
     },
 };
 
-static const uint32_t vim_video_protocols[] = {
-    ZX_PROTOCOL_AMLOGIC_CANVAS,
-};
-
 zx_status_t Vim::VideoInit() {
     pbus_dev_t video_dev = {};
     video_dev.name = "video";
@@ -80,8 +76,6 @@
     video_dev.irq_count = countof(vim_video_irqs);
     video_dev.bti_list = vim_video_btis;
     video_dev.bti_count = countof(vim_video_btis);
-    video_dev.protocol_list = vim_video_protocols;
-    video_dev.protocol_count = countof(vim_video_protocols);
 
     zx_status_t status;
 
diff --git a/zircon/system/dev/bus/platform/BUILD.gn b/zircon/system/dev/bus/platform/BUILD.gn
index d1d343c..fa4b825 100644
--- a/zircon/system/dev/bus/platform/BUILD.gn
+++ b/zircon/system/dev/bus/platform/BUILD.gn
@@ -28,7 +28,6 @@
     "$zx/system/banjo/ddk-protocol-iommu",
     "$zx/system/banjo/ddk-protocol-platform-bus",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/banjo/ddk-protocol-powerimpl",
     "$zx/system/banjo/ddk-protocol-sysmem",
     "$zx/system/fidl/fuchsia-sysinfo:c",
@@ -44,7 +43,6 @@
 
 driver("platform-bus.proxy") {
   sources = [
-    "platform-proxy-client.cpp",
     "platform-proxy-device.cpp",
     "platform-proxy.cpp",
   ]
@@ -57,7 +55,6 @@
     "$zx/system/banjo/ddk-protocol-i2cimpl",
     "$zx/system/banjo/ddk-protocol-platform-bus",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/banjo/ddk-protocol-powerimpl",
     "$zx/system/banjo/ddk-protocol-sysmem",
     "$zx/system/ulib/ddk",
diff --git a/zircon/system/dev/bus/platform/device-resources.cpp b/zircon/system/dev/bus/platform/device-resources.cpp
index 30379f25..efbac6d 100644
--- a/zircon/system/dev/bus/platform/device-resources.cpp
+++ b/zircon/system/dev/bus/platform/device-resources.cpp
@@ -27,9 +27,6 @@
 namespace platform_bus {
 
 zx_status_t DeviceResources::Init(const pbus_dev_t* pdev, uint32_t* next_index) {
-    if (pdev->protocol_count > PROXY_MAX_PROTOCOLS) {
-        return ZX_ERR_INVALID_ARGS;
-    }
     if (!CopyResources(pdev->mmio_count, pdev->mmio_list, &mmios_) ||
         !CopyResources(pdev->irq_count, pdev->irq_list, &irqs_) ||
         !CopyResources(pdev->gpio_count, pdev->gpio_list, &gpios_) ||
@@ -39,11 +36,7 @@
         !CopyResources(pdev->bti_count, pdev->bti_list, &btis_) ||
         !CopyResources(pdev->smc_count, pdev->smc_list, &smcs_) ||
         !CopyResources(pdev->metadata_count, pdev->metadata_list, &metadata_) ||
-        !CopyResources(pdev->boot_metadata_count, pdev->boot_metadata_list, &boot_metadata_)
-/* Ignore protocol_list for now. We will remove this completely in the next pass.
-         || !CopyResources(pdev->protocol_count, pdev->protocol_list, &protocols_)
-*/
-        ) {
+        !CopyResources(pdev->boot_metadata_count, pdev->boot_metadata_list, &boot_metadata_)) {
         return ZX_ERR_NO_MEMORY;
     }
 
diff --git a/zircon/system/dev/bus/platform/device-resources.h b/zircon/system/dev/bus/platform/device-resources.h
index ffe0651..9d79bc5 100644
--- a/zircon/system/dev/bus/platform/device-resources.h
+++ b/zircon/system/dev/bus/platform/device-resources.h
@@ -45,7 +45,6 @@
     inline const pbus_smc_t& smc(size_t i) const { return smcs_[i]; }
     inline const pbus_metadata_t& metadata(size_t i) const { return metadata_[i]; }
     inline const pbus_boot_metadata_t& boot_metadata(size_t i) const { return boot_metadata_[i]; }
-    inline const uint32_t* protocols() const { return protocols_.begin(); }
 
     // Counts for the above resource lists.
     inline size_t mmio_count() const { return mmios_.size(); }
@@ -59,7 +58,6 @@
     inline size_t metadata_count() const { return metadata_.size(); }
     inline size_t boot_metadata_count() const { return boot_metadata_.size(); }
     inline size_t child_count() const { return children_.size(); }
-    inline size_t protocol_count() const { return protocols_.size(); }
 
 private:
     // Index of this DeviceResources instance in PlatformDevice::device_index_.
@@ -76,7 +74,6 @@
     fbl::Array<pbus_smc_t> smcs_;
     fbl::Array<pbus_metadata_t> metadata_;
     fbl::Array<pbus_boot_metadata_t> boot_metadata_;
-    fbl::Array<uint32_t> protocols_;
 
     // Resources for children of this device.
     fbl::Vector<DeviceResources> children_;
diff --git a/zircon/system/dev/bus/platform/platform-bus.cpp b/zircon/system/dev/bus/platform/platform-bus.cpp
index 417f4d4..1c00f89 100644
--- a/zircon/system/dev/bus/platform/platform-bus.cpp
+++ b/zircon/system/dev/bus/platform/platform-bus.cpp
@@ -31,25 +31,6 @@
 
 namespace platform_bus {
 
-zx_status_t PlatformBus::Proxy(
-    const void* req_buffer, size_t req_size, const zx_handle_t* req_handle_list,
-    size_t req_handle_count, void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-    zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-    size_t* out_resp_handle_actual) {
-
-    auto* req = static_cast<const platform_proxy_req*>(req_buffer);
-    fbl::AutoLock lock(&proto_proxys_mutex_);
-    auto proto_proxy = proto_proxys_.find(req->proto_id);
-    if (!proto_proxy.IsValid()) {
-        return ZX_ERR_NOT_SUPPORTED;
-    }
-
-    proto_proxy->Proxy(req_buffer, req_size, req_handle_list, req_handle_count,
-                       out_resp_buffer, resp_size, out_resp_actual, out_resp_handle_list,
-                       resp_handle_count, out_resp_handle_actual);
-    return ZX_OK;
-}
-
 zx_status_t PlatformBus::IommuGetBti(uint32_t iommu_index, uint32_t bti_id,
                                      zx::bti* out_bti) {
     if (iommu_index != 0) {
@@ -59,24 +40,17 @@
 }
 
 zx_status_t PlatformBus::PBusRegisterProtocol(uint32_t proto_id, const void* protocol,
-                                              size_t protocol_size,
-                                              const platform_proxy_cb_t* proxy_cb) {
+                                              size_t protocol_size) {
     if (!protocol || protocol_size < sizeof(ddk::AnyProtocol)) {
         return ZX_ERR_INVALID_ARGS;
     }
 
     switch (proto_id) {
     case ZX_PROTOCOL_GPIO_IMPL: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         gpio_ = ddk::GpioImplProtocolClient(static_cast<const gpio_impl_protocol_t*>(protocol));
         break;
     }
     case ZX_PROTOCOL_I2C_IMPL: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         auto proto = static_cast<const i2c_impl_protocol_t*>(protocol);
         auto status = I2cInit(proto);
         if (status != ZX_OK) {
@@ -87,64 +61,28 @@
         break;
     }
     case ZX_PROTOCOL_CLOCK: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         clk_ = ddk::ClockProtocolClient(static_cast<const clock_protocol_t*>(protocol));
         break;
     }
     case ZX_PROTOCOL_POWER_IMPL: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         power_ = ddk::PowerImplProtocolClient(static_cast<const power_impl_protocol_t*>(protocol));
         break;
     }
     case ZX_PROTOCOL_IOMMU: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         iommu_ = ddk::IommuProtocolClient(static_cast<const iommu_protocol_t*>(protocol));
         break;
     }
     case ZX_PROTOCOL_SYSMEM: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         sysmem_ = ddk::SysmemProtocolClient(static_cast<const sysmem_protocol_t*>(protocol));
         break;
     }
     case ZX_PROTOCOL_AMLOGIC_CANVAS: {
-        if (proxy_cb->callback != nullptr) {
-            return ZX_ERR_INVALID_ARGS;
-        }
         canvas_ = ddk::AmlogicCanvasProtocolClient(
                                         static_cast<const amlogic_canvas_protocol_t*>(protocol));
         break;
     }
-    default: {
-        if (proxy_cb->callback == nullptr) {
-            return ZX_ERR_NOT_SUPPORTED;
-        }
-
-        fbl::AutoLock lock(&proto_proxys_mutex_);
-        if (proto_proxys_.find(proto_id).IsValid()) {
-            zxlogf(ERROR, "%s: protocol %08x has already been registered\n", __func__, proto_id);
-            return ZX_ERR_BAD_STATE;
-        }
-
-        fbl::AllocChecker ac;
-        auto proxy = fbl::make_unique_checked<ProtoProxy>(&ac, proto_id,
-                                                          static_cast<const ddk::AnyProtocol*>(protocol),
-                                                          *proxy_cb);
-        if (!ac.check()) {
-            return ZX_ERR_NO_MEMORY;
-        }
-
-        proto_proxys_.insert(std::move(proxy));
-        sync_completion_signal(&proto_completion_);
-        return ZX_OK;
-    }
+    default:
+        return ZX_ERR_NOT_SUPPORTED;
     }
 
     fbl::AutoLock lock(&proto_completion_mutex_);
@@ -291,15 +229,6 @@
             return ZX_OK;
         }
         break;
-    default: {
-        fbl::AutoLock lock(&proto_proxys_mutex_);
-        auto proto_proxy = proto_proxys_.find(proto_id);
-        if (!proto_proxy.IsValid()) {
-            return ZX_ERR_NOT_SUPPORTED;
-        }
-        proto_proxy->GetProtocol(out);
-        return ZX_OK;
-    }
     }
 
     return ZX_ERR_NOT_SUPPORTED;
diff --git a/zircon/system/dev/bus/platform/platform-bus.h b/zircon/system/dev/bus/platform/platform-bus.h
index c7ee308..39d65d0 100644
--- a/zircon/system/dev/bus/platform/platform-bus.h
+++ b/zircon/system/dev/bus/platform/platform-bus.h
@@ -15,7 +15,6 @@
 #include <ddktl/protocol/platform/bus.h>
 #include <ddktl/protocol/sysmem.h>
 #include <fbl/array.h>
-#include <fbl/intrusive_wavl_tree.h>
 #include <fbl/mutex.h>
 #include <fbl/unique_ptr.h>
 #include <fbl/vector.h>
@@ -46,12 +45,6 @@
 public:
     static zx_status_t Create(zx_device_t* parent, const char* name, zx::vmo zbi);
 
-    zx_status_t Proxy(
-         const void* req_buffer, size_t req_size, const zx_handle_t* req_handle_list,
-         size_t req_handle_count, void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-         zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-         size_t* out_resp_handle_actual);
-
     // Device protocol implementation.
     zx_status_t DdkGetProtocol(uint32_t proto_id, void* out);
     void DdkRelease();
@@ -59,8 +52,7 @@
     // Platform bus protocol implementation.
     zx_status_t PBusDeviceAdd(const pbus_dev_t* dev);
     zx_status_t PBusProtocolDeviceAdd(uint32_t proto_id, const pbus_dev_t* dev);
-    zx_status_t PBusRegisterProtocol(uint32_t proto_id, const void* protocol, size_t protocol_size,
-                                     const platform_proxy_cb_t* proxy_cb);
+    zx_status_t PBusRegisterProtocol(uint32_t proto_id, const void* protocol, size_t protocol_size);
     zx_status_t PBusGetBoardInfo(pdev_board_info_t* out_info);
     zx_status_t PBusSetBoardInfo(const pbus_board_info_t* info);
 
@@ -94,36 +86,6 @@
 private:
     pbus_sys_suspend_t suspend_cb_ = {};
 
-    // This class is a wrapper for a platform_proxy_cb_t added via pbus_register_protocol().
-    // It also is the element type for the proto_proxys_ WAVL tree.
-    class ProtoProxy : public fbl::WAVLTreeContainable<fbl::unique_ptr<ProtoProxy>> {
-    public:
-        ProtoProxy(uint32_t proto_id, const ddk::AnyProtocol* protocol,
-                   const platform_proxy_cb_t& proxy_cb)
-            : proto_id_(proto_id), protocol_(*protocol), proxy_cb_(proxy_cb) {}
-
-        inline uint32_t GetKey() const { return proto_id_; }
-        inline void GetProtocol(void* out) const { memcpy(out, &protocol_, sizeof(protocol_)); }
-
-        inline void Proxy(const void* req_buffer, size_t req_size,
-                          const zx_handle_t* req_handle_list, size_t req_handle_count,
-                          void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-                          zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-                          size_t* out_resp_handle_actual) {
-            proxy_cb_.callback(proxy_cb_.ctx, req_buffer, req_size,
-                               req_handle_list, req_handle_count,
-                               out_resp_buffer, resp_size, out_resp_actual,
-                               out_resp_handle_list, resp_handle_count,
-                               out_resp_handle_actual);
-        }
-
-    private:
-        const uint32_t proto_id_;
-        const ddk::AnyProtocol protocol_;
-        platform_proxy_cb_t proxy_cb_;
-    };
-
-
     explicit PlatformBus(zx_device_t* parent);
 
     DISALLOW_COPY_ASSIGN_AND_MOVE(PlatformBus);
@@ -159,11 +121,6 @@
 
     // Dummy IOMMU.
     zx::iommu iommu_handle_;
-
-    fbl::WAVLTree<uint32_t, fbl::unique_ptr<ProtoProxy>> proto_proxys_
-                                                __TA_GUARDED(proto_proxys_mutex_);
-    // Protects proto_proxys_.
-    fbl::Mutex proto_proxys_mutex_;
 };
 
 } // namespace platform_bus
diff --git a/zircon/system/dev/bus/platform/platform-device.cpp b/zircon/system/dev/bus/platform/platform-device.cpp
index d20c63c..907fcac 100644
--- a/zircon/system/dev/bus/platform/platform-device.cpp
+++ b/zircon/system/dev/bus/platform/platform-device.cpp
@@ -242,14 +242,6 @@
     }
 }
 
-zx_status_t PlatformDevice::RpcGetProtocols(const DeviceResources* dr, uint32_t* out_protocols,
-                                            uint32_t* out_protocol_count) {
-    auto count = dr->protocol_count();
-    memcpy(out_protocols, dr->protocols(), count * sizeof(*out_protocols));
-    *out_protocol_count = static_cast<uint32_t>(count);
-    return ZX_OK;
-}
-
 zx_status_t PlatformDevice::RpcGpioConfigIn(const DeviceResources* dr, uint32_t index, uint32_t flags) {
     if (bus_->gpio() == nullptr) {
         return ZX_ERR_NOT_SUPPORTED;
@@ -530,12 +522,6 @@
             resp_len += resp->pdev.metadata_length;
             break;
         }
-        case PDEV_GET_PROTOCOLS: {
-            auto protos = reinterpret_cast<uint32_t*>(&resp[1]);
-            status = RpcGetProtocols(dr, protos, &resp->protocol_count);
-            resp_len += static_cast<uint32_t>(resp->protocol_count * sizeof(*protos));
-            break;
-        }
         default:
             zxlogf(ERROR, "%s: unknown pdev op %u\n", __func__, req_header->op);
             return ZX_ERR_INTERNAL;
@@ -705,16 +691,9 @@
         }
         break;
     }
-    default: {
-        size_t resp_actual = 0;
-        size_t resp_handle_actual = 0;
-        status = bus_->Proxy(req_header, actual, req_handles, req_handle_count, resp_header,
-                             sizeof(resp_buf), &resp_actual, resp_handles,
-                             fbl::count_of(resp_handles), &resp_handle_actual);
-        resp_len = static_cast<uint32_t>(resp_actual);
-        resp_handle_count = static_cast<uint32_t>(resp_handle_actual);
-        break;
-    }
+    default:
+        zxlogf(ERROR, "%s: unknown protocol %u\n", __func__, req_header->proto_id);
+        return ZX_ERR_INTERNAL;
     }
 
     // set op to match request so zx_channel_write will return our response
@@ -753,20 +732,13 @@
     }
 
     zx_status_t status;
-    if (dr->protocol_count() > 0) {
-        // PlatformDevice::Start with protocols
-        status = DdkAdd(name, device_add_flags, nullptr, 0, ZX_PROTOCOL_PLATFORM_PROXY, argstr);
-    } else {
     zx_device_prop_t props[] = {
-            {BIND_PLATFORM_DEV_VID, 0, vid_},
-            {BIND_PLATFORM_DEV_PID, 0, pid_},
-            {BIND_PLATFORM_DEV_DID, 0, did_},
-        };
+        {BIND_PLATFORM_DEV_VID, 0, vid_},
+        {BIND_PLATFORM_DEV_PID, 0, pid_},
+        {BIND_PLATFORM_DEV_DID, 0, did_},
+    };
 
-        status = DdkAdd(name, device_add_flags, props, fbl::count_of(props),
-                        ZX_PROTOCOL_PDEV, argstr);
-    }
-
+    status = DdkAdd(name, device_add_flags, props, fbl::count_of(props), ZX_PROTOCOL_PDEV, argstr);
     if (status != ZX_OK) {
         return status;
     }
diff --git a/zircon/system/dev/bus/platform/platform-device.h b/zircon/system/dev/bus/platform/platform-device.h
index 89f2942..7e5b5c6 100644
--- a/zircon/system/dev/bus/platform/platform-device.h
+++ b/zircon/system/dev/bus/platform/platform-device.h
@@ -71,8 +71,6 @@
     zx_status_t RpcDeviceAdd(const DeviceResources* dr, uint32_t index, uint32_t* out_device_id);
     zx_status_t RpcGetMetadata(const DeviceResources* dr, uint32_t index, uint32_t* out_type,
                                uint8_t* buf, uint32_t buf_size, uint32_t* actual);
-    zx_status_t RpcGetProtocols(const DeviceResources* dr, uint32_t* out_protocols,
-                                uint32_t* out_protocol_count);
     zx_status_t RpcGpioConfigIn(const DeviceResources* dr, uint32_t index, uint32_t flags);
     zx_status_t RpcGpioConfigOut(const DeviceResources* dr, uint32_t index, uint8_t initial_value);
     zx_status_t RpcGpioSetAltFunction(const DeviceResources* dr, uint32_t index, uint64_t function);
diff --git a/zircon/system/dev/bus/platform/platform-proxy-client.cpp b/zircon/system/dev/bus/platform/platform-proxy-client.cpp
deleted file mode 100644
index 2f30baa..0000000
--- a/zircon/system/dev/bus/platform/platform-proxy-client.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "platform-proxy-client.h"
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <threads.h>
-
-#include <ddk/binding.h>
-#include <ddk/debug.h>
-#include <ddk/device.h>
-#include <ddk/driver.h>
-#include <fbl/algorithm.h>
-#include <fbl/unique_ptr.h>
-
-#include "platform-proxy.h"
-
-namespace platform_bus {
-
-zx_status_t ProxyClient::Create(uint32_t proto_id, zx_device_t* parent,
-                                fbl::RefPtr<PlatformProxy> proxy) {
-    fbl::AllocChecker ac;
-    auto client = fbl::make_unique_checked<ProxyClient>(&ac, proto_id, parent, proxy);
-    if (!ac.check()) {
-        return ZX_ERR_NO_MEMORY;
-    }
-
-    char name[ZX_DEVICE_NAME_MAX];
-    snprintf(name, sizeof(name), "ProxyClient[%08x]", proto_id);
-
-    zx_device_prop_t props[] = {
-        {BIND_PLATFORM_PROTO, 0, proto_id},
-    };
-
-    auto status = client->DdkAdd(name, 0, props, fbl::count_of(props));
-    if (status != ZX_OK) {
-        return status;
-    }
-
-    // devmgr is now in charge of the device.
-    __UNUSED auto* dummy = client.release();
-    return ZX_OK;
-}
-
-void ProxyClient::DdkRelease() {
-    proxy_->UnregisterProtocol(proto_id_);
-    delete this;
-}
-
-zx_status_t ProxyClient::PlatformProxyRegisterProtocol(uint32_t proto_id, const void* protocol,
-                                                       size_t protocol_size) {
-    if (proto_id != proto_id_) {
-        // We may allow drivers to implement multiple protocols in the future,
-        // but for now require that the driver only proxy the one protocol we loaded it for.
-        return ZX_ERR_ACCESS_DENIED;
-    }
-    return proxy_->RegisterProtocol(proto_id, protocol);
-
-}
-
-zx_status_t ProxyClient::PlatformProxyProxy(
-    const void* req_buffer, size_t req_size, const zx_handle_t* req_handle_list,
-    size_t req_handle_count, void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-    zx_handle_t* out_resp_handle_list, size_t resp_handle_count, size_t* out_resp_handle_actual) {
-
-    auto* req = static_cast<const platform_proxy_req*>(req_buffer);
-    if (req->proto_id != proto_id_) {
-        // We may allow drivers to implement multiple protocols in the future,
-        // but for now require that the driver only proxy the one protocol we loaded it for.
-        return ZX_ERR_ACCESS_DENIED;
-    }
-    proxy_->Proxy(req_buffer, req_size, req_handle_list, req_handle_count, out_resp_buffer,
-                  resp_size, out_resp_actual, out_resp_handle_list, resp_handle_count,
-                  out_resp_handle_actual);
-    return ZX_OK;
-}
-
-} // namespace platform_bus
diff --git a/zircon/system/dev/bus/platform/platform-proxy-client.h b/zircon/system/dev/bus/platform/platform-proxy-client.h
deleted file mode 100644
index 00f7dab..0000000
--- a/zircon/system/dev/bus/platform/platform-proxy-client.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include <ddktl/device.h>
-#include <ddktl/protocol/platform/proxy.h>
-#include <fbl/ref_ptr.h>
-#include <fbl/vector.h>
-#include <lib/zx/channel.h>
-#include <lib/zx/handle.h>
-
-#include "platform-proxy.h"
-
-namespace platform_bus {
-
-class ProxyClient;
-using ProxyClientType = ddk::Device<ProxyClient>;
-
-class ProxyClient : public ProxyClientType,
-                    public ddk::PlatformProxyProtocol<ProxyClient, ddk::base_protocol> {
-public:
-    explicit ProxyClient(uint32_t proto_id, zx_device_t* parent, fbl::RefPtr<PlatformProxy> proxy)
-        :  ProxyClientType(parent), proto_id_(proto_id), proxy_(proxy) {}
-
-    static zx_status_t Create(uint32_t proto_id, zx_device_t* parent,
-                              fbl::RefPtr<PlatformProxy> proxy);
-
-    // Device protocol implementation.
-    void DdkRelease();
-
-    // Platform proxy protocol implementation.
-     zx_status_t PlatformProxyRegisterProtocol(uint32_t proto_id, const void* protocol,
-                                               size_t protocol_size);
-     zx_status_t PlatformProxyProxy(
-         const void* req_buffer, size_t req_size, const zx_handle_t* req_handle_list,
-         size_t req_handle_count, void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-         zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-         size_t* out_resp_handle_actual);
-
-private:
-    DISALLOW_COPY_ASSIGN_AND_MOVE(ProxyClient);
-
-    uint32_t proto_id_;
-    fbl::RefPtr<PlatformProxy> proxy_;
-};
-
-} // namespace platform_bus
diff --git a/zircon/system/dev/bus/platform/platform-proxy.cpp b/zircon/system/dev/bus/platform/platform-proxy.cpp
index 04c0a40..9bef0e7 100644
--- a/zircon/system/dev/bus/platform/platform-proxy.cpp
+++ b/zircon/system/dev/bus/platform/platform-proxy.cpp
@@ -17,7 +17,6 @@
 
 #include <utility>
 
-#include "platform-proxy-client.h"
 #include "platform-proxy-device.h"
 
 namespace platform_bus {
@@ -149,26 +148,6 @@
     protocols_.erase(proto_id);
 }
 
-zx_status_t PlatformProxy::Proxy(
-    const void* req_buffer, size_t req_size, const zx_handle_t* req_handle_list,
-    size_t req_handle_count, void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-    zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-    size_t* out_resp_handle_actual) {
-
-    auto* req = static_cast<const platform_proxy_req*>(req_buffer);
-    auto* resp = static_cast<platform_proxy_rsp*>(out_resp_buffer);
-    if (req->device_id != ROOT_DEVICE_ID) {
-        return ZX_ERR_INVALID_ARGS;
-    }
-    if (req_size > PLATFORM_PROXY_MAX_DATA) {
-        return ZX_ERR_OUT_OF_RANGE;
-    }
-
-    return Rpc(ROOT_DEVICE_ID, req, req_size, resp, resp_size,
-               req_handle_list, req_handle_count, out_resp_handle_list,
-               resp_handle_count, out_resp_actual);
-}
-
 zx_status_t PlatformProxy::Create(void* ctx, zx_device_t* parent, const char* name,
                                   const char* args, zx_handle_t rpc_channel) {
     fbl::AllocChecker ac;
@@ -182,45 +161,7 @@
 }
 
 zx_status_t PlatformProxy::Init(zx_device_t* parent) {
-    // Get list of extra protocols to proxy.
-    rpc_pdev_req_t req = {};
-    struct {
-        rpc_pdev_rsp_t pdev;
-        uint32_t protocols[PROXY_MAX_PROTOCOLS];
-    } resp = {};
-    req.header.device_id = ROOT_DEVICE_ID;
-    req.header.proto_id = ZX_PROTOCOL_PDEV;
-    req.header.op = PDEV_GET_PROTOCOLS;
-
-    auto status = Rpc(ROOT_DEVICE_ID, &req.header, sizeof(req), &resp.pdev.header, sizeof(resp));
-    if (status != ZX_OK) {
-        return status;
-    }
-
-    if (resp.pdev.protocol_count > 0) {
-        status = DdkAdd("PlatformProxy");
-        if (status != ZX_OK) {
-            return status;
-        }
-        // Increment our reference count so we aren't destroyed while the devmgr
-        // has a reference to us. We will decrement it in DdkRelease();
-        AddRef();
-
-        // Create device hosts for all the protocols.
-        protocol_count_ = resp.pdev.protocol_count;
-
-        for (uint32_t i = 0; i < protocol_count_; i++) {
-            status = ProxyClient::Create(resp.protocols[i], zxdev(),
-                                         fbl::RefPtr<PlatformProxy>(this));
-        }
-    } else {
-        status = ProxyDevice::CreateRoot(parent, fbl::RefPtr<PlatformProxy>(this));
-        if (status != ZX_OK) {
-            return status;
-        }
-    }
-
-    return ZX_OK;
+    return ProxyDevice::CreateRoot(parent, fbl::RefPtr<PlatformProxy>(this));
 }
 
 static zx_driver_ops_t proxy_driver_ops = [](){
diff --git a/zircon/system/dev/bus/platform/platform-proxy.h b/zircon/system/dev/bus/platform/platform-proxy.h
index c07c792..d767511 100644
--- a/zircon/system/dev/bus/platform/platform-proxy.h
+++ b/zircon/system/dev/bus/platform/platform-proxy.h
@@ -4,7 +4,6 @@
 
 #pragma once
 
-#include <ddk/protocol/platform/proxy.h>
 #include <ddktl/device.h>
 #include <fbl/intrusive_wavl_tree.h>
 #include <fbl/ref_counted.h>
@@ -49,11 +48,6 @@
     zx_status_t GetProtocol(uint32_t proto_id, void* out);
     zx_status_t RegisterProtocol(uint32_t proto_id, const void* protocol);
     void UnregisterProtocol(uint32_t proto_id);
-    zx_status_t Proxy(
-         const void* req_buffer, size_t req_size, const zx_handle_t* req_handle_list,
-         size_t req_handle_count, void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-         zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-         size_t* out_resp_handle_actual);
 
 private:
     // This class is a wrapper for a protocol added via platform_proxy_register_protocol().
diff --git a/zircon/system/dev/bus/platform/proxy-protocol.h b/zircon/system/dev/bus/platform/proxy-protocol.h
index 6287910..8a6bd36 100644
--- a/zircon/system/dev/bus/platform/proxy-protocol.h
+++ b/zircon/system/dev/bus/platform/proxy-protocol.h
@@ -7,7 +7,6 @@
 #include <ddk/protocol/amlogiccanvas.h>
 #include <ddk/protocol/i2c.h>
 #include <ddk/protocol/platform/device.h>
-#include <ddk/protocol/platform/proxy.h>
 #include <ddktl/protocol/powerimpl.h>
 
 namespace platform_bus {
@@ -28,16 +27,29 @@
     PDEV_GET_BOARD_INFO,
     PDEV_DEVICE_ADD,
     PDEV_GET_METADATA,
-    PDEV_GET_PROTOCOLS,
 };
 
-typedef struct {
+/// Header for RPC requests.
+struct platform_proxy_req_t {
+    uint32_t txid;
+    uint32_t device_id;
+    uint32_t proto_id;
+    uint32_t op;
+};
+
+/// Header for RPC responses.
+struct platform_proxy_rsp_t {
+    uint32_t txid;
+    zx_status_t status;
+};
+
+struct rpc_pdev_req_t {
     platform_proxy_req_t header;
     uint32_t index;
     uint32_t flags;
-} rpc_pdev_req_t;
+};
 
-typedef struct {
+struct rpc_pdev_rsp_t {
     platform_proxy_rsp_t header;
     zx_paddr_t paddr;
     size_t length;
@@ -48,21 +60,16 @@
     uint32_t device_id;
     uint32_t metadata_type;
     uint32_t metadata_length;
-    uint32_t protocol_count;
-} rpc_pdev_rsp_t;
+};
 
 // Maximum metadata size that can be returned via PDEV_DEVICE_GET_METADATA.
 static constexpr uint32_t PROXY_MAX_METADATA_SIZE =
     (PROXY_MAX_TRANSFER_SIZE - sizeof(rpc_pdev_rsp_t));
 
-typedef struct {
+struct rpc_pdev_metadata_rsp_t {
     rpc_pdev_rsp_t pdev;
     uint8_t metadata[PROXY_MAX_METADATA_SIZE];
-} rpc_pdev_metadata_rsp_t;
-
-// Maximum number of protocols that can be returned via PDEV_GET_PROTOCOLS.
-static constexpr size_t PROXY_MAX_PROTOCOLS =
-    ((PLATFORM_PROXY_MAX_DATA - sizeof(rpc_pdev_rsp_t)) / sizeof(uint32_t));
+};
 
 // Maximum I2C transfer is I2C_MAX_TRANSFER_SIZE minus size of largest header.
 static constexpr uint32_t I2C_MAX_TRANSFER_SIZE =
@@ -82,19 +89,19 @@
     GPIO_SET_POLARITY,
 };
 
-typedef struct {
+struct rpc_gpio_req_t {
     platform_proxy_req_t header;
     uint32_t index;
     uint32_t flags;
     uint32_t polarity;
     uint64_t alt_function;
     uint8_t value;
-} rpc_gpio_req_t;
+};
 
-typedef struct {
+struct rpc_gpio_rsp_t {
     platform_proxy_rsp_t header;
     uint8_t value;
-} rpc_gpio_rsp_t;
+};
 
 // ZX_PROTOCOL_I2C proxy support.
 enum {
@@ -102,20 +109,20 @@
     I2C_TRANSACT,
 };
 
-typedef struct {
+struct rpc_i2c_req_t {
     platform_proxy_req_t header;
     uint32_t index;
     i2c_transact_callback transact_cb;
     void* cookie;
     size_t cnt;
-} rpc_i2c_req_t;
+};
 
-typedef struct {
+struct rpc_i2c_rsp_t {
     platform_proxy_rsp_t header;
     size_t max_transfer;
     i2c_transact_callback transact_cb;
     void* cookie;
-} rpc_i2c_rsp_t;
+};
 
 // ZX_PROTOCOL_CLOCK proxy support.
 enum {
@@ -123,10 +130,10 @@
     CLK_DISABLE,
 };
 
-typedef struct {
+struct rpc_clk_req_t {
     platform_proxy_req_t header;
     uint32_t index;
-} rpc_clk_req_t;
+};
 
 // ZX_PROTOCOL_POWER proxy support.
 enum {
@@ -135,15 +142,15 @@
     POWER_GET_STATUS,
 };
 
-typedef struct {
+struct rpc_power_req_t {
     platform_proxy_req_t header;
     uint32_t index;
-} rpc_power_req_t;
+};
 
-typedef struct {
+struct rpc_power_rsp_t {
     platform_proxy_rsp_t header;
     power_domain_status_t status;
-} rpc_power_rsp_t;
+};
 
 // ZX_PROTOCOL_SYSMEM proxy support.
 enum {
@@ -156,16 +163,16 @@
     AMLOGIC_CANVAS_FREE,
 };
 
-typedef struct {
+struct rpc_amlogic_canvas_req_t {
     platform_proxy_req_t header;
     size_t offset;
     canvas_info_t info;
     uint8_t canvas_idx;
-} rpc_amlogic_canvas_req_t;
+};
 
-typedef struct {
+struct rpc_amlogic_canvas_rsp_t {
     platform_proxy_rsp_t header;
     uint8_t canvas_idx;
-} rpc_amlogic_canvas_rsp_t;
+};
 
 } // namespace platform_bus
diff --git a/zircon/system/dev/clk/amlogic-clk/aml-clk.cpp b/zircon/system/dev/clk/amlogic-clk/aml-clk.cpp
index 89bb29d..4254bec 100644
--- a/zircon/system/dev/clk/amlogic-clk/aml-clk.cpp
+++ b/zircon/system/dev/clk/amlogic-clk/aml-clk.cpp
@@ -160,9 +160,7 @@
         .ctx = this,
     };
 
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_CLOCK, &clk_proto, sizeof(clk_proto),
-                                    &kCallback);
+    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_CLOCK, &clk_proto, sizeof(clk_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "meson_clk_bind: pbus_register_protocol failed, st = %d\n", status);
         return status;
diff --git a/zircon/system/dev/clk/hisi-lib/hisi-clk.cpp b/zircon/system/dev/clk/hisi-lib/hisi-clk.cpp
index 48a6d5e..4b6de67 100644
--- a/zircon/system/dev/clk/hisi-lib/hisi-clk.cpp
+++ b/zircon/system/dev/clk/hisi-lib/hisi-clk.cpp
@@ -155,9 +155,7 @@
         .ctx = this,
     };
 
-    const platform_proxy_cb_t kCallback = {nullptr, nullptr};
-    st = pbus.RegisterProtocol(ZX_PROTOCOL_CLOCK, &clk_proto,
-                               sizeof(clk_proto), &kCallback);
+    st = pbus.RegisterProtocol(ZX_PROTOCOL_CLOCK, &clk_proto, sizeof(clk_proto));
     if (st != ZX_OK) {
         zxlogf(ERROR, "HisiClock::RegisterClockProtocol: pbus_register_protocol"
                       " failed with st = %d\n",
diff --git a/zircon/system/dev/clk/mtk-clk/mtk-clk.cpp b/zircon/system/dev/clk/mtk-clk/mtk-clk.cpp
index bbb300d..98168d0 100644
--- a/zircon/system/dev/clk/mtk-clk/mtk-clk.cpp
+++ b/zircon/system/dev/clk/mtk-clk/mtk-clk.cpp
@@ -132,9 +132,7 @@
         .ctx = this,
     };
 
-    const platform_proxy_cb_t kCallback = {nullptr, nullptr};
-    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_CLOCK, &clk_proto, sizeof(clk_proto),
-                                    &kCallback);
+    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_CLOCK, &clk_proto, sizeof(clk_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "MtkClk::Create: pbus_register_protocol failed, st = %d\n", status);
         return status;
diff --git a/zircon/system/dev/display/aml-canvas/BUILD.gn b/zircon/system/dev/display/aml-canvas/BUILD.gn
index c16dcaa..af81026 100644
--- a/zircon/system/dev/display/aml-canvas/BUILD.gn
+++ b/zircon/system/dev/display/aml-canvas/BUILD.gn
@@ -10,7 +10,6 @@
     "$zx/system/banjo/ddk-protocol-amlogiccanvas",
     "$zx/system/banjo/ddk-protocol-platform-bus",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/ulib/ddk",
     "$zx/system/ulib/zircon",
   ]
diff --git a/zircon/system/dev/display/aml-canvas/aml-canvas.c b/zircon/system/dev/display/aml-canvas/aml-canvas.c
index dd2dc2a8..b77b6b5 100644
--- a/zircon/system/dev/display/aml-canvas/aml-canvas.c
+++ b/zircon/system/dev/display/aml-canvas/aml-canvas.c
@@ -17,7 +17,6 @@
 #include <ddk/platform-defs.h>
 #include <ddk/protocol/platform/device.h>
 #include <ddk/protocol/platform-device-lib.h>
-#include <ddk/protocol/platform/proxy.h>
 #include <zircon/pixelformat.h>
 
 #include "aml-canvas.h"
@@ -221,9 +220,8 @@
     canvas->canvas.ctx = canvas;
 
     // Register the canvas protocol with the platform bus
-    const platform_proxy_cb_t callback = {NULL, NULL};
     pbus_register_protocol(&pbus, ZX_PROTOCOL_AMLOGIC_CANVAS, &canvas->canvas,
-                           sizeof(canvas->canvas), &callback);
+                           sizeof(canvas->canvas));
     return ZX_OK;
 fail:
     aml_canvas_release(canvas);
diff --git a/zircon/system/dev/display/dsi-dw/BUILD.gn b/zircon/system/dev/display/dsi-dw/BUILD.gn
index 43bb36f..18d74c8 100644
--- a/zircon/system/dev/display/dsi-dw/BUILD.gn
+++ b/zircon/system/dev/display/dsi-dw/BUILD.gn
@@ -13,7 +13,6 @@
     "$zx/system/banjo/ddk-protocol-gpio",
     "$zx/system/banjo/ddk-protocol-i2c",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/dev/lib/mmio",
     "$zx/system/fidl/fuchsia-sysmem:c",
     "$zx/system/ulib/bitmap",
diff --git a/zircon/system/dev/display/dsi-mt/BUILD.gn b/zircon/system/dev/display/dsi-mt/BUILD.gn
index 7b08d14..cebdf0d 100644
--- a/zircon/system/dev/display/dsi-mt/BUILD.gn
+++ b/zircon/system/dev/display/dsi-mt/BUILD.gn
@@ -13,7 +13,6 @@
     "$zx/system/banjo/ddk-protocol-gpio",
     "$zx/system/banjo/ddk-protocol-i2c",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/dev/lib/mmio",
     "$zx/system/fidl/fuchsia-sysmem:c",
     "$zx/system/ulib/bitmap",
diff --git a/zircon/system/dev/gpio/aml-axg-gpio/aml-axg-gpio.c b/zircon/system/dev/gpio/aml-axg-gpio/aml-axg-gpio.c
index 622c9d1..daf70f6 100644
--- a/zircon/system/dev/gpio/aml-axg-gpio/aml-axg-gpio.c
+++ b/zircon/system/dev/gpio/aml-axg-gpio/aml-axg-gpio.c
@@ -531,9 +531,7 @@
     gpio->gpio_interrupt->irq_status = 0;
     gpio->gpio.ops = &gpio_ops;
     gpio->gpio.ctx = gpio;
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio->gpio, sizeof(gpio->gpio),
-                           &kCallback);
+    pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio->gpio, sizeof(gpio->gpio));
     gpio->gpio_interrupt->irq_info = calloc(gpio->gpio_interrupt->irq_count,
                                      sizeof(uint16_t));
     if (!gpio->gpio_interrupt->irq_info) {
diff --git a/zircon/system/dev/gpio/aml-gxl-gpio/aml-gxl-gpio.cpp b/zircon/system/dev/gpio/aml-gxl-gpio/aml-gxl-gpio.cpp
index 9c79686..51af983 100644
--- a/zircon/system/dev/gpio/aml-gxl-gpio/aml-gxl-gpio.cpp
+++ b/zircon/system/dev/gpio/aml-gxl-gpio/aml-gxl-gpio.cpp
@@ -170,9 +170,7 @@
         .ctx = this
     };
 
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto),
-                           &kCallback);
+    pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto));
 }
 
 zx_status_t AmlGxlGpio::AmlPinToBlock(const uint32_t pin, const AmlGpioBlock** out_block,
diff --git a/zircon/system/dev/gpio/imx8/imx8m-gpio.c b/zircon/system/dev/gpio/imx8/imx8m-gpio.c
index ab4b1da..dc6a913 100644
--- a/zircon/system/dev/gpio/imx8/imx8m-gpio.c
+++ b/zircon/system/dev/gpio/imx8/imx8m-gpio.c
@@ -180,9 +180,7 @@
 
     gpio->gpio.ops = &gpio_ops;
     gpio->gpio.ctx = gpio;
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&gpio->pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio->gpio, sizeof(gpio->gpio),
-                           &kCallback);
+    pbus_register_protocol(&gpio->pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio->gpio, sizeof(gpio->gpio));
 
     return ZX_OK;
 
diff --git a/zircon/system/dev/gpio/imx8/imx8m-mini-gpio.c b/zircon/system/dev/gpio/imx8/imx8m-mini-gpio.c
index bf640f9..b26da65 100644
--- a/zircon/system/dev/gpio/imx8/imx8m-mini-gpio.c
+++ b/zircon/system/dev/gpio/imx8/imx8m-mini-gpio.c
@@ -179,9 +179,7 @@
 
     gpio->gpio.ops = &gpio_ops;
     gpio->gpio.ctx = gpio;
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&gpio->pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio->gpio, sizeof(gpio->gpio),
-                           &kCallback);
+    pbus_register_protocol(&gpio->pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio->gpio, sizeof(gpio->gpio));
 
     return ZX_OK;
 
diff --git a/zircon/system/dev/gpio/mt-8167/mt8167-gpio.cpp b/zircon/system/dev/gpio/mt-8167/mt8167-gpio.cpp
index c56c2e7..7a41768 100644
--- a/zircon/system/dev/gpio/mt-8167/mt8167-gpio.cpp
+++ b/zircon/system/dev/gpio/mt-8167/mt8167-gpio.cpp
@@ -290,9 +290,7 @@
         .ops = &gpio_impl_protocol_ops_,
         .ctx = this,
     };
-    const platform_proxy_cb_t kCallback = {nullptr, nullptr};
-    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto),
-                                    &kCallback);
+    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "%s pbus_register_protocol failed %d\n", __FUNCTION__, status);
         ShutDown();
diff --git a/zircon/system/dev/gpio/qcom-gpio/qcom-gpio.cpp b/zircon/system/dev/gpio/qcom-gpio/qcom-gpio.cpp
index 19c78dc..991c234 100644
--- a/zircon/system/dev/gpio/qcom-gpio/qcom-gpio.cpp
+++ b/zircon/system/dev/gpio/qcom-gpio/qcom-gpio.cpp
@@ -247,9 +247,7 @@
         .ops = &gpio_impl_protocol_ops_,
         .ctx = this,
     };
-    const platform_proxy_cb_t kCallback = {nullptr, nullptr};
-    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto),
-                                    &kCallback);
+    status = pbus_register_protocol(&pbus, ZX_PROTOCOL_GPIO_IMPL, &gpio_proto, sizeof(gpio_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "%s pbus_register_protocol failed %d\n", __func__, status);
         ShutDown();
diff --git a/zircon/system/dev/i2c/aml-i2c/aml-i2c.c b/zircon/system/dev/i2c/aml-i2c/aml-i2c.c
index e7592d1..c2c4728 100644
--- a/zircon/system/dev/i2c/aml-i2c/aml-i2c.c
+++ b/zircon/system/dev/i2c/aml-i2c/aml-i2c.c
@@ -414,8 +414,7 @@
 
     i2c->i2c.ops = &i2c_ops;
     i2c->i2c.ctx = i2c;
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c->i2c, sizeof(i2c->i2c), &kCallback);
+    pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c->i2c, sizeof(i2c->i2c));
 
     return ZX_OK;
 
diff --git a/zircon/system/dev/i2c/dw-i2c/dw-i2c.c b/zircon/system/dev/i2c/dw-i2c/dw-i2c.c
index 33deab2..8a4f4fb 100644
--- a/zircon/system/dev/i2c/dw-i2c/dw-i2c.c
+++ b/zircon/system/dev/i2c/dw-i2c/dw-i2c.c
@@ -504,8 +504,7 @@
 
     i2c->i2c.ops = &i2c_ops;
     i2c->i2c.ctx = i2c;
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c->i2c, sizeof(i2c->i2c), &kCallback);
+    pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c->i2c, sizeof(i2c->i2c));
 
     return ZX_OK;
 
diff --git a/zircon/system/dev/i2c/imx-i2c/imx-i2c.cpp b/zircon/system/dev/i2c/imx-i2c/imx-i2c.cpp
index 9904d11..1b1dfdb 100644
--- a/zircon/system/dev/i2c/imx-i2c/imx-i2c.cpp
+++ b/zircon/system/dev/i2c/imx-i2c/imx-i2c.cpp
@@ -284,8 +284,7 @@
         .ops = &i2c_impl_protocol_ops_,
         .ctx = this,
     };
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c_proto, sizeof(i2c_proto), &kCallback);
+    pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c_proto, sizeof(i2c_proto));
 
     cleanup.cancel();
     return ZX_OK;
diff --git a/zircon/system/dev/i2c/mt8167-i2c/mt8167-i2c.cpp b/zircon/system/dev/i2c/mt8167-i2c/mt8167-i2c.cpp
index 2077913..b7f9108 100644
--- a/zircon/system/dev/i2c/mt8167-i2c/mt8167-i2c.cpp
+++ b/zircon/system/dev/i2c/mt8167-i2c/mt8167-i2c.cpp
@@ -285,9 +285,7 @@
         .ops = &i2c_impl_protocol_ops_,
         .ctx = this,
     };
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
-    auto status = pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c_proto, sizeof(i2c_proto),
-                                         &kCallback);
+    auto status = pbus_register_protocol(&pbus, ZX_PROTOCOL_I2C_IMPL, &i2c_proto, sizeof(i2c_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "%s pbus_register_protocol failed: %d\n", __FUNCTION__, status);
         return status;
diff --git a/zircon/system/dev/power/mtk-power/mtk-power.cpp b/zircon/system/dev/power/mtk-power/mtk-power.cpp
index 42eda3a..bdac8aa 100644
--- a/zircon/system/dev/power/mtk-power/mtk-power.cpp
+++ b/zircon/system/dev/power/mtk-power/mtk-power.cpp
@@ -180,11 +180,9 @@
         .ctx = this,
     };
 
-    const platform_proxy_cb_t kCallback = {NULL, NULL};
     status = pbus_register_protocol(&pbus, ZX_PROTOCOL_POWER_IMPL,
                                     &power_proto,
-                                    sizeof(power_proto),
-                                    &kCallback);
+                                    sizeof(power_proto));
     if (status != ZX_OK) {
         zxlogf(ERROR, "%s pbus_register_protocol failed: %d\n", __FUNCTION__, status);
         return status;
diff --git a/zircon/system/dev/sysmem/sysmem/BUILD.gn b/zircon/system/dev/sysmem/sysmem/BUILD.gn
index e7f5c5b..a167c89 100644
--- a/zircon/system/dev/sysmem/sysmem/BUILD.gn
+++ b/zircon/system/dev/sysmem/sysmem/BUILD.gn
@@ -19,7 +19,6 @@
   deps = [
     "$zx/system/banjo/ddk-protocol-platform-bus",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/banjo/ddk-protocol-sysmem",
     "$zx/system/fidl/fuchsia-sysmem:c",
     "$zx/system/ulib/async:async-cpp",
@@ -50,7 +49,6 @@
   deps = [
     "$zx/system/banjo/ddk-protocol-platform-bus",
     "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/banjo/ddk-protocol-sysmem",
     "$zx/system/dev/lib/fake_ddk",
     "$zx/system/fidl/fuchsia-sysmem:c",
diff --git a/zircon/system/dev/sysmem/sysmem/device.cpp b/zircon/system/dev/sysmem/sysmem/device.cpp
index 3a052bf..26a94b7 100644
--- a/zircon/system/dev/sysmem/sysmem/device.cpp
+++ b/zircon/system/dev/sysmem/sysmem/device.cpp
@@ -150,10 +150,9 @@
     // We should only pbus_register_protocol() if device_add() succeeded, but if
     // pbus_register_protocol() fails, we should remove the device without it
     // ever being visible.
-    const platform_proxy_cb_t callback = {nullptr, nullptr};
     status = pbus_register_protocol(
         &pbus, ZX_PROTOCOL_SYSMEM, &in_proc_sysmem_protocol_,
-        sizeof(in_proc_sysmem_protocol_), &callback);
+        sizeof(in_proc_sysmem_protocol_));
     if (status != ZX_OK) {
         zx_status_t remove_status = device_remove(device_);
         // If this failed, we're potentially leaving the device invisible in a