blob: 9f26163262d4249f3628e918eacd3037e6b25f50 [file] [log] [blame]
// Copyright 2021 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 <lib/ddk/binding_driver.h>
#include <lib/ddk/device.h>
#include <lib/ddk/driver.h>
#include <lib/ddk/platform-defs.h>
#include <zircon/assert.h>
#include <zircon/types.h>
#include <memory>
#include <ddktl/device.h>
namespace {
class TestParent;
using TestParentType = ddk::Device<TestParent>;
class TestParent : public TestParentType {
public:
explicit TestParent(zx_device_t* device) : TestParentType(device) {}
static zx_status_t Create(zx_device_t* parent);
// Device protocol implementation.
void DdkRelease() { delete this; }
};
zx_status_t TestParent::Create(zx_device_t* parent) {
auto test_parent = std::make_unique<TestParent>(parent);
zx_status_t status =
test_parent->DdkAdd(ddk::DeviceAddArgs("test").set_proto_id(ZX_PROTOCOL_TEST_PARENT));
if (status != ZX_OK) {
return status;
}
// Now owned by the driver framework.
[[maybe_unused]] auto ptr = test_parent.release();
return ZX_OK;
}
class SysDevice;
using SysDeviceType = ddk::Device<SysDevice>;
class SysDevice : public SysDeviceType {
public:
explicit SysDevice(zx_device_t* device) : SysDeviceType(device) {}
static zx_status_t Create(void* ctx, zx_device_t* parent, const char* name,
zx_handle_t items_svc_handle);
// Device protocol implementation.
void DdkRelease() { delete this; }
};
zx_status_t SysDevice::Create(void* ctx, zx_device_t* parent, const char* name,
zx_handle_t items_svc_handle) {
auto sys_device = std::make_unique<SysDevice>(parent);
zx_status_t status =
sys_device->DdkAdd(ddk::DeviceAddArgs("sys").set_flags(DEVICE_ADD_NON_BINDABLE));
if (status != ZX_OK) {
return status;
}
// Now owned by the driver framework.
auto ptr = sys_device.release();
return TestParent::Create(ptr->zxdev());
}
static constexpr zx_driver_ops_t driver_ops = []() {
zx_driver_ops_t ops = {};
ops.version = DRIVER_OPS_VERSION;
ops.create = SysDevice::Create;
return ops;
}();
} // namespace
ZIRCON_DRIVER(test - parent, driver_ops, "zircon", "0.1");