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

#ifndef SRC_DEVICES_SPI_DRIVERS_MTK_SPI_MTK_SPI_H_
#define SRC_DEVICES_SPI_DRIVERS_MTK_SPI_MTK_SPI_H_

#include <lib/mmio/mmio.h>

#include <ddk/protocol/platform/device.h>
#include <ddktl/device.h>
#include <ddktl/protocol/spiimpl.h>
#include <fbl/span.h>

namespace spi {

class MtkSpi;
using DeviceType = ddk::Device<MtkSpi, ddk::Unbindable>;

class MtkSpi : public DeviceType, public ddk::SpiImplProtocol<MtkSpi, ddk::base_protocol> {
 public:
  explicit MtkSpi(zx_device_t* device, ddk::MmioBuffer mmio)
      : DeviceType(device), mmio_(std::move(mmio)) {}

  static zx_status_t Create(void* ctx, zx_device_t* device);

  void DdkUnbind(ddk::UnbindTxn txn) { txn.Reply(); }
  void DdkRelease() { delete this; }

  uint32_t SpiImplGetChipSelectCount() { return 1; }
  zx_status_t SpiImplExchange(uint32_t cs, const uint8_t* txdata, size_t txdata_size,
                              uint8_t* out_rxdata, size_t rxdata_size, size_t* out_rxdata_actual);

 private:
  friend class FakeMtkSpi;

  zx_status_t Init();
  zx_status_t FifoExchange(const uint8_t* txdata, uint8_t* out_rxdata,
                           size_t data_size /* bytes */);
  void FifoTransferPacket(const uint8_t** tx, uint8_t** rx, size_t packet_size);

  ddk::MmioBuffer mmio_;

  // TODO: find correct values
  uint32_t spi_clk_hz_ = 109'000'000;
  uint32_t speed_hz_ = 3'120'000;
};

}  // namespace spi

#endif  // SRC_DEVICES_SPI_DRIVERS_MTK_SPI_MTK_SPI_H_
