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
12struct 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
25namespace audio {
26namespace vim2 {
27
28class 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 platform_device_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
57typedef struct vim2_audio vim2_audio_t;
58
59zx_status_t vim2_audio_create(const platform_device_protocol_t* pdev,
60                              vim2_audio_t **out_audio);
61void vim2_audio_shutdown(vim2_audio_t** inout_audio);
62
63void vim2_audio_on_display_added(const struct vim2_display* display, uint64_t display_id);
64void vim2_audio_on_display_removed(const struct vim2_display* display, uint64_t display_id);
65__END_CDECLS
66