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 <zircon/compiler.h>
8 #include <zircon/types.h>
9 #include <ddk/protocol/platform/device.h>
10 
11 __BEGIN_CDECLS
12 struct vim2_display;  // fwd decl
13 __END_CDECLS
14 
15 #ifdef __cplusplus
16 
17 #include <fbl/macros.h>
18 #include <lib/fzl/pinned-vmo.h>
19 #include <lib/zx/bti.h>
20 #include <lib/zx/vmo.h>
21 
22 #include "vim-audio-utils.h"
23 #include "vim-spdif-audio-stream.h"
24 
25 namespace audio {
26 namespace vim2 {
27 
28 class Vim2Audio {
29   public:
30     Vim2Audio() = default;
31     ~Vim2Audio();
32     DISALLOW_COPY_ASSIGN_AND_MOVE(Vim2Audio);
33 
34     // Ddk Hooks
35     static zx_status_t DriverBind(zx_device_t* parent);
36     void DdkUnbind();
37     void DdkRelease();
38 
39     // Display driver hooks
40     zx_status_t Init(const pdev_protocol_t* pdev);
41     void OnDisplayAdded(const struct vim2_display* display, uint64_t display_id);
42     void OnDisplayRemoved(uint64_t display_id);
43 
44   private:
45     zx::bti audio_bti_;
46     fbl::RefPtr<Registers> regs_;
47     fbl::RefPtr<RefCountedVmo> spdif_rb_vmo_;
48     fbl::RefPtr<Vim2SpdifAudioStream> spdif_stream_;
49 };
50 
51 }  // namespace vim2
52 }  // namespace audio
53 
54 #endif  // __cplusplus
55 
56 __BEGIN_CDECLS
57 typedef struct vim2_audio vim2_audio_t;
58 
59 zx_status_t vim2_audio_create(const pdev_protocol_t* pdev,
60                               vim2_audio_t **out_audio);
61 void vim2_audio_shutdown(vim2_audio_t** inout_audio);
62 
63 void vim2_audio_on_display_added(const struct vim2_display* display, uint64_t display_id);
64 void vim2_audio_on_display_removed(const struct vim2_display* display, uint64_t display_id);
65 __END_CDECLS
66