SPI: mxc_spi: remove second reset from ECSPI config handler
[platform/kernel/u-boot.git] / drivers / spi / mxc_spi.c
1 /*
2  * Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <common.h>
8 #include <malloc.h>
9 #include <spi.h>
10 #include <asm/errno.h>
11 #include <asm/io.h>
12 #include <asm/gpio.h>
13 #include <asm/arch/imx-regs.h>
14 #include <asm/arch/clock.h>
15 #include <asm/imx-common/spi.h>
16
17 #ifdef CONFIG_MX27
18 /* i.MX27 has a completely wrong register layout and register definitions in the
19  * datasheet, the correct one is in the Freescale's Linux driver */
20
21 #error "i.MX27 CSPI not supported due to drastic differences in register definitions" \
22 "See linux mxc_spi driver from Freescale for details."
23 #endif
24
25 static unsigned long spi_bases[] = {
26         MXC_SPI_BASE_ADDRESSES
27 };
28
29 __weak int board_spi_cs_gpio(unsigned bus, unsigned cs)
30 {
31         return -1;
32 }
33
34 #define OUT     MXC_GPIO_DIRECTION_OUT
35
36 #define reg_read readl
37 #define reg_write(a, v) writel(v, a)
38
39 #if !defined(CONFIG_SYS_SPI_MXC_WAIT)
40 #define CONFIG_SYS_SPI_MXC_WAIT         (CONFIG_SYS_HZ/100)     /* 10 ms */
41 #endif
42
43 struct mxc_spi_slave {
44         struct spi_slave slave;
45         unsigned long   base;
46         u32             ctrl_reg;
47 #if defined(MXC_ECSPI)
48         u32             cfg_reg;
49 #endif
50         int             gpio;
51         int             ss_pol;
52 };
53
54 static inline struct mxc_spi_slave *to_mxc_spi_slave(struct spi_slave *slave)
55 {
56         return container_of(slave, struct mxc_spi_slave, slave);
57 }
58
59 void spi_cs_activate(struct spi_slave *slave)
60 {
61         struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
62         if (mxcs->gpio > 0)
63                 gpio_set_value(mxcs->gpio, mxcs->ss_pol);
64 }
65
66 void spi_cs_deactivate(struct spi_slave *slave)
67 {
68         struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
69         if (mxcs->gpio > 0)
70                 gpio_set_value(mxcs->gpio,
71                               !(mxcs->ss_pol));
72 }
73
74 u32 get_cspi_div(u32 div)
75 {
76         int i;
77
78         for (i = 0; i < 8; i++) {
79                 if (div <= (4 << i))
80                         return i;
81         }
82         return i;
83 }
84
85 #ifdef MXC_CSPI
86 static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
87                 unsigned int max_hz, unsigned int mode)
88 {
89         unsigned int ctrl_reg;
90         u32 clk_src;
91         u32 div;
92
93         clk_src = mxc_get_clock(MXC_CSPI_CLK);
94
95         div = DIV_ROUND_UP(clk_src, max_hz);
96         div = get_cspi_div(div);
97
98         debug("clk %d Hz, div %d, real clk %d Hz\n",
99                 max_hz, div, clk_src / (4 << div));
100
101         ctrl_reg = MXC_CSPICTRL_CHIPSELECT(cs) |
102                 MXC_CSPICTRL_BITCOUNT(MXC_CSPICTRL_MAXBITS) |
103                 MXC_CSPICTRL_DATARATE(div) |
104                 MXC_CSPICTRL_EN |
105 #ifdef CONFIG_MX35
106                 MXC_CSPICTRL_SSCTL |
107 #endif
108                 MXC_CSPICTRL_MODE;
109
110         if (mode & SPI_CPHA)
111                 ctrl_reg |= MXC_CSPICTRL_PHA;
112         if (mode & SPI_CPOL)
113                 ctrl_reg |= MXC_CSPICTRL_POL;
114         if (mode & SPI_CS_HIGH)
115                 ctrl_reg |= MXC_CSPICTRL_SSPOL;
116         mxcs->ctrl_reg = ctrl_reg;
117
118         return 0;
119 }
120 #endif
121
122 #ifdef MXC_ECSPI
123 static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
124                 unsigned int max_hz, unsigned int mode)
125 {
126         u32 clk_src = mxc_get_clock(MXC_CSPI_CLK);
127         s32 reg_ctrl, reg_config;
128         u32 ss_pol = 0, sclkpol = 0, sclkpha = 0, sclkctl = 0;
129         u32 pre_div = 0, post_div = 0;
130         struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
131
132         if (max_hz == 0) {
133                 printf("Error: desired clock is 0\n");
134                 return -1;
135         }
136
137         /*
138          * Reset SPI and set all CSs to master mode, if toggling
139          * between slave and master mode we might see a glitch
140          * on the clock line
141          */
142         reg_ctrl = MXC_CSPICTRL_MODE_MASK;
143         reg_write(&regs->ctrl, reg_ctrl);
144         reg_ctrl |=  MXC_CSPICTRL_EN;
145         reg_write(&regs->ctrl, reg_ctrl);
146
147         if (clk_src > max_hz) {
148                 pre_div = (clk_src - 1) / max_hz;
149                 /* fls(1) = 1, fls(0x80000000) = 32, fls(16) = 5 */
150                 post_div = fls(pre_div);
151                 if (post_div > 4) {
152                         post_div -= 4;
153                         if (post_div >= 16) {
154                                 printf("Error: no divider for the freq: %d\n",
155                                         max_hz);
156                                 return -1;
157                         }
158                         pre_div >>= post_div;
159                 } else {
160                         post_div = 0;
161                 }
162         }
163
164         debug("pre_div = %d, post_div=%d\n", pre_div, post_div);
165         reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_SELCHAN(3)) |
166                 MXC_CSPICTRL_SELCHAN(cs);
167         reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_PREDIV(0x0F)) |
168                 MXC_CSPICTRL_PREDIV(pre_div);
169         reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_POSTDIV(0x0F)) |
170                 MXC_CSPICTRL_POSTDIV(post_div);
171
172         if (mode & SPI_CS_HIGH)
173                 ss_pol = 1;
174
175         if (mode & SPI_CPOL) {
176                 sclkpol = 1;
177                 sclkctl = 1;
178         }
179
180         if (mode & SPI_CPHA)
181                 sclkpha = 1;
182
183         reg_config = reg_read(&regs->cfg);
184
185         /*
186          * Configuration register setup
187          * The MX51 supports different setup for each SS
188          */
189         reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_SSPOL))) |
190                 (ss_pol << (cs + MXC_CSPICON_SSPOL));
191         reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_POL))) |
192                 (sclkpol << (cs + MXC_CSPICON_POL));
193         reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_CTL))) |
194                 (sclkctl << (cs + MXC_CSPICON_CTL));
195         reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_PHA))) |
196                 (sclkpha << (cs + MXC_CSPICON_PHA));
197
198         debug("reg_ctrl = 0x%x\n", reg_ctrl);
199         reg_write(&regs->ctrl, reg_ctrl);
200         debug("reg_config = 0x%x\n", reg_config);
201         reg_write(&regs->cfg, reg_config);
202
203         /* save config register and control register */
204         mxcs->ctrl_reg = reg_ctrl;
205         mxcs->cfg_reg = reg_config;
206
207         /* clear interrupt reg */
208         reg_write(&regs->intr, 0);
209         reg_write(&regs->stat, MXC_CSPICTRL_TC | MXC_CSPICTRL_RXOVF);
210
211         return 0;
212 }
213 #endif
214
215 int spi_xchg_single(struct spi_slave *slave, unsigned int bitlen,
216         const u8 *dout, u8 *din, unsigned long flags)
217 {
218         struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
219         int nbytes = DIV_ROUND_UP(bitlen, 8);
220         u32 data, cnt, i;
221         struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
222         u32 ts;
223         int status;
224
225         debug("%s: bitlen %d dout 0x%x din 0x%x\n",
226                 __func__, bitlen, (u32)dout, (u32)din);
227
228         mxcs->ctrl_reg = (mxcs->ctrl_reg &
229                 ~MXC_CSPICTRL_BITCOUNT(MXC_CSPICTRL_MAXBITS)) |
230                 MXC_CSPICTRL_BITCOUNT(bitlen - 1);
231
232         reg_write(&regs->ctrl, mxcs->ctrl_reg | MXC_CSPICTRL_EN);
233 #ifdef MXC_ECSPI
234         reg_write(&regs->cfg, mxcs->cfg_reg);
235 #endif
236
237         /* Clear interrupt register */
238         reg_write(&regs->stat, MXC_CSPICTRL_TC | MXC_CSPICTRL_RXOVF);
239
240         /*
241          * The SPI controller works only with words,
242          * check if less than a word is sent.
243          * Access to the FIFO is only 32 bit
244          */
245         if (bitlen % 32) {
246                 data = 0;
247                 cnt = (bitlen % 32) / 8;
248                 if (dout) {
249                         for (i = 0; i < cnt; i++) {
250                                 data = (data << 8) | (*dout++ & 0xFF);
251                         }
252                 }
253                 debug("Sending SPI 0x%x\n", data);
254
255                 reg_write(&regs->txdata, data);
256                 nbytes -= cnt;
257         }
258
259         data = 0;
260
261         while (nbytes > 0) {
262                 data = 0;
263                 if (dout) {
264                         /* Buffer is not 32-bit aligned */
265                         if ((unsigned long)dout & 0x03) {
266                                 data = 0;
267                                 for (i = 0; i < 4; i++)
268                                         data = (data << 8) | (*dout++ & 0xFF);
269                         } else {
270                                 data = *(u32 *)dout;
271                                 data = cpu_to_be32(data);
272                                 dout += 4;
273                         }
274                 }
275                 debug("Sending SPI 0x%x\n", data);
276                 reg_write(&regs->txdata, data);
277                 nbytes -= 4;
278         }
279
280         /* FIFO is written, now starts the transfer setting the XCH bit */
281         reg_write(&regs->ctrl, mxcs->ctrl_reg |
282                 MXC_CSPICTRL_EN | MXC_CSPICTRL_XCH);
283
284         ts = get_timer(0);
285         status = reg_read(&regs->stat);
286         /* Wait until the TC (Transfer completed) bit is set */
287         while ((status & MXC_CSPICTRL_TC) == 0) {
288                 if (get_timer(ts) > CONFIG_SYS_SPI_MXC_WAIT) {
289                         printf("spi_xchg_single: Timeout!\n");
290                         return -1;
291                 }
292                 status = reg_read(&regs->stat);
293         }
294
295         /* Transfer completed, clear any pending request */
296         reg_write(&regs->stat, MXC_CSPICTRL_TC | MXC_CSPICTRL_RXOVF);
297
298         nbytes = DIV_ROUND_UP(bitlen, 8);
299
300         cnt = nbytes % 32;
301
302         if (bitlen % 32) {
303                 data = reg_read(&regs->rxdata);
304                 cnt = (bitlen % 32) / 8;
305                 data = cpu_to_be32(data) >> ((sizeof(data) - cnt) * 8);
306                 debug("SPI Rx unaligned: 0x%x\n", data);
307                 if (din) {
308                         memcpy(din, &data, cnt);
309                         din += cnt;
310                 }
311                 nbytes -= cnt;
312         }
313
314         while (nbytes > 0) {
315                 u32 tmp;
316                 tmp = reg_read(&regs->rxdata);
317                 data = cpu_to_be32(tmp);
318                 debug("SPI Rx: 0x%x 0x%x\n", tmp, data);
319                 cnt = min(nbytes, sizeof(data));
320                 if (din) {
321                         memcpy(din, &data, cnt);
322                         din += cnt;
323                 }
324                 nbytes -= cnt;
325         }
326
327         return 0;
328
329 }
330
331 int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
332                 void *din, unsigned long flags)
333 {
334         int n_bytes = DIV_ROUND_UP(bitlen, 8);
335         int n_bits;
336         int ret;
337         u32 blk_size;
338         u8 *p_outbuf = (u8 *)dout;
339         u8 *p_inbuf = (u8 *)din;
340
341         if (!slave)
342                 return -1;
343
344         if (flags & SPI_XFER_BEGIN)
345                 spi_cs_activate(slave);
346
347         while (n_bytes > 0) {
348                 if (n_bytes < MAX_SPI_BYTES)
349                         blk_size = n_bytes;
350                 else
351                         blk_size = MAX_SPI_BYTES;
352
353                 n_bits = blk_size * 8;
354
355                 ret = spi_xchg_single(slave, n_bits, p_outbuf, p_inbuf, 0);
356
357                 if (ret)
358                         return ret;
359                 if (dout)
360                         p_outbuf += blk_size;
361                 if (din)
362                         p_inbuf += blk_size;
363                 n_bytes -= blk_size;
364         }
365
366         if (flags & SPI_XFER_END) {
367                 spi_cs_deactivate(slave);
368         }
369
370         return 0;
371 }
372
373 void spi_init(void)
374 {
375 }
376
377 /*
378  * Some SPI devices require active chip-select over multiple
379  * transactions, we achieve this using a GPIO. Still, the SPI
380  * controller has to be configured to use one of its own chipselects.
381  * To use this feature you have to implement board_spi_cs_gpio() to assign
382  * a gpio value for each cs (-1 if cs doesn't need to use gpio).
383  * You must use some unused on this SPI controller cs between 0 and 3.
384  */
385 static int setup_cs_gpio(struct mxc_spi_slave *mxcs,
386                          unsigned int bus, unsigned int cs)
387 {
388         int ret;
389
390         mxcs->gpio = board_spi_cs_gpio(bus, cs);
391         if (mxcs->gpio == -1)
392                 return 0;
393
394         ret = gpio_direction_output(mxcs->gpio, !(mxcs->ss_pol));
395         if (ret) {
396                 printf("mxc_spi: cannot setup gpio %d\n", mxcs->gpio);
397                 return -EINVAL;
398         }
399
400         return 0;
401 }
402
403 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
404                         unsigned int max_hz, unsigned int mode)
405 {
406         struct mxc_spi_slave *mxcs;
407         int ret;
408
409         if (bus >= ARRAY_SIZE(spi_bases))
410                 return NULL;
411
412         mxcs = spi_alloc_slave(struct mxc_spi_slave, bus, cs);
413         if (!mxcs) {
414                 puts("mxc_spi: SPI Slave not allocated !\n");
415                 return NULL;
416         }
417
418         mxcs->ss_pol = (mode & SPI_CS_HIGH) ? 1 : 0;
419
420         ret = setup_cs_gpio(mxcs, bus, cs);
421         if (ret < 0) {
422                 free(mxcs);
423                 return NULL;
424         }
425
426         mxcs->base = spi_bases[bus];
427
428         ret = spi_cfg_mxc(mxcs, cs, max_hz, mode);
429         if (ret) {
430                 printf("mxc_spi: cannot setup SPI controller\n");
431                 free(mxcs);
432                 return NULL;
433         }
434         return &mxcs->slave;
435 }
436
437 void spi_free_slave(struct spi_slave *slave)
438 {
439         struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
440
441         free(mxcs);
442 }
443
444 int spi_claim_bus(struct spi_slave *slave)
445 {
446         struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
447         struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
448
449         reg_write(&regs->rxdata, 1);
450         udelay(1);
451         reg_write(&regs->ctrl, mxcs->ctrl_reg);
452         reg_write(&regs->period, MXC_CSPIPERIOD_32KHZ);
453         reg_write(&regs->intr, 0);
454
455         return 0;
456 }
457
458 void spi_release_bus(struct spi_slave *slave)
459 {
460         /* TODO: Shut the controller down */
461 }