191094Sdes// Copyright 2018 The Fuchsia Authors. All rights reserved.
291094Sdes// Use of this source code is governed by a BSD-style license that can be
391094Sdes// found in the LICENSE file.
491094Sdes
591094Sdes#pragma once
691094Sdes
791094Sdes#include <zircon/compiler.h>
891094Sdes#include <ddk/protocol/platform-device.h>
991094Sdes#include <fbl/unique_ptr.h>
1091094Sdes#include <hwreg/mmio.h>
1191094Sdes#include "vpu-regs.h"
1291094Sdes#include "common.h"
1391094Sdes
1491094Sdes
1591094Sdesnamespace astro_display {
1691094Sdes
1791094Sdesclass Vpu {
1891094Sdespublic:
1991094Sdes    Vpu() {}
2091094Sdes    ~Vpu() {
2191094Sdes        io_buffer_release(&mmio_vpu_);
2291094Sdes        io_buffer_release(&mmio_hhi_);
2391094Sdes    }
2491094Sdes    zx_status_t Init(zx_device_t* parent);
2591094Sdes    // This function powers on VPU related blocks. The function contains undocumented
2691094Sdes    // register and/or power-on sequences.
2791094Sdes    void PowerOn();
2891094Sdes    // This function powers off VPU related blocks. The function contains undocumented
2991094Sdes    // register and/or power-off sequences.
3091094Sdes    void PowerOff();
3191094Sdes    // This function sets up default video post processing unit. It contains undocumented
3291094Sdes    // registers and/or initialization sequences
3391094Sdes    void VppInit();
3491094Sdesprivate:
3591094Sdes    // This function configures the VPU-related clocks. It contains undocumented registers
3691094Sdes    // and/or clock initialization sequences
3791094Sdes    void ConfigureClock();
3891094Sdes
3991100Sdes    io_buffer_t                         mmio_vpu_;
4091100Sdes    io_buffer_t                         mmio_hhi_;
4191100Sdes    io_buffer_t                         mmio_aobus_;
4291100Sdes    io_buffer_t                         mmio_cbus_;
4391100Sdes    platform_device_protocol_t          pdev_ = {};
4491100Sdes    fbl::unique_ptr<hwreg::RegisterIo>  vpu_regs_;
4591100Sdes    fbl::unique_ptr<hwreg::RegisterIo>  hhi_regs_;
4691094Sdes    fbl::unique_ptr<hwreg::RegisterIo>  aobus_regs_;
4791094Sdes    fbl::unique_ptr<hwreg::RegisterIo>  cbus_regs_;
4891094Sdes
4991094Sdes    bool                                initialized_ = false;
5091094Sdes
5191094Sdes};
5291094Sdes} // namespace astro_display
5391094Sdes