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/mmc/sdio_func.h>
8 #include <linux/mmc/host.h>
9
10 #include "wilc_wfi_netdevice.h"
11
12 #define SDIO_MODALIAS "wilc1000_sdio"
13
14 #define SDIO_VENDOR_ID_WILC 0x0296
15 #define SDIO_DEVICE_ID_WILC 0x5347
16
17 static const struct sdio_device_id wilc_sdio_ids[] = {
18 { SDIO_DEVICE(SDIO_VENDOR_ID_WILC, SDIO_DEVICE_ID_WILC) },
19 { },
20 };
21
22 #define WILC_SDIO_BLOCK_SIZE 512
23
24 struct wilc_sdio {
25 bool irq_gpio;
26 u32 block_size;
27 int nint;
28 /* Max num interrupts allowed in registers 0xf7, 0xf8 */
29 #define MAX_NUN_INT_THRPT_ENH2 (5)
30 int has_thrpt_enh3;
31 };
32
33 static struct wilc_sdio g_sdio;
34 static const struct wilc_hif_func wilc_hif_sdio;
35
36 static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data);
37 static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data);
38 static int sdio_init(struct wilc *wilc, bool resume);
39
wilc_sdio_interrupt(struct sdio_func * func)40 static void wilc_sdio_interrupt(struct sdio_func *func)
41 {
42 sdio_release_host(func);
43 wilc_handle_isr(sdio_get_drvdata(func));
44 sdio_claim_host(func);
45 }
46
wilc_sdio_cmd52(struct wilc * wilc,struct sdio_cmd52 * cmd)47 static int wilc_sdio_cmd52(struct wilc *wilc, struct sdio_cmd52 *cmd)
48 {
49 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
50 int ret;
51 u8 data;
52
53 sdio_claim_host(func);
54
55 func->num = cmd->function;
56 if (cmd->read_write) { /* write */
57 if (cmd->raw) {
58 sdio_writeb(func, cmd->data, cmd->address, &ret);
59 data = sdio_readb(func, cmd->address, &ret);
60 cmd->data = data;
61 } else {
62 sdio_writeb(func, cmd->data, cmd->address, &ret);
63 }
64 } else { /* read */
65 data = sdio_readb(func, cmd->address, &ret);
66 cmd->data = data;
67 }
68
69 sdio_release_host(func);
70
71 if (ret)
72 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
73 return ret;
74 }
75
wilc_sdio_cmd53(struct wilc * wilc,struct sdio_cmd53 * cmd)76 static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
77 {
78 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
79 int size, ret;
80
81 sdio_claim_host(func);
82
83 func->num = cmd->function;
84 func->cur_blksize = cmd->block_size;
85 if (cmd->block_mode)
86 size = cmd->count * cmd->block_size;
87 else
88 size = cmd->count;
89
90 if (cmd->read_write) { /* write */
91 ret = sdio_memcpy_toio(func, cmd->address,
92 (void *)cmd->buffer, size);
93 } else { /* read */
94 ret = sdio_memcpy_fromio(func, (void *)cmd->buffer,
95 cmd->address, size);
96 }
97
98 sdio_release_host(func);
99
100 if (ret)
101 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
102
103 return ret;
104 }
105
linux_sdio_probe(struct sdio_func * func,const struct sdio_device_id * id)106 static int linux_sdio_probe(struct sdio_func *func,
107 const struct sdio_device_id *id)
108 {
109 struct wilc *wilc;
110 int ret;
111 struct gpio_desc *gpio = NULL;
112
113 if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
114 gpio = gpiod_get(&func->dev, "irq", GPIOD_IN);
115 if (IS_ERR(gpio)) {
116 /* get the GPIO descriptor from hardcode GPIO number */
117 gpio = gpio_to_desc(GPIO_NUM);
118 if (!gpio)
119 dev_err(&func->dev, "failed to get irq gpio\n");
120 }
121 }
122
123 dev_dbg(&func->dev, "Initializing netdev\n");
124 ret = wilc_netdev_init(&wilc, &func->dev, HIF_SDIO, &wilc_hif_sdio);
125 if (ret) {
126 dev_err(&func->dev, "Couldn't initialize netdev\n");
127 return ret;
128 }
129 sdio_set_drvdata(func, wilc);
130 wilc->dev = &func->dev;
131 wilc->gpio_irq = gpio;
132
133 dev_info(&func->dev, "Driver Initializing success\n");
134 return 0;
135 }
136
linux_sdio_remove(struct sdio_func * func)137 static void linux_sdio_remove(struct sdio_func *func)
138 {
139 struct wilc *wilc = sdio_get_drvdata(func);
140
141 /* free the GPIO in module remove */
142 if (wilc->gpio_irq)
143 gpiod_put(wilc->gpio_irq);
144 wilc_netdev_cleanup(wilc);
145 }
146
sdio_reset(struct wilc * wilc)147 static int sdio_reset(struct wilc *wilc)
148 {
149 struct sdio_cmd52 cmd;
150 int ret;
151 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
152
153 cmd.read_write = 1;
154 cmd.function = 0;
155 cmd.raw = 0;
156 cmd.address = 0x6;
157 cmd.data = 0x8;
158 ret = wilc_sdio_cmd52(wilc, &cmd);
159 if (ret) {
160 dev_err(&func->dev, "Fail cmd 52, reset cmd ...\n");
161 return ret;
162 }
163 return 0;
164 }
165
wilc_sdio_suspend(struct device * dev)166 static int wilc_sdio_suspend(struct device *dev)
167 {
168 struct sdio_func *func = dev_to_sdio_func(dev);
169 struct wilc *wilc = sdio_get_drvdata(func);
170 int ret;
171
172 dev_info(dev, "sdio suspend\n");
173 chip_wakeup(wilc);
174
175 if (!wilc->suspend_event) {
176 wilc_chip_sleep_manually(wilc);
177 } else {
178 host_sleep_notify(wilc);
179 chip_allow_sleep(wilc);
180 }
181
182 ret = sdio_reset(wilc);
183 if (ret) {
184 dev_err(&func->dev, "Fail reset sdio\n");
185 return ret;
186 }
187 sdio_claim_host(func);
188
189 return 0;
190 }
191
wilc_sdio_resume(struct device * dev)192 static int wilc_sdio_resume(struct device *dev)
193 {
194 struct sdio_func *func = dev_to_sdio_func(dev);
195 struct wilc *wilc = sdio_get_drvdata(func);
196
197 dev_info(dev, "sdio resume\n");
198 sdio_release_host(func);
199 chip_wakeup(wilc);
200 sdio_init(wilc, true);
201
202 if (wilc->suspend_event)
203 host_wakeup_notify(wilc);
204
205 chip_allow_sleep(wilc);
206
207 return 0;
208 }
209
210 static const struct of_device_id wilc_of_match[] = {
211 { .compatible = "microchip,wilc1000-sdio", },
212 { /* sentinel */ }
213 };
214 MODULE_DEVICE_TABLE(of, wilc_of_match);
215
216 static const struct dev_pm_ops wilc_sdio_pm_ops = {
217 .suspend = wilc_sdio_suspend,
218 .resume = wilc_sdio_resume,
219 };
220
221 static struct sdio_driver wilc_sdio_driver = {
222 .name = SDIO_MODALIAS,
223 .id_table = wilc_sdio_ids,
224 .probe = linux_sdio_probe,
225 .remove = linux_sdio_remove,
226 .drv = {
227 .pm = &wilc_sdio_pm_ops,
228 .of_match_table = wilc_of_match,
229 }
230 };
231 module_driver(wilc_sdio_driver,
232 sdio_register_driver,
233 sdio_unregister_driver);
234 MODULE_LICENSE("GPL");
235
wilc_sdio_enable_interrupt(struct wilc * dev)236 static int wilc_sdio_enable_interrupt(struct wilc *dev)
237 {
238 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
239 int ret = 0;
240
241 sdio_claim_host(func);
242 ret = sdio_claim_irq(func, wilc_sdio_interrupt);
243 sdio_release_host(func);
244
245 if (ret < 0) {
246 dev_err(&func->dev, "can't claim sdio_irq, err(%d)\n", ret);
247 ret = -EIO;
248 }
249 return ret;
250 }
251
wilc_sdio_disable_interrupt(struct wilc * dev)252 static void wilc_sdio_disable_interrupt(struct wilc *dev)
253 {
254 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
255 int ret;
256
257 sdio_claim_host(func);
258 ret = sdio_release_irq(func);
259 if (ret < 0)
260 dev_err(&func->dev, "can't release sdio_irq, err(%d)\n", ret);
261 sdio_release_host(func);
262 }
263
264 /********************************************
265 *
266 * Function 0
267 *
268 ********************************************/
269
sdio_set_func0_csa_address(struct wilc * wilc,u32 adr)270 static int sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
271 {
272 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
273 struct sdio_cmd52 cmd;
274 int ret;
275
276 /**
277 * Review: BIG ENDIAN
278 **/
279 cmd.read_write = 1;
280 cmd.function = 0;
281 cmd.raw = 0;
282 cmd.address = 0x10c;
283 cmd.data = (u8)adr;
284 ret = wilc_sdio_cmd52(wilc, &cmd);
285 if (ret) {
286 dev_err(&func->dev, "Failed cmd52, set 0x10c data...\n");
287 goto fail;
288 }
289
290 cmd.address = 0x10d;
291 cmd.data = (u8)(adr >> 8);
292 ret = wilc_sdio_cmd52(wilc, &cmd);
293 if (ret) {
294 dev_err(&func->dev, "Failed cmd52, set 0x10d data...\n");
295 goto fail;
296 }
297
298 cmd.address = 0x10e;
299 cmd.data = (u8)(adr >> 16);
300 ret = wilc_sdio_cmd52(wilc, &cmd);
301 if (ret) {
302 dev_err(&func->dev, "Failed cmd52, set 0x10e data...\n");
303 goto fail;
304 }
305
306 return 1;
307 fail:
308 return 0;
309 }
310
sdio_set_func0_block_size(struct wilc * wilc,u32 block_size)311 static int sdio_set_func0_block_size(struct wilc *wilc, u32 block_size)
312 {
313 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
314 struct sdio_cmd52 cmd;
315 int ret;
316
317 cmd.read_write = 1;
318 cmd.function = 0;
319 cmd.raw = 0;
320 cmd.address = 0x10;
321 cmd.data = (u8)block_size;
322 ret = wilc_sdio_cmd52(wilc, &cmd);
323 if (ret) {
324 dev_err(&func->dev, "Failed cmd52, set 0x10 data...\n");
325 goto fail;
326 }
327
328 cmd.address = 0x11;
329 cmd.data = (u8)(block_size >> 8);
330 ret = wilc_sdio_cmd52(wilc, &cmd);
331 if (ret) {
332 dev_err(&func->dev, "Failed cmd52, set 0x11 data...\n");
333 goto fail;
334 }
335
336 return 1;
337 fail:
338 return 0;
339 }
340
341 /********************************************
342 *
343 * Function 1
344 *
345 ********************************************/
346
sdio_set_func1_block_size(struct wilc * wilc,u32 block_size)347 static int sdio_set_func1_block_size(struct wilc *wilc, u32 block_size)
348 {
349 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
350 struct sdio_cmd52 cmd;
351 int ret;
352
353 cmd.read_write = 1;
354 cmd.function = 0;
355 cmd.raw = 0;
356 cmd.address = 0x110;
357 cmd.data = (u8)block_size;
358 ret = wilc_sdio_cmd52(wilc, &cmd);
359 if (ret) {
360 dev_err(&func->dev, "Failed cmd52, set 0x110 data...\n");
361 goto fail;
362 }
363 cmd.address = 0x111;
364 cmd.data = (u8)(block_size >> 8);
365 ret = wilc_sdio_cmd52(wilc, &cmd);
366 if (ret) {
367 dev_err(&func->dev, "Failed cmd52, set 0x111 data...\n");
368 goto fail;
369 }
370
371 return 1;
372 fail:
373 return 0;
374 }
375
376 /********************************************
377 *
378 * Sdio interfaces
379 *
380 ********************************************/
sdio_write_reg(struct wilc * wilc,u32 addr,u32 data)381 static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
382 {
383 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
384 int ret;
385
386 cpu_to_le32s(&data);
387
388 if (addr >= 0xf0 && addr <= 0xff) {
389 struct sdio_cmd52 cmd;
390
391 cmd.read_write = 1;
392 cmd.function = 0;
393 cmd.raw = 0;
394 cmd.address = addr;
395 cmd.data = data;
396 ret = wilc_sdio_cmd52(wilc, &cmd);
397 if (ret) {
398 dev_err(&func->dev,
399 "Failed cmd 52, read reg (%08x) ...\n", addr);
400 goto fail;
401 }
402 } else {
403 struct sdio_cmd53 cmd;
404
405 /**
406 * set the AHB address
407 **/
408 if (!sdio_set_func0_csa_address(wilc, addr))
409 goto fail;
410
411 cmd.read_write = 1;
412 cmd.function = 0;
413 cmd.address = 0x10f;
414 cmd.block_mode = 0;
415 cmd.increment = 1;
416 cmd.count = 4;
417 cmd.buffer = (u8 *)&data;
418 cmd.block_size = g_sdio.block_size;
419 ret = wilc_sdio_cmd53(wilc, &cmd);
420 if (ret) {
421 dev_err(&func->dev,
422 "Failed cmd53, write reg (%08x)...\n", addr);
423 goto fail;
424 }
425 }
426
427 return 1;
428
429 fail:
430
431 return 0;
432 }
433
sdio_write(struct wilc * wilc,u32 addr,u8 * buf,u32 size)434 static int sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
435 {
436 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
437 u32 block_size = g_sdio.block_size;
438 struct sdio_cmd53 cmd;
439 int nblk, nleft, ret;
440
441 cmd.read_write = 1;
442 if (addr > 0) {
443 /**
444 * has to be word aligned...
445 **/
446 if (size & 0x3) {
447 size += 4;
448 size &= ~0x3;
449 }
450
451 /**
452 * func 0 access
453 **/
454 cmd.function = 0;
455 cmd.address = 0x10f;
456 } else {
457 /**
458 * has to be word aligned...
459 **/
460 if (size & 0x3) {
461 size += 4;
462 size &= ~0x3;
463 }
464
465 /**
466 * func 1 access
467 **/
468 cmd.function = 1;
469 cmd.address = 0;
470 }
471
472 nblk = size / block_size;
473 nleft = size % block_size;
474
475 if (nblk > 0) {
476 cmd.block_mode = 1;
477 cmd.increment = 1;
478 cmd.count = nblk;
479 cmd.buffer = buf;
480 cmd.block_size = block_size;
481 if (addr > 0) {
482 if (!sdio_set_func0_csa_address(wilc, addr))
483 goto fail;
484 }
485 ret = wilc_sdio_cmd53(wilc, &cmd);
486 if (ret) {
487 dev_err(&func->dev,
488 "Failed cmd53 [%x], block send...\n", addr);
489 goto fail;
490 }
491 if (addr > 0)
492 addr += nblk * block_size;
493 buf += nblk * block_size;
494 }
495
496 if (nleft > 0) {
497 cmd.block_mode = 0;
498 cmd.increment = 1;
499 cmd.count = nleft;
500 cmd.buffer = buf;
501
502 cmd.block_size = block_size;
503
504 if (addr > 0) {
505 if (!sdio_set_func0_csa_address(wilc, addr))
506 goto fail;
507 }
508 ret = wilc_sdio_cmd53(wilc, &cmd);
509 if (ret) {
510 dev_err(&func->dev,
511 "Failed cmd53 [%x], bytes send...\n", addr);
512 goto fail;
513 }
514 }
515
516 return 1;
517
518 fail:
519
520 return 0;
521 }
522
sdio_read_reg(struct wilc * wilc,u32 addr,u32 * data)523 static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
524 {
525 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
526 int ret;
527
528 if (addr >= 0xf0 && addr <= 0xff) {
529 struct sdio_cmd52 cmd;
530
531 cmd.read_write = 0;
532 cmd.function = 0;
533 cmd.raw = 0;
534 cmd.address = addr;
535 ret = wilc_sdio_cmd52(wilc, &cmd);
536 if (ret) {
537 dev_err(&func->dev,
538 "Failed cmd 52, read reg (%08x) ...\n", addr);
539 goto fail;
540 }
541 *data = cmd.data;
542 } else {
543 struct sdio_cmd53 cmd;
544
545 if (!sdio_set_func0_csa_address(wilc, addr))
546 goto fail;
547
548 cmd.read_write = 0;
549 cmd.function = 0;
550 cmd.address = 0x10f;
551 cmd.block_mode = 0;
552 cmd.increment = 1;
553 cmd.count = 4;
554 cmd.buffer = (u8 *)data;
555
556 cmd.block_size = g_sdio.block_size;
557 ret = wilc_sdio_cmd53(wilc, &cmd);
558 if (ret) {
559 dev_err(&func->dev,
560 "Failed cmd53, read reg (%08x)...\n", addr);
561 goto fail;
562 }
563 }
564
565 le32_to_cpus(data);
566
567 return 1;
568
569 fail:
570
571 return 0;
572 }
573
sdio_read(struct wilc * wilc,u32 addr,u8 * buf,u32 size)574 static int sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
575 {
576 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
577 u32 block_size = g_sdio.block_size;
578 struct sdio_cmd53 cmd;
579 int nblk, nleft, ret;
580
581 cmd.read_write = 0;
582 if (addr > 0) {
583 /**
584 * has to be word aligned...
585 **/
586 if (size & 0x3) {
587 size += 4;
588 size &= ~0x3;
589 }
590
591 /**
592 * func 0 access
593 **/
594 cmd.function = 0;
595 cmd.address = 0x10f;
596 } else {
597 /**
598 * has to be word aligned...
599 **/
600 if (size & 0x3) {
601 size += 4;
602 size &= ~0x3;
603 }
604
605 /**
606 * func 1 access
607 **/
608 cmd.function = 1;
609 cmd.address = 0;
610 }
611
612 nblk = size / block_size;
613 nleft = size % block_size;
614
615 if (nblk > 0) {
616 cmd.block_mode = 1;
617 cmd.increment = 1;
618 cmd.count = nblk;
619 cmd.buffer = buf;
620 cmd.block_size = block_size;
621 if (addr > 0) {
622 if (!sdio_set_func0_csa_address(wilc, addr))
623 goto fail;
624 }
625 ret = wilc_sdio_cmd53(wilc, &cmd);
626 if (ret) {
627 dev_err(&func->dev,
628 "Failed cmd53 [%x], block read...\n", addr);
629 goto fail;
630 }
631 if (addr > 0)
632 addr += nblk * block_size;
633 buf += nblk * block_size;
634 } /* if (nblk > 0) */
635
636 if (nleft > 0) {
637 cmd.block_mode = 0;
638 cmd.increment = 1;
639 cmd.count = nleft;
640 cmd.buffer = buf;
641
642 cmd.block_size = block_size;
643
644 if (addr > 0) {
645 if (!sdio_set_func0_csa_address(wilc, addr))
646 goto fail;
647 }
648 ret = wilc_sdio_cmd53(wilc, &cmd);
649 if (ret) {
650 dev_err(&func->dev,
651 "Failed cmd53 [%x], bytes read...\n", addr);
652 goto fail;
653 }
654 }
655
656 return 1;
657
658 fail:
659
660 return 0;
661 }
662
663 /********************************************
664 *
665 * Bus interfaces
666 *
667 ********************************************/
668
sdio_deinit(struct wilc * wilc)669 static int sdio_deinit(struct wilc *wilc)
670 {
671 return 1;
672 }
673
sdio_init(struct wilc * wilc,bool resume)674 static int sdio_init(struct wilc *wilc, bool resume)
675 {
676 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
677 struct sdio_cmd52 cmd;
678 int loop, ret;
679 u32 chipid;
680
681 if (!resume) {
682 memset(&g_sdio, 0, sizeof(struct wilc_sdio));
683 g_sdio.irq_gpio = wilc->dev_irq_num;
684 }
685
686 /**
687 * function 0 csa enable
688 **/
689 cmd.read_write = 1;
690 cmd.function = 0;
691 cmd.raw = 1;
692 cmd.address = 0x100;
693 cmd.data = 0x80;
694 ret = wilc_sdio_cmd52(wilc, &cmd);
695 if (ret) {
696 dev_err(&func->dev, "Fail cmd 52, enable csa...\n");
697 goto fail;
698 }
699
700 /**
701 * function 0 block size
702 **/
703 if (!sdio_set_func0_block_size(wilc, WILC_SDIO_BLOCK_SIZE)) {
704 dev_err(&func->dev, "Fail cmd 52, set func 0 block size...\n");
705 goto fail;
706 }
707 g_sdio.block_size = WILC_SDIO_BLOCK_SIZE;
708
709 /**
710 * enable func1 IO
711 **/
712 cmd.read_write = 1;
713 cmd.function = 0;
714 cmd.raw = 1;
715 cmd.address = 0x2;
716 cmd.data = 0x2;
717 ret = wilc_sdio_cmd52(wilc, &cmd);
718 if (ret) {
719 dev_err(&func->dev,
720 "Fail cmd 52, set IOE register...\n");
721 goto fail;
722 }
723
724 /**
725 * make sure func 1 is up
726 **/
727 cmd.read_write = 0;
728 cmd.function = 0;
729 cmd.raw = 0;
730 cmd.address = 0x3;
731 loop = 3;
732 do {
733 cmd.data = 0;
734 ret = wilc_sdio_cmd52(wilc, &cmd);
735 if (ret) {
736 dev_err(&func->dev,
737 "Fail cmd 52, get IOR register...\n");
738 goto fail;
739 }
740 if (cmd.data == 0x2)
741 break;
742 } while (loop--);
743
744 if (loop <= 0) {
745 dev_err(&func->dev, "Fail func 1 is not ready...\n");
746 goto fail;
747 }
748
749 /**
750 * func 1 is ready, set func 1 block size
751 **/
752 if (!sdio_set_func1_block_size(wilc, WILC_SDIO_BLOCK_SIZE)) {
753 dev_err(&func->dev, "Fail set func 1 block size...\n");
754 goto fail;
755 }
756
757 /**
758 * func 1 interrupt enable
759 **/
760 cmd.read_write = 1;
761 cmd.function = 0;
762 cmd.raw = 1;
763 cmd.address = 0x4;
764 cmd.data = 0x3;
765 ret = wilc_sdio_cmd52(wilc, &cmd);
766 if (ret) {
767 dev_err(&func->dev, "Fail cmd 52, set IEN register...\n");
768 goto fail;
769 }
770
771 /**
772 * make sure can read back chip id correctly
773 **/
774 if (!resume) {
775 if (!sdio_read_reg(wilc, 0x1000, &chipid)) {
776 dev_err(&func->dev, "Fail cmd read chip id...\n");
777 goto fail;
778 }
779 dev_err(&func->dev, "chipid (%08x)\n", chipid);
780 if ((chipid & 0xfff) > 0x2a0)
781 g_sdio.has_thrpt_enh3 = 1;
782 else
783 g_sdio.has_thrpt_enh3 = 0;
784 dev_info(&func->dev, "has_thrpt_enh3 = %d...\n",
785 g_sdio.has_thrpt_enh3);
786 }
787
788 return 1;
789
790 fail:
791
792 return 0;
793 }
794
sdio_read_size(struct wilc * wilc,u32 * size)795 static int sdio_read_size(struct wilc *wilc, u32 *size)
796 {
797 u32 tmp;
798 struct sdio_cmd52 cmd;
799
800 /**
801 * Read DMA count in words
802 **/
803 cmd.read_write = 0;
804 cmd.function = 0;
805 cmd.raw = 0;
806 cmd.address = 0xf2;
807 cmd.data = 0;
808 wilc_sdio_cmd52(wilc, &cmd);
809 tmp = cmd.data;
810
811 cmd.address = 0xf3;
812 cmd.data = 0;
813 wilc_sdio_cmd52(wilc, &cmd);
814 tmp |= (cmd.data << 8);
815
816 *size = tmp;
817 return 1;
818 }
819
sdio_read_int(struct wilc * wilc,u32 * int_status)820 static int sdio_read_int(struct wilc *wilc, u32 *int_status)
821 {
822 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
823 u32 tmp;
824 struct sdio_cmd52 cmd;
825
826 sdio_read_size(wilc, &tmp);
827
828 /**
829 * Read IRQ flags
830 **/
831 if (!g_sdio.irq_gpio) {
832 int i;
833
834 cmd.function = 1;
835 cmd.address = 0x04;
836 cmd.data = 0;
837 wilc_sdio_cmd52(wilc, &cmd);
838
839 if (cmd.data & BIT(0))
840 tmp |= INT_0;
841 if (cmd.data & BIT(2))
842 tmp |= INT_1;
843 if (cmd.data & BIT(3))
844 tmp |= INT_2;
845 if (cmd.data & BIT(4))
846 tmp |= INT_3;
847 if (cmd.data & BIT(5))
848 tmp |= INT_4;
849 if (cmd.data & BIT(6))
850 tmp |= INT_5;
851 for (i = g_sdio.nint; i < MAX_NUM_INT; i++) {
852 if ((tmp >> (IRG_FLAGS_OFFSET + i)) & 0x1) {
853 dev_err(&func->dev,
854 "Unexpected interrupt (1) : tmp=%x, data=%x\n",
855 tmp, cmd.data);
856 break;
857 }
858 }
859 } else {
860 u32 irq_flags;
861
862 cmd.read_write = 0;
863 cmd.function = 0;
864 cmd.raw = 0;
865 cmd.address = 0xf7;
866 cmd.data = 0;
867 wilc_sdio_cmd52(wilc, &cmd);
868 irq_flags = cmd.data & 0x1f;
869 tmp |= ((irq_flags >> 0) << IRG_FLAGS_OFFSET);
870 }
871
872 *int_status = tmp;
873
874 return 1;
875 }
876
sdio_clear_int_ext(struct wilc * wilc,u32 val)877 static int sdio_clear_int_ext(struct wilc *wilc, u32 val)
878 {
879 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
880 int ret;
881 int vmm_ctl;
882
883 if (g_sdio.has_thrpt_enh3) {
884 u32 reg;
885
886 if (g_sdio.irq_gpio) {
887 u32 flags;
888
889 flags = val & (BIT(MAX_NUN_INT_THRPT_ENH2) - 1);
890 reg = flags;
891 } else {
892 reg = 0;
893 }
894 /* select VMM table 0 */
895 if (val & SEL_VMM_TBL0)
896 reg |= BIT(5);
897 /* select VMM table 1 */
898 if (val & SEL_VMM_TBL1)
899 reg |= BIT(6);
900 /* enable VMM */
901 if (val & EN_VMM)
902 reg |= BIT(7);
903 if (reg) {
904 struct sdio_cmd52 cmd;
905
906 cmd.read_write = 1;
907 cmd.function = 0;
908 cmd.raw = 0;
909 cmd.address = 0xf8;
910 cmd.data = reg;
911
912 ret = wilc_sdio_cmd52(wilc, &cmd);
913 if (ret) {
914 dev_err(&func->dev,
915 "Failed cmd52, set 0xf8 data (%d) ...\n",
916 __LINE__);
917 goto fail;
918 }
919 }
920 return 1;
921 }
922 if (g_sdio.irq_gpio) {
923 /* has_thrpt_enh2 uses register 0xf8 to clear interrupts. */
924 /*
925 * Cannot clear multiple interrupts.
926 * Must clear each interrupt individually.
927 */
928 u32 flags;
929
930 flags = val & (BIT(MAX_NUM_INT) - 1);
931 if (flags) {
932 int i;
933
934 ret = 1;
935 for (i = 0; i < g_sdio.nint; i++) {
936 if (flags & 1) {
937 struct sdio_cmd52 cmd;
938
939 cmd.read_write = 1;
940 cmd.function = 0;
941 cmd.raw = 0;
942 cmd.address = 0xf8;
943 cmd.data = BIT(i);
944
945 ret = wilc_sdio_cmd52(wilc, &cmd);
946 if (ret) {
947 dev_err(&func->dev,
948 "Failed cmd52, set 0xf8 data (%d) ...\n",
949 __LINE__);
950 goto fail;
951 }
952 }
953 if (!ret)
954 break;
955 flags >>= 1;
956 }
957 if (!ret)
958 goto fail;
959 for (i = g_sdio.nint; i < MAX_NUM_INT; i++) {
960 if (flags & 1)
961 dev_err(&func->dev,
962 "Unexpected interrupt cleared %d...\n",
963 i);
964 flags >>= 1;
965 }
966 }
967 }
968
969 vmm_ctl = 0;
970 /* select VMM table 0 */
971 if (val & SEL_VMM_TBL0)
972 vmm_ctl |= BIT(0);
973 /* select VMM table 1 */
974 if (val & SEL_VMM_TBL1)
975 vmm_ctl |= BIT(1);
976 /* enable VMM */
977 if (val & EN_VMM)
978 vmm_ctl |= BIT(2);
979
980 if (vmm_ctl) {
981 struct sdio_cmd52 cmd;
982
983 cmd.read_write = 1;
984 cmd.function = 0;
985 cmd.raw = 0;
986 cmd.address = 0xf6;
987 cmd.data = vmm_ctl;
988 ret = wilc_sdio_cmd52(wilc, &cmd);
989 if (ret) {
990 dev_err(&func->dev,
991 "Failed cmd52, set 0xf6 data (%d) ...\n",
992 __LINE__);
993 goto fail;
994 }
995 }
996 return 1;
997 fail:
998 return 0;
999 }
1000
sdio_sync_ext(struct wilc * wilc,int nint)1001 static int sdio_sync_ext(struct wilc *wilc, int nint)
1002 {
1003 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
1004 u32 reg;
1005
1006 if (nint > MAX_NUM_INT) {
1007 dev_err(&func->dev, "Too many interrupts (%d)...\n", nint);
1008 return 0;
1009 }
1010 if (nint > MAX_NUN_INT_THRPT_ENH2) {
1011 dev_err(&func->dev,
1012 "Cannot support more than 5 interrupts when has_thrpt_enh2=1.\n");
1013 return 0;
1014 }
1015
1016 g_sdio.nint = nint;
1017
1018 /**
1019 * Disable power sequencer
1020 **/
1021 if (!sdio_read_reg(wilc, WILC_MISC, ®)) {
1022 dev_err(&func->dev, "Failed read misc reg...\n");
1023 return 0;
1024 }
1025
1026 reg &= ~BIT(8);
1027 if (!sdio_write_reg(wilc, WILC_MISC, reg)) {
1028 dev_err(&func->dev, "Failed write misc reg...\n");
1029 return 0;
1030 }
1031
1032 if (g_sdio.irq_gpio) {
1033 u32 reg;
1034 int ret, i;
1035
1036 /**
1037 * interrupt pin mux select
1038 **/
1039 ret = sdio_read_reg(wilc, WILC_PIN_MUX_0, ®);
1040 if (!ret) {
1041 dev_err(&func->dev, "Failed read reg (%08x)...\n",
1042 WILC_PIN_MUX_0);
1043 return 0;
1044 }
1045 reg |= BIT(8);
1046 ret = sdio_write_reg(wilc, WILC_PIN_MUX_0, reg);
1047 if (!ret) {
1048 dev_err(&func->dev, "Failed write reg (%08x)...\n",
1049 WILC_PIN_MUX_0);
1050 return 0;
1051 }
1052
1053 /**
1054 * interrupt enable
1055 **/
1056 ret = sdio_read_reg(wilc, WILC_INTR_ENABLE, ®);
1057 if (!ret) {
1058 dev_err(&func->dev, "Failed read reg (%08x)...\n",
1059 WILC_INTR_ENABLE);
1060 return 0;
1061 }
1062
1063 for (i = 0; (i < 5) && (nint > 0); i++, nint--)
1064 reg |= BIT((27 + i));
1065 ret = sdio_write_reg(wilc, WILC_INTR_ENABLE, reg);
1066 if (!ret) {
1067 dev_err(&func->dev, "Failed write reg (%08x)...\n",
1068 WILC_INTR_ENABLE);
1069 return 0;
1070 }
1071 if (nint) {
1072 ret = sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
1073 if (!ret) {
1074 dev_err(&func->dev,
1075 "Failed read reg (%08x)...\n",
1076 WILC_INTR2_ENABLE);
1077 return 0;
1078 }
1079
1080 for (i = 0; (i < 3) && (nint > 0); i++, nint--)
1081 reg |= BIT(i);
1082
1083 ret = sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
1084 if (!ret) {
1085 dev_err(&func->dev,
1086 "Failed write reg (%08x)...\n",
1087 WILC_INTR2_ENABLE);
1088 return 0;
1089 }
1090 }
1091 }
1092 return 1;
1093 }
1094
1095 /* Global sdio HIF function table */
1096 static const struct wilc_hif_func wilc_hif_sdio = {
1097 .hif_init = sdio_init,
1098 .hif_deinit = sdio_deinit,
1099 .hif_read_reg = sdio_read_reg,
1100 .hif_write_reg = sdio_write_reg,
1101 .hif_block_rx = sdio_read,
1102 .hif_block_tx = sdio_write,
1103 .hif_read_int = sdio_read_int,
1104 .hif_clear_int_ext = sdio_clear_int_ext,
1105 .hif_read_size = sdio_read_size,
1106 .hif_block_tx_ext = sdio_write,
1107 .hif_block_rx_ext = sdio_read,
1108 .hif_sync_ext = sdio_sync_ext,
1109 .enable_interrupt = wilc_sdio_enable_interrupt,
1110 .disable_interrupt = wilc_sdio_disable_interrupt,
1111 };
1112
1113