1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * SH QSPI (Quad SPI) driver
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2013 Renesas Electronics Corporation
5*4882a593Smuzhiyun * Copyright (C) 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <common.h>
11*4882a593Smuzhiyun #include <console.h>
12*4882a593Smuzhiyun #include <malloc.h>
13*4882a593Smuzhiyun #include <spi.h>
14*4882a593Smuzhiyun #include <wait_bit.h>
15*4882a593Smuzhiyun #include <asm/arch/rmobile.h>
16*4882a593Smuzhiyun #include <asm/io.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /* SH QSPI register bit masks <REG>_<BIT> */
19*4882a593Smuzhiyun #define SPCR_MSTR 0x08
20*4882a593Smuzhiyun #define SPCR_SPE 0x40
21*4882a593Smuzhiyun #define SPSR_SPRFF 0x80
22*4882a593Smuzhiyun #define SPSR_SPTEF 0x20
23*4882a593Smuzhiyun #define SPPCR_IO3FV 0x04
24*4882a593Smuzhiyun #define SPPCR_IO2FV 0x02
25*4882a593Smuzhiyun #define SPPCR_IO1FV 0x01
26*4882a593Smuzhiyun #define SPBDCR_RXBC0 BIT(0)
27*4882a593Smuzhiyun #define SPCMD_SCKDEN BIT(15)
28*4882a593Smuzhiyun #define SPCMD_SLNDEN BIT(14)
29*4882a593Smuzhiyun #define SPCMD_SPNDEN BIT(13)
30*4882a593Smuzhiyun #define SPCMD_SSLKP BIT(7)
31*4882a593Smuzhiyun #define SPCMD_BRDV0 BIT(2)
32*4882a593Smuzhiyun #define SPCMD_INIT1 SPCMD_SCKDEN | SPCMD_SLNDEN | \
33*4882a593Smuzhiyun SPCMD_SPNDEN | SPCMD_SSLKP | \
34*4882a593Smuzhiyun SPCMD_BRDV0
35*4882a593Smuzhiyun #define SPCMD_INIT2 SPCMD_SPNDEN | SPCMD_SSLKP | \
36*4882a593Smuzhiyun SPCMD_BRDV0
37*4882a593Smuzhiyun #define SPBFCR_TXRST BIT(7)
38*4882a593Smuzhiyun #define SPBFCR_RXRST BIT(6)
39*4882a593Smuzhiyun #define SPBFCR_TXTRG 0x30
40*4882a593Smuzhiyun #define SPBFCR_RXTRG 0x07
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /* SH QSPI register set */
43*4882a593Smuzhiyun struct sh_qspi_regs {
44*4882a593Smuzhiyun u8 spcr;
45*4882a593Smuzhiyun u8 sslp;
46*4882a593Smuzhiyun u8 sppcr;
47*4882a593Smuzhiyun u8 spsr;
48*4882a593Smuzhiyun u32 spdr;
49*4882a593Smuzhiyun u8 spscr;
50*4882a593Smuzhiyun u8 spssr;
51*4882a593Smuzhiyun u8 spbr;
52*4882a593Smuzhiyun u8 spdcr;
53*4882a593Smuzhiyun u8 spckd;
54*4882a593Smuzhiyun u8 sslnd;
55*4882a593Smuzhiyun u8 spnd;
56*4882a593Smuzhiyun u8 dummy0;
57*4882a593Smuzhiyun u16 spcmd0;
58*4882a593Smuzhiyun u16 spcmd1;
59*4882a593Smuzhiyun u16 spcmd2;
60*4882a593Smuzhiyun u16 spcmd3;
61*4882a593Smuzhiyun u8 spbfcr;
62*4882a593Smuzhiyun u8 dummy1;
63*4882a593Smuzhiyun u16 spbdcr;
64*4882a593Smuzhiyun u32 spbmul0;
65*4882a593Smuzhiyun u32 spbmul1;
66*4882a593Smuzhiyun u32 spbmul2;
67*4882a593Smuzhiyun u32 spbmul3;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun struct sh_qspi_slave {
71*4882a593Smuzhiyun struct spi_slave slave;
72*4882a593Smuzhiyun struct sh_qspi_regs *regs;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun
to_sh_qspi(struct spi_slave * slave)75*4882a593Smuzhiyun static inline struct sh_qspi_slave *to_sh_qspi(struct spi_slave *slave)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun return container_of(slave, struct sh_qspi_slave, slave);
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
sh_qspi_init(struct sh_qspi_slave * ss)80*4882a593Smuzhiyun static void sh_qspi_init(struct sh_qspi_slave *ss)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun /* QSPI initialize */
83*4882a593Smuzhiyun /* Set master mode only */
84*4882a593Smuzhiyun writeb(SPCR_MSTR, &ss->regs->spcr);
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun /* Set SSL signal level */
87*4882a593Smuzhiyun writeb(0x00, &ss->regs->sslp);
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /* Set MOSI signal value when transfer is in idle state */
90*4882a593Smuzhiyun writeb(SPPCR_IO3FV|SPPCR_IO2FV, &ss->regs->sppcr);
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /* Set bit rate. See 58.3.8 Quad Serial Peripheral Interface */
93*4882a593Smuzhiyun writeb(0x01, &ss->regs->spbr);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun /* Disable Dummy Data Transmission */
96*4882a593Smuzhiyun writeb(0x00, &ss->regs->spdcr);
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /* Set clock delay value */
99*4882a593Smuzhiyun writeb(0x00, &ss->regs->spckd);
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /* Set SSL negation delay value */
102*4882a593Smuzhiyun writeb(0x00, &ss->regs->sslnd);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /* Set next-access delay value */
105*4882a593Smuzhiyun writeb(0x00, &ss->regs->spnd);
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /* Set equence command */
108*4882a593Smuzhiyun writew(SPCMD_INIT2, &ss->regs->spcmd0);
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun /* Reset transfer and receive Buffer */
111*4882a593Smuzhiyun setbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun /* Clear transfer and receive Buffer control bit */
114*4882a593Smuzhiyun clrbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /* Set equence control method. Use equence0 only */
117*4882a593Smuzhiyun writeb(0x00, &ss->regs->spscr);
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /* Enable SPI function */
120*4882a593Smuzhiyun setbits_8(&ss->regs->spcr, SPCR_SPE);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
spi_cs_is_valid(unsigned int bus,unsigned int cs)123*4882a593Smuzhiyun int spi_cs_is_valid(unsigned int bus, unsigned int cs)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun return 1;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
spi_cs_activate(struct spi_slave * slave)128*4882a593Smuzhiyun void spi_cs_activate(struct spi_slave *slave)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun struct sh_qspi_slave *ss = to_sh_qspi(slave);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun /* Set master mode only */
133*4882a593Smuzhiyun writeb(SPCR_MSTR, &ss->regs->spcr);
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun /* Set command */
136*4882a593Smuzhiyun writew(SPCMD_INIT1, &ss->regs->spcmd0);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun /* Reset transfer and receive Buffer */
139*4882a593Smuzhiyun setbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun /* Clear transfer and receive Buffer control bit */
142*4882a593Smuzhiyun clrbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* Set equence control method. Use equence0 only */
145*4882a593Smuzhiyun writeb(0x00, &ss->regs->spscr);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun /* Enable SPI function */
148*4882a593Smuzhiyun setbits_8(&ss->regs->spcr, SPCR_SPE);
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
spi_cs_deactivate(struct spi_slave * slave)151*4882a593Smuzhiyun void spi_cs_deactivate(struct spi_slave *slave)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun struct sh_qspi_slave *ss = to_sh_qspi(slave);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /* Disable SPI Function */
156*4882a593Smuzhiyun clrbits_8(&ss->regs->spcr, SPCR_SPE);
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun
spi_init(void)159*4882a593Smuzhiyun void spi_init(void)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun /* nothing to do */
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
spi_setup_slave(unsigned int bus,unsigned int cs,unsigned int max_hz,unsigned int mode)164*4882a593Smuzhiyun struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
165*4882a593Smuzhiyun unsigned int max_hz, unsigned int mode)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun struct sh_qspi_slave *ss;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun if (!spi_cs_is_valid(bus, cs))
170*4882a593Smuzhiyun return NULL;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun ss = spi_alloc_slave(struct sh_qspi_slave, bus, cs);
173*4882a593Smuzhiyun if (!ss) {
174*4882a593Smuzhiyun printf("SPI_error: Fail to allocate sh_qspi_slave\n");
175*4882a593Smuzhiyun return NULL;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun ss->regs = (struct sh_qspi_regs *)SH_QSPI_BASE;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun /* Init SH QSPI */
181*4882a593Smuzhiyun sh_qspi_init(ss);
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun return &ss->slave;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
spi_free_slave(struct spi_slave * slave)186*4882a593Smuzhiyun void spi_free_slave(struct spi_slave *slave)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun struct sh_qspi_slave *spi = to_sh_qspi(slave);
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun free(spi);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
spi_claim_bus(struct spi_slave * slave)193*4882a593Smuzhiyun int spi_claim_bus(struct spi_slave *slave)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun return 0;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
spi_release_bus(struct spi_slave * slave)198*4882a593Smuzhiyun void spi_release_bus(struct spi_slave *slave)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
spi_xfer(struct spi_slave * slave,unsigned int bitlen,const void * dout,void * din,unsigned long flags)202*4882a593Smuzhiyun int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
203*4882a593Smuzhiyun void *din, unsigned long flags)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun struct sh_qspi_slave *ss = to_sh_qspi(slave);
206*4882a593Smuzhiyun u32 nbyte, chunk;
207*4882a593Smuzhiyun int i, ret = 0;
208*4882a593Smuzhiyun u8 dtdata = 0, drdata;
209*4882a593Smuzhiyun u8 *tdata = &dtdata, *rdata = &drdata;
210*4882a593Smuzhiyun u32 *spbmul0 = &ss->regs->spbmul0;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun if (dout == NULL && din == NULL) {
213*4882a593Smuzhiyun if (flags & SPI_XFER_END)
214*4882a593Smuzhiyun spi_cs_deactivate(slave);
215*4882a593Smuzhiyun return 0;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun if (bitlen % 8) {
219*4882a593Smuzhiyun printf("%s: bitlen is not 8bit alined %d", __func__, bitlen);
220*4882a593Smuzhiyun return 1;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun nbyte = bitlen / 8;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun if (flags & SPI_XFER_BEGIN) {
226*4882a593Smuzhiyun spi_cs_activate(slave);
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /* Set 1048576 byte */
229*4882a593Smuzhiyun writel(0x100000, spbmul0);
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun if (flags & SPI_XFER_END)
233*4882a593Smuzhiyun writel(nbyte, spbmul0);
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun if (dout != NULL)
236*4882a593Smuzhiyun tdata = (u8 *)dout;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun if (din != NULL)
239*4882a593Smuzhiyun rdata = din;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun while (nbyte > 0) {
242*4882a593Smuzhiyun /*
243*4882a593Smuzhiyun * Check if there is 32 Byte chunk and if there is, transfer
244*4882a593Smuzhiyun * it in one burst, otherwise transfer on byte-by-byte basis.
245*4882a593Smuzhiyun */
246*4882a593Smuzhiyun chunk = (nbyte >= 32) ? 32 : 1;
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun clrsetbits_8(&ss->regs->spbfcr, SPBFCR_TXTRG | SPBFCR_RXTRG,
249*4882a593Smuzhiyun chunk == 32 ? SPBFCR_TXTRG | SPBFCR_RXTRG : 0);
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun ret = wait_for_bit_8(&ss->regs->spsr, SPSR_SPTEF,
252*4882a593Smuzhiyun true, 1000, true);
253*4882a593Smuzhiyun if (ret)
254*4882a593Smuzhiyun return ret;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun for (i = 0; i < chunk; i++) {
257*4882a593Smuzhiyun writeb(*tdata, &ss->regs->spdr);
258*4882a593Smuzhiyun if (dout != NULL)
259*4882a593Smuzhiyun tdata++;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun ret = wait_for_bit_8(&ss->regs->spsr, SPSR_SPRFF,
263*4882a593Smuzhiyun true, 1000, true);
264*4882a593Smuzhiyun if (ret)
265*4882a593Smuzhiyun return ret;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun for (i = 0; i < chunk; i++) {
268*4882a593Smuzhiyun *rdata = readb(&ss->regs->spdr);
269*4882a593Smuzhiyun if (din != NULL)
270*4882a593Smuzhiyun rdata++;
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun nbyte -= chunk;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun if (flags & SPI_XFER_END)
277*4882a593Smuzhiyun spi_cs_deactivate(slave);
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun return ret;
280*4882a593Smuzhiyun }
281