// Copyright 2019 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 <lib/ddk/debug.h>
#include <lib/ddk/device.h>
#include <lib/ddk/platform-defs.h>

#include <soc/msm8x53/msm8x53-hw.h>
#include <soc/msm8x53/msm8x53-sdhci.h>

#include "msm8x53.h"

namespace board_msm8x53 {

zx_status_t Msm8x53::Sdc1Init() {
  static const pbus_bti_t sdc1_btis[] = {
      {.iommu_index = 0, .bti_id = BTI_SDC1},
  };

  const pbus_irq_t sdc1_irqs[] = {
      {.irq = msm8x53::kIrqSdc1, .mode = ZX_INTERRUPT_MODE_EDGE_HIGH},
  };

  const pbus_mmio_t sdc1_mmios[] = {
      {.base = msm8x53::kSdc1CoreBase, .length = msm8x53::kSdc1CoreSize},
      {.base = msm8x53::kSdc1HcBase, .length = msm8x53::kSdc1HcSize},
  };

  pbus_dev_t sdc1_dev = {};
  sdc1_dev.name = "emmc";
  sdc1_dev.vid = PDEV_VID_QUALCOMM;
  sdc1_dev.did = PDEV_DID_QUALCOMM_SDC1;
  sdc1_dev.bti_list = sdc1_btis;
  sdc1_dev.bti_count = countof(sdc1_btis);
  sdc1_dev.irq_list = sdc1_irqs;
  sdc1_dev.irq_count = countof(sdc1_irqs);
  sdc1_dev.mmio_list = sdc1_mmios;
  sdc1_dev.mmio_count = countof(sdc1_mmios);

  zx_status_t status = pbus_.DeviceAdd(&sdc1_dev);
  if (status != ZX_OK) {
    zxlogf(ERROR, "%s: DeviceAdd failed: %d", __func__, status);
  }

  return status;
}

}  // namespace board_msm8x53
