1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "sysdev.h"
6 
7 #include <ddk/device.h>
8 #include <ddk/driver.h>
9 #include <ddktl/device.h>
10 #include <fbl/unique_ptr.h>
11 #include <lib/zx/vmo.h>
12 #include <zircon/assert.h>
13 #include <zircon/types.h>
14 
15 namespace {
16 
17 class Sysdev;
18 using SysdevType = ddk::Device<Sysdev>;
19 
20 class Sysdev : public SysdevType {
21 public:
Sysdev(zx_device_t * device)22     explicit Sysdev(zx_device_t* device) : SysdevType(device) { }
23 
24     static zx_status_t Create(zx_device_t* parent, const char* name, zx::vmo zbi);
25 
26     // Device protocol implementation.
DdkRelease()27     void DdkRelease() {
28         // sysdev should never have its release called.
29         ZX_ASSERT_MSG(false, "Sysdev::DdkRelease() invoked!\n");
30     }
31 };
32 
Create(zx_device_t * parent,const char * name,zx::vmo zbi)33 zx_status_t Sysdev::Create(zx_device_t* parent, const char* name, zx::vmo zbi) {
34     auto sysdev = fbl::make_unique<Sysdev>(parent);
35 
36     zx_status_t status = sysdev->DdkAdd("sys", DEVICE_ADD_NON_BINDABLE,
37                                         nullptr /* props */, 0 /* prop_count */);
38     if (status != ZX_OK) {
39         return status;
40     }
41 
42     // Now owned by devmgr.
43     __UNUSED auto ptr = sysdev.release();
44 
45     return ZX_OK;
46 }
47 
48 } // namespace
49 
test_sysdev_create(void * ctx,zx_device_t * parent,const char * name,const char * args,zx_handle_t zbi_vmo_handle)50 zx_status_t test_sysdev_create(void* ctx, zx_device_t* parent, const char* name,
51                                const char* args, zx_handle_t zbi_vmo_handle) {
52     zx::vmo zbi(zbi_vmo_handle);
53     return Sysdev::Create(parent, name, std::move(zbi));
54 }
55