1
2
3
4
5
6
7
8
9#include <common.h>
10#include <console.h>
11#include <malloc.h>
12#include <spi.h>
13#include <wait_bit.h>
14#include <asm/arch/rmobile.h>
15#include <asm/io.h>
16
17
18#define SPCR_MSTR 0x08
19#define SPCR_SPE 0x40
20#define SPSR_SPRFF 0x80
21#define SPSR_SPTEF 0x20
22#define SPPCR_IO3FV 0x04
23#define SPPCR_IO2FV 0x02
24#define SPPCR_IO1FV 0x01
25#define SPBDCR_RXBC0 BIT(0)
26#define SPCMD_SCKDEN BIT(15)
27#define SPCMD_SLNDEN BIT(14)
28#define SPCMD_SPNDEN BIT(13)
29#define SPCMD_SSLKP BIT(7)
30#define SPCMD_BRDV0 BIT(2)
31#define SPCMD_INIT1 SPCMD_SCKDEN | SPCMD_SLNDEN | \
32 SPCMD_SPNDEN | SPCMD_SSLKP | \
33 SPCMD_BRDV0
34#define SPCMD_INIT2 SPCMD_SPNDEN | SPCMD_SSLKP | \
35 SPCMD_BRDV0
36#define SPBFCR_TXRST BIT(7)
37#define SPBFCR_RXRST BIT(6)
38#define SPBFCR_TXTRG 0x30
39#define SPBFCR_RXTRG 0x07
40
41
42struct sh_qspi_regs {
43 u8 spcr;
44 u8 sslp;
45 u8 sppcr;
46 u8 spsr;
47 u32 spdr;
48 u8 spscr;
49 u8 spssr;
50 u8 spbr;
51 u8 spdcr;
52 u8 spckd;
53 u8 sslnd;
54 u8 spnd;
55 u8 dummy0;
56 u16 spcmd0;
57 u16 spcmd1;
58 u16 spcmd2;
59 u16 spcmd3;
60 u8 spbfcr;
61 u8 dummy1;
62 u16 spbdcr;
63 u32 spbmul0;
64 u32 spbmul1;
65 u32 spbmul2;
66 u32 spbmul3;
67};
68
69struct sh_qspi_slave {
70#ifndef CONFIG_DM_SPI
71 struct spi_slave slave;
72#endif
73 struct sh_qspi_regs *regs;
74};
75
76static void sh_qspi_init(struct sh_qspi_slave *ss)
77{
78
79
80 writeb(SPCR_MSTR, &ss->regs->spcr);
81
82
83 writeb(0x00, &ss->regs->sslp);
84
85
86 writeb(SPPCR_IO3FV|SPPCR_IO2FV, &ss->regs->sppcr);
87
88
89 writeb(0x01, &ss->regs->spbr);
90
91
92 writeb(0x00, &ss->regs->spdcr);
93
94
95 writeb(0x00, &ss->regs->spckd);
96
97
98 writeb(0x00, &ss->regs->sslnd);
99
100
101 writeb(0x00, &ss->regs->spnd);
102
103
104 writew(SPCMD_INIT2, &ss->regs->spcmd0);
105
106
107 setbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
108
109
110 clrbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
111
112
113 writeb(0x00, &ss->regs->spscr);
114
115
116 setbits_8(&ss->regs->spcr, SPCR_SPE);
117}
118
119static void sh_qspi_cs_activate(struct sh_qspi_slave *ss)
120{
121
122 writeb(SPCR_MSTR, &ss->regs->spcr);
123
124
125 writew(SPCMD_INIT1, &ss->regs->spcmd0);
126
127
128 setbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
129
130
131 clrbits_8(&ss->regs->spbfcr, SPBFCR_TXRST|SPBFCR_RXRST);
132
133
134 writeb(0x00, &ss->regs->spscr);
135
136
137 setbits_8(&ss->regs->spcr, SPCR_SPE);
138}
139
140static void sh_qspi_cs_deactivate(struct sh_qspi_slave *ss)
141{
142
143 clrbits_8(&ss->regs->spcr, SPCR_SPE);
144}
145
146static int sh_qspi_xfer_common(struct sh_qspi_slave *ss, unsigned int bitlen,
147 const void *dout, void *din, unsigned long flags)
148{
149 u32 nbyte, chunk;
150 int i, ret = 0;
151 u8 dtdata = 0, drdata;
152 u8 *tdata = &dtdata, *rdata = &drdata;
153 u32 *spbmul0 = &ss->regs->spbmul0;
154
155 if (dout == NULL && din == NULL) {
156 if (flags & SPI_XFER_END)
157 sh_qspi_cs_deactivate(ss);
158 return 0;
159 }
160
161 if (bitlen % 8) {
162 printf("%s: bitlen is not 8bit alined %d", __func__, bitlen);
163 return 1;
164 }
165
166 nbyte = bitlen / 8;
167
168 if (flags & SPI_XFER_BEGIN) {
169 sh_qspi_cs_activate(ss);
170
171
172 writel(0x100000, spbmul0);
173 }
174
175 if (flags & SPI_XFER_END)
176 writel(nbyte, spbmul0);
177
178 if (dout != NULL)
179 tdata = (u8 *)dout;
180
181 if (din != NULL)
182 rdata = din;
183
184 while (nbyte > 0) {
185
186
187
188
189 chunk = (nbyte >= 32) ? 32 : 1;
190
191 clrsetbits_8(&ss->regs->spbfcr, SPBFCR_TXTRG | SPBFCR_RXTRG,
192 chunk == 32 ? SPBFCR_TXTRG | SPBFCR_RXTRG : 0);
193
194 ret = wait_for_bit_8(&ss->regs->spsr, SPSR_SPTEF,
195 true, 1000, true);
196 if (ret)
197 return ret;
198
199 for (i = 0; i < chunk; i++) {
200 writeb(*tdata, &ss->regs->spdr);
201 if (dout != NULL)
202 tdata++;
203 }
204
205 ret = wait_for_bit_8(&ss->regs->spsr, SPSR_SPRFF,
206 true, 1000, true);
207 if (ret)
208 return ret;
209
210 for (i = 0; i < chunk; i++) {
211 *rdata = readb(&ss->regs->spdr);
212 if (din != NULL)
213 rdata++;
214 }
215
216 nbyte -= chunk;
217 }
218
219 if (flags & SPI_XFER_END)
220 sh_qspi_cs_deactivate(ss);
221
222 return ret;
223}
224
225#ifndef CONFIG_DM_SPI
226static inline struct sh_qspi_slave *to_sh_qspi(struct spi_slave *slave)
227{
228 return container_of(slave, struct sh_qspi_slave, slave);
229}
230
231int spi_cs_is_valid(unsigned int bus, unsigned int cs)
232{
233 return 1;
234}
235
236void spi_cs_activate(struct spi_slave *slave)
237{
238 struct sh_qspi_slave *ss = to_sh_qspi(slave);
239
240 sh_qspi_cs_activate(ss);
241}
242
243void spi_cs_deactivate(struct spi_slave *slave)
244{
245 struct sh_qspi_slave *ss = to_sh_qspi(slave);
246
247 sh_qspi_cs_deactivate(ss);
248}
249
250struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
251 unsigned int max_hz, unsigned int mode)
252{
253 struct sh_qspi_slave *ss;
254
255 if (!spi_cs_is_valid(bus, cs))
256 return NULL;
257
258 ss = spi_alloc_slave(struct sh_qspi_slave, bus, cs);
259 if (!ss) {
260 printf("SPI_error: Fail to allocate sh_qspi_slave\n");
261 return NULL;
262 }
263
264 ss->regs = (struct sh_qspi_regs *)SH_QSPI_BASE;
265
266
267 sh_qspi_init(ss);
268
269 return &ss->slave;
270}
271
272void spi_free_slave(struct spi_slave *slave)
273{
274 struct sh_qspi_slave *spi = to_sh_qspi(slave);
275
276 free(spi);
277}
278
279int spi_claim_bus(struct spi_slave *slave)
280{
281 return 0;
282}
283
284void spi_release_bus(struct spi_slave *slave)
285{
286}
287
288int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
289 const void *dout, void *din, unsigned long flags)
290{
291 struct sh_qspi_slave *ss = to_sh_qspi(slave);
292
293 return sh_qspi_xfer_common(ss, bitlen, dout, din, flags);
294}
295
296#else
297
298#include <dm.h>
299
300static int sh_qspi_xfer(struct udevice *dev, unsigned int bitlen,
301 const void *dout, void *din, unsigned long flags)
302{
303 struct udevice *bus = dev->parent;
304 struct sh_qspi_slave *ss = dev_get_platdata(bus);
305
306 return sh_qspi_xfer_common(ss, bitlen, dout, din, flags);
307}
308
309static int sh_qspi_set_speed(struct udevice *dev, uint speed)
310{
311
312 return 0;
313}
314
315static int sh_qspi_set_mode(struct udevice *dev, uint mode)
316{
317
318 return 0;
319}
320
321static int sh_qspi_probe(struct udevice *dev)
322{
323 struct sh_qspi_slave *ss = dev_get_platdata(dev);
324
325 sh_qspi_init(ss);
326
327 return 0;
328}
329
330static int sh_qspi_ofdata_to_platdata(struct udevice *dev)
331{
332 struct sh_qspi_slave *plat = dev_get_platdata(dev);
333
334 plat->regs = (struct sh_qspi_regs *)dev_read_addr(dev);
335
336 return 0;
337}
338
339static const struct dm_spi_ops sh_qspi_ops = {
340 .xfer = sh_qspi_xfer,
341 .set_speed = sh_qspi_set_speed,
342 .set_mode = sh_qspi_set_mode,
343};
344
345static const struct udevice_id sh_qspi_ids[] = {
346 { .compatible = "renesas,qspi" },
347 { }
348};
349
350U_BOOT_DRIVER(sh_qspi) = {
351 .name = "sh_qspi",
352 .id = UCLASS_SPI,
353 .of_match = sh_qspi_ids,
354 .ops = &sh_qspi_ops,
355 .ofdata_to_platdata = sh_qspi_ofdata_to_platdata,
356 .platdata_auto_alloc_size = sizeof(struct sh_qspi_slave),
357 .probe = sh_qspi_probe,
358};
359#endif
360