1*c906a3a0SJean-Christophe DUBOIS /* 2*c906a3a0SJean-Christophe DUBOIS * IMX SPI Controller 3*c906a3a0SJean-Christophe DUBOIS * 4*c906a3a0SJean-Christophe DUBOIS * Copyright 2016 Jean-Christophe Dubois <jcd@tribudubois.net> 5*c906a3a0SJean-Christophe DUBOIS * 6*c906a3a0SJean-Christophe DUBOIS * This work is licensed under the terms of the GNU GPL, version 2 or later. 7*c906a3a0SJean-Christophe DUBOIS * See the COPYING file in the top-level directory. 8*c906a3a0SJean-Christophe DUBOIS */ 9*c906a3a0SJean-Christophe DUBOIS 10*c906a3a0SJean-Christophe DUBOIS #ifndef IMX_SPI_H 11*c906a3a0SJean-Christophe DUBOIS #define IMX_SPI_H 12*c906a3a0SJean-Christophe DUBOIS 13*c906a3a0SJean-Christophe DUBOIS #include "hw/sysbus.h" 14*c906a3a0SJean-Christophe DUBOIS #include "hw/ssi/ssi.h" 15*c906a3a0SJean-Christophe DUBOIS #include "qemu/bitops.h" 16*c906a3a0SJean-Christophe DUBOIS #include "qemu/fifo32.h" 17*c906a3a0SJean-Christophe DUBOIS 18*c906a3a0SJean-Christophe DUBOIS #define ECSPI_FIFO_SIZE 64 19*c906a3a0SJean-Christophe DUBOIS 20*c906a3a0SJean-Christophe DUBOIS #define ECSPI_RXDATA 0 21*c906a3a0SJean-Christophe DUBOIS #define ECSPI_TXDATA 1 22*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG 2 23*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONFIGREG 3 24*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG 4 25*c906a3a0SJean-Christophe DUBOIS #define ECSPI_DMAREG 5 26*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG 6 27*c906a3a0SJean-Christophe DUBOIS #define ECSPI_PERIODREG 7 28*c906a3a0SJean-Christophe DUBOIS #define ECSPI_TESTREG 8 29*c906a3a0SJean-Christophe DUBOIS #define ECSPI_MSGDATA 16 30*c906a3a0SJean-Christophe DUBOIS #define ECSPI_MAX 17 31*c906a3a0SJean-Christophe DUBOIS 32*c906a3a0SJean-Christophe DUBOIS /* ECSPI_CONREG */ 33*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_EN (1 << 0) 34*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_HT (1 << 1) 35*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_XCH (1 << 2) 36*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_SMC (1 << 3) 37*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_CHANNEL_MODE_SHIFT 4 38*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_CHANNEL_MODE_LENGTH 4 39*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_DRCTL_SHIFT 16 40*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_DRCTL_LENGTH 2 41*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_CHANNEL_SELECT_SHIFT 18 42*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_CHANNEL_SELECT_LENGTH 2 43*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_BURST_LENGTH_SHIFT 20 44*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONREG_BURST_LENGTH_LENGTH 12 45*c906a3a0SJean-Christophe DUBOIS 46*c906a3a0SJean-Christophe DUBOIS /* ECSPI_CONFIGREG */ 47*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONFIGREG_SS_CTL_SHIFT 8 48*c906a3a0SJean-Christophe DUBOIS #define ECSPI_CONFIGREG_SS_CTL_LENGTH 4 49*c906a3a0SJean-Christophe DUBOIS 50*c906a3a0SJean-Christophe DUBOIS /* ECSPI_INTREG */ 51*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_TEEN (1 << 0) 52*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_TDREN (1 << 1) 53*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_TFEN (1 << 2) 54*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_RREN (1 << 3) 55*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_RDREN (1 << 4) 56*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_RFEN (1 << 5) 57*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_ROEN (1 << 6) 58*c906a3a0SJean-Christophe DUBOIS #define ECSPI_INTREG_TCEN (1 << 7) 59*c906a3a0SJean-Christophe DUBOIS 60*c906a3a0SJean-Christophe DUBOIS /* ECSPI_DMAREG */ 61*c906a3a0SJean-Christophe DUBOIS #define ECSPI_DMAREG_RXTDEN (1 << 31) 62*c906a3a0SJean-Christophe DUBOIS #define ECSPI_DMAREG_RXDEN (1 << 23) 63*c906a3a0SJean-Christophe DUBOIS #define ECSPI_DMAREG_TEDEN (1 << 7) 64*c906a3a0SJean-Christophe DUBOIS #define ECSPI_DMAREG_RX_THRESHOLD_SHIFT 16 65*c906a3a0SJean-Christophe DUBOIS #define ECSPI_DMAREG_RX_THRESHOLD_LENGTH 6 66*c906a3a0SJean-Christophe DUBOIS 67*c906a3a0SJean-Christophe DUBOIS /* ECSPI_STATREG */ 68*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_TE (1 << 0) 69*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_TDR (1 << 1) 70*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_TF (1 << 2) 71*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_RR (1 << 3) 72*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_RDR (1 << 4) 73*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_RF (1 << 5) 74*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_RO (1 << 6) 75*c906a3a0SJean-Christophe DUBOIS #define ECSPI_STATREG_TC (1 << 7) 76*c906a3a0SJean-Christophe DUBOIS 77*c906a3a0SJean-Christophe DUBOIS #define EXTRACT(value, name) extract32(value, name##_SHIFT, name##_LENGTH) 78*c906a3a0SJean-Christophe DUBOIS 79*c906a3a0SJean-Christophe DUBOIS #define TYPE_IMX_SPI "imx.spi" 80*c906a3a0SJean-Christophe DUBOIS #define IMX_SPI(obj) OBJECT_CHECK(IMXSPIState, (obj), TYPE_IMX_SPI) 81*c906a3a0SJean-Christophe DUBOIS 82*c906a3a0SJean-Christophe DUBOIS typedef struct IMXSPIState { 83*c906a3a0SJean-Christophe DUBOIS /* <private> */ 84*c906a3a0SJean-Christophe DUBOIS SysBusDevice parent_obj; 85*c906a3a0SJean-Christophe DUBOIS 86*c906a3a0SJean-Christophe DUBOIS /* <public> */ 87*c906a3a0SJean-Christophe DUBOIS MemoryRegion iomem; 88*c906a3a0SJean-Christophe DUBOIS 89*c906a3a0SJean-Christophe DUBOIS qemu_irq irq; 90*c906a3a0SJean-Christophe DUBOIS 91*c906a3a0SJean-Christophe DUBOIS qemu_irq cs_lines[4]; 92*c906a3a0SJean-Christophe DUBOIS 93*c906a3a0SJean-Christophe DUBOIS SSIBus *bus; 94*c906a3a0SJean-Christophe DUBOIS 95*c906a3a0SJean-Christophe DUBOIS uint32_t regs[ECSPI_MAX]; 96*c906a3a0SJean-Christophe DUBOIS 97*c906a3a0SJean-Christophe DUBOIS Fifo32 rx_fifo; 98*c906a3a0SJean-Christophe DUBOIS Fifo32 tx_fifo; 99*c906a3a0SJean-Christophe DUBOIS 100*c906a3a0SJean-Christophe DUBOIS int16_t burst_length; 101*c906a3a0SJean-Christophe DUBOIS } IMXSPIState; 102*c906a3a0SJean-Christophe DUBOIS 103*c906a3a0SJean-Christophe DUBOIS #endif /* IMX_SPI_H */ 104