// 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 <ddk/debug.h>
#include <ddk/device.h>
#include <ddk/platform-defs.h>
#include <ddktl/mmio.h>
#include <hw/reg.h>
#include <lib/zx/handle.h>
#include <soc/aml-common/aml-usb-phy-v2.h>

#include <soc/aml-t931/t931-gpio.h>
#include <soc/aml-t931/t931-hw.h>

#include <optional>

#include "sherlock.h"

namespace sherlock {

namespace {

constexpr pbus_mmio_t xhci_mmios[] = {
    {
        .base = T931_USB0_BASE,
        .length = T931_USB0_LENGTH,
    },
};

constexpr pbus_irq_t xhci_irqs[] = {
    {
        .irq = T931_USB0_IRQ,
        .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
    },
};

constexpr pbus_bti_t xhci_btis[] = {
    {
        .iommu_index = 0,
        .bti_id = BTI_USB_XHCI,
    },
};

static pbus_dev_t xhci_dev = [](){
    pbus_dev_t dev;
    dev.name = "xhci";
    dev.vid = PDEV_VID_GENERIC;
    dev.pid = PDEV_PID_GENERIC;
    dev.did = PDEV_DID_USB_XHCI;
    dev.mmio_list = xhci_mmios;
    dev.mmio_count = countof(xhci_mmios);
    dev.irq_list = xhci_irqs;
    dev.irq_count = countof(xhci_irqs);
    dev.bti_list = xhci_btis;
    dev.bti_count = countof(xhci_btis);
    return dev;
}();

// magic numbers for USB PHY tuning
constexpr uint32_t PLL_SETTING_3 = 0xfe18;
constexpr uint32_t PLL_SETTING_4 = 0xfff;
constexpr uint32_t PLL_SETTING_5 = 0xc8000;
constexpr uint32_t PLL_SETTING_6 = 0xe0004;
constexpr uint32_t PLL_SETTING_7 = 0xe000c;

zx_status_t PerformUsbTuning(bool host, bool default_val) {
    std::optional<ddk::MmioBuffer> buf;
    zx_status_t status;

    zx::unowned_resource resource(get_root_resource());
    status = ddk::MmioBuffer::Create(T931_USBPHY21_BASE, T931_USBPHY21_LENGTH, *resource,
                                     ZX_CACHE_POLICY_UNCACHED_DEVICE, &buf);
    if (status != ZX_OK) {
        return status;
    }

    if (default_val) {
        buf->Write32(0, 0x38);
        buf->Write32(PLL_SETTING_5, 0x34);
    } else {
        buf->Write32(PLL_SETTING_3, 0x50);
        buf->Write32(PLL_SETTING_4, 0x10);
        if (host) {
            buf->Write32(PLL_SETTING_6, 0x38);
        } else {
            buf->Write32(PLL_SETTING_7, 0x38);
        }
        buf->Write32(PLL_SETTING_5, 0x34);
    }

    return ZX_OK;
}

} // namespace

zx_status_t Sherlock::UsbInit() {
    zx::bti bti;
    auto status = iommu_.GetBti(BTI_BOARD, 0, &bti);
    if (status != ZX_OK) {
        zxlogf(ERROR, "%s: GetBti failed: %d\n", __func__, status);
        return status;
    }

    status = aml_usb_phy_v2_init(bti.get());
    if (status != ZX_OK) {
        zxlogf(ERROR, "%s: aml_usb_phy_v2_init failed %d\n", __func__, status);
        return status;
    }

    status = PerformUsbTuning(true, false);
    if (status != ZX_OK) {
        return status;
    }

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

    return ZX_OK;
}

} // namespace sherlock
