// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "vim-audio-utils.h"

#include <utility>

#include <fbl/alloc_checker.h>

namespace audio {
namespace vim2 {

fbl::RefPtr<Registers> Registers::Create(const pdev_protocol_t* pdev, uint32_t which_mmio,
                                         zx_status_t* out_res) {
  ZX_DEBUG_ASSERT(pdev != nullptr);

  mmio_buffer_t mmio;
  *out_res = pdev_map_mmio_buffer(pdev, which_mmio, ZX_CACHE_POLICY_UNCACHED_DEVICE, &mmio);
  if (*out_res != ZX_OK) {
    return nullptr;
  }

  fbl::AllocChecker ac;
  auto ret = fbl::AdoptRef(new (&ac) Registers(mmio));
  if (!ac.check()) {
    *out_res = ZX_ERR_NO_MEMORY;
    return nullptr;
  }

  return ret;
}

fbl::RefPtr<RefCountedVmo> RefCountedVmo::Create(zx::vmo vmo) {
  if (!vmo.is_valid()) {
    return nullptr;
  }

  fbl::AllocChecker ac;
  auto ret = fbl::AdoptRef(new (&ac) RefCountedVmo(std::move(vmo)));
  if (!ac.check()) {
    return nullptr;
  }

  return ret;
}

}  // namespace vim2
}  // namespace audio
