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 <ddk/protocol/platform-device.h>
9#include <fbl/unique_ptr.h>
10#include <hwreg/mmio.h>
11#include "vpu-regs.h"
12#include "common.h"
13
14
15namespace astro_display {
16
17class Vpu {
18public:
19    Vpu() {}
20    ~Vpu() {
21        io_buffer_release(&mmio_vpu_);
22        io_buffer_release(&mmio_hhi_);
23    }
24    zx_status_t Init(zx_device_t* parent);
25    // This function powers on VPU related blocks. The function contains undocumented
26    // register and/or power-on sequences.
27    void PowerOn();
28    // This function powers off VPU related blocks. The function contains undocumented
29    // register and/or power-off sequences.
30    void PowerOff();
31    // This function sets up default video post processing unit. It contains undocumented
32    // registers and/or initialization sequences
33    void VppInit();
34private:
35    // This function configures the VPU-related clocks. It contains undocumented registers
36    // and/or clock initialization sequences
37    void ConfigureClock();
38
39    io_buffer_t                         mmio_vpu_;
40    io_buffer_t                         mmio_hhi_;
41    io_buffer_t                         mmio_aobus_;
42    io_buffer_t                         mmio_cbus_;
43    platform_device_protocol_t          pdev_ = {};
44    fbl::unique_ptr<hwreg::RegisterIo>  vpu_regs_;
45    fbl::unique_ptr<hwreg::RegisterIo>  hhi_regs_;
46    fbl::unique_ptr<hwreg::RegisterIo>  aobus_regs_;
47    fbl::unique_ptr<hwreg::RegisterIo>  cbus_regs_;
48
49    bool                                initialized_ = false;
50
51};
52} // namespace astro_display
53