blob: 95d2288bf14580c86d4f155000517550e21f3108 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * Driver for simulating ssp as spi device for pxa
3 *
4 * Copyright (c) 2009 Marvell Inc.
5 * Lei Wen <leiwen@marvell.com>
6 *
7 * Licensed under the GPL-2 or later.
8 */
9
10
11#include <common.h>
12#include <malloc.h>
13#include <spi.h>
14#include <watchdog.h>
15#include <asm/io.h>
16#include <asm/arch/pxa2xx_spi.h>
17#include <asm/gpio.h>
18#include <asm/arch/pxa_dma.h>
19#include <asm/arch/cpu.h>
20
21#define to_pxa_spi_slave(s) container_of(s, struct pxa_spi_slave, slave)
22
23int cs_continuous;
24
25#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
26void spi_cs_activate(struct spi_slave *slave)
27{
28 struct pxa_spi_slave *pss = to_pxa_spi_slave(slave);
29 gpio_set_value(slave->cs, pss->gpio_cs_inverted);
30}
31
32void spi_cs_deactivate(struct spi_slave *slave)
33{
34 struct pxa_spi_slave *pss = to_pxa_spi_slave(slave);
35 gpio_set_value(slave->cs, !pss->gpio_cs_inverted);
36}
37#endif
38
39static int spi_pxa_write(struct pxa_spi_slave *pss, unsigned int bitlen)
40{
41 int wait_timeout = SSP_FLUSH_NUM;
42 int bytes = bitlen / pss->slave.wordlen;
43
44 while (--wait_timeout && !(readl(&pss->spi_reg->sssr) & SSSR_TNF))
45 ;
46 if (!wait_timeout) {
47 debug("%s: timeout error\n", __func__);
48 return -1;
49 }
50
51 while (bytes--) {
52 if (pss->tx != NULL) {
53 if (pss->slave.wordlen > 16) {
54 writel(*(u32 *)pss->tx, &pss->spi_reg->ssdr);
55 pss->tx += 4;
56 } else if (pss->slave.wordlen > 8) {
57 writel(*(u16 *)pss->tx, &pss->spi_reg->ssdr);
58 pss->tx += 2;
59 } else {
60 writel(*(u8 *)pss->tx, &pss->spi_reg->ssdr);
61 ++pss->tx;
62 }
63 } else
64 writel(0, &pss->spi_reg->ssdr);
65
66 while ((readl(&pss->spi_reg->sssr)&0xF10) && wait_timeout--) {
67 nop();
68 nop();
69 }
70 if (!wait_timeout) {
71 debug("%s: timeout error\n", __func__);
72 return -1;
73 }
74 }
75
76 return 0;
77}
78
79static int spi_pxa_read(struct pxa_spi_slave *pss, unsigned int bitlen)
80{
81 int wait_timeout = SSP_FLUSH_NUM;
82 int bytes = bitlen / pss->slave.wordlen;
83
84 while (--wait_timeout && !(readl(&pss->spi_reg->sssr) & SSSR_TNF))
85 ;
86 if (!wait_timeout) {
87 debug("%s: timeout error\n", __func__);
88 return -1;
89 }
90
91 while (bytes--) {
92 wait_timeout = SSP_FLUSH_NUM;
93 writel(0xff, &pss->spi_reg->ssdr);
94 while ((readl(&pss->spi_reg->sssr)&0xF10) && wait_timeout--) {
95 nop();
96 nop();
97 }
98 if (!wait_timeout) {
99 printf("%s: timeout error, sssr:0x%x. byte:0x%x.\n",
100 __func__, readl(&pss->spi_reg->sssr), bytes);
101 return -1;
102 }
103
104 wait_timeout = SSP_FLUSH_NUM;
105 while (--wait_timeout && !(readl(&pss->spi_reg->sssr) & SSSR_RNE))
106 ;
107 if (!wait_timeout) {
108 printf("%s: timeout error sssr:0x%x.\n", __func__,
109 readl(&pss->spi_reg->sssr));
110 return -1;
111 }
112
113 if (pss->rx != NULL) {
114 if (pss->slave.wordlen > 16) {
115 *(u32 *)pss->rx = readl(&pss->spi_reg->ssdr);
116 pss->rx += 4;
117 } else if (pss->slave.wordlen > 8) {
118 *(u16 *)pss->rx = readl(&pss->spi_reg->ssdr);
119 pss->rx += 2;
120 } else {
121 *(u8 *)pss->rx = readl(&pss->spi_reg->ssdr);
122 ++pss->rx;
123 }
124 } else
125 readl(&pss->spi_reg->ssdr);
126 }
127
128 return 0;
129}
130
131static int spi_pxa_flush(struct pxa_spi_slave *pss)
132{
133 unsigned long limit = SSP_FLUSH_NUM;
134
135 do {
136 while (readl(&pss->spi_reg->sssr) & SSSR_RNE)
137 readl(&pss->spi_reg->ssdr);
138 } while ((readl(&pss->spi_reg->sssr) & SSSR_BSY) && limit--);
139
140 writel(SSSR_ROR, &pss->spi_reg->sssr);
141
142 return limit;
143}
144
145struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
146 unsigned int max_hz, unsigned int mode)
147{
148 struct pxa_spi_slave *pss;
149
150 pss = spi_alloc_slave(struct pxa_spi_slave, bus, cs);
151 if (!pss)
152 return NULL;
153
154 pss->slave.bus = bus;
155#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
156 pss->slave.cs = cs;
157#endif
158 pss->spi_reg = (struct ssp_reg *)CONFIG_SYS_SSP_BASE;
159#ifdef CONFIG_SPI_52M_ENABLE
160 pss->cr0 = SSCR0_MOTO | SSCR0_DATASIZE(DEFAULT_WORD_LEN)
161 | SSCR0_SSE | SSCR0_52MM;
162#else
163 pss->cr0 = SSCR0_MOTO | SSCR0_DATASIZE(DEFAULT_WORD_LEN)
164 | SSCR0_SSE;
165#endif
166
167 pss->cr1 = SSCR1_TTE | SSCR1_TTELP |
168 (SSCR1_RXTRESH(RX_THRESH_DEF) & SSCR1_RFT) |
169 (SSCR1_TXTRESH(TX_THRESH_DEF) & SSCR1_TFT);
170
171 pss->cr1 &= ~(SSCR1_SPO | SSCR1_SPH);
172 pss->cr1 |= (((mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0)
173 | (((mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0);
174
175 pss->int_cr1 = SSCR1_TIE | SSCR1_RIE | SSCR1_TINTE;
176 pss->clear_sr = SSSR_ROR | SSSR_TINT;
177
178 if (cs) {
179#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
180 gpio_direction_output(cs, !pss->gpio_cs_inverted);
181 pss->gpio_cs_inverted = mode & SPI_CS_HIGH;
182 gpio_set_value(cs, !pss->gpio_cs_inverted);
183#endif
184 }
185 cs_continuous = 0;
186
187 return &pss->slave;
188}
189
190void spi_free_slave(struct spi_slave *slave)
191{
192 struct pxa_spi_slave *pss = to_pxa_spi_slave(slave);
193 free(pss);
194}
195#ifdef CONFIG_PXA_DMA
196__attribute__ ((aligned(32))) unsigned int dummy[0x400];
197#endif
198void spi_init(void)
199{
200 unsigned int reg;
201 int clk = SSP_26M; // default 26M
202 if (CONFIG_SYS_SSP_BASE == SSP0_BASE)
203 reg = APBC_SSP0_CLK_RST;
204 else if (CONFIG_SYS_SSP_BASE == SSP1_BASE)
205 reg = APBC_SSP1_CLK_RST;
206 else if (CONFIG_SYS_SSP_BASE == SSP2_BASE)
207 reg = APBC_SSP2_CLK_RST;
208 else {
209 printf("Fatal error: unsupportted ssp base: 0x%x.\n", CONFIG_SYS_SSP_BASE);
210 return;
211 }
212
213#ifdef CONFIG_SPI_52M_ENABLE
214 clk = SSP_52M;
215#else
216 #ifdef CONFIG_SPI_26M_ENABLE
217 clk = SSP_26M;
218 #else
219 #ifdef CONFIG_SPI_13M_ENABLE
220 clk = SSP_13M;
221 #else
222 #ifdef CONFIG_SPI_6P5M_ENABLE
223 clk = SSP_6P5M;
224 #endif
225 #endif
226 #endif
227#endif
228
229 __raw_writel(APBC_SSP_BCLKEN | APBC_SSP_FNCLKEN |
230 (clk << APBC_SSP_FNCLKSEL_SHIFT), reg);
231
232#ifdef CONFIG_PXA_DMA
233 memset(dummy, 0x0, 0x400*4);
234#endif
235 /* Load default SSP configuration */
236 writel(0, CONFIG_SYS_SSP_BASE + SSCR0);
237 writel(SSCR1_RXTRESH(RX_THRESH_DEF) |
238 SSCR1_TXTRESH(TX_THRESH_DEF), CONFIG_SYS_SSP_BASE + SSCR1);
239 writel(SSCR0_MOTO | SSCR0_DATASIZE(DEFAULT_WORD_LEN)
240 , CONFIG_SYS_SSP_BASE + SSCR0);
241 writel(0, CONFIG_SYS_SSP_BASE + SSTO);
242 writel(0, CONFIG_SYS_SSP_BASE + SSPSP);
243
244 __raw_writel(DMA_CLK_AXICLK_EN | DMA_CLK_AXI_RST,
245 PMUA_DMA_CLK_RES_CTRL); /* enable DMA clock */
246}
247
248int spi_claim_bus(struct spi_slave *slave)
249{
250 struct pxa_spi_slave *pss = to_pxa_spi_slave(slave);
251 slave->wordlen = 8; /* set default wordlen */
252
253 if (spi_pxa_flush(pss) == 0)
254 return -1;
255
256 return 0;
257}
258
259void spi_release_bus(struct spi_slave *slave)
260{
261}
262
263int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
264 void *din, unsigned long flags)
265{
266 struct pxa_spi_slave *pss = to_pxa_spi_slave(slave);
267 int ret = 0;
268
269 if (slave->wordlen < 4 || slave->wordlen > 32) {
270 printf("pxa2xx_spi: invalid wordlen %d\n", slave->wordlen);
271 return -1;
272 }
273
274 if (bitlen % slave->wordlen)
275 return -1;
276
277 pss->rx = din;
278 pss->tx = dout;
279
280 writel(0, &pss->spi_reg->sscr0);
281 pss->cr0 &= ~(0xf);
282 if (slave->wordlen > 16)
283 pss->cr0 |= SSCR0_EDSS | (slave->wordlen - 1);
284 else
285 pss->cr0 |= 0xc00000 | (slave->wordlen - 1);
286 writel(pss->cr1, &pss->spi_reg->sscr1);
287 writel(TIMEOUT_DEF, &pss->spi_reg->ssto);
288 writel(pss->cr0, &pss->spi_reg->sscr0);
289
290 if (flags & SPI_XFER_BEGIN) {
291#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
292 if (!cs_continuous)
293 spi_cs_activate(slave);
294#endif
295 }
296
297 if (dout != NULL && din != NULL) {
298 ret = spi_pxa_write(pss, bitlen - slave->wordlen);
299 if(ret)
300 return -1;
301
302 ret = spi_pxa_read(pss, slave->wordlen);
303 if(ret)
304 return -1;
305 } else if (dout != NULL) {
306 ret = spi_pxa_write(pss, bitlen);
307 if(ret)
308 return -1;
309 } else if (din != NULL) {
310 ret = spi_pxa_read(pss, bitlen);
311 if(ret)
312 return -1;
313 }
314
315 if (flags & SPI_XFER_END) {
316 writel(pss->clear_sr, &pss->spi_reg->sssr);
317 writel(0, &pss->spi_reg->ssto);
318 writel(0, &pss->spi_reg->sscr0);
319#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
320 if (!cs_continuous)
321 spi_cs_deactivate(slave);
322#endif
323 }
324 return ret;
325}
326#ifdef CONFIG_PXA_DMA
327static int spi_dma_read(void *din, unsigned int len)
328{
329 int i, init = 0;
330 if (!init) {
331 if (cpu_is_pxa1826_z3() || cpu_is_pxa1826_a0()) {
332 dmac_map_device_to_channel(DMAC_SSP2_RX,
333 SSP_RX_CHANNEL);
334 dmac_map_device_to_channel(DMAC_SSP2_TX,
335 SSP_TX_CHANNEL);
336 } else {
337 dmac_map_device_to_channel(DMAC_SSP2_RX_Z12,
338 SSP_RX_CHANNEL);
339 dmac_map_device_to_channel(DMAC_SSP2_TX_Z12,
340 SSP_TX_CHANNEL);
341 }
342
343 dmac_user_aligment(SSP_RX_CHANNEL);
344 dmac_user_aligment(SSP_TX_CHANNEL);
345 init = 1;
346 }
347
348 pxa_dma_read((unsigned int)din, SSP_SSDR, len, SSP_RX_CHANNEL);
349 pxa_dma_write(SSP_SSDR, (unsigned int)dummy, len, SSP_TX_CHANNEL);
350
351 dmac_start_transfer(SSP_RX_CHANNEL);
352 dmac_start_transfer(SSP_TX_CHANNEL);
353
354 do {
355 for (i = 0; i < 500; i++)
356 nop();
357 if (dmac_read_dcsr(SSP_TX_CHANNEL) & DCSR_STOPSTATE)
358 break;
359
360 } while (1);
361
362 do {
363 if (dmac_read_dcsr(SSP_RX_CHANNEL) & DCSR_STOPSTATE)
364 break;
365 } while (1);
366
367
368 for (i = 0; i < len; i += 4)
369 swab32s(din+i);
370
371 if (!(dmac_read_dcsr(SSP_TX_CHANNEL) & DCSR_STOPSTATE)) {
372 printf("Error:DMA write operate timeout.\n");
373 return 1;
374 }
375 if (!(dmac_read_dcsr(SSP_RX_CHANNEL) & DCSR_STOPSTATE)) {
376 printf("Error:DMA read operate timeout.\n");
377 return 1;
378 }
379
380 return 0;
381}
382
383static int spi_dma_write(void *dout, unsigned int len)
384{
385 int i, init = 0;
386
387 for (i = 0; i < len; i += 4)
388 swab32s(dout+i);
389
390 flush_dcache_all();
391 if (!init) {
392 if (cpu_is_pxa1826_z3() || cpu_is_pxa1826_a0())
393 dmac_map_device_to_channel(DMAC_SSP2_TX,
394 SSP_TX_CHANNEL);
395 else
396 dmac_map_device_to_channel(DMAC_SSP2_TX_Z12,
397 SSP_TX_CHANNEL);
398
399 dmac_user_aligment(SSP_TX_CHANNEL);
400 init = 1;
401 }
402
403 pxa_dma_write(SSP_SSDR, (unsigned int)dout, len, SSP_TX_CHANNEL);
404 dmac_start_transfer(SSP_TX_CHANNEL);
405
406 do {
407 for (i = 0; i < 500; i++)
408 nop();
409 if (dmac_read_dcsr(SSP_TX_CHANNEL) & DCSR_STOPSTATE)
410 break;
411 } while (1);
412
413 if (!(dmac_read_dcsr(SSP_TX_CHANNEL) & DCSR_STOPSTATE)) {
414 printf("Error:DMA write operate timeout.\n");
415 return 1;
416 }
417
418 return 0;
419}
420
421int spi_dma_xfer(struct spi_slave *slave, const u8 *cmd, size_t cmd_len,
422 const void *dout, const void *din, size_t data_len)
423{
424 struct pxa_spi_slave *pss = to_pxa_spi_slave(slave);
425 int ret = 0;
426
427#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
428 spi_cs_activate(slave);
429#endif
430
431 if (cmd) {
432 cs_continuous = 1;
433 spi_xfer(slave, cmd_len*8, cmd, NULL,
434 SPI_XFER_BEGIN | SPI_XFER_END);
435 }
436
437 if (dout || din) {
438 writel(TIMEOUT_DEF, &pss->spi_reg->ssto);
439#ifdef CONFIG_SPI_52M_ENABLE
440 writel(SSCR1_TTELP | SSCR1_TTE | SSCR1_RXTRESH(0x3)
441 | SSCR1_TRAIL | SSCR1_TSRE | SSCR1_RSRE |
442 SSCR1_TXTRESH(0x4), &pss->spi_reg->sscr1);
443 writel(SSCR0_52MM | SSCR0_SSE | SSCR0_EDSS |
444 SSCR0_DATASIZE(0x10), &pss->spi_reg->sscr0);
445#else
446 writel(SSCR1_TTELP | SSCR1_TTE | SSCR1_RXTRESH(0x9)
447 | SSCR1_TRAIL | SSCR1_TSRE | SSCR1_RSRE |
448 SSCR1_TXTRESH(0x4), &pss->spi_reg->sscr1);
449
450 writel(SSCR0_SSE | SSCR0_EDSS |
451 SSCR0_DATASIZE(0x10), &pss->spi_reg->sscr0);
452#endif
453 }
454
455 if (dout)
456 ret = spi_dma_write((void *)dout, data_len);
457 if (din)
458 ret = spi_dma_read((void *)din, data_len);
459
460 while (readl(&pss->spi_reg->sssr) & 0xF10)
461 ;
462 if (dout || din) {
463 writel(pss->clear_sr, &pss->spi_reg->sssr);
464 clrbits_le32(&pss->spi_reg->sscr1, pss->int_cr1);
465 writel(0, &pss->spi_reg->sscr0);
466#ifndef CONFIG_PXA_SPI_ENABLE_AUTO_CS
467 spi_cs_deactivate(slave);
468#endif
469 }
470 cs_continuous = 0;
471 return ret;
472}
473#endif