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 #pragma once
6 
7 #include <ddk/protocol/platform/device.h>
8 #include <ddk/protocol/platform-device-lib.h>
9 #include <ddktl/mmio.h>
10 #include <fbl/macros.h>
11 #include <fbl/ref_counted.h>
12 #include <fbl/ref_ptr.h>
13 #include <fbl/unique_ptr.h>
14 #include <lib/zx/vmo.h>
15 #include <zircon/compiler.h>
16 #include <zircon/types.h>
17 
18 #include <utility>
19 
20 namespace audio {
21 namespace vim2 {
22 
23 class Registers : public fbl::RefCounted<Registers>,
24                   public ddk::MmioBuffer {
25   public:
26     static fbl::RefPtr<Registers> Create(const pdev_protocol_t* pdev,
27                                          uint32_t which_mmio,
28                                          zx_status_t* out_res);
29     DISALLOW_COPY_ASSIGN_AND_MOVE(Registers);
30 
31   private:
32     friend class fbl::RefPtr<Registers>;
33 
Registers(mmio_buffer_t & mmio)34     Registers(mmio_buffer_t& mmio) : ddk::MmioBuffer(mmio) {}
35     ~Registers() = default;
36 };
37 
38 class RefCountedVmo : public fbl::RefCounted<RefCountedVmo>{
39 public:
40     static fbl::RefPtr<RefCountedVmo> Create(zx::vmo vmo);
41     DISALLOW_COPY_ASSIGN_AND_MOVE(RefCountedVmo);
42 
vmo()43     const zx::vmo& vmo() { return vmo_; }
44 
45 private:
46     friend class fbl::RefPtr<RefCountedVmo>;
47 
RefCountedVmo(zx::vmo vmo)48     explicit RefCountedVmo(zx::vmo vmo) : vmo_(std::move(vmo)) { }
49     ~RefCountedVmo() = default;
50 
51     const zx::vmo vmo_;
52 };
53 
54 }  // namespace vim2
55 }  // namespace audio
56