xref: /qemu/include/hw/ssi/imx_spi.h (revision c906a3a01582219b40a6b075ed28d4dd6f53d462)
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