.. | .. |
---|
10 | 10 | #include <linux/delay.h> |
---|
11 | 11 | #include <linux/dmaengine.h> |
---|
12 | 12 | #include <linux/dma-mapping.h> |
---|
13 | | -#include <linux/err.h> |
---|
14 | | -#include <linux/errno.h> |
---|
15 | 13 | #include <linux/interrupt.h> |
---|
16 | | -#include <linux/io.h> |
---|
17 | 14 | #include <linux/kernel.h> |
---|
18 | | -#include <linux/math64.h> |
---|
19 | 15 | #include <linux/module.h> |
---|
20 | | -#include <linux/of.h> |
---|
21 | 16 | #include <linux/of_device.h> |
---|
22 | 17 | #include <linux/pinctrl/consumer.h> |
---|
23 | | -#include <linux/platform_device.h> |
---|
24 | | -#include <linux/pm_runtime.h> |
---|
25 | 18 | #include <linux/regmap.h> |
---|
26 | | -#include <linux/sched.h> |
---|
27 | 19 | #include <linux/spi/spi.h> |
---|
28 | 20 | #include <linux/spi/spi-fsl-dspi.h> |
---|
29 | | -#include <linux/spi/spi_bitbang.h> |
---|
30 | | -#include <linux/time.h> |
---|
31 | 21 | |
---|
32 | | -#define DRIVER_NAME "fsl-dspi" |
---|
| 22 | +#define DRIVER_NAME "fsl-dspi" |
---|
33 | 23 | |
---|
34 | | -#ifdef CONFIG_M5441x |
---|
35 | | -#define DSPI_FIFO_SIZE 16 |
---|
36 | | -#else |
---|
37 | | -#define DSPI_FIFO_SIZE 4 |
---|
38 | | -#endif |
---|
39 | | -#define DSPI_DMA_BUFSIZE (DSPI_FIFO_SIZE * 1024) |
---|
| 24 | +#define SPI_MCR 0x00 |
---|
| 25 | +#define SPI_MCR_MASTER BIT(31) |
---|
| 26 | +#define SPI_MCR_PCSIS(x) ((x) << 16) |
---|
| 27 | +#define SPI_MCR_CLR_TXF BIT(11) |
---|
| 28 | +#define SPI_MCR_CLR_RXF BIT(10) |
---|
| 29 | +#define SPI_MCR_XSPI BIT(3) |
---|
| 30 | +#define SPI_MCR_DIS_TXF BIT(13) |
---|
| 31 | +#define SPI_MCR_DIS_RXF BIT(12) |
---|
| 32 | +#define SPI_MCR_HALT BIT(0) |
---|
40 | 33 | |
---|
41 | | -#define SPI_MCR 0x00 |
---|
42 | | -#define SPI_MCR_MASTER (1 << 31) |
---|
43 | | -#define SPI_MCR_PCSIS (0x3F << 16) |
---|
44 | | -#define SPI_MCR_CLR_TXF (1 << 11) |
---|
45 | | -#define SPI_MCR_CLR_RXF (1 << 10) |
---|
46 | | -#define SPI_MCR_XSPI (1 << 3) |
---|
47 | | -#define SPI_MCR_DIS_TXF (1 << 13) |
---|
48 | | -#define SPI_MCR_DIS_RXF (1 << 12) |
---|
49 | | -#define SPI_MCR_HALT (1 << 0) |
---|
| 34 | +#define SPI_TCR 0x08 |
---|
| 35 | +#define SPI_TCR_GET_TCNT(x) (((x) & GENMASK(31, 16)) >> 16) |
---|
50 | 36 | |
---|
51 | | -#define SPI_TCR 0x08 |
---|
52 | | -#define SPI_TCR_GET_TCNT(x) (((x) & 0xffff0000) >> 16) |
---|
| 37 | +#define SPI_CTAR(x) (0x0c + (((x) & GENMASK(1, 0)) * 4)) |
---|
| 38 | +#define SPI_CTAR_FMSZ(x) (((x) << 27) & GENMASK(30, 27)) |
---|
| 39 | +#define SPI_CTAR_CPOL BIT(26) |
---|
| 40 | +#define SPI_CTAR_CPHA BIT(25) |
---|
| 41 | +#define SPI_CTAR_LSBFE BIT(24) |
---|
| 42 | +#define SPI_CTAR_PCSSCK(x) (((x) << 22) & GENMASK(23, 22)) |
---|
| 43 | +#define SPI_CTAR_PASC(x) (((x) << 20) & GENMASK(21, 20)) |
---|
| 44 | +#define SPI_CTAR_PDT(x) (((x) << 18) & GENMASK(19, 18)) |
---|
| 45 | +#define SPI_CTAR_PBR(x) (((x) << 16) & GENMASK(17, 16)) |
---|
| 46 | +#define SPI_CTAR_CSSCK(x) (((x) << 12) & GENMASK(15, 12)) |
---|
| 47 | +#define SPI_CTAR_ASC(x) (((x) << 8) & GENMASK(11, 8)) |
---|
| 48 | +#define SPI_CTAR_DT(x) (((x) << 4) & GENMASK(7, 4)) |
---|
| 49 | +#define SPI_CTAR_BR(x) ((x) & GENMASK(3, 0)) |
---|
| 50 | +#define SPI_CTAR_SCALE_BITS 0xf |
---|
53 | 51 | |
---|
54 | | -#define SPI_CTAR(x) (0x0c + (((x) & 0x3) * 4)) |
---|
55 | | -#define SPI_CTAR_FMSZ(x) (((x) & 0x0000000f) << 27) |
---|
56 | | -#define SPI_CTAR_CPOL(x) ((x) << 26) |
---|
57 | | -#define SPI_CTAR_CPHA(x) ((x) << 25) |
---|
58 | | -#define SPI_CTAR_LSBFE(x) ((x) << 24) |
---|
59 | | -#define SPI_CTAR_PCSSCK(x) (((x) & 0x00000003) << 22) |
---|
60 | | -#define SPI_CTAR_PASC(x) (((x) & 0x00000003) << 20) |
---|
61 | | -#define SPI_CTAR_PDT(x) (((x) & 0x00000003) << 18) |
---|
62 | | -#define SPI_CTAR_PBR(x) (((x) & 0x00000003) << 16) |
---|
63 | | -#define SPI_CTAR_CSSCK(x) (((x) & 0x0000000f) << 12) |
---|
64 | | -#define SPI_CTAR_ASC(x) (((x) & 0x0000000f) << 8) |
---|
65 | | -#define SPI_CTAR_DT(x) (((x) & 0x0000000f) << 4) |
---|
66 | | -#define SPI_CTAR_BR(x) ((x) & 0x0000000f) |
---|
67 | | -#define SPI_CTAR_SCALE_BITS 0xf |
---|
| 52 | +#define SPI_CTAR0_SLAVE 0x0c |
---|
68 | 53 | |
---|
69 | | -#define SPI_CTAR0_SLAVE 0x0c |
---|
| 54 | +#define SPI_SR 0x2c |
---|
| 55 | +#define SPI_SR_TCFQF BIT(31) |
---|
| 56 | +#define SPI_SR_TFUF BIT(27) |
---|
| 57 | +#define SPI_SR_TFFF BIT(25) |
---|
| 58 | +#define SPI_SR_CMDTCF BIT(23) |
---|
| 59 | +#define SPI_SR_SPEF BIT(21) |
---|
| 60 | +#define SPI_SR_RFOF BIT(19) |
---|
| 61 | +#define SPI_SR_TFIWF BIT(18) |
---|
| 62 | +#define SPI_SR_RFDF BIT(17) |
---|
| 63 | +#define SPI_SR_CMDFFF BIT(16) |
---|
| 64 | +#define SPI_SR_CLEAR (SPI_SR_TCFQF | \ |
---|
| 65 | + SPI_SR_TFUF | SPI_SR_TFFF | \ |
---|
| 66 | + SPI_SR_CMDTCF | SPI_SR_SPEF | \ |
---|
| 67 | + SPI_SR_RFOF | SPI_SR_TFIWF | \ |
---|
| 68 | + SPI_SR_RFDF | SPI_SR_CMDFFF) |
---|
70 | 69 | |
---|
71 | | -#define SPI_SR 0x2c |
---|
72 | | -#define SPI_SR_EOQF 0x10000000 |
---|
73 | | -#define SPI_SR_TCFQF 0x80000000 |
---|
74 | | -#define SPI_SR_CLEAR 0x9aaf0000 |
---|
| 70 | +#define SPI_RSER_TFFFE BIT(25) |
---|
| 71 | +#define SPI_RSER_TFFFD BIT(24) |
---|
| 72 | +#define SPI_RSER_RFDFE BIT(17) |
---|
| 73 | +#define SPI_RSER_RFDFD BIT(16) |
---|
75 | 74 | |
---|
76 | | -#define SPI_RSER_TFFFE BIT(25) |
---|
77 | | -#define SPI_RSER_TFFFD BIT(24) |
---|
78 | | -#define SPI_RSER_RFDFE BIT(17) |
---|
79 | | -#define SPI_RSER_RFDFD BIT(16) |
---|
| 75 | +#define SPI_RSER 0x30 |
---|
| 76 | +#define SPI_RSER_TCFQE BIT(31) |
---|
| 77 | +#define SPI_RSER_CMDTCFE BIT(23) |
---|
80 | 78 | |
---|
81 | | -#define SPI_RSER 0x30 |
---|
82 | | -#define SPI_RSER_EOQFE 0x10000000 |
---|
83 | | -#define SPI_RSER_TCFQE 0x80000000 |
---|
| 79 | +#define SPI_PUSHR 0x34 |
---|
| 80 | +#define SPI_PUSHR_CMD_CONT BIT(15) |
---|
| 81 | +#define SPI_PUSHR_CMD_CTAS(x) (((x) << 12 & GENMASK(14, 12))) |
---|
| 82 | +#define SPI_PUSHR_CMD_EOQ BIT(11) |
---|
| 83 | +#define SPI_PUSHR_CMD_CTCNT BIT(10) |
---|
| 84 | +#define SPI_PUSHR_CMD_PCS(x) (BIT(x) & GENMASK(5, 0)) |
---|
84 | 85 | |
---|
85 | | -#define SPI_PUSHR 0x34 |
---|
86 | | -#define SPI_PUSHR_CMD_CONT (1 << 15) |
---|
87 | | -#define SPI_PUSHR_CONT (SPI_PUSHR_CMD_CONT << 16) |
---|
88 | | -#define SPI_PUSHR_CMD_CTAS(x) (((x) & 0x0003) << 12) |
---|
89 | | -#define SPI_PUSHR_CTAS(x) (SPI_PUSHR_CMD_CTAS(x) << 16) |
---|
90 | | -#define SPI_PUSHR_CMD_EOQ (1 << 11) |
---|
91 | | -#define SPI_PUSHR_EOQ (SPI_PUSHR_CMD_EOQ << 16) |
---|
92 | | -#define SPI_PUSHR_CMD_CTCNT (1 << 10) |
---|
93 | | -#define SPI_PUSHR_CTCNT (SPI_PUSHR_CMD_CTCNT << 16) |
---|
94 | | -#define SPI_PUSHR_CMD_PCS(x) ((1 << x) & 0x003f) |
---|
95 | | -#define SPI_PUSHR_PCS(x) (SPI_PUSHR_CMD_PCS(x) << 16) |
---|
96 | | -#define SPI_PUSHR_TXDATA(x) ((x) & 0x0000ffff) |
---|
| 86 | +#define SPI_PUSHR_SLAVE 0x34 |
---|
97 | 87 | |
---|
98 | | -#define SPI_PUSHR_SLAVE 0x34 |
---|
| 88 | +#define SPI_POPR 0x38 |
---|
99 | 89 | |
---|
100 | | -#define SPI_POPR 0x38 |
---|
101 | | -#define SPI_POPR_RXDATA(x) ((x) & 0x0000ffff) |
---|
| 90 | +#define SPI_TXFR0 0x3c |
---|
| 91 | +#define SPI_TXFR1 0x40 |
---|
| 92 | +#define SPI_TXFR2 0x44 |
---|
| 93 | +#define SPI_TXFR3 0x48 |
---|
| 94 | +#define SPI_RXFR0 0x7c |
---|
| 95 | +#define SPI_RXFR1 0x80 |
---|
| 96 | +#define SPI_RXFR2 0x84 |
---|
| 97 | +#define SPI_RXFR3 0x88 |
---|
102 | 98 | |
---|
103 | | -#define SPI_TXFR0 0x3c |
---|
104 | | -#define SPI_TXFR1 0x40 |
---|
105 | | -#define SPI_TXFR2 0x44 |
---|
106 | | -#define SPI_TXFR3 0x48 |
---|
107 | | -#define SPI_RXFR0 0x7c |
---|
108 | | -#define SPI_RXFR1 0x80 |
---|
109 | | -#define SPI_RXFR2 0x84 |
---|
110 | | -#define SPI_RXFR3 0x88 |
---|
| 99 | +#define SPI_CTARE(x) (0x11c + (((x) & GENMASK(1, 0)) * 4)) |
---|
| 100 | +#define SPI_CTARE_FMSZE(x) (((x) & 0x1) << 16) |
---|
| 101 | +#define SPI_CTARE_DTCP(x) ((x) & 0x7ff) |
---|
111 | 102 | |
---|
112 | | -#define SPI_CTARE(x) (0x11c + (((x) & 0x3) * 4)) |
---|
113 | | -#define SPI_CTARE_FMSZE(x) (((x) & 0x1) << 16) |
---|
114 | | -#define SPI_CTARE_DTCP(x) ((x) & 0x7ff) |
---|
| 103 | +#define SPI_SREX 0x13c |
---|
115 | 104 | |
---|
116 | | -#define SPI_SREX 0x13c |
---|
| 105 | +#define SPI_FRAME_BITS(bits) SPI_CTAR_FMSZ((bits) - 1) |
---|
| 106 | +#define SPI_FRAME_EBITS(bits) SPI_CTARE_FMSZE(((bits) - 1) >> 4) |
---|
117 | 107 | |
---|
118 | | -#define SPI_FRAME_BITS(bits) SPI_CTAR_FMSZ((bits) - 1) |
---|
119 | | -#define SPI_FRAME_BITS_MASK SPI_CTAR_FMSZ(0xf) |
---|
120 | | -#define SPI_FRAME_BITS_16 SPI_CTAR_FMSZ(0xf) |
---|
121 | | -#define SPI_FRAME_BITS_8 SPI_CTAR_FMSZ(0x7) |
---|
122 | | - |
---|
123 | | -#define SPI_FRAME_EBITS(bits) SPI_CTARE_FMSZE(((bits) - 1) >> 4) |
---|
124 | | -#define SPI_FRAME_EBITS_MASK SPI_CTARE_FMSZE(1) |
---|
125 | | - |
---|
126 | | -/* Register offsets for regmap_pushr */ |
---|
127 | | -#define PUSHR_CMD 0x0 |
---|
128 | | -#define PUSHR_TX 0x2 |
---|
129 | | - |
---|
130 | | -#define SPI_CS_INIT 0x01 |
---|
131 | | -#define SPI_CS_ASSERT 0x02 |
---|
132 | | -#define SPI_CS_DROP 0x04 |
---|
133 | | - |
---|
134 | | -#define DMA_COMPLETION_TIMEOUT msecs_to_jiffies(3000) |
---|
| 108 | +#define DMA_COMPLETION_TIMEOUT msecs_to_jiffies(3000) |
---|
135 | 109 | |
---|
136 | 110 | struct chip_data { |
---|
137 | | - u32 ctar_val; |
---|
138 | | - u16 void_write_data; |
---|
| 111 | + u32 ctar_val; |
---|
139 | 112 | }; |
---|
140 | 113 | |
---|
141 | 114 | enum dspi_trans_mode { |
---|
142 | | - DSPI_EOQ_MODE = 0, |
---|
143 | | - DSPI_TCFQ_MODE, |
---|
| 115 | + DSPI_XSPI_MODE, |
---|
144 | 116 | DSPI_DMA_MODE, |
---|
145 | 117 | }; |
---|
146 | 118 | |
---|
147 | 119 | struct fsl_dspi_devtype_data { |
---|
148 | | - enum dspi_trans_mode trans_mode; |
---|
149 | | - u8 max_clock_factor; |
---|
150 | | - bool xspi_mode; |
---|
| 120 | + enum dspi_trans_mode trans_mode; |
---|
| 121 | + u8 max_clock_factor; |
---|
| 122 | + int fifo_size; |
---|
151 | 123 | }; |
---|
152 | 124 | |
---|
153 | | -static const struct fsl_dspi_devtype_data vf610_data = { |
---|
154 | | - .trans_mode = DSPI_DMA_MODE, |
---|
155 | | - .max_clock_factor = 2, |
---|
| 125 | +enum { |
---|
| 126 | + LS1021A, |
---|
| 127 | + LS1012A, |
---|
| 128 | + LS1028A, |
---|
| 129 | + LS1043A, |
---|
| 130 | + LS1046A, |
---|
| 131 | + LS2080A, |
---|
| 132 | + LS2085A, |
---|
| 133 | + LX2160A, |
---|
| 134 | + MCF5441X, |
---|
| 135 | + VF610, |
---|
156 | 136 | }; |
---|
157 | 137 | |
---|
158 | | -static const struct fsl_dspi_devtype_data ls1021a_v1_data = { |
---|
159 | | - .trans_mode = DSPI_TCFQ_MODE, |
---|
160 | | - .max_clock_factor = 8, |
---|
161 | | - .xspi_mode = true, |
---|
162 | | -}; |
---|
163 | | - |
---|
164 | | -static const struct fsl_dspi_devtype_data ls2085a_data = { |
---|
165 | | - .trans_mode = DSPI_TCFQ_MODE, |
---|
166 | | - .max_clock_factor = 8, |
---|
167 | | -}; |
---|
168 | | - |
---|
169 | | -static const struct fsl_dspi_devtype_data coldfire_data = { |
---|
170 | | - .trans_mode = DSPI_EOQ_MODE, |
---|
171 | | - .max_clock_factor = 8, |
---|
| 138 | +static const struct fsl_dspi_devtype_data devtype_data[] = { |
---|
| 139 | + [VF610] = { |
---|
| 140 | + .trans_mode = DSPI_DMA_MODE, |
---|
| 141 | + .max_clock_factor = 2, |
---|
| 142 | + .fifo_size = 4, |
---|
| 143 | + }, |
---|
| 144 | + [LS1021A] = { |
---|
| 145 | + /* Has A-011218 DMA erratum */ |
---|
| 146 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 147 | + .max_clock_factor = 8, |
---|
| 148 | + .fifo_size = 4, |
---|
| 149 | + }, |
---|
| 150 | + [LS1012A] = { |
---|
| 151 | + /* Has A-011218 DMA erratum */ |
---|
| 152 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 153 | + .max_clock_factor = 8, |
---|
| 154 | + .fifo_size = 16, |
---|
| 155 | + }, |
---|
| 156 | + [LS1028A] = { |
---|
| 157 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 158 | + .max_clock_factor = 8, |
---|
| 159 | + .fifo_size = 4, |
---|
| 160 | + }, |
---|
| 161 | + [LS1043A] = { |
---|
| 162 | + /* Has A-011218 DMA erratum */ |
---|
| 163 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 164 | + .max_clock_factor = 8, |
---|
| 165 | + .fifo_size = 16, |
---|
| 166 | + }, |
---|
| 167 | + [LS1046A] = { |
---|
| 168 | + /* Has A-011218 DMA erratum */ |
---|
| 169 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 170 | + .max_clock_factor = 8, |
---|
| 171 | + .fifo_size = 16, |
---|
| 172 | + }, |
---|
| 173 | + [LS2080A] = { |
---|
| 174 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 175 | + .max_clock_factor = 8, |
---|
| 176 | + .fifo_size = 4, |
---|
| 177 | + }, |
---|
| 178 | + [LS2085A] = { |
---|
| 179 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 180 | + .max_clock_factor = 8, |
---|
| 181 | + .fifo_size = 4, |
---|
| 182 | + }, |
---|
| 183 | + [LX2160A] = { |
---|
| 184 | + .trans_mode = DSPI_XSPI_MODE, |
---|
| 185 | + .max_clock_factor = 8, |
---|
| 186 | + .fifo_size = 4, |
---|
| 187 | + }, |
---|
| 188 | + [MCF5441X] = { |
---|
| 189 | + .trans_mode = DSPI_DMA_MODE, |
---|
| 190 | + .max_clock_factor = 8, |
---|
| 191 | + .fifo_size = 16, |
---|
| 192 | + }, |
---|
172 | 193 | }; |
---|
173 | 194 | |
---|
174 | 195 | struct fsl_dspi_dma { |
---|
175 | | - /* Length of transfer in words of DSPI_FIFO_SIZE */ |
---|
176 | | - u32 curr_xfer_len; |
---|
| 196 | + u32 *tx_dma_buf; |
---|
| 197 | + struct dma_chan *chan_tx; |
---|
| 198 | + dma_addr_t tx_dma_phys; |
---|
| 199 | + struct completion cmd_tx_complete; |
---|
| 200 | + struct dma_async_tx_descriptor *tx_desc; |
---|
177 | 201 | |
---|
178 | | - u32 *tx_dma_buf; |
---|
179 | | - struct dma_chan *chan_tx; |
---|
180 | | - dma_addr_t tx_dma_phys; |
---|
181 | | - struct completion cmd_tx_complete; |
---|
182 | | - struct dma_async_tx_descriptor *tx_desc; |
---|
183 | | - |
---|
184 | | - u32 *rx_dma_buf; |
---|
185 | | - struct dma_chan *chan_rx; |
---|
186 | | - dma_addr_t rx_dma_phys; |
---|
187 | | - struct completion cmd_rx_complete; |
---|
188 | | - struct dma_async_tx_descriptor *rx_desc; |
---|
| 202 | + u32 *rx_dma_buf; |
---|
| 203 | + struct dma_chan *chan_rx; |
---|
| 204 | + dma_addr_t rx_dma_phys; |
---|
| 205 | + struct completion cmd_rx_complete; |
---|
| 206 | + struct dma_async_tx_descriptor *rx_desc; |
---|
189 | 207 | }; |
---|
190 | 208 | |
---|
191 | 209 | struct fsl_dspi { |
---|
192 | | - struct spi_master *master; |
---|
193 | | - struct platform_device *pdev; |
---|
| 210 | + struct spi_controller *ctlr; |
---|
| 211 | + struct platform_device *pdev; |
---|
194 | 212 | |
---|
195 | | - struct regmap *regmap; |
---|
196 | | - struct regmap *regmap_pushr; |
---|
197 | | - int irq; |
---|
198 | | - struct clk *clk; |
---|
| 213 | + struct regmap *regmap; |
---|
| 214 | + struct regmap *regmap_pushr; |
---|
| 215 | + int irq; |
---|
| 216 | + struct clk *clk; |
---|
199 | 217 | |
---|
200 | | - struct spi_transfer *cur_transfer; |
---|
201 | | - struct spi_message *cur_msg; |
---|
202 | | - struct chip_data *cur_chip; |
---|
203 | | - size_t len; |
---|
204 | | - const void *tx; |
---|
205 | | - void *rx; |
---|
206 | | - void *rx_end; |
---|
207 | | - u16 void_write_data; |
---|
208 | | - u16 tx_cmd; |
---|
209 | | - u8 bits_per_word; |
---|
210 | | - u8 bytes_per_word; |
---|
211 | | - const struct fsl_dspi_devtype_data *devtype_data; |
---|
| 218 | + struct spi_transfer *cur_transfer; |
---|
| 219 | + struct spi_message *cur_msg; |
---|
| 220 | + struct chip_data *cur_chip; |
---|
| 221 | + size_t progress; |
---|
| 222 | + size_t len; |
---|
| 223 | + const void *tx; |
---|
| 224 | + void *rx; |
---|
| 225 | + u16 tx_cmd; |
---|
| 226 | + const struct fsl_dspi_devtype_data *devtype_data; |
---|
212 | 227 | |
---|
213 | | - wait_queue_head_t waitq; |
---|
214 | | - u32 waitflags; |
---|
| 228 | + struct completion xfer_done; |
---|
215 | 229 | |
---|
216 | | - struct fsl_dspi_dma *dma; |
---|
| 230 | + struct fsl_dspi_dma *dma; |
---|
| 231 | + |
---|
| 232 | + int oper_word_size; |
---|
| 233 | + int oper_bits_per_word; |
---|
| 234 | + |
---|
| 235 | + int words_in_flight; |
---|
| 236 | + |
---|
| 237 | + /* |
---|
| 238 | + * Offsets for CMD and TXDATA within SPI_PUSHR when accessed |
---|
| 239 | + * individually (in XSPI mode) |
---|
| 240 | + */ |
---|
| 241 | + int pushr_cmd; |
---|
| 242 | + int pushr_tx; |
---|
| 243 | + |
---|
| 244 | + void (*host_to_dev)(struct fsl_dspi *dspi, u32 *txdata); |
---|
| 245 | + void (*dev_to_host)(struct fsl_dspi *dspi, u32 rxdata); |
---|
217 | 246 | }; |
---|
218 | 247 | |
---|
| 248 | +static void dspi_native_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) |
---|
| 249 | +{ |
---|
| 250 | + switch (dspi->oper_word_size) { |
---|
| 251 | + case 1: |
---|
| 252 | + *txdata = *(u8 *)dspi->tx; |
---|
| 253 | + break; |
---|
| 254 | + case 2: |
---|
| 255 | + *txdata = *(u16 *)dspi->tx; |
---|
| 256 | + break; |
---|
| 257 | + case 4: |
---|
| 258 | + *txdata = *(u32 *)dspi->tx; |
---|
| 259 | + break; |
---|
| 260 | + } |
---|
| 261 | + dspi->tx += dspi->oper_word_size; |
---|
| 262 | +} |
---|
| 263 | + |
---|
| 264 | +static void dspi_native_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) |
---|
| 265 | +{ |
---|
| 266 | + switch (dspi->oper_word_size) { |
---|
| 267 | + case 1: |
---|
| 268 | + *(u8 *)dspi->rx = rxdata; |
---|
| 269 | + break; |
---|
| 270 | + case 2: |
---|
| 271 | + *(u16 *)dspi->rx = rxdata; |
---|
| 272 | + break; |
---|
| 273 | + case 4: |
---|
| 274 | + *(u32 *)dspi->rx = rxdata; |
---|
| 275 | + break; |
---|
| 276 | + } |
---|
| 277 | + dspi->rx += dspi->oper_word_size; |
---|
| 278 | +} |
---|
| 279 | + |
---|
| 280 | +static void dspi_8on32_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) |
---|
| 281 | +{ |
---|
| 282 | + *txdata = cpu_to_be32(*(u32 *)dspi->tx); |
---|
| 283 | + dspi->tx += sizeof(u32); |
---|
| 284 | +} |
---|
| 285 | + |
---|
| 286 | +static void dspi_8on32_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) |
---|
| 287 | +{ |
---|
| 288 | + *(u32 *)dspi->rx = be32_to_cpu(rxdata); |
---|
| 289 | + dspi->rx += sizeof(u32); |
---|
| 290 | +} |
---|
| 291 | + |
---|
| 292 | +static void dspi_8on16_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) |
---|
| 293 | +{ |
---|
| 294 | + *txdata = cpu_to_be16(*(u16 *)dspi->tx); |
---|
| 295 | + dspi->tx += sizeof(u16); |
---|
| 296 | +} |
---|
| 297 | + |
---|
| 298 | +static void dspi_8on16_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) |
---|
| 299 | +{ |
---|
| 300 | + *(u16 *)dspi->rx = be16_to_cpu(rxdata); |
---|
| 301 | + dspi->rx += sizeof(u16); |
---|
| 302 | +} |
---|
| 303 | + |
---|
| 304 | +static void dspi_16on32_host_to_dev(struct fsl_dspi *dspi, u32 *txdata) |
---|
| 305 | +{ |
---|
| 306 | + u16 hi = *(u16 *)dspi->tx; |
---|
| 307 | + u16 lo = *(u16 *)(dspi->tx + 2); |
---|
| 308 | + |
---|
| 309 | + *txdata = (u32)hi << 16 | lo; |
---|
| 310 | + dspi->tx += sizeof(u32); |
---|
| 311 | +} |
---|
| 312 | + |
---|
| 313 | +static void dspi_16on32_dev_to_host(struct fsl_dspi *dspi, u32 rxdata) |
---|
| 314 | +{ |
---|
| 315 | + u16 hi = rxdata & 0xffff; |
---|
| 316 | + u16 lo = rxdata >> 16; |
---|
| 317 | + |
---|
| 318 | + *(u16 *)dspi->rx = lo; |
---|
| 319 | + *(u16 *)(dspi->rx + 2) = hi; |
---|
| 320 | + dspi->rx += sizeof(u32); |
---|
| 321 | +} |
---|
| 322 | + |
---|
| 323 | +/* |
---|
| 324 | + * Pop one word from the TX buffer for pushing into the |
---|
| 325 | + * PUSHR register (TX FIFO) |
---|
| 326 | + */ |
---|
219 | 327 | static u32 dspi_pop_tx(struct fsl_dspi *dspi) |
---|
220 | 328 | { |
---|
221 | 329 | u32 txdata = 0; |
---|
222 | 330 | |
---|
223 | | - if (dspi->tx) { |
---|
224 | | - if (dspi->bytes_per_word == 1) |
---|
225 | | - txdata = *(u8 *)dspi->tx; |
---|
226 | | - else if (dspi->bytes_per_word == 2) |
---|
227 | | - txdata = *(u16 *)dspi->tx; |
---|
228 | | - else /* dspi->bytes_per_word == 4 */ |
---|
229 | | - txdata = *(u32 *)dspi->tx; |
---|
230 | | - dspi->tx += dspi->bytes_per_word; |
---|
231 | | - } |
---|
232 | | - dspi->len -= dspi->bytes_per_word; |
---|
| 331 | + if (dspi->tx) |
---|
| 332 | + dspi->host_to_dev(dspi, &txdata); |
---|
| 333 | + dspi->len -= dspi->oper_word_size; |
---|
233 | 334 | return txdata; |
---|
234 | 335 | } |
---|
235 | 336 | |
---|
| 337 | +/* Prepare one TX FIFO entry (txdata plus cmd) */ |
---|
236 | 338 | static u32 dspi_pop_tx_pushr(struct fsl_dspi *dspi) |
---|
237 | 339 | { |
---|
238 | 340 | u16 cmd = dspi->tx_cmd, data = dspi_pop_tx(dspi); |
---|
| 341 | + |
---|
| 342 | + if (spi_controller_is_slave(dspi->ctlr)) |
---|
| 343 | + return data; |
---|
239 | 344 | |
---|
240 | 345 | if (dspi->len > 0) |
---|
241 | 346 | cmd |= SPI_PUSHR_CMD_CONT; |
---|
242 | 347 | return cmd << 16 | data; |
---|
243 | 348 | } |
---|
244 | 349 | |
---|
| 350 | +/* Push one word to the RX buffer from the POPR register (RX FIFO) */ |
---|
245 | 351 | static void dspi_push_rx(struct fsl_dspi *dspi, u32 rxdata) |
---|
246 | 352 | { |
---|
247 | 353 | if (!dspi->rx) |
---|
248 | 354 | return; |
---|
249 | | - |
---|
250 | | - /* Mask of undefined bits */ |
---|
251 | | - rxdata &= (1 << dspi->bits_per_word) - 1; |
---|
252 | | - |
---|
253 | | - if (dspi->bytes_per_word == 1) |
---|
254 | | - *(u8 *)dspi->rx = rxdata; |
---|
255 | | - else if (dspi->bytes_per_word == 2) |
---|
256 | | - *(u16 *)dspi->rx = rxdata; |
---|
257 | | - else /* dspi->bytes_per_word == 4 */ |
---|
258 | | - *(u32 *)dspi->rx = rxdata; |
---|
259 | | - dspi->rx += dspi->bytes_per_word; |
---|
| 355 | + dspi->dev_to_host(dspi, rxdata); |
---|
260 | 356 | } |
---|
261 | 357 | |
---|
262 | 358 | static void dspi_tx_dma_callback(void *arg) |
---|
.. | .. |
---|
274 | 370 | int i; |
---|
275 | 371 | |
---|
276 | 372 | if (dspi->rx) { |
---|
277 | | - for (i = 0; i < dma->curr_xfer_len; i++) |
---|
| 373 | + for (i = 0; i < dspi->words_in_flight; i++) |
---|
278 | 374 | dspi_push_rx(dspi, dspi->dma->rx_dma_buf[i]); |
---|
279 | 375 | } |
---|
280 | 376 | |
---|
.. | .. |
---|
283 | 379 | |
---|
284 | 380 | static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi) |
---|
285 | 381 | { |
---|
286 | | - struct fsl_dspi_dma *dma = dspi->dma; |
---|
287 | 382 | struct device *dev = &dspi->pdev->dev; |
---|
| 383 | + struct fsl_dspi_dma *dma = dspi->dma; |
---|
288 | 384 | int time_left; |
---|
289 | 385 | int i; |
---|
290 | 386 | |
---|
291 | | - for (i = 0; i < dma->curr_xfer_len; i++) |
---|
| 387 | + for (i = 0; i < dspi->words_in_flight; i++) |
---|
292 | 388 | dspi->dma->tx_dma_buf[i] = dspi_pop_tx_pushr(dspi); |
---|
293 | 389 | |
---|
294 | 390 | dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx, |
---|
295 | 391 | dma->tx_dma_phys, |
---|
296 | | - dma->curr_xfer_len * |
---|
| 392 | + dspi->words_in_flight * |
---|
297 | 393 | DMA_SLAVE_BUSWIDTH_4_BYTES, |
---|
298 | 394 | DMA_MEM_TO_DEV, |
---|
299 | 395 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
---|
.. | .. |
---|
311 | 407 | |
---|
312 | 408 | dma->rx_desc = dmaengine_prep_slave_single(dma->chan_rx, |
---|
313 | 409 | dma->rx_dma_phys, |
---|
314 | | - dma->curr_xfer_len * |
---|
| 410 | + dspi->words_in_flight * |
---|
315 | 411 | DMA_SLAVE_BUSWIDTH_4_BYTES, |
---|
316 | 412 | DMA_DEV_TO_MEM, |
---|
317 | 413 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
---|
.. | .. |
---|
333 | 429 | dma_async_issue_pending(dma->chan_rx); |
---|
334 | 430 | dma_async_issue_pending(dma->chan_tx); |
---|
335 | 431 | |
---|
| 432 | + if (spi_controller_is_slave(dspi->ctlr)) { |
---|
| 433 | + wait_for_completion_interruptible(&dspi->dma->cmd_rx_complete); |
---|
| 434 | + return 0; |
---|
| 435 | + } |
---|
| 436 | + |
---|
336 | 437 | time_left = wait_for_completion_timeout(&dspi->dma->cmd_tx_complete, |
---|
337 | | - DMA_COMPLETION_TIMEOUT); |
---|
| 438 | + DMA_COMPLETION_TIMEOUT); |
---|
338 | 439 | if (time_left == 0) { |
---|
339 | 440 | dev_err(dev, "DMA tx timeout\n"); |
---|
340 | 441 | dmaengine_terminate_all(dma->chan_tx); |
---|
.. | .. |
---|
343 | 444 | } |
---|
344 | 445 | |
---|
345 | 446 | time_left = wait_for_completion_timeout(&dspi->dma->cmd_rx_complete, |
---|
346 | | - DMA_COMPLETION_TIMEOUT); |
---|
| 447 | + DMA_COMPLETION_TIMEOUT); |
---|
347 | 448 | if (time_left == 0) { |
---|
348 | 449 | dev_err(dev, "DMA rx timeout\n"); |
---|
349 | 450 | dmaengine_terminate_all(dma->chan_tx); |
---|
.. | .. |
---|
354 | 455 | return 0; |
---|
355 | 456 | } |
---|
356 | 457 | |
---|
| 458 | +static void dspi_setup_accel(struct fsl_dspi *dspi); |
---|
| 459 | + |
---|
357 | 460 | static int dspi_dma_xfer(struct fsl_dspi *dspi) |
---|
358 | 461 | { |
---|
359 | | - struct fsl_dspi_dma *dma = dspi->dma; |
---|
360 | | - struct device *dev = &dspi->pdev->dev; |
---|
361 | 462 | struct spi_message *message = dspi->cur_msg; |
---|
362 | | - int curr_remaining_bytes; |
---|
363 | | - int bytes_per_buffer; |
---|
| 463 | + struct device *dev = &dspi->pdev->dev; |
---|
364 | 464 | int ret = 0; |
---|
365 | 465 | |
---|
366 | | - curr_remaining_bytes = dspi->len; |
---|
367 | | - bytes_per_buffer = DSPI_DMA_BUFSIZE / DSPI_FIFO_SIZE; |
---|
368 | | - while (curr_remaining_bytes) { |
---|
369 | | - /* Check if current transfer fits the DMA buffer */ |
---|
370 | | - dma->curr_xfer_len = curr_remaining_bytes |
---|
371 | | - / dspi->bytes_per_word; |
---|
372 | | - if (dma->curr_xfer_len > bytes_per_buffer) |
---|
373 | | - dma->curr_xfer_len = bytes_per_buffer; |
---|
| 466 | + /* |
---|
| 467 | + * dspi->len gets decremented by dspi_pop_tx_pushr in |
---|
| 468 | + * dspi_next_xfer_dma_submit |
---|
| 469 | + */ |
---|
| 470 | + while (dspi->len) { |
---|
| 471 | + /* Figure out operational bits-per-word for this chunk */ |
---|
| 472 | + dspi_setup_accel(dspi); |
---|
| 473 | + |
---|
| 474 | + dspi->words_in_flight = dspi->len / dspi->oper_word_size; |
---|
| 475 | + if (dspi->words_in_flight > dspi->devtype_data->fifo_size) |
---|
| 476 | + dspi->words_in_flight = dspi->devtype_data->fifo_size; |
---|
| 477 | + |
---|
| 478 | + message->actual_length += dspi->words_in_flight * |
---|
| 479 | + dspi->oper_word_size; |
---|
374 | 480 | |
---|
375 | 481 | ret = dspi_next_xfer_dma_submit(dspi); |
---|
376 | 482 | if (ret) { |
---|
377 | 483 | dev_err(dev, "DMA transfer failed\n"); |
---|
378 | | - goto exit; |
---|
379 | | - |
---|
380 | | - } else { |
---|
381 | | - const int len = |
---|
382 | | - dma->curr_xfer_len * dspi->bytes_per_word; |
---|
383 | | - curr_remaining_bytes -= len; |
---|
384 | | - message->actual_length += len; |
---|
385 | | - if (curr_remaining_bytes < 0) |
---|
386 | | - curr_remaining_bytes = 0; |
---|
| 484 | + break; |
---|
387 | 485 | } |
---|
388 | 486 | } |
---|
389 | 487 | |
---|
390 | | -exit: |
---|
391 | 488 | return ret; |
---|
392 | 489 | } |
---|
393 | 490 | |
---|
394 | 491 | static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr) |
---|
395 | 492 | { |
---|
396 | | - struct fsl_dspi_dma *dma; |
---|
397 | | - struct dma_slave_config cfg; |
---|
| 493 | + int dma_bufsize = dspi->devtype_data->fifo_size * 2; |
---|
398 | 494 | struct device *dev = &dspi->pdev->dev; |
---|
| 495 | + struct dma_slave_config cfg; |
---|
| 496 | + struct fsl_dspi_dma *dma; |
---|
399 | 497 | int ret; |
---|
400 | 498 | |
---|
401 | 499 | dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); |
---|
402 | 500 | if (!dma) |
---|
403 | 501 | return -ENOMEM; |
---|
404 | 502 | |
---|
405 | | - dma->chan_rx = dma_request_slave_channel(dev, "rx"); |
---|
406 | | - if (!dma->chan_rx) { |
---|
| 503 | + dma->chan_rx = dma_request_chan(dev, "rx"); |
---|
| 504 | + if (IS_ERR(dma->chan_rx)) { |
---|
407 | 505 | dev_err(dev, "rx dma channel not available\n"); |
---|
408 | | - ret = -ENODEV; |
---|
| 506 | + ret = PTR_ERR(dma->chan_rx); |
---|
409 | 507 | return ret; |
---|
410 | 508 | } |
---|
411 | 509 | |
---|
412 | | - dma->chan_tx = dma_request_slave_channel(dev, "tx"); |
---|
413 | | - if (!dma->chan_tx) { |
---|
| 510 | + dma->chan_tx = dma_request_chan(dev, "tx"); |
---|
| 511 | + if (IS_ERR(dma->chan_tx)) { |
---|
414 | 512 | dev_err(dev, "tx dma channel not available\n"); |
---|
415 | | - ret = -ENODEV; |
---|
| 513 | + ret = PTR_ERR(dma->chan_tx); |
---|
416 | 514 | goto err_tx_channel; |
---|
417 | 515 | } |
---|
418 | 516 | |
---|
419 | | - dma->tx_dma_buf = dma_alloc_coherent(dev, DSPI_DMA_BUFSIZE, |
---|
420 | | - &dma->tx_dma_phys, GFP_KERNEL); |
---|
| 517 | + dma->tx_dma_buf = dma_alloc_coherent(dma->chan_tx->device->dev, |
---|
| 518 | + dma_bufsize, &dma->tx_dma_phys, |
---|
| 519 | + GFP_KERNEL); |
---|
421 | 520 | if (!dma->tx_dma_buf) { |
---|
422 | 521 | ret = -ENOMEM; |
---|
423 | 522 | goto err_tx_dma_buf; |
---|
424 | 523 | } |
---|
425 | 524 | |
---|
426 | | - dma->rx_dma_buf = dma_alloc_coherent(dev, DSPI_DMA_BUFSIZE, |
---|
427 | | - &dma->rx_dma_phys, GFP_KERNEL); |
---|
| 525 | + dma->rx_dma_buf = dma_alloc_coherent(dma->chan_rx->device->dev, |
---|
| 526 | + dma_bufsize, &dma->rx_dma_phys, |
---|
| 527 | + GFP_KERNEL); |
---|
428 | 528 | if (!dma->rx_dma_buf) { |
---|
429 | 529 | ret = -ENOMEM; |
---|
430 | 530 | goto err_rx_dma_buf; |
---|
.. | .. |
---|
461 | 561 | return 0; |
---|
462 | 562 | |
---|
463 | 563 | err_slave_config: |
---|
464 | | - dma_free_coherent(dev, DSPI_DMA_BUFSIZE, |
---|
465 | | - dma->rx_dma_buf, dma->rx_dma_phys); |
---|
| 564 | + dma_free_coherent(dma->chan_rx->device->dev, |
---|
| 565 | + dma_bufsize, dma->rx_dma_buf, dma->rx_dma_phys); |
---|
466 | 566 | err_rx_dma_buf: |
---|
467 | | - dma_free_coherent(dev, DSPI_DMA_BUFSIZE, |
---|
468 | | - dma->tx_dma_buf, dma->tx_dma_phys); |
---|
| 567 | + dma_free_coherent(dma->chan_tx->device->dev, |
---|
| 568 | + dma_bufsize, dma->tx_dma_buf, dma->tx_dma_phys); |
---|
469 | 569 | err_tx_dma_buf: |
---|
470 | 570 | dma_release_channel(dma->chan_tx); |
---|
471 | 571 | err_tx_channel: |
---|
.. | .. |
---|
479 | 579 | |
---|
480 | 580 | static void dspi_release_dma(struct fsl_dspi *dspi) |
---|
481 | 581 | { |
---|
| 582 | + int dma_bufsize = dspi->devtype_data->fifo_size * 2; |
---|
482 | 583 | struct fsl_dspi_dma *dma = dspi->dma; |
---|
483 | | - struct device *dev = &dspi->pdev->dev; |
---|
484 | 584 | |
---|
485 | | - if (dma) { |
---|
486 | | - if (dma->chan_tx) { |
---|
487 | | - dma_unmap_single(dev, dma->tx_dma_phys, |
---|
488 | | - DSPI_DMA_BUFSIZE, DMA_TO_DEVICE); |
---|
489 | | - dma_release_channel(dma->chan_tx); |
---|
490 | | - } |
---|
| 585 | + if (!dma) |
---|
| 586 | + return; |
---|
491 | 587 | |
---|
492 | | - if (dma->chan_rx) { |
---|
493 | | - dma_unmap_single(dev, dma->rx_dma_phys, |
---|
494 | | - DSPI_DMA_BUFSIZE, DMA_FROM_DEVICE); |
---|
495 | | - dma_release_channel(dma->chan_rx); |
---|
496 | | - } |
---|
| 588 | + if (dma->chan_tx) { |
---|
| 589 | + dma_free_coherent(dma->chan_tx->device->dev, dma_bufsize, |
---|
| 590 | + dma->tx_dma_buf, dma->tx_dma_phys); |
---|
| 591 | + dma_release_channel(dma->chan_tx); |
---|
| 592 | + } |
---|
| 593 | + |
---|
| 594 | + if (dma->chan_rx) { |
---|
| 595 | + dma_free_coherent(dma->chan_rx->device->dev, dma_bufsize, |
---|
| 596 | + dma->rx_dma_buf, dma->rx_dma_phys); |
---|
| 597 | + dma_release_channel(dma->chan_rx); |
---|
497 | 598 | } |
---|
498 | 599 | } |
---|
499 | 600 | |
---|
500 | 601 | static void hz_to_spi_baud(char *pbr, char *br, int speed_hz, |
---|
501 | | - unsigned long clkrate) |
---|
| 602 | + unsigned long clkrate) |
---|
502 | 603 | { |
---|
503 | 604 | /* Valid baud rate pre-scaler values */ |
---|
504 | 605 | int pbr_tbl[4] = {2, 3, 5, 7}; |
---|
505 | 606 | int brs[16] = { 2, 4, 6, 8, |
---|
506 | | - 16, 32, 64, 128, |
---|
507 | | - 256, 512, 1024, 2048, |
---|
508 | | - 4096, 8192, 16384, 32768 }; |
---|
| 607 | + 16, 32, 64, 128, |
---|
| 608 | + 256, 512, 1024, 2048, |
---|
| 609 | + 4096, 8192, 16384, 32768 }; |
---|
509 | 610 | int scale_needed, scale, minscale = INT_MAX; |
---|
510 | 611 | int i, j; |
---|
511 | 612 | |
---|
.. | .. |
---|
535 | 636 | } |
---|
536 | 637 | |
---|
537 | 638 | static void ns_delay_scale(char *psc, char *sc, int delay_ns, |
---|
538 | | - unsigned long clkrate) |
---|
| 639 | + unsigned long clkrate) |
---|
539 | 640 | { |
---|
540 | | - int pscale_tbl[4] = {1, 3, 5, 7}; |
---|
541 | 641 | int scale_needed, scale, minscale = INT_MAX; |
---|
542 | | - int i, j; |
---|
| 642 | + int pscale_tbl[4] = {1, 3, 5, 7}; |
---|
543 | 643 | u32 remainder; |
---|
| 644 | + int i, j; |
---|
544 | 645 | |
---|
545 | 646 | scale_needed = div_u64_rem((u64)delay_ns * clkrate, NSEC_PER_SEC, |
---|
546 | | - &remainder); |
---|
| 647 | + &remainder); |
---|
547 | 648 | if (remainder) |
---|
548 | 649 | scale_needed++; |
---|
549 | 650 | |
---|
.. | .. |
---|
568 | 669 | } |
---|
569 | 670 | } |
---|
570 | 671 | |
---|
571 | | -static void fifo_write(struct fsl_dspi *dspi) |
---|
| 672 | +static void dspi_pushr_cmd_write(struct fsl_dspi *dspi, u16 cmd) |
---|
572 | 673 | { |
---|
573 | | - regmap_write(dspi->regmap, SPI_PUSHR, dspi_pop_tx_pushr(dspi)); |
---|
574 | | -} |
---|
575 | | - |
---|
576 | | -static void cmd_fifo_write(struct fsl_dspi *dspi) |
---|
577 | | -{ |
---|
578 | | - u16 cmd = dspi->tx_cmd; |
---|
579 | | - |
---|
580 | | - if (dspi->len > 0) |
---|
| 674 | + /* |
---|
| 675 | + * The only time when the PCS doesn't need continuation after this word |
---|
| 676 | + * is when it's last. We need to look ahead, because we actually call |
---|
| 677 | + * dspi_pop_tx (the function that decrements dspi->len) _after_ |
---|
| 678 | + * dspi_pushr_cmd_write with XSPI mode. As for how much in advance? One |
---|
| 679 | + * word is enough. If there's more to transmit than that, |
---|
| 680 | + * dspi_xspi_write will know to split the FIFO writes in 2, and |
---|
| 681 | + * generate a new PUSHR command with the final word that will have PCS |
---|
| 682 | + * deasserted (not continued) here. |
---|
| 683 | + */ |
---|
| 684 | + if (dspi->len > dspi->oper_word_size) |
---|
581 | 685 | cmd |= SPI_PUSHR_CMD_CONT; |
---|
582 | | - regmap_write(dspi->regmap_pushr, PUSHR_CMD, cmd); |
---|
| 686 | + regmap_write(dspi->regmap_pushr, dspi->pushr_cmd, cmd); |
---|
583 | 687 | } |
---|
584 | 688 | |
---|
585 | | -static void tx_fifo_write(struct fsl_dspi *dspi, u16 txdata) |
---|
| 689 | +static void dspi_pushr_txdata_write(struct fsl_dspi *dspi, u16 txdata) |
---|
586 | 690 | { |
---|
587 | | - regmap_write(dspi->regmap_pushr, PUSHR_TX, txdata); |
---|
| 691 | + regmap_write(dspi->regmap_pushr, dspi->pushr_tx, txdata); |
---|
588 | 692 | } |
---|
589 | 693 | |
---|
590 | | -static void dspi_tcfq_write(struct fsl_dspi *dspi) |
---|
| 694 | +static void dspi_xspi_fifo_write(struct fsl_dspi *dspi, int num_words) |
---|
591 | 695 | { |
---|
592 | | - /* Clear transfer count */ |
---|
593 | | - dspi->tx_cmd |= SPI_PUSHR_CMD_CTCNT; |
---|
| 696 | + int num_bytes = num_words * dspi->oper_word_size; |
---|
| 697 | + u16 tx_cmd = dspi->tx_cmd; |
---|
594 | 698 | |
---|
595 | | - if (dspi->devtype_data->xspi_mode && dspi->bits_per_word > 16) { |
---|
596 | | - /* Write two TX FIFO entries first, and then the corresponding |
---|
597 | | - * CMD FIFO entry. |
---|
598 | | - */ |
---|
| 699 | + /* |
---|
| 700 | + * If the PCS needs to de-assert (i.e. we're at the end of the buffer |
---|
| 701 | + * and cs_change does not want the PCS to stay on), then we need a new |
---|
| 702 | + * PUSHR command, since this one (for the body of the buffer) |
---|
| 703 | + * necessarily has the CONT bit set. |
---|
| 704 | + * So send one word less during this go, to force a split and a command |
---|
| 705 | + * with a single word next time, when CONT will be unset. |
---|
| 706 | + */ |
---|
| 707 | + if (!(dspi->tx_cmd & SPI_PUSHR_CMD_CONT) && num_bytes == dspi->len) |
---|
| 708 | + tx_cmd |= SPI_PUSHR_CMD_EOQ; |
---|
| 709 | + |
---|
| 710 | + /* Update CTARE */ |
---|
| 711 | + regmap_write(dspi->regmap, SPI_CTARE(0), |
---|
| 712 | + SPI_FRAME_EBITS(dspi->oper_bits_per_word) | |
---|
| 713 | + SPI_CTARE_DTCP(num_words)); |
---|
| 714 | + |
---|
| 715 | + /* |
---|
| 716 | + * Write the CMD FIFO entry first, and then the two |
---|
| 717 | + * corresponding TX FIFO entries (or one...). |
---|
| 718 | + */ |
---|
| 719 | + dspi_pushr_cmd_write(dspi, tx_cmd); |
---|
| 720 | + |
---|
| 721 | + /* Fill TX FIFO with as many transfers as possible */ |
---|
| 722 | + while (num_words--) { |
---|
599 | 723 | u32 data = dspi_pop_tx(dspi); |
---|
600 | 724 | |
---|
601 | | - if (dspi->cur_chip->ctar_val & SPI_CTAR_LSBFE(1)) { |
---|
602 | | - /* LSB */ |
---|
603 | | - tx_fifo_write(dspi, data & 0xFFFF); |
---|
604 | | - tx_fifo_write(dspi, data >> 16); |
---|
605 | | - } else { |
---|
606 | | - /* MSB */ |
---|
607 | | - tx_fifo_write(dspi, data >> 16); |
---|
608 | | - tx_fifo_write(dspi, data & 0xFFFF); |
---|
609 | | - } |
---|
610 | | - cmd_fifo_write(dspi); |
---|
611 | | - } else { |
---|
612 | | - /* Write one entry to both TX FIFO and CMD FIFO |
---|
613 | | - * simultaneously. |
---|
614 | | - */ |
---|
615 | | - fifo_write(dspi); |
---|
| 725 | + dspi_pushr_txdata_write(dspi, data & 0xFFFF); |
---|
| 726 | + if (dspi->oper_bits_per_word > 16) |
---|
| 727 | + dspi_pushr_txdata_write(dspi, data >> 16); |
---|
616 | 728 | } |
---|
617 | 729 | } |
---|
618 | 730 | |
---|
619 | | -static u32 fifo_read(struct fsl_dspi *dspi) |
---|
| 731 | +static u32 dspi_popr_read(struct fsl_dspi *dspi) |
---|
620 | 732 | { |
---|
621 | 733 | u32 rxdata = 0; |
---|
622 | 734 | |
---|
.. | .. |
---|
624 | 736 | return rxdata; |
---|
625 | 737 | } |
---|
626 | 738 | |
---|
627 | | -static void dspi_tcfq_read(struct fsl_dspi *dspi) |
---|
| 739 | +static void dspi_fifo_read(struct fsl_dspi *dspi) |
---|
628 | 740 | { |
---|
629 | | - dspi_push_rx(dspi, fifo_read(dspi)); |
---|
| 741 | + int num_fifo_entries = dspi->words_in_flight; |
---|
| 742 | + |
---|
| 743 | + /* Read one FIFO entry and push to rx buffer */ |
---|
| 744 | + while (num_fifo_entries--) |
---|
| 745 | + dspi_push_rx(dspi, dspi_popr_read(dspi)); |
---|
630 | 746 | } |
---|
631 | 747 | |
---|
632 | | -static void dspi_eoq_write(struct fsl_dspi *dspi) |
---|
| 748 | +static void dspi_setup_accel(struct fsl_dspi *dspi) |
---|
633 | 749 | { |
---|
634 | | - int fifo_size = DSPI_FIFO_SIZE; |
---|
635 | | - u16 xfer_cmd = dspi->tx_cmd; |
---|
| 750 | + struct spi_transfer *xfer = dspi->cur_transfer; |
---|
| 751 | + bool odd = !!(dspi->len & 1); |
---|
636 | 752 | |
---|
637 | | - /* Fill TX FIFO with as many transfers as possible */ |
---|
638 | | - while (dspi->len && fifo_size--) { |
---|
639 | | - dspi->tx_cmd = xfer_cmd; |
---|
640 | | - /* Request EOQF for last transfer in FIFO */ |
---|
641 | | - if (dspi->len == dspi->bytes_per_word || fifo_size == 0) |
---|
642 | | - dspi->tx_cmd |= SPI_PUSHR_CMD_EOQ; |
---|
643 | | - /* Clear transfer count for first transfer in FIFO */ |
---|
644 | | - if (fifo_size == (DSPI_FIFO_SIZE - 1)) |
---|
645 | | - dspi->tx_cmd |= SPI_PUSHR_CMD_CTCNT; |
---|
646 | | - /* Write combined TX FIFO and CMD FIFO entry */ |
---|
647 | | - fifo_write(dspi); |
---|
| 753 | + /* No accel for frames not multiple of 8 bits at the moment */ |
---|
| 754 | + if (xfer->bits_per_word % 8) |
---|
| 755 | + goto no_accel; |
---|
| 756 | + |
---|
| 757 | + if (!odd && dspi->len <= dspi->devtype_data->fifo_size * 2) { |
---|
| 758 | + dspi->oper_bits_per_word = 16; |
---|
| 759 | + } else if (odd && dspi->len <= dspi->devtype_data->fifo_size) { |
---|
| 760 | + dspi->oper_bits_per_word = 8; |
---|
| 761 | + } else { |
---|
| 762 | + /* Start off with maximum supported by hardware */ |
---|
| 763 | + if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) |
---|
| 764 | + dspi->oper_bits_per_word = 32; |
---|
| 765 | + else |
---|
| 766 | + dspi->oper_bits_per_word = 16; |
---|
| 767 | + |
---|
| 768 | + /* |
---|
| 769 | + * And go down only if the buffer can't be sent with |
---|
| 770 | + * words this big |
---|
| 771 | + */ |
---|
| 772 | + do { |
---|
| 773 | + if (dspi->len >= DIV_ROUND_UP(dspi->oper_bits_per_word, 8)) |
---|
| 774 | + break; |
---|
| 775 | + |
---|
| 776 | + dspi->oper_bits_per_word /= 2; |
---|
| 777 | + } while (dspi->oper_bits_per_word > 8); |
---|
648 | 778 | } |
---|
| 779 | + |
---|
| 780 | + if (xfer->bits_per_word == 8 && dspi->oper_bits_per_word == 32) { |
---|
| 781 | + dspi->dev_to_host = dspi_8on32_dev_to_host; |
---|
| 782 | + dspi->host_to_dev = dspi_8on32_host_to_dev; |
---|
| 783 | + } else if (xfer->bits_per_word == 8 && dspi->oper_bits_per_word == 16) { |
---|
| 784 | + dspi->dev_to_host = dspi_8on16_dev_to_host; |
---|
| 785 | + dspi->host_to_dev = dspi_8on16_host_to_dev; |
---|
| 786 | + } else if (xfer->bits_per_word == 16 && dspi->oper_bits_per_word == 32) { |
---|
| 787 | + dspi->dev_to_host = dspi_16on32_dev_to_host; |
---|
| 788 | + dspi->host_to_dev = dspi_16on32_host_to_dev; |
---|
| 789 | + } else { |
---|
| 790 | +no_accel: |
---|
| 791 | + dspi->dev_to_host = dspi_native_dev_to_host; |
---|
| 792 | + dspi->host_to_dev = dspi_native_host_to_dev; |
---|
| 793 | + dspi->oper_bits_per_word = xfer->bits_per_word; |
---|
| 794 | + } |
---|
| 795 | + |
---|
| 796 | + dspi->oper_word_size = DIV_ROUND_UP(dspi->oper_bits_per_word, 8); |
---|
| 797 | + |
---|
| 798 | + /* |
---|
| 799 | + * Update CTAR here (code is common for XSPI and DMA modes). |
---|
| 800 | + * We will update CTARE in the portion specific to XSPI, when we |
---|
| 801 | + * also know the preload value (DTCP). |
---|
| 802 | + */ |
---|
| 803 | + regmap_write(dspi->regmap, SPI_CTAR(0), |
---|
| 804 | + dspi->cur_chip->ctar_val | |
---|
| 805 | + SPI_FRAME_BITS(dspi->oper_bits_per_word)); |
---|
649 | 806 | } |
---|
650 | 807 | |
---|
651 | | -static void dspi_eoq_read(struct fsl_dspi *dspi) |
---|
| 808 | +static void dspi_fifo_write(struct fsl_dspi *dspi) |
---|
652 | 809 | { |
---|
653 | | - int fifo_size = DSPI_FIFO_SIZE; |
---|
| 810 | + int num_fifo_entries = dspi->devtype_data->fifo_size; |
---|
| 811 | + struct spi_transfer *xfer = dspi->cur_transfer; |
---|
| 812 | + struct spi_message *msg = dspi->cur_msg; |
---|
| 813 | + int num_words, num_bytes; |
---|
654 | 814 | |
---|
655 | | - /* Read one FIFO entry at and push to rx buffer */ |
---|
656 | | - while ((dspi->rx < dspi->rx_end) && fifo_size--) |
---|
657 | | - dspi_push_rx(dspi, fifo_read(dspi)); |
---|
| 815 | + dspi_setup_accel(dspi); |
---|
| 816 | + |
---|
| 817 | + /* In XSPI mode each 32-bit word occupies 2 TX FIFO entries */ |
---|
| 818 | + if (dspi->oper_word_size == 4) |
---|
| 819 | + num_fifo_entries /= 2; |
---|
| 820 | + |
---|
| 821 | + /* |
---|
| 822 | + * Integer division intentionally trims off odd (or non-multiple of 4) |
---|
| 823 | + * numbers of bytes at the end of the buffer, which will be sent next |
---|
| 824 | + * time using a smaller oper_word_size. |
---|
| 825 | + */ |
---|
| 826 | + num_words = dspi->len / dspi->oper_word_size; |
---|
| 827 | + if (num_words > num_fifo_entries) |
---|
| 828 | + num_words = num_fifo_entries; |
---|
| 829 | + |
---|
| 830 | + /* Update total number of bytes that were transferred */ |
---|
| 831 | + num_bytes = num_words * dspi->oper_word_size; |
---|
| 832 | + msg->actual_length += num_bytes; |
---|
| 833 | + dspi->progress += num_bytes / DIV_ROUND_UP(xfer->bits_per_word, 8); |
---|
| 834 | + |
---|
| 835 | + /* |
---|
| 836 | + * Update shared variable for use in the next interrupt (both in |
---|
| 837 | + * dspi_fifo_read and in dspi_fifo_write). |
---|
| 838 | + */ |
---|
| 839 | + dspi->words_in_flight = num_words; |
---|
| 840 | + |
---|
| 841 | + spi_take_timestamp_pre(dspi->ctlr, xfer, dspi->progress, !dspi->irq); |
---|
| 842 | + |
---|
| 843 | + dspi_xspi_fifo_write(dspi, num_words); |
---|
| 844 | + /* |
---|
| 845 | + * Everything after this point is in a potential race with the next |
---|
| 846 | + * interrupt, so we must never use dspi->words_in_flight again since it |
---|
| 847 | + * might already be modified by the next dspi_fifo_write. |
---|
| 848 | + */ |
---|
| 849 | + |
---|
| 850 | + spi_take_timestamp_post(dspi->ctlr, dspi->cur_transfer, |
---|
| 851 | + dspi->progress, !dspi->irq); |
---|
658 | 852 | } |
---|
659 | 853 | |
---|
660 | | -static int dspi_transfer_one_message(struct spi_master *master, |
---|
661 | | - struct spi_message *message) |
---|
| 854 | +static int dspi_rxtx(struct fsl_dspi *dspi) |
---|
662 | 855 | { |
---|
663 | | - struct fsl_dspi *dspi = spi_master_get_devdata(master); |
---|
| 856 | + dspi_fifo_read(dspi); |
---|
| 857 | + |
---|
| 858 | + if (!dspi->len) |
---|
| 859 | + /* Success! */ |
---|
| 860 | + return 0; |
---|
| 861 | + |
---|
| 862 | + dspi_fifo_write(dspi); |
---|
| 863 | + |
---|
| 864 | + return -EINPROGRESS; |
---|
| 865 | +} |
---|
| 866 | + |
---|
| 867 | +static int dspi_poll(struct fsl_dspi *dspi) |
---|
| 868 | +{ |
---|
| 869 | + int tries = 1000; |
---|
| 870 | + u32 spi_sr; |
---|
| 871 | + |
---|
| 872 | + do { |
---|
| 873 | + regmap_read(dspi->regmap, SPI_SR, &spi_sr); |
---|
| 874 | + regmap_write(dspi->regmap, SPI_SR, spi_sr); |
---|
| 875 | + |
---|
| 876 | + if (spi_sr & SPI_SR_CMDTCF) |
---|
| 877 | + break; |
---|
| 878 | + } while (--tries); |
---|
| 879 | + |
---|
| 880 | + if (!tries) |
---|
| 881 | + return -ETIMEDOUT; |
---|
| 882 | + |
---|
| 883 | + return dspi_rxtx(dspi); |
---|
| 884 | +} |
---|
| 885 | + |
---|
| 886 | +static irqreturn_t dspi_interrupt(int irq, void *dev_id) |
---|
| 887 | +{ |
---|
| 888 | + struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; |
---|
| 889 | + u32 spi_sr; |
---|
| 890 | + |
---|
| 891 | + regmap_read(dspi->regmap, SPI_SR, &spi_sr); |
---|
| 892 | + regmap_write(dspi->regmap, SPI_SR, spi_sr); |
---|
| 893 | + |
---|
| 894 | + if (!(spi_sr & SPI_SR_CMDTCF)) |
---|
| 895 | + return IRQ_NONE; |
---|
| 896 | + |
---|
| 897 | + if (dspi_rxtx(dspi) == 0) |
---|
| 898 | + complete(&dspi->xfer_done); |
---|
| 899 | + |
---|
| 900 | + return IRQ_HANDLED; |
---|
| 901 | +} |
---|
| 902 | + |
---|
| 903 | +static int dspi_transfer_one_message(struct spi_controller *ctlr, |
---|
| 904 | + struct spi_message *message) |
---|
| 905 | +{ |
---|
| 906 | + struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr); |
---|
664 | 907 | struct spi_device *spi = message->spi; |
---|
665 | 908 | struct spi_transfer *transfer; |
---|
666 | 909 | int status = 0; |
---|
667 | | - enum dspi_trans_mode trans_mode; |
---|
668 | 910 | |
---|
669 | 911 | message->actual_length = 0; |
---|
670 | 912 | |
---|
.. | .. |
---|
674 | 916 | dspi->cur_chip = spi_get_ctldata(spi); |
---|
675 | 917 | /* Prepare command word for CMD FIFO */ |
---|
676 | 918 | dspi->tx_cmd = SPI_PUSHR_CMD_CTAS(0) | |
---|
677 | | - SPI_PUSHR_CMD_PCS(spi->chip_select); |
---|
| 919 | + SPI_PUSHR_CMD_PCS(spi->chip_select); |
---|
678 | 920 | if (list_is_last(&dspi->cur_transfer->transfer_list, |
---|
679 | 921 | &dspi->cur_msg->transfers)) { |
---|
680 | 922 | /* Leave PCS activated after last transfer when |
---|
.. | .. |
---|
692 | 934 | dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; |
---|
693 | 935 | } |
---|
694 | 936 | |
---|
695 | | - dspi->void_write_data = dspi->cur_chip->void_write_data; |
---|
696 | | - |
---|
697 | 937 | dspi->tx = transfer->tx_buf; |
---|
698 | 938 | dspi->rx = transfer->rx_buf; |
---|
699 | | - dspi->rx_end = dspi->rx + transfer->len; |
---|
700 | 939 | dspi->len = transfer->len; |
---|
701 | | - /* Validated transfer specific frame size (defaults applied) */ |
---|
702 | | - dspi->bits_per_word = transfer->bits_per_word; |
---|
703 | | - if (transfer->bits_per_word <= 8) |
---|
704 | | - dspi->bytes_per_word = 1; |
---|
705 | | - else if (transfer->bits_per_word <= 16) |
---|
706 | | - dspi->bytes_per_word = 2; |
---|
707 | | - else |
---|
708 | | - dspi->bytes_per_word = 4; |
---|
| 940 | + dspi->progress = 0; |
---|
709 | 941 | |
---|
710 | 942 | regmap_update_bits(dspi->regmap, SPI_MCR, |
---|
711 | 943 | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF, |
---|
712 | 944 | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF); |
---|
713 | | - regmap_write(dspi->regmap, SPI_CTAR(0), |
---|
714 | | - dspi->cur_chip->ctar_val | |
---|
715 | | - SPI_FRAME_BITS(transfer->bits_per_word)); |
---|
716 | | - if (dspi->devtype_data->xspi_mode) |
---|
717 | | - regmap_write(dspi->regmap, SPI_CTARE(0), |
---|
718 | | - SPI_FRAME_EBITS(transfer->bits_per_word) |
---|
719 | | - | SPI_CTARE_DTCP(1)); |
---|
720 | 945 | |
---|
721 | | - trans_mode = dspi->devtype_data->trans_mode; |
---|
722 | | - switch (trans_mode) { |
---|
723 | | - case DSPI_EOQ_MODE: |
---|
724 | | - regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE); |
---|
725 | | - dspi_eoq_write(dspi); |
---|
726 | | - break; |
---|
727 | | - case DSPI_TCFQ_MODE: |
---|
728 | | - regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_TCFQE); |
---|
729 | | - dspi_tcfq_write(dspi); |
---|
730 | | - break; |
---|
731 | | - case DSPI_DMA_MODE: |
---|
732 | | - regmap_write(dspi->regmap, SPI_RSER, |
---|
733 | | - SPI_RSER_TFFFE | SPI_RSER_TFFFD | |
---|
734 | | - SPI_RSER_RFDFE | SPI_RSER_RFDFD); |
---|
| 946 | + spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, |
---|
| 947 | + dspi->progress, !dspi->irq); |
---|
| 948 | + |
---|
| 949 | + if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { |
---|
735 | 950 | status = dspi_dma_xfer(dspi); |
---|
| 951 | + } else { |
---|
| 952 | + dspi_fifo_write(dspi); |
---|
| 953 | + |
---|
| 954 | + if (dspi->irq) { |
---|
| 955 | + wait_for_completion(&dspi->xfer_done); |
---|
| 956 | + reinit_completion(&dspi->xfer_done); |
---|
| 957 | + } else { |
---|
| 958 | + do { |
---|
| 959 | + status = dspi_poll(dspi); |
---|
| 960 | + } while (status == -EINPROGRESS); |
---|
| 961 | + } |
---|
| 962 | + } |
---|
| 963 | + if (status) |
---|
736 | 964 | break; |
---|
737 | | - default: |
---|
738 | | - dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", |
---|
739 | | - trans_mode); |
---|
740 | | - status = -EINVAL; |
---|
741 | | - goto out; |
---|
742 | | - } |
---|
743 | 965 | |
---|
744 | | - if (trans_mode != DSPI_DMA_MODE) { |
---|
745 | | - if (wait_event_interruptible(dspi->waitq, |
---|
746 | | - dspi->waitflags)) |
---|
747 | | - dev_err(&dspi->pdev->dev, |
---|
748 | | - "wait transfer complete fail!\n"); |
---|
749 | | - dspi->waitflags = 0; |
---|
750 | | - } |
---|
751 | | - |
---|
752 | | - if (transfer->delay_usecs) |
---|
753 | | - udelay(transfer->delay_usecs); |
---|
| 966 | + spi_transfer_delay_exec(transfer); |
---|
754 | 967 | } |
---|
755 | 968 | |
---|
756 | | -out: |
---|
757 | 969 | message->status = status; |
---|
758 | | - spi_finalize_current_message(master); |
---|
| 970 | + spi_finalize_current_message(ctlr); |
---|
759 | 971 | |
---|
760 | 972 | return status; |
---|
761 | 973 | } |
---|
762 | 974 | |
---|
763 | 975 | static int dspi_setup(struct spi_device *spi) |
---|
764 | 976 | { |
---|
765 | | - struct chip_data *chip; |
---|
766 | | - struct fsl_dspi *dspi = spi_master_get_devdata(spi->master); |
---|
767 | | - struct fsl_dspi_platform_data *pdata; |
---|
768 | | - u32 cs_sck_delay = 0, sck_cs_delay = 0; |
---|
| 977 | + struct fsl_dspi *dspi = spi_controller_get_devdata(spi->controller); |
---|
| 978 | + u32 period_ns = DIV_ROUND_UP(NSEC_PER_SEC, spi->max_speed_hz); |
---|
769 | 979 | unsigned char br = 0, pbr = 0, pcssck = 0, cssck = 0; |
---|
| 980 | + u32 quarter_period_ns = DIV_ROUND_UP(period_ns, 4); |
---|
| 981 | + u32 cs_sck_delay = 0, sck_cs_delay = 0; |
---|
| 982 | + struct fsl_dspi_platform_data *pdata; |
---|
770 | 983 | unsigned char pasc = 0, asc = 0; |
---|
| 984 | + struct chip_data *chip; |
---|
771 | 985 | unsigned long clkrate; |
---|
772 | 986 | |
---|
773 | 987 | /* Only alloc on first setup */ |
---|
.. | .. |
---|
782 | 996 | |
---|
783 | 997 | if (!pdata) { |
---|
784 | 998 | of_property_read_u32(spi->dev.of_node, "fsl,spi-cs-sck-delay", |
---|
785 | | - &cs_sck_delay); |
---|
| 999 | + &cs_sck_delay); |
---|
786 | 1000 | |
---|
787 | 1001 | of_property_read_u32(spi->dev.of_node, "fsl,spi-sck-cs-delay", |
---|
788 | | - &sck_cs_delay); |
---|
| 1002 | + &sck_cs_delay); |
---|
789 | 1003 | } else { |
---|
790 | 1004 | cs_sck_delay = pdata->cs_sck_delay; |
---|
791 | 1005 | sck_cs_delay = pdata->sck_cs_delay; |
---|
792 | 1006 | } |
---|
793 | 1007 | |
---|
794 | | - chip->void_write_data = 0; |
---|
| 1008 | + /* Since tCSC and tASC apply to continuous transfers too, avoid SCK |
---|
| 1009 | + * glitches of half a cycle by never allowing tCSC + tASC to go below |
---|
| 1010 | + * half a SCK period. |
---|
| 1011 | + */ |
---|
| 1012 | + if (cs_sck_delay < quarter_period_ns) |
---|
| 1013 | + cs_sck_delay = quarter_period_ns; |
---|
| 1014 | + if (sck_cs_delay < quarter_period_ns) |
---|
| 1015 | + sck_cs_delay = quarter_period_ns; |
---|
| 1016 | + |
---|
| 1017 | + dev_dbg(&spi->dev, |
---|
| 1018 | + "DSPI controller timing params: CS-to-SCK delay %u ns, SCK-to-CS delay %u ns\n", |
---|
| 1019 | + cs_sck_delay, sck_cs_delay); |
---|
795 | 1020 | |
---|
796 | 1021 | clkrate = clk_get_rate(dspi->clk); |
---|
797 | 1022 | hz_to_spi_baud(&pbr, &br, spi->max_speed_hz, clkrate); |
---|
.. | .. |
---|
802 | 1027 | /* Set After SCK delay scale values */ |
---|
803 | 1028 | ns_delay_scale(&pasc, &asc, sck_cs_delay, clkrate); |
---|
804 | 1029 | |
---|
805 | | - chip->ctar_val = SPI_CTAR_CPOL(spi->mode & SPI_CPOL ? 1 : 0) |
---|
806 | | - | SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0) |
---|
807 | | - | SPI_CTAR_LSBFE(spi->mode & SPI_LSB_FIRST ? 1 : 0) |
---|
808 | | - | SPI_CTAR_PCSSCK(pcssck) |
---|
809 | | - | SPI_CTAR_CSSCK(cssck) |
---|
810 | | - | SPI_CTAR_PASC(pasc) |
---|
811 | | - | SPI_CTAR_ASC(asc) |
---|
812 | | - | SPI_CTAR_PBR(pbr) |
---|
813 | | - | SPI_CTAR_BR(br); |
---|
| 1030 | + chip->ctar_val = 0; |
---|
| 1031 | + if (spi->mode & SPI_CPOL) |
---|
| 1032 | + chip->ctar_val |= SPI_CTAR_CPOL; |
---|
| 1033 | + if (spi->mode & SPI_CPHA) |
---|
| 1034 | + chip->ctar_val |= SPI_CTAR_CPHA; |
---|
| 1035 | + |
---|
| 1036 | + if (!spi_controller_is_slave(dspi->ctlr)) { |
---|
| 1037 | + chip->ctar_val |= SPI_CTAR_PCSSCK(pcssck) | |
---|
| 1038 | + SPI_CTAR_CSSCK(cssck) | |
---|
| 1039 | + SPI_CTAR_PASC(pasc) | |
---|
| 1040 | + SPI_CTAR_ASC(asc) | |
---|
| 1041 | + SPI_CTAR_PBR(pbr) | |
---|
| 1042 | + SPI_CTAR_BR(br); |
---|
| 1043 | + |
---|
| 1044 | + if (spi->mode & SPI_LSB_FIRST) |
---|
| 1045 | + chip->ctar_val |= SPI_CTAR_LSBFE; |
---|
| 1046 | + } |
---|
814 | 1047 | |
---|
815 | 1048 | spi_set_ctldata(spi, chip); |
---|
816 | 1049 | |
---|
.. | .. |
---|
822 | 1055 | struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); |
---|
823 | 1056 | |
---|
824 | 1057 | dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", |
---|
825 | | - spi->master->bus_num, spi->chip_select); |
---|
| 1058 | + spi->controller->bus_num, spi->chip_select); |
---|
826 | 1059 | |
---|
827 | 1060 | kfree(chip); |
---|
828 | 1061 | } |
---|
829 | 1062 | |
---|
830 | | -static irqreturn_t dspi_interrupt(int irq, void *dev_id) |
---|
831 | | -{ |
---|
832 | | - struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; |
---|
833 | | - struct spi_message *msg = dspi->cur_msg; |
---|
834 | | - enum dspi_trans_mode trans_mode; |
---|
835 | | - u32 spi_sr, spi_tcr; |
---|
836 | | - u16 spi_tcnt; |
---|
837 | | - |
---|
838 | | - regmap_read(dspi->regmap, SPI_SR, &spi_sr); |
---|
839 | | - regmap_write(dspi->regmap, SPI_SR, spi_sr); |
---|
840 | | - |
---|
841 | | - |
---|
842 | | - if (spi_sr & (SPI_SR_EOQF | SPI_SR_TCFQF)) { |
---|
843 | | - /* Get transfer counter (in number of SPI transfers). It was |
---|
844 | | - * reset to 0 when transfer(s) were started. |
---|
845 | | - */ |
---|
846 | | - regmap_read(dspi->regmap, SPI_TCR, &spi_tcr); |
---|
847 | | - spi_tcnt = SPI_TCR_GET_TCNT(spi_tcr); |
---|
848 | | - /* Update total number of bytes that were transferred */ |
---|
849 | | - msg->actual_length += spi_tcnt * dspi->bytes_per_word; |
---|
850 | | - |
---|
851 | | - trans_mode = dspi->devtype_data->trans_mode; |
---|
852 | | - switch (trans_mode) { |
---|
853 | | - case DSPI_EOQ_MODE: |
---|
854 | | - dspi_eoq_read(dspi); |
---|
855 | | - break; |
---|
856 | | - case DSPI_TCFQ_MODE: |
---|
857 | | - dspi_tcfq_read(dspi); |
---|
858 | | - break; |
---|
859 | | - default: |
---|
860 | | - dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", |
---|
861 | | - trans_mode); |
---|
862 | | - return IRQ_HANDLED; |
---|
863 | | - } |
---|
864 | | - |
---|
865 | | - if (!dspi->len) { |
---|
866 | | - dspi->waitflags = 1; |
---|
867 | | - wake_up_interruptible(&dspi->waitq); |
---|
868 | | - } else { |
---|
869 | | - switch (trans_mode) { |
---|
870 | | - case DSPI_EOQ_MODE: |
---|
871 | | - dspi_eoq_write(dspi); |
---|
872 | | - break; |
---|
873 | | - case DSPI_TCFQ_MODE: |
---|
874 | | - dspi_tcfq_write(dspi); |
---|
875 | | - break; |
---|
876 | | - default: |
---|
877 | | - dev_err(&dspi->pdev->dev, |
---|
878 | | - "unsupported trans_mode %u\n", |
---|
879 | | - trans_mode); |
---|
880 | | - } |
---|
881 | | - } |
---|
882 | | - |
---|
883 | | - return IRQ_HANDLED; |
---|
884 | | - } |
---|
885 | | - |
---|
886 | | - return IRQ_NONE; |
---|
887 | | -} |
---|
888 | | - |
---|
889 | 1063 | static const struct of_device_id fsl_dspi_dt_ids[] = { |
---|
890 | | - { .compatible = "fsl,vf610-dspi", .data = &vf610_data, }, |
---|
891 | | - { .compatible = "fsl,ls1021a-v1.0-dspi", .data = &ls1021a_v1_data, }, |
---|
892 | | - { .compatible = "fsl,ls2085a-dspi", .data = &ls2085a_data, }, |
---|
| 1064 | + { |
---|
| 1065 | + .compatible = "fsl,vf610-dspi", |
---|
| 1066 | + .data = &devtype_data[VF610], |
---|
| 1067 | + }, { |
---|
| 1068 | + .compatible = "fsl,ls1021a-v1.0-dspi", |
---|
| 1069 | + .data = &devtype_data[LS1021A], |
---|
| 1070 | + }, { |
---|
| 1071 | + .compatible = "fsl,ls1012a-dspi", |
---|
| 1072 | + .data = &devtype_data[LS1012A], |
---|
| 1073 | + }, { |
---|
| 1074 | + .compatible = "fsl,ls1028a-dspi", |
---|
| 1075 | + .data = &devtype_data[LS1028A], |
---|
| 1076 | + }, { |
---|
| 1077 | + .compatible = "fsl,ls1043a-dspi", |
---|
| 1078 | + .data = &devtype_data[LS1043A], |
---|
| 1079 | + }, { |
---|
| 1080 | + .compatible = "fsl,ls1046a-dspi", |
---|
| 1081 | + .data = &devtype_data[LS1046A], |
---|
| 1082 | + }, { |
---|
| 1083 | + .compatible = "fsl,ls2080a-dspi", |
---|
| 1084 | + .data = &devtype_data[LS2080A], |
---|
| 1085 | + }, { |
---|
| 1086 | + .compatible = "fsl,ls2085a-dspi", |
---|
| 1087 | + .data = &devtype_data[LS2085A], |
---|
| 1088 | + }, { |
---|
| 1089 | + .compatible = "fsl,lx2160a-dspi", |
---|
| 1090 | + .data = &devtype_data[LX2160A], |
---|
| 1091 | + }, |
---|
893 | 1092 | { /* sentinel */ } |
---|
894 | 1093 | }; |
---|
895 | 1094 | MODULE_DEVICE_TABLE(of, fsl_dspi_dt_ids); |
---|
.. | .. |
---|
897 | 1096 | #ifdef CONFIG_PM_SLEEP |
---|
898 | 1097 | static int dspi_suspend(struct device *dev) |
---|
899 | 1098 | { |
---|
900 | | - struct spi_master *master = dev_get_drvdata(dev); |
---|
901 | | - struct fsl_dspi *dspi = spi_master_get_devdata(master); |
---|
| 1099 | + struct fsl_dspi *dspi = dev_get_drvdata(dev); |
---|
902 | 1100 | |
---|
903 | 1101 | if (dspi->irq) |
---|
904 | 1102 | disable_irq(dspi->irq); |
---|
905 | | - spi_master_suspend(master); |
---|
| 1103 | + spi_controller_suspend(dspi->ctlr); |
---|
906 | 1104 | clk_disable_unprepare(dspi->clk); |
---|
907 | 1105 | |
---|
908 | 1106 | pinctrl_pm_select_sleep_state(dev); |
---|
.. | .. |
---|
912 | 1110 | |
---|
913 | 1111 | static int dspi_resume(struct device *dev) |
---|
914 | 1112 | { |
---|
915 | | - struct spi_master *master = dev_get_drvdata(dev); |
---|
916 | | - struct fsl_dspi *dspi = spi_master_get_devdata(master); |
---|
| 1113 | + struct fsl_dspi *dspi = dev_get_drvdata(dev); |
---|
917 | 1114 | int ret; |
---|
918 | 1115 | |
---|
919 | 1116 | pinctrl_pm_select_default_state(dev); |
---|
.. | .. |
---|
921 | 1118 | ret = clk_prepare_enable(dspi->clk); |
---|
922 | 1119 | if (ret) |
---|
923 | 1120 | return ret; |
---|
924 | | - spi_master_resume(master); |
---|
| 1121 | + spi_controller_resume(dspi->ctlr); |
---|
925 | 1122 | if (dspi->irq) |
---|
926 | 1123 | enable_irq(dspi->irq); |
---|
927 | 1124 | |
---|
.. | .. |
---|
938 | 1135 | }; |
---|
939 | 1136 | |
---|
940 | 1137 | static const struct regmap_access_table dspi_volatile_table = { |
---|
941 | | - .yes_ranges = dspi_volatile_ranges, |
---|
942 | | - .n_yes_ranges = ARRAY_SIZE(dspi_volatile_ranges), |
---|
| 1138 | + .yes_ranges = dspi_volatile_ranges, |
---|
| 1139 | + .n_yes_ranges = ARRAY_SIZE(dspi_volatile_ranges), |
---|
943 | 1140 | }; |
---|
944 | 1141 | |
---|
945 | 1142 | static const struct regmap_config dspi_regmap_config = { |
---|
946 | | - .reg_bits = 32, |
---|
947 | | - .val_bits = 32, |
---|
948 | | - .reg_stride = 4, |
---|
949 | | - .max_register = 0x88, |
---|
950 | | - .volatile_table = &dspi_volatile_table, |
---|
| 1143 | + .reg_bits = 32, |
---|
| 1144 | + .val_bits = 32, |
---|
| 1145 | + .reg_stride = 4, |
---|
| 1146 | + .max_register = 0x88, |
---|
| 1147 | + .volatile_table = &dspi_volatile_table, |
---|
951 | 1148 | }; |
---|
952 | 1149 | |
---|
953 | 1150 | static const struct regmap_range dspi_xspi_volatile_ranges[] = { |
---|
.. | .. |
---|
958 | 1155 | }; |
---|
959 | 1156 | |
---|
960 | 1157 | static const struct regmap_access_table dspi_xspi_volatile_table = { |
---|
961 | | - .yes_ranges = dspi_xspi_volatile_ranges, |
---|
962 | | - .n_yes_ranges = ARRAY_SIZE(dspi_xspi_volatile_ranges), |
---|
| 1158 | + .yes_ranges = dspi_xspi_volatile_ranges, |
---|
| 1159 | + .n_yes_ranges = ARRAY_SIZE(dspi_xspi_volatile_ranges), |
---|
963 | 1160 | }; |
---|
964 | 1161 | |
---|
965 | 1162 | static const struct regmap_config dspi_xspi_regmap_config[] = { |
---|
966 | 1163 | { |
---|
967 | | - .reg_bits = 32, |
---|
968 | | - .val_bits = 32, |
---|
969 | | - .reg_stride = 4, |
---|
970 | | - .max_register = 0x13c, |
---|
971 | | - .volatile_table = &dspi_xspi_volatile_table, |
---|
| 1164 | + .reg_bits = 32, |
---|
| 1165 | + .val_bits = 32, |
---|
| 1166 | + .reg_stride = 4, |
---|
| 1167 | + .max_register = 0x13c, |
---|
| 1168 | + .volatile_table = &dspi_xspi_volatile_table, |
---|
972 | 1169 | }, |
---|
973 | 1170 | { |
---|
974 | | - .name = "pushr", |
---|
975 | | - .reg_bits = 16, |
---|
976 | | - .val_bits = 16, |
---|
977 | | - .reg_stride = 2, |
---|
978 | | - .max_register = 0x2, |
---|
| 1171 | + .name = "pushr", |
---|
| 1172 | + .reg_bits = 16, |
---|
| 1173 | + .val_bits = 16, |
---|
| 1174 | + .reg_stride = 2, |
---|
| 1175 | + .max_register = 0x2, |
---|
979 | 1176 | }, |
---|
980 | 1177 | }; |
---|
981 | 1178 | |
---|
982 | | -static void dspi_init(struct fsl_dspi *dspi) |
---|
| 1179 | +static int dspi_init(struct fsl_dspi *dspi) |
---|
983 | 1180 | { |
---|
984 | | - regmap_write(dspi->regmap, SPI_MCR, SPI_MCR_MASTER | SPI_MCR_PCSIS | |
---|
985 | | - (dspi->devtype_data->xspi_mode ? SPI_MCR_XSPI : 0)); |
---|
| 1181 | + unsigned int mcr; |
---|
| 1182 | + |
---|
| 1183 | + /* Set idle states for all chip select signals to high */ |
---|
| 1184 | + mcr = SPI_MCR_PCSIS(GENMASK(dspi->ctlr->max_native_cs - 1, 0)); |
---|
| 1185 | + |
---|
| 1186 | + if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) |
---|
| 1187 | + mcr |= SPI_MCR_XSPI; |
---|
| 1188 | + if (!spi_controller_is_slave(dspi->ctlr)) |
---|
| 1189 | + mcr |= SPI_MCR_MASTER; |
---|
| 1190 | + |
---|
| 1191 | + regmap_write(dspi->regmap, SPI_MCR, mcr); |
---|
986 | 1192 | regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); |
---|
987 | | - if (dspi->devtype_data->xspi_mode) |
---|
988 | | - regmap_write(dspi->regmap, SPI_CTARE(0), |
---|
989 | | - SPI_CTARE_FMSZE(0) | SPI_CTARE_DTCP(1)); |
---|
| 1193 | + |
---|
| 1194 | + switch (dspi->devtype_data->trans_mode) { |
---|
| 1195 | + case DSPI_XSPI_MODE: |
---|
| 1196 | + regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE); |
---|
| 1197 | + break; |
---|
| 1198 | + case DSPI_DMA_MODE: |
---|
| 1199 | + regmap_write(dspi->regmap, SPI_RSER, |
---|
| 1200 | + SPI_RSER_TFFFE | SPI_RSER_TFFFD | |
---|
| 1201 | + SPI_RSER_RFDFE | SPI_RSER_RFDFD); |
---|
| 1202 | + break; |
---|
| 1203 | + default: |
---|
| 1204 | + dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n", |
---|
| 1205 | + dspi->devtype_data->trans_mode); |
---|
| 1206 | + return -EINVAL; |
---|
| 1207 | + } |
---|
| 1208 | + |
---|
| 1209 | + return 0; |
---|
| 1210 | +} |
---|
| 1211 | + |
---|
| 1212 | +static int dspi_slave_abort(struct spi_master *master) |
---|
| 1213 | +{ |
---|
| 1214 | + struct fsl_dspi *dspi = spi_master_get_devdata(master); |
---|
| 1215 | + |
---|
| 1216 | + /* |
---|
| 1217 | + * Terminate all pending DMA transactions for the SPI working |
---|
| 1218 | + * in SLAVE mode. |
---|
| 1219 | + */ |
---|
| 1220 | + if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { |
---|
| 1221 | + dmaengine_terminate_sync(dspi->dma->chan_rx); |
---|
| 1222 | + dmaengine_terminate_sync(dspi->dma->chan_tx); |
---|
| 1223 | + } |
---|
| 1224 | + |
---|
| 1225 | + /* Clear the internal DSPI RX and TX FIFO buffers */ |
---|
| 1226 | + regmap_update_bits(dspi->regmap, SPI_MCR, |
---|
| 1227 | + SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF, |
---|
| 1228 | + SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF); |
---|
| 1229 | + |
---|
| 1230 | + return 0; |
---|
990 | 1231 | } |
---|
991 | 1232 | |
---|
992 | 1233 | static int dspi_probe(struct platform_device *pdev) |
---|
993 | 1234 | { |
---|
994 | 1235 | struct device_node *np = pdev->dev.of_node; |
---|
995 | | - struct spi_master *master; |
---|
| 1236 | + const struct regmap_config *regmap_config; |
---|
| 1237 | + struct fsl_dspi_platform_data *pdata; |
---|
| 1238 | + struct spi_controller *ctlr; |
---|
| 1239 | + int ret, cs_num, bus_num = -1; |
---|
996 | 1240 | struct fsl_dspi *dspi; |
---|
997 | 1241 | struct resource *res; |
---|
998 | | - const struct regmap_config *regmap_config; |
---|
999 | 1242 | void __iomem *base; |
---|
1000 | | - struct fsl_dspi_platform_data *pdata; |
---|
1001 | | - int ret = 0, cs_num, bus_num; |
---|
| 1243 | + bool big_endian; |
---|
1002 | 1244 | |
---|
1003 | | - master = spi_alloc_master(&pdev->dev, sizeof(struct fsl_dspi)); |
---|
1004 | | - if (!master) |
---|
| 1245 | + dspi = devm_kzalloc(&pdev->dev, sizeof(*dspi), GFP_KERNEL); |
---|
| 1246 | + if (!dspi) |
---|
1005 | 1247 | return -ENOMEM; |
---|
1006 | 1248 | |
---|
1007 | | - dspi = spi_master_get_devdata(master); |
---|
| 1249 | + ctlr = spi_alloc_master(&pdev->dev, 0); |
---|
| 1250 | + if (!ctlr) |
---|
| 1251 | + return -ENOMEM; |
---|
| 1252 | + |
---|
| 1253 | + spi_controller_set_devdata(ctlr, dspi); |
---|
| 1254 | + platform_set_drvdata(pdev, dspi); |
---|
| 1255 | + |
---|
1008 | 1256 | dspi->pdev = pdev; |
---|
1009 | | - dspi->master = master; |
---|
| 1257 | + dspi->ctlr = ctlr; |
---|
1010 | 1258 | |
---|
1011 | | - master->transfer = NULL; |
---|
1012 | | - master->setup = dspi_setup; |
---|
1013 | | - master->transfer_one_message = dspi_transfer_one_message; |
---|
1014 | | - master->dev.of_node = pdev->dev.of_node; |
---|
| 1259 | + ctlr->setup = dspi_setup; |
---|
| 1260 | + ctlr->transfer_one_message = dspi_transfer_one_message; |
---|
| 1261 | + ctlr->dev.of_node = pdev->dev.of_node; |
---|
1015 | 1262 | |
---|
1016 | | - master->cleanup = dspi_cleanup; |
---|
1017 | | - master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST; |
---|
| 1263 | + ctlr->cleanup = dspi_cleanup; |
---|
| 1264 | + ctlr->slave_abort = dspi_slave_abort; |
---|
| 1265 | + ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST; |
---|
1018 | 1266 | |
---|
1019 | 1267 | pdata = dev_get_platdata(&pdev->dev); |
---|
1020 | 1268 | if (pdata) { |
---|
1021 | | - master->num_chipselect = pdata->cs_num; |
---|
1022 | | - master->bus_num = pdata->bus_num; |
---|
| 1269 | + ctlr->num_chipselect = ctlr->max_native_cs = pdata->cs_num; |
---|
| 1270 | + ctlr->bus_num = pdata->bus_num; |
---|
1023 | 1271 | |
---|
1024 | | - dspi->devtype_data = &coldfire_data; |
---|
| 1272 | + /* Only Coldfire uses platform data */ |
---|
| 1273 | + dspi->devtype_data = &devtype_data[MCF5441X]; |
---|
| 1274 | + big_endian = true; |
---|
1025 | 1275 | } else { |
---|
1026 | 1276 | |
---|
1027 | 1277 | ret = of_property_read_u32(np, "spi-num-chipselects", &cs_num); |
---|
1028 | 1278 | if (ret < 0) { |
---|
1029 | 1279 | dev_err(&pdev->dev, "can't get spi-num-chipselects\n"); |
---|
1030 | | - goto out_master_put; |
---|
| 1280 | + goto out_ctlr_put; |
---|
1031 | 1281 | } |
---|
1032 | | - master->num_chipselect = cs_num; |
---|
| 1282 | + ctlr->num_chipselect = ctlr->max_native_cs = cs_num; |
---|
1033 | 1283 | |
---|
1034 | | - ret = of_property_read_u32(np, "bus-num", &bus_num); |
---|
1035 | | - if (ret < 0) { |
---|
1036 | | - dev_err(&pdev->dev, "can't get bus-num\n"); |
---|
1037 | | - goto out_master_put; |
---|
1038 | | - } |
---|
1039 | | - master->bus_num = bus_num; |
---|
| 1284 | + of_property_read_u32(np, "bus-num", &bus_num); |
---|
| 1285 | + ctlr->bus_num = bus_num; |
---|
| 1286 | + |
---|
| 1287 | + if (of_property_read_bool(np, "spi-slave")) |
---|
| 1288 | + ctlr->slave = true; |
---|
1040 | 1289 | |
---|
1041 | 1290 | dspi->devtype_data = of_device_get_match_data(&pdev->dev); |
---|
1042 | 1291 | if (!dspi->devtype_data) { |
---|
1043 | 1292 | dev_err(&pdev->dev, "can't get devtype_data\n"); |
---|
1044 | 1293 | ret = -EFAULT; |
---|
1045 | | - goto out_master_put; |
---|
| 1294 | + goto out_ctlr_put; |
---|
1046 | 1295 | } |
---|
| 1296 | + |
---|
| 1297 | + big_endian = of_device_is_big_endian(np); |
---|
| 1298 | + } |
---|
| 1299 | + if (big_endian) { |
---|
| 1300 | + dspi->pushr_cmd = 0; |
---|
| 1301 | + dspi->pushr_tx = 2; |
---|
| 1302 | + } else { |
---|
| 1303 | + dspi->pushr_cmd = 2; |
---|
| 1304 | + dspi->pushr_tx = 0; |
---|
1047 | 1305 | } |
---|
1048 | 1306 | |
---|
1049 | | - if (dspi->devtype_data->xspi_mode) |
---|
1050 | | - master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); |
---|
| 1307 | + if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) |
---|
| 1308 | + ctlr->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); |
---|
1051 | 1309 | else |
---|
1052 | | - master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16); |
---|
| 1310 | + ctlr->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16); |
---|
1053 | 1311 | |
---|
1054 | 1312 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
1055 | 1313 | base = devm_ioremap_resource(&pdev->dev, res); |
---|
1056 | 1314 | if (IS_ERR(base)) { |
---|
1057 | 1315 | ret = PTR_ERR(base); |
---|
1058 | | - goto out_master_put; |
---|
| 1316 | + goto out_ctlr_put; |
---|
1059 | 1317 | } |
---|
1060 | 1318 | |
---|
1061 | | - if (dspi->devtype_data->xspi_mode) |
---|
| 1319 | + if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) |
---|
1062 | 1320 | regmap_config = &dspi_xspi_regmap_config[0]; |
---|
1063 | 1321 | else |
---|
1064 | 1322 | regmap_config = &dspi_regmap_config; |
---|
.. | .. |
---|
1067 | 1325 | dev_err(&pdev->dev, "failed to init regmap: %ld\n", |
---|
1068 | 1326 | PTR_ERR(dspi->regmap)); |
---|
1069 | 1327 | ret = PTR_ERR(dspi->regmap); |
---|
1070 | | - goto out_master_put; |
---|
| 1328 | + goto out_ctlr_put; |
---|
1071 | 1329 | } |
---|
1072 | 1330 | |
---|
1073 | | - if (dspi->devtype_data->xspi_mode) { |
---|
| 1331 | + if (dspi->devtype_data->trans_mode == DSPI_XSPI_MODE) { |
---|
1074 | 1332 | dspi->regmap_pushr = devm_regmap_init_mmio( |
---|
1075 | 1333 | &pdev->dev, base + SPI_PUSHR, |
---|
1076 | 1334 | &dspi_xspi_regmap_config[1]); |
---|
.. | .. |
---|
1079 | 1337 | "failed to init pushr regmap: %ld\n", |
---|
1080 | 1338 | PTR_ERR(dspi->regmap_pushr)); |
---|
1081 | 1339 | ret = PTR_ERR(dspi->regmap_pushr); |
---|
1082 | | - goto out_master_put; |
---|
| 1340 | + goto out_ctlr_put; |
---|
1083 | 1341 | } |
---|
1084 | 1342 | } |
---|
1085 | 1343 | |
---|
.. | .. |
---|
1087 | 1345 | if (IS_ERR(dspi->clk)) { |
---|
1088 | 1346 | ret = PTR_ERR(dspi->clk); |
---|
1089 | 1347 | dev_err(&pdev->dev, "unable to get clock\n"); |
---|
1090 | | - goto out_master_put; |
---|
| 1348 | + goto out_ctlr_put; |
---|
1091 | 1349 | } |
---|
1092 | 1350 | ret = clk_prepare_enable(dspi->clk); |
---|
1093 | 1351 | if (ret) |
---|
1094 | | - goto out_master_put; |
---|
| 1352 | + goto out_ctlr_put; |
---|
1095 | 1353 | |
---|
1096 | | - dspi_init(dspi); |
---|
1097 | | - dspi->irq = platform_get_irq(pdev, 0); |
---|
1098 | | - if (dspi->irq < 0) { |
---|
1099 | | - dev_err(&pdev->dev, "can't get platform irq\n"); |
---|
1100 | | - ret = dspi->irq; |
---|
| 1354 | + ret = dspi_init(dspi); |
---|
| 1355 | + if (ret) |
---|
1101 | 1356 | goto out_clk_put; |
---|
| 1357 | + |
---|
| 1358 | + dspi->irq = platform_get_irq(pdev, 0); |
---|
| 1359 | + if (dspi->irq <= 0) { |
---|
| 1360 | + dev_info(&pdev->dev, |
---|
| 1361 | + "can't get platform irq, using poll mode\n"); |
---|
| 1362 | + dspi->irq = 0; |
---|
| 1363 | + goto poll_mode; |
---|
1102 | 1364 | } |
---|
| 1365 | + |
---|
| 1366 | + init_completion(&dspi->xfer_done); |
---|
1103 | 1367 | |
---|
1104 | 1368 | ret = request_threaded_irq(dspi->irq, dspi_interrupt, NULL, |
---|
1105 | 1369 | IRQF_SHARED, pdev->name, dspi); |
---|
.. | .. |
---|
1107 | 1371 | dev_err(&pdev->dev, "Unable to attach DSPI interrupt\n"); |
---|
1108 | 1372 | goto out_clk_put; |
---|
1109 | 1373 | } |
---|
| 1374 | + |
---|
| 1375 | +poll_mode: |
---|
1110 | 1376 | |
---|
1111 | 1377 | if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { |
---|
1112 | 1378 | ret = dspi_request_dma(dspi, res->start); |
---|
.. | .. |
---|
1116 | 1382 | } |
---|
1117 | 1383 | } |
---|
1118 | 1384 | |
---|
1119 | | - master->max_speed_hz = |
---|
| 1385 | + ctlr->max_speed_hz = |
---|
1120 | 1386 | clk_get_rate(dspi->clk) / dspi->devtype_data->max_clock_factor; |
---|
1121 | 1387 | |
---|
1122 | | - init_waitqueue_head(&dspi->waitq); |
---|
1123 | | - platform_set_drvdata(pdev, master); |
---|
| 1388 | + if (dspi->devtype_data->trans_mode != DSPI_DMA_MODE) |
---|
| 1389 | + ctlr->ptp_sts_supported = true; |
---|
1124 | 1390 | |
---|
1125 | | - ret = spi_register_master(master); |
---|
| 1391 | + ret = spi_register_controller(ctlr); |
---|
1126 | 1392 | if (ret != 0) { |
---|
1127 | | - dev_err(&pdev->dev, "Problem registering DSPI master\n"); |
---|
| 1393 | + dev_err(&pdev->dev, "Problem registering DSPI ctlr\n"); |
---|
1128 | 1394 | goto out_release_dma; |
---|
1129 | 1395 | } |
---|
1130 | 1396 | |
---|
.. | .. |
---|
1137 | 1403 | free_irq(dspi->irq, dspi); |
---|
1138 | 1404 | out_clk_put: |
---|
1139 | 1405 | clk_disable_unprepare(dspi->clk); |
---|
1140 | | -out_master_put: |
---|
1141 | | - spi_master_put(master); |
---|
| 1406 | +out_ctlr_put: |
---|
| 1407 | + spi_controller_put(ctlr); |
---|
1142 | 1408 | |
---|
1143 | 1409 | return ret; |
---|
1144 | 1410 | } |
---|
1145 | 1411 | |
---|
1146 | 1412 | static int dspi_remove(struct platform_device *pdev) |
---|
1147 | 1413 | { |
---|
1148 | | - struct spi_master *master = platform_get_drvdata(pdev); |
---|
1149 | | - struct fsl_dspi *dspi = spi_master_get_devdata(master); |
---|
| 1414 | + struct fsl_dspi *dspi = platform_get_drvdata(pdev); |
---|
1150 | 1415 | |
---|
1151 | 1416 | /* Disconnect from the SPI framework */ |
---|
1152 | | - spi_unregister_controller(dspi->master); |
---|
| 1417 | + spi_unregister_controller(dspi->ctlr); |
---|
1153 | 1418 | |
---|
1154 | 1419 | /* Disable RX and TX */ |
---|
1155 | 1420 | regmap_update_bits(dspi->regmap, SPI_MCR, |
---|
.. | .. |
---|
1173 | 1438 | } |
---|
1174 | 1439 | |
---|
1175 | 1440 | static struct platform_driver fsl_dspi_driver = { |
---|
1176 | | - .driver.name = DRIVER_NAME, |
---|
1177 | | - .driver.of_match_table = fsl_dspi_dt_ids, |
---|
1178 | | - .driver.owner = THIS_MODULE, |
---|
1179 | | - .driver.pm = &dspi_pm, |
---|
1180 | | - .probe = dspi_probe, |
---|
1181 | | - .remove = dspi_remove, |
---|
1182 | | - .shutdown = dspi_shutdown, |
---|
| 1441 | + .driver.name = DRIVER_NAME, |
---|
| 1442 | + .driver.of_match_table = fsl_dspi_dt_ids, |
---|
| 1443 | + .driver.owner = THIS_MODULE, |
---|
| 1444 | + .driver.pm = &dspi_pm, |
---|
| 1445 | + .probe = dspi_probe, |
---|
| 1446 | + .remove = dspi_remove, |
---|
| 1447 | + .shutdown = dspi_shutdown, |
---|
1183 | 1448 | }; |
---|
1184 | 1449 | module_platform_driver(fsl_dspi_driver); |
---|
1185 | 1450 | |
---|