Merge branch 'remotes/lorenzo/pci/hv'
[linux-2.6-microblaze.git] / drivers / staging / wilc1000 / spi.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
4  * All rights reserved.
5  */
6
7 #include <linux/clk.h>
8 #include <linux/spi/spi.h>
9 #include <linux/crc7.h>
10
11 #include "netdev.h"
12 #include "cfg80211.h"
13
14 struct wilc_spi {
15         int crc_off;
16 };
17
18 static const struct wilc_hif_func wilc_hif_spi;
19
20 /********************************************
21  *
22  *      Spi protocol Function
23  *
24  ********************************************/
25
26 #define CMD_DMA_WRITE                           0xc1
27 #define CMD_DMA_READ                            0xc2
28 #define CMD_INTERNAL_WRITE                      0xc3
29 #define CMD_INTERNAL_READ                       0xc4
30 #define CMD_TERMINATE                           0xc5
31 #define CMD_REPEAT                              0xc6
32 #define CMD_DMA_EXT_WRITE                       0xc7
33 #define CMD_DMA_EXT_READ                        0xc8
34 #define CMD_SINGLE_WRITE                        0xc9
35 #define CMD_SINGLE_READ                         0xca
36 #define CMD_RESET                               0xcf
37
38 #define DATA_PKT_SZ_256                         256
39 #define DATA_PKT_SZ_512                         512
40 #define DATA_PKT_SZ_1K                          1024
41 #define DATA_PKT_SZ_4K                          (4 * 1024)
42 #define DATA_PKT_SZ_8K                          (8 * 1024)
43 #define DATA_PKT_SZ                             DATA_PKT_SZ_8K
44
45 #define USE_SPI_DMA                             0
46
47 #define WILC_SPI_COMMAND_STAT_SUCCESS           0
48 #define WILC_GET_RESP_HDR_START(h)              (((h) >> 4) & 0xf)
49
50 struct wilc_spi_cmd {
51         u8 cmd_type;
52         union {
53                 struct {
54                         u8 addr[3];
55                         u8 crc[];
56                 } __packed simple_cmd;
57                 struct {
58                         u8 addr[3];
59                         u8 size[2];
60                         u8 crc[];
61                 } __packed dma_cmd;
62                 struct {
63                         u8 addr[3];
64                         u8 size[3];
65                         u8 crc[];
66                 } __packed dma_cmd_ext;
67                 struct {
68                         u8 addr[2];
69                         __be32 data;
70                         u8 crc[];
71                 } __packed internal_w_cmd;
72                 struct {
73                         u8 addr[3];
74                         __be32 data;
75                         u8 crc[];
76                 } __packed w_cmd;
77         } u;
78 } __packed;
79
80 struct wilc_spi_read_rsp_data {
81         u8 rsp_cmd_type;
82         u8 status;
83         u8 resp_header;
84         u8 resp_data[4];
85         u8 crc[];
86 } __packed;
87
88 struct wilc_spi_rsp_data {
89         u8 rsp_cmd_type;
90         u8 status;
91 } __packed;
92
93 static int wilc_bus_probe(struct spi_device *spi)
94 {
95         int ret;
96         struct wilc *wilc;
97         struct wilc_spi *spi_priv;
98
99         spi_priv = kzalloc(sizeof(*spi_priv), GFP_KERNEL);
100         if (!spi_priv)
101                 return -ENOMEM;
102
103         ret = wilc_cfg80211_init(&wilc, &spi->dev, WILC_HIF_SPI, &wilc_hif_spi);
104         if (ret) {
105                 kfree(spi_priv);
106                 return ret;
107         }
108
109         spi_set_drvdata(spi, wilc);
110         wilc->dev = &spi->dev;
111         wilc->bus_data = spi_priv;
112         wilc->dev_irq_num = spi->irq;
113
114         wilc->rtc_clk = devm_clk_get(&spi->dev, "rtc_clk");
115         if (PTR_ERR_OR_ZERO(wilc->rtc_clk) == -EPROBE_DEFER)
116                 return -EPROBE_DEFER;
117         else if (!IS_ERR(wilc->rtc_clk))
118                 clk_prepare_enable(wilc->rtc_clk);
119
120         return 0;
121 }
122
123 static int wilc_bus_remove(struct spi_device *spi)
124 {
125         struct wilc *wilc = spi_get_drvdata(spi);
126
127         if (!IS_ERR(wilc->rtc_clk))
128                 clk_disable_unprepare(wilc->rtc_clk);
129
130         wilc_netdev_cleanup(wilc);
131         return 0;
132 }
133
134 static const struct of_device_id wilc_of_match[] = {
135         { .compatible = "microchip,wilc1000", },
136         { /* sentinel */ }
137 };
138 MODULE_DEVICE_TABLE(of, wilc_of_match);
139
140 static struct spi_driver wilc_spi_driver = {
141         .driver = {
142                 .name = MODALIAS,
143                 .of_match_table = wilc_of_match,
144         },
145         .probe =  wilc_bus_probe,
146         .remove = wilc_bus_remove,
147 };
148 module_spi_driver(wilc_spi_driver);
149 MODULE_LICENSE("GPL");
150
151 static int wilc_spi_tx(struct wilc *wilc, u8 *b, u32 len)
152 {
153         struct spi_device *spi = to_spi_device(wilc->dev);
154         int ret;
155         struct spi_message msg;
156
157         if (len > 0 && b) {
158                 struct spi_transfer tr = {
159                         .tx_buf = b,
160                         .len = len,
161                         .delay = {
162                                 .value = 0,
163                                 .unit = SPI_DELAY_UNIT_USECS
164                         },
165                 };
166                 char *r_buffer = kzalloc(len, GFP_KERNEL);
167
168                 if (!r_buffer)
169                         return -ENOMEM;
170
171                 tr.rx_buf = r_buffer;
172                 dev_dbg(&spi->dev, "Request writing %d bytes\n", len);
173
174                 memset(&msg, 0, sizeof(msg));
175                 spi_message_init(&msg);
176                 msg.spi = spi;
177                 msg.is_dma_mapped = USE_SPI_DMA;
178                 spi_message_add_tail(&tr, &msg);
179
180                 ret = spi_sync(spi, &msg);
181                 if (ret < 0)
182                         dev_err(&spi->dev, "SPI transaction failed\n");
183
184                 kfree(r_buffer);
185         } else {
186                 dev_err(&spi->dev,
187                         "can't write data with the following length: %d\n",
188                         len);
189                 ret = -EINVAL;
190         }
191
192         return ret;
193 }
194
195 static int wilc_spi_rx(struct wilc *wilc, u8 *rb, u32 rlen)
196 {
197         struct spi_device *spi = to_spi_device(wilc->dev);
198         int ret;
199
200         if (rlen > 0) {
201                 struct spi_message msg;
202                 struct spi_transfer tr = {
203                         .rx_buf = rb,
204                         .len = rlen,
205                         .delay = {
206                                 .value = 0,
207                                 .unit = SPI_DELAY_UNIT_USECS
208                         },
209
210                 };
211                 char *t_buffer = kzalloc(rlen, GFP_KERNEL);
212
213                 if (!t_buffer)
214                         return -ENOMEM;
215
216                 tr.tx_buf = t_buffer;
217
218                 memset(&msg, 0, sizeof(msg));
219                 spi_message_init(&msg);
220                 msg.spi = spi;
221                 msg.is_dma_mapped = USE_SPI_DMA;
222                 spi_message_add_tail(&tr, &msg);
223
224                 ret = spi_sync(spi, &msg);
225                 if (ret < 0)
226                         dev_err(&spi->dev, "SPI transaction failed\n");
227                 kfree(t_buffer);
228         } else {
229                 dev_err(&spi->dev,
230                         "can't read data with the following length: %u\n",
231                         rlen);
232                 ret = -EINVAL;
233         }
234
235         return ret;
236 }
237
238 static int wilc_spi_tx_rx(struct wilc *wilc, u8 *wb, u8 *rb, u32 rlen)
239 {
240         struct spi_device *spi = to_spi_device(wilc->dev);
241         int ret;
242
243         if (rlen > 0) {
244                 struct spi_message msg;
245                 struct spi_transfer tr = {
246                         .rx_buf = rb,
247                         .tx_buf = wb,
248                         .len = rlen,
249                         .bits_per_word = 8,
250                         .delay = {
251                                 .value = 0,
252                                 .unit = SPI_DELAY_UNIT_USECS
253                         },
254
255                 };
256
257                 memset(&msg, 0, sizeof(msg));
258                 spi_message_init(&msg);
259                 msg.spi = spi;
260                 msg.is_dma_mapped = USE_SPI_DMA;
261
262                 spi_message_add_tail(&tr, &msg);
263                 ret = spi_sync(spi, &msg);
264                 if (ret < 0)
265                         dev_err(&spi->dev, "SPI transaction failed\n");
266         } else {
267                 dev_err(&spi->dev,
268                         "can't read data with the following length: %u\n",
269                         rlen);
270                 ret = -EINVAL;
271         }
272
273         return ret;
274 }
275
276 static int spi_data_write(struct wilc *wilc, u8 *b, u32 sz)
277 {
278         struct spi_device *spi = to_spi_device(wilc->dev);
279         struct wilc_spi *spi_priv = wilc->bus_data;
280         int ix, nbytes;
281         int result = 0;
282         u8 cmd, order, crc[2] = {0};
283
284         /*
285          * Data
286          */
287         ix = 0;
288         do {
289                 if (sz <= DATA_PKT_SZ) {
290                         nbytes = sz;
291                         order = 0x3;
292                 } else {
293                         nbytes = DATA_PKT_SZ;
294                         if (ix == 0)
295                                 order = 0x1;
296                         else
297                                 order = 0x02;
298                 }
299
300                 /*
301                  * Write command
302                  */
303                 cmd = 0xf0;
304                 cmd |= order;
305
306                 if (wilc_spi_tx(wilc, &cmd, 1)) {
307                         dev_err(&spi->dev,
308                                 "Failed data block cmd write, bus error...\n");
309                         result = -EINVAL;
310                         break;
311                 }
312
313                 /*
314                  * Write data
315                  */
316                 if (wilc_spi_tx(wilc, &b[ix], nbytes)) {
317                         dev_err(&spi->dev,
318                                 "Failed data block write, bus error...\n");
319                         result = -EINVAL;
320                         break;
321                 }
322
323                 /*
324                  * Write Crc
325                  */
326                 if (!spi_priv->crc_off) {
327                         if (wilc_spi_tx(wilc, crc, 2)) {
328                                 dev_err(&spi->dev, "Failed data block crc write, bus error...\n");
329                                 result = -EINVAL;
330                                 break;
331                         }
332                 }
333
334                 /*
335                  * No need to wait for response
336                  */
337                 ix += nbytes;
338                 sz -= nbytes;
339         } while (sz);
340
341         return result;
342 }
343
344 /********************************************
345  *
346  *      Spi Internal Read/Write Function
347  *
348  ********************************************/
349 static u8 wilc_get_crc7(u8 *buffer, u32 len)
350 {
351         return crc7_be(0xfe, buffer, len);
352 }
353
354 static int wilc_spi_single_read(struct wilc *wilc, u8 cmd, u32 adr, void *b,
355                                 u8 clockless)
356 {
357         struct spi_device *spi = to_spi_device(wilc->dev);
358         struct wilc_spi *spi_priv = wilc->bus_data;
359         u8 wb[32], rb[32];
360         int cmd_len, resp_len;
361         u8 crc[2];
362         struct wilc_spi_cmd *c;
363         struct wilc_spi_read_rsp_data *r;
364
365         memset(wb, 0x0, sizeof(wb));
366         memset(rb, 0x0, sizeof(rb));
367         c = (struct wilc_spi_cmd *)wb;
368         c->cmd_type = cmd;
369         if (cmd == CMD_SINGLE_READ) {
370                 c->u.simple_cmd.addr[0] = adr >> 16;
371                 c->u.simple_cmd.addr[1] = adr >> 8;
372                 c->u.simple_cmd.addr[2] = adr;
373         } else if (cmd == CMD_INTERNAL_READ) {
374                 c->u.simple_cmd.addr[0] = adr >> 8;
375                 if (clockless == 1)
376                         c->u.simple_cmd.addr[0] |= BIT(7);
377                 c->u.simple_cmd.addr[1] = adr;
378                 c->u.simple_cmd.addr[2] = 0x0;
379         } else {
380                 dev_err(&spi->dev, "cmd [%x] not supported\n", cmd);
381                 return -EINVAL;
382         }
383
384         cmd_len = offsetof(struct wilc_spi_cmd, u.simple_cmd.crc);
385         resp_len = sizeof(*r);
386         if (!spi_priv->crc_off) {
387                 c->u.simple_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
388                 cmd_len += 1;
389                 resp_len += 2;
390         }
391
392         if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
393                 dev_err(&spi->dev,
394                         "spi buffer size too small (%d) (%d) (%zu)\n",
395                         cmd_len, resp_len, ARRAY_SIZE(wb));
396                 return -EINVAL;
397         }
398
399         if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
400                 dev_err(&spi->dev, "Failed cmd write, bus error...\n");
401                 return -EINVAL;
402         }
403
404         r = (struct wilc_spi_read_rsp_data *)&rb[cmd_len];
405         if (r->rsp_cmd_type != cmd) {
406                 dev_err(&spi->dev,
407                         "Failed cmd response, cmd (%02x), resp (%02x)\n",
408                         cmd, r->rsp_cmd_type);
409                 return -EINVAL;
410         }
411
412         if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
413                 dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
414                         r->status);
415                 return -EINVAL;
416         }
417
418         if (WILC_GET_RESP_HDR_START(r->resp_header) != 0xf) {
419                 dev_err(&spi->dev, "Error, data read response (%02x)\n",
420                         r->resp_header);
421                 return -EINVAL;
422         }
423
424         if (b)
425                 memcpy(b, r->resp_data, 4);
426
427         if (!spi_priv->crc_off)
428                 memcpy(crc, r->crc, 2);
429
430         return 0;
431 }
432
433 static int wilc_spi_write_cmd(struct wilc *wilc, u8 cmd, u32 adr, u32 data,
434                               u8 clockless)
435 {
436         struct spi_device *spi = to_spi_device(wilc->dev);
437         struct wilc_spi *spi_priv = wilc->bus_data;
438         u8 wb[32], rb[32];
439         int cmd_len, resp_len;
440         struct wilc_spi_cmd *c;
441         struct wilc_spi_rsp_data *r;
442
443         memset(wb, 0x0, sizeof(wb));
444         memset(rb, 0x0, sizeof(rb));
445         c = (struct wilc_spi_cmd *)wb;
446         c->cmd_type = cmd;
447         if (cmd == CMD_INTERNAL_WRITE) {
448                 c->u.internal_w_cmd.addr[0] = adr >> 8;
449                 if (clockless == 1)
450                         c->u.internal_w_cmd.addr[0] |= BIT(7);
451
452                 c->u.internal_w_cmd.addr[1] = adr;
453                 c->u.internal_w_cmd.data = cpu_to_be32(data);
454                 cmd_len = offsetof(struct wilc_spi_cmd, u.internal_w_cmd.crc);
455                 if (!spi_priv->crc_off)
456                         c->u.internal_w_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
457         } else if (cmd == CMD_SINGLE_WRITE) {
458                 c->u.w_cmd.addr[0] = adr >> 16;
459                 c->u.w_cmd.addr[1] = adr >> 8;
460                 c->u.w_cmd.addr[2] = adr;
461                 c->u.w_cmd.data = cpu_to_be32(data);
462                 cmd_len = offsetof(struct wilc_spi_cmd, u.w_cmd.crc);
463                 if (!spi_priv->crc_off)
464                         c->u.w_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
465         } else {
466                 dev_err(&spi->dev, "write cmd [%x] not supported\n", cmd);
467                 return -EINVAL;
468         }
469
470         if (!spi_priv->crc_off)
471                 cmd_len += 1;
472
473         resp_len = sizeof(*r);
474
475         if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
476                 dev_err(&spi->dev,
477                         "spi buffer size too small (%d) (%d) (%zu)\n",
478                         cmd_len, resp_len, ARRAY_SIZE(wb));
479                 return -EINVAL;
480         }
481
482         if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
483                 dev_err(&spi->dev, "Failed cmd write, bus error...\n");
484                 return -EINVAL;
485         }
486
487         r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
488         if (r->rsp_cmd_type != cmd) {
489                 dev_err(&spi->dev,
490                         "Failed cmd response, cmd (%02x), resp (%02x)\n",
491                         cmd, r->rsp_cmd_type);
492                 return -EINVAL;
493         }
494
495         if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
496                 dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
497                         r->status);
498                 return -EINVAL;
499         }
500
501         return 0;
502 }
503
504 static int wilc_spi_dma_rw(struct wilc *wilc, u8 cmd, u32 adr, u8 *b, u32 sz)
505 {
506         struct spi_device *spi = to_spi_device(wilc->dev);
507         struct wilc_spi *spi_priv = wilc->bus_data;
508         u8 wb[32], rb[32];
509         int cmd_len, resp_len;
510         int retry, ix = 0;
511         u8 crc[2];
512         struct wilc_spi_cmd *c;
513         struct wilc_spi_rsp_data *r;
514
515         memset(wb, 0x0, sizeof(wb));
516         memset(rb, 0x0, sizeof(rb));
517         c = (struct wilc_spi_cmd *)wb;
518         c->cmd_type = cmd;
519         if (cmd == CMD_DMA_WRITE || cmd == CMD_DMA_READ) {
520                 c->u.dma_cmd.addr[0] = adr >> 16;
521                 c->u.dma_cmd.addr[1] = adr >> 8;
522                 c->u.dma_cmd.addr[2] = adr;
523                 c->u.dma_cmd.size[0] = sz >> 8;
524                 c->u.dma_cmd.size[1] = sz;
525                 cmd_len = offsetof(struct wilc_spi_cmd, u.dma_cmd.crc);
526                 if (!spi_priv->crc_off)
527                         c->u.dma_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
528         } else if (cmd == CMD_DMA_EXT_WRITE || cmd == CMD_DMA_EXT_READ) {
529                 c->u.dma_cmd_ext.addr[0] = adr >> 16;
530                 c->u.dma_cmd_ext.addr[1] = adr >> 8;
531                 c->u.dma_cmd_ext.addr[2] = adr;
532                 c->u.dma_cmd_ext.size[0] = sz >> 16;
533                 c->u.dma_cmd_ext.size[1] = sz >> 8;
534                 c->u.dma_cmd_ext.size[2] = sz;
535                 cmd_len = offsetof(struct wilc_spi_cmd, u.dma_cmd_ext.crc);
536                 if (!spi_priv->crc_off)
537                         c->u.dma_cmd_ext.crc[0] = wilc_get_crc7(wb, cmd_len);
538         } else {
539                 dev_err(&spi->dev, "dma read write cmd [%x] not supported\n",
540                         cmd);
541                 return -EINVAL;
542         }
543         if (!spi_priv->crc_off)
544                 cmd_len += 1;
545
546         resp_len = sizeof(*r);
547
548         if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
549                 dev_err(&spi->dev, "spi buffer size too small (%d)(%d) (%zu)\n",
550                         cmd_len, resp_len, ARRAY_SIZE(wb));
551                 return -EINVAL;
552         }
553
554         if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
555                 dev_err(&spi->dev, "Failed cmd write, bus error...\n");
556                 return -EINVAL;
557         }
558
559         r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
560         if (r->rsp_cmd_type != cmd) {
561                 dev_err(&spi->dev,
562                         "Failed cmd response, cmd (%02x), resp (%02x)\n",
563                         cmd, r->rsp_cmd_type);
564                 return -EINVAL;
565         }
566
567         if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
568                 dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
569                         r->status);
570                 return -EINVAL;
571         }
572
573         if (cmd == CMD_DMA_WRITE || cmd == CMD_DMA_EXT_WRITE)
574                 return 0;
575
576         while (sz > 0) {
577                 int nbytes;
578                 u8 rsp;
579
580                 if (sz <= DATA_PKT_SZ)
581                         nbytes = sz;
582                 else
583                         nbytes = DATA_PKT_SZ;
584
585                 /*
586                  * Data Response header
587                  */
588                 retry = 100;
589                 do {
590                         if (wilc_spi_rx(wilc, &rsp, 1)) {
591                                 dev_err(&spi->dev,
592                                         "Failed resp read, bus err\n");
593                                 return -EINVAL;
594                         }
595                         if (WILC_GET_RESP_HDR_START(rsp) == 0xf)
596                                 break;
597                 } while (retry--);
598
599                 /*
600                  * Read bytes
601                  */
602                 if (wilc_spi_rx(wilc, &b[ix], nbytes)) {
603                         dev_err(&spi->dev,
604                                 "Failed block read, bus err\n");
605                         return -EINVAL;
606                 }
607
608                 /*
609                  * Read Crc
610                  */
611                 if (!spi_priv->crc_off && wilc_spi_rx(wilc, crc, 2)) {
612                         dev_err(&spi->dev,
613                                 "Failed block crc read, bus err\n");
614                         return -EINVAL;
615                 }
616
617                 ix += nbytes;
618                 sz -= nbytes;
619         }
620         return 0;
621 }
622
623 static int wilc_spi_read_reg(struct wilc *wilc, u32 addr, u32 *data)
624 {
625         struct spi_device *spi = to_spi_device(wilc->dev);
626         int result;
627         u8 cmd = CMD_SINGLE_READ;
628         u8 clockless = 0;
629
630         if (addr < WILC_SPI_CLOCKLESS_ADDR_LIMIT) {
631                 /* Clockless register */
632                 cmd = CMD_INTERNAL_READ;
633                 clockless = 1;
634         }
635
636         result = wilc_spi_single_read(wilc, cmd, addr, data, clockless);
637         if (result) {
638                 dev_err(&spi->dev, "Failed cmd, read reg (%08x)...\n", addr);
639                 return result;
640         }
641
642         le32_to_cpus(data);
643
644         return 0;
645 }
646
647 static int wilc_spi_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
648 {
649         struct spi_device *spi = to_spi_device(wilc->dev);
650         int result;
651
652         if (size <= 4)
653                 return -EINVAL;
654
655         result = wilc_spi_dma_rw(wilc, CMD_DMA_EXT_READ, addr, buf, size);
656         if (result) {
657                 dev_err(&spi->dev, "Failed cmd, read block (%08x)...\n", addr);
658                 return result;
659         }
660
661         return 0;
662 }
663
664 static int spi_internal_write(struct wilc *wilc, u32 adr, u32 dat)
665 {
666         struct spi_device *spi = to_spi_device(wilc->dev);
667         int result;
668
669         result = wilc_spi_write_cmd(wilc, CMD_INTERNAL_WRITE, adr, dat, 0);
670         if (result) {
671                 dev_err(&spi->dev, "Failed internal write cmd...\n");
672                 return result;
673         }
674
675         return 0;
676 }
677
678 static int spi_internal_read(struct wilc *wilc, u32 adr, u32 *data)
679 {
680         struct spi_device *spi = to_spi_device(wilc->dev);
681         int result;
682
683         result = wilc_spi_single_read(wilc, CMD_INTERNAL_READ, adr, data, 0);
684         if (result) {
685                 dev_err(&spi->dev, "Failed internal read cmd...\n");
686                 return result;
687         }
688
689         le32_to_cpus(data);
690
691         return 0;
692 }
693
694 /********************************************
695  *
696  *      Spi interfaces
697  *
698  ********************************************/
699
700 static int wilc_spi_write_reg(struct wilc *wilc, u32 addr, u32 data)
701 {
702         struct spi_device *spi = to_spi_device(wilc->dev);
703         int result;
704         u8 cmd = CMD_SINGLE_WRITE;
705         u8 clockless = 0;
706
707         if (addr < WILC_SPI_CLOCKLESS_ADDR_LIMIT) {
708                 /* Clockless register */
709                 cmd = CMD_INTERNAL_WRITE;
710                 clockless = 1;
711         }
712
713         result = wilc_spi_write_cmd(wilc, cmd, addr, data, clockless);
714         if (result) {
715                 dev_err(&spi->dev, "Failed cmd, write reg (%08x)...\n", addr);
716                 return result;
717         }
718
719         return 0;
720 }
721
722 static int wilc_spi_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
723 {
724         struct spi_device *spi = to_spi_device(wilc->dev);
725         int result;
726
727         /*
728          * has to be greated than 4
729          */
730         if (size <= 4)
731                 return -EINVAL;
732
733         result = wilc_spi_dma_rw(wilc, CMD_DMA_EXT_WRITE, addr, NULL, size);
734         if (result) {
735                 dev_err(&spi->dev,
736                         "Failed cmd, write block (%08x)...\n", addr);
737                 return result;
738         }
739
740         /*
741          * Data
742          */
743         result = spi_data_write(wilc, buf, size);
744         if (result) {
745                 dev_err(&spi->dev, "Failed block data write...\n");
746                 return result;
747         }
748
749         return 0;
750 }
751
752 /********************************************
753  *
754  *      Bus interfaces
755  *
756  ********************************************/
757
758 static int wilc_spi_deinit(struct wilc *wilc)
759 {
760         /*
761          * TODO:
762          */
763         return 0;
764 }
765
766 static int wilc_spi_init(struct wilc *wilc, bool resume)
767 {
768         struct spi_device *spi = to_spi_device(wilc->dev);
769         struct wilc_spi *spi_priv = wilc->bus_data;
770         u32 reg;
771         u32 chipid;
772         static int isinit;
773         int ret;
774
775         if (isinit) {
776                 ret = wilc_spi_read_reg(wilc, WILC_CHIPID, &chipid);
777                 if (ret)
778                         dev_err(&spi->dev, "Fail cmd read chip id...\n");
779
780                 return ret;
781         }
782
783         /*
784          * configure protocol
785          */
786
787         /*
788          * TODO: We can remove the CRC trials if there is a definite
789          * way to reset
790          */
791         /* the SPI to it's initial value. */
792         ret = spi_internal_read(wilc, WILC_SPI_PROTOCOL_OFFSET, &reg);
793         if (ret) {
794                 /*
795                  * Read failed. Try with CRC off. This might happen when module
796                  * is removed but chip isn't reset
797                  */
798                 spi_priv->crc_off = 1;
799                 dev_err(&spi->dev,
800                         "Failed read with CRC on, retrying with CRC off\n");
801                 ret = spi_internal_read(wilc, WILC_SPI_PROTOCOL_OFFSET, &reg);
802                 if (ret) {
803                         /*
804                          * Read failed with both CRC on and off,
805                          * something went bad
806                          */
807                         dev_err(&spi->dev, "Failed internal read protocol\n");
808                         return ret;
809                 }
810         }
811         if (spi_priv->crc_off == 0) {
812                 reg &= ~0xc; /* disable crc checking */
813                 reg &= ~0x70;
814                 reg |= (0x5 << 4);
815                 ret = spi_internal_write(wilc, WILC_SPI_PROTOCOL_OFFSET, reg);
816                 if (ret) {
817                         dev_err(&spi->dev,
818                                 "[wilc spi %d]: Failed internal write reg\n",
819                                 __LINE__);
820                         return ret;
821                 }
822                 spi_priv->crc_off = 1;
823         }
824
825         /*
826          * make sure can read back chip id correctly
827          */
828         ret = wilc_spi_read_reg(wilc, WILC_CHIPID, &chipid);
829         if (ret) {
830                 dev_err(&spi->dev, "Fail cmd read chip id...\n");
831                 return ret;
832         }
833
834         isinit = 1;
835
836         return 0;
837 }
838
839 static int wilc_spi_read_size(struct wilc *wilc, u32 *size)
840 {
841         int ret;
842
843         ret = spi_internal_read(wilc,
844                                 WILC_SPI_INT_STATUS - WILC_SPI_REG_BASE, size);
845         *size = FIELD_GET(IRQ_DMA_WD_CNT_MASK, *size);
846
847         return ret;
848 }
849
850 static int wilc_spi_read_int(struct wilc *wilc, u32 *int_status)
851 {
852         return spi_internal_read(wilc, WILC_SPI_INT_STATUS - WILC_SPI_REG_BASE,
853                                  int_status);
854 }
855
856 static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 val)
857 {
858         return spi_internal_write(wilc, WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
859                                   val);
860 }
861
862 static int wilc_spi_sync_ext(struct wilc *wilc, int nint)
863 {
864         struct spi_device *spi = to_spi_device(wilc->dev);
865         u32 reg;
866         int ret, i;
867
868         if (nint > MAX_NUM_INT) {
869                 dev_err(&spi->dev, "Too many interrupts (%d)...\n", nint);
870                 return -EINVAL;
871         }
872
873         /*
874          * interrupt pin mux select
875          */
876         ret = wilc_spi_read_reg(wilc, WILC_PIN_MUX_0, &reg);
877         if (ret) {
878                 dev_err(&spi->dev, "Failed read reg (%08x)...\n",
879                         WILC_PIN_MUX_0);
880                 return ret;
881         }
882         reg |= BIT(8);
883         ret = wilc_spi_write_reg(wilc, WILC_PIN_MUX_0, reg);
884         if (ret) {
885                 dev_err(&spi->dev, "Failed write reg (%08x)...\n",
886                         WILC_PIN_MUX_0);
887                 return ret;
888         }
889
890         /*
891          * interrupt enable
892          */
893         ret = wilc_spi_read_reg(wilc, WILC_INTR_ENABLE, &reg);
894         if (ret) {
895                 dev_err(&spi->dev, "Failed read reg (%08x)...\n",
896                         WILC_INTR_ENABLE);
897                 return ret;
898         }
899
900         for (i = 0; (i < 5) && (nint > 0); i++, nint--)
901                 reg |= (BIT((27 + i)));
902
903         ret = wilc_spi_write_reg(wilc, WILC_INTR_ENABLE, reg);
904         if (ret) {
905                 dev_err(&spi->dev, "Failed write reg (%08x)...\n",
906                         WILC_INTR_ENABLE);
907                 return ret;
908         }
909         if (nint) {
910                 ret = wilc_spi_read_reg(wilc, WILC_INTR2_ENABLE, &reg);
911                 if (ret) {
912                         dev_err(&spi->dev, "Failed read reg (%08x)...\n",
913                                 WILC_INTR2_ENABLE);
914                         return ret;
915                 }
916
917                 for (i = 0; (i < 3) && (nint > 0); i++, nint--)
918                         reg |= BIT(i);
919
920                 ret = wilc_spi_read_reg(wilc, WILC_INTR2_ENABLE, &reg);
921                 if (ret) {
922                         dev_err(&spi->dev, "Failed write reg (%08x)...\n",
923                                 WILC_INTR2_ENABLE);
924                         return ret;
925                 }
926         }
927
928         return 0;
929 }
930
931 /* Global spi HIF function table */
932 static const struct wilc_hif_func wilc_hif_spi = {
933         .hif_init = wilc_spi_init,
934         .hif_deinit = wilc_spi_deinit,
935         .hif_read_reg = wilc_spi_read_reg,
936         .hif_write_reg = wilc_spi_write_reg,
937         .hif_block_rx = wilc_spi_read,
938         .hif_block_tx = wilc_spi_write,
939         .hif_read_int = wilc_spi_read_int,
940         .hif_clear_int_ext = wilc_spi_clear_int_ext,
941         .hif_read_size = wilc_spi_read_size,
942         .hif_block_tx_ext = wilc_spi_write,
943         .hif_block_rx_ext = wilc_spi_read,
944         .hif_sync_ext = wilc_spi_sync_ext,
945 };