blob: 96e0279084a668689fb08b803056e4449341145c [file] [log] [blame]
// 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.
#include "sysdev.h"
#include <ddk/device.h>
#include <ddk/driver.h>
#include <ddktl/device.h>
#include <fbl/unique_ptr.h>
#include <lib/zx/channel.h>
#include <zircon/assert.h>
#include <zircon/types.h>
namespace {
class Sysdev;
using SysdevType = ddk::Device<Sysdev>;
class Sysdev : public SysdevType {
public:
explicit Sysdev(zx_device_t* device) : SysdevType(device) { }
static zx_status_t Create(zx_device_t* parent, const char* name, zx::channel items_svc);
// Device protocol implementation.
void DdkRelease() {
// sysdev should never have its release called.
ZX_ASSERT_MSG(false, "Sysdev::DdkRelease() invoked!\n");
}
};
zx_status_t Sysdev::Create(zx_device_t* parent, const char* name, zx::channel items_svc) {
auto sysdev = std::make_unique<Sysdev>(parent);
zx_status_t status = sysdev->DdkAdd("sys", DEVICE_ADD_NON_BINDABLE,
nullptr /* props */, 0 /* prop_count */);
if (status != ZX_OK) {
return status;
}
// Now owned by devmgr.
__UNUSED auto ptr = sysdev.release();
return ZX_OK;
}
} // namespace
zx_status_t test_sysdev_create(void* ctx, zx_device_t* parent, const char* name,
const char* args, zx_handle_t items_svc_handle) {
zx::channel items_svc(items_svc_handle);
return Sysdev::Create(parent, name, std::move(items_svc));
}