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