blob: c858eabc25fe6c4e68d8dd2962047cb855f25d63 [file] [log] [blame]
// 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::UnbindableNew>;
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 DdkUnbindNew(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_