// Copyright 2017 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.

#pragma once

#include <ddk/mmio-buffer.h>
#include <ddk/protocol/gpioimpl.h>
#include <ddk/protocol/iommu.h>
#include <ddk/protocol/platform/bus.h>
#include <soc/aml-a113/a113-clocks.h>

#include <threads.h>

enum {
    AML_I2C_A,
    AML_I2C_B,
    AML_I2C_C,
    AML_I2C_D,
};

// BTI IDs for our devices
enum {
    BTI_BOARD,
    BTI_AUDIO_IN,
    BTI_AUDIO_OUT,
    BTI_USB_XHCI,
    BTI_AML_RAW_NAND,
    BTI_SYSMEM,
};

typedef struct {
    zx_device_t* parent;
    pbus_protocol_t pbus;
    gpio_impl_protocol_t gpio;
    iommu_protocol_t iommu;
    zx_handle_t bti_handle;
    mmio_buffer_t usb_phy;
    zx_handle_t usb_phy_irq_handle;
    thrd_t phy_irq_thread;
    a113_clk_dev_t *clocks;
} gauss_bus_t;

// gauss-sysmem.c
zx_status_t gauss_sysmem_init(gauss_bus_t* bus);

// gauss-audio.c
zx_status_t gauss_audio_init(gauss_bus_t* bus);

// gauss-gpio.c
zx_status_t gauss_gpio_init(gauss_bus_t* bus);

// gauss-i2c.c
zx_status_t gauss_i2c_init(gauss_bus_t* bus);

// gauss-usb.c
zx_status_t gauss_usb_init(gauss_bus_t* bus);

// gauss-clk.c
zx_status_t gauss_clk_init(gauss_bus_t* bus);

// gauss-pcie.c
zx_status_t gauss_pcie_init(gauss_bus_t* bus);

// gauss-raw_nand.c
zx_status_t gauss_raw_nand_init(gauss_bus_t* bus);
