// 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/io-buffer.h>
#include <ddk/metadata.h>
#include <ddk/metadata/nand.h>
#include <ddk/platform-defs.h>
#include <ddk/protocol/gpio.h>
#include <ddk/protocol/platform/bus.h>
#include <hw/reg.h>
#include <soc/aml-s905d2/s905d2-hw.h>
#include <soc/aml-s905d2/s905d2-gpio.h>
#include <unistd.h>
#include <zircon/hw/gpt.h>

#include "astro.h"

namespace astro {

static const pbus_mmio_t raw_nand_mmios[] = {
    {   /* nandreg : Registers for NAND controller */
        .base = S905D2_RAW_NAND_REG_BASE,
        .length = 0x2000,
    },
    {   /* clockreg : Clock Register for NAND controller */
        .base = S905D2_RAW_NAND_CLOCK_BASE,
        .length = 0x4,  /* Just 4 bytes */
    },
};

static const pbus_irq_t raw_nand_irqs[] = {
    {
        .irq = S905D2_RAW_NAND_IRQ,
        .mode = 0,
    },
};

static const pbus_bti_t raw_nand_btis[] = {
    {
        .iommu_index = 0,
        .bti_id = BTI_AML_RAW_NAND,
    },
};

static const nand_config_t config = {
    .bad_block_config = {
        .type = kAmlogicUboot,
        .aml = {
            .table_start_block = 20,
            .table_end_block = 23,
        },
    },
    .extra_partition_config_count = 1,
    .extra_partition_config = {
        {
            .type_guid = GUID_BOOTLOADER_VALUE,
            .copy_count = 4,
            .copy_byte_offset = 0,
        },
    },
};

static const pbus_metadata_t raw_nand_metadata[] = {
    {
        .type = DEVICE_METADATA_PRIVATE,
        .data_buffer = &config,
        .data_size = sizeof(config),
    },
};

static const pbus_boot_metadata_t raw_nand_boot_metadata[] = {
    {
        .zbi_type = DEVICE_METADATA_PARTITION_MAP,
        .zbi_extra = 0,
    },
};

static const pbus_dev_t raw_nand_dev = []() {
    pbus_dev_t dev;
    dev.name = "raw_nand";
    dev.vid = PDEV_VID_AMLOGIC;
    dev.pid = PDEV_PID_GENERIC;
    dev.did = PDEV_DID_AMLOGIC_RAW_NAND;
    dev.mmio_list = raw_nand_mmios;
    dev.mmio_count = countof(raw_nand_mmios);
    dev.irq_list = raw_nand_irqs;
    dev.irq_count = countof(raw_nand_irqs);
    dev.bti_list = raw_nand_btis;
    dev.bti_count = countof(raw_nand_btis);
    dev.metadata_list= raw_nand_metadata;
    dev.metadata_count = countof(raw_nand_metadata);
    dev.boot_metadata_list = raw_nand_boot_metadata;
    dev.boot_metadata_count = countof(raw_nand_boot_metadata);
    return dev;
}();

zx_status_t Astro::RawNandInit() {
    zx_status_t status;

    // Set alternate functions to enable raw_nand.
    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(8), 2);
    if (status != ZX_OK) {
        return status;
    }

    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(9), 2);
    if (status != ZX_OK) {
        return status;
    }
    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(10), 2);
    if (status != ZX_OK) {
        return status;
    }
    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(11), 2);
    if (status != ZX_OK) {
        return status;
    }
    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(12), 2);
    if (status != ZX_OK) {
        return status;
    }
    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(14), 2);
    if (status != ZX_OK) {
        return status;
    }
    status = gpio_impl_.SetAltFunction(S905D2_GPIOBOOT(15), 2);
    if (status != ZX_OK) {
        return status;
    }

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

    return ZX_OK;
}

} // namespace astro
