#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#define SIFIVE_SPI_DRIVER_NAME "sifive_spi"
#define SIFIVE_SPI_MAX_CS 32
#define SIFIVE_SPI_DEFAULT_DEPTH 8
#define SIFIVE_SPI_DEFAULT_MAX_BITS 8
#define SIFIVE_SPI_REG_SCKDIV 0x00
#define SIFIVE_SPI_REG_SCKMODE 0x04
#define SIFIVE_SPI_REG_CSID 0x10
#define SIFIVE_SPI_REG_CSDEF 0x14
#define SIFIVE_SPI_REG_CSMODE 0x18
#define SIFIVE_SPI_REG_DELAY0 0x28
#define SIFIVE_SPI_REG_DELAY1 0x2c
#define SIFIVE_SPI_REG_FMT 0x40
#define SIFIVE_SPI_REG_TXDATA 0x48
#define SIFIVE_SPI_REG_RXDATA 0x4c
#define SIFIVE_SPI_REG_TXMARK 0x50
#define SIFIVE_SPI_REG_RXMARK 0x54
#define SIFIVE_SPI_REG_FCTRL 0x60
#define SIFIVE_SPI_REG_FFMT 0x64
#define SIFIVE_SPI_REG_IE 0x70
#define SIFIVE_SPI_REG_IP 0x74
#define SIFIVE_SPI_SCKDIV_DIV_MASK 0xfffU
#define SIFIVE_SPI_SCKMODE_PHA BIT(0)
#define SIFIVE_SPI_SCKMODE_POL BIT(1)
#define SIFIVE_SPI_SCKMODE_MODE_MASK (SIFIVE_SPI_SCKMODE_PHA | \
#define SIFIVE_SPI_CSMODE_MODE_AUTO 0U
#define SIFIVE_SPI_CSMODE_MODE_HOLD 2U
#define SIFIVE_SPI_CSMODE_MODE_OFF 3U
#define SIFIVE_SPI_DELAY0_CSSCK(x) ((u32)(x))
#define SIFIVE_SPI_DELAY0_CSSCK_MASK 0xffU
#define SIFIVE_SPI_DELAY0_SCKCS(x) ((u32)(x) << 16)
#define SIFIVE_SPI_DELAY0_SCKCS_MASK (0xffU << 16)