1 /* ////////////////////////////////////////////////////////////////////////// */
3 /* Copyright (c) Atmel Corporation. All rights reserved. */
5 /* Module Name: wilc_sdio.c */
8 /* //////////////////////////////////////////////////////////////////////////// */
10 #include <linux/string.h>
11 #include "wilc_wlan_if.h"
12 #include "wilc_wlan.h"
13 #include "wilc_wfi_netdevice.h"
14 #include <linux/mmc/sdio_func.h>
15 #include <linux/mmc/card.h>
16 #include <linux/mmc/sdio_ids.h>
17 #include <linux/mmc/sdio.h>
18 #include <linux/mmc/host.h>
19 #include <linux/of_gpio.h>
21 #define SDIO_MODALIAS "wilc1000_sdio"
23 #define SDIO_VENDOR_ID_WILC 0x0296
24 #define SDIO_DEVICE_ID_WILC 0x5347
26 static const struct sdio_device_id wilc_sdio_ids[] = {
27 { SDIO_DEVICE(SDIO_VENDOR_ID_WILC, SDIO_DEVICE_ID_WILC) },
31 #define WILC_SDIO_BLOCK_SIZE 512
37 #define MAX_NUN_INT_THRPT_ENH2 (5) /* Max num interrupts allowed in registers 0xf7, 0xf8 */
41 static wilc_sdio_t g_sdio;
43 static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data);
44 static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data);
46 static void wilc_sdio_interrupt(struct sdio_func *func)
48 sdio_release_host(func);
49 wilc_handle_isr(sdio_get_drvdata(func));
50 sdio_claim_host(func);
53 static int wilc_sdio_cmd52(struct wilc *wilc, sdio_cmd52_t *cmd)
55 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
59 sdio_claim_host(func);
61 func->num = cmd->function;
62 if (cmd->read_write) { /* write */
64 sdio_writeb(func, cmd->data, cmd->address, &ret);
65 data = sdio_readb(func, cmd->address, &ret);
68 sdio_writeb(func, cmd->data, cmd->address, &ret);
71 data = sdio_readb(func, cmd->address, &ret);
75 sdio_release_host(func);
78 dev_err(&func->dev, "wilc_sdio_cmd52..failed, err(%d)\n", ret);
83 static int wilc_sdio_cmd53(struct wilc *wilc, sdio_cmd53_t *cmd)
85 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
88 sdio_claim_host(func);
90 func->num = cmd->function;
91 func->cur_blksize = cmd->block_size;
93 size = cmd->count * cmd->block_size;
97 if (cmd->read_write) { /* write */
98 ret = sdio_memcpy_toio(func, cmd->address,
99 (void *)cmd->buffer, size);
101 ret = sdio_memcpy_fromio(func, (void *)cmd->buffer,
105 sdio_release_host(func);
108 dev_err(&func->dev, "wilc_sdio_cmd53..failed, err(%d)\n", ret);
113 static int linux_sdio_probe(struct sdio_func *func,
114 const struct sdio_device_id *id)
120 if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
121 gpio = of_get_gpio(func->dev.of_node, 0);
126 dev_dbg(&func->dev, "Initializing netdev\n");
127 ret = wilc_netdev_init(&wilc, &func->dev, HIF_SDIO, gpio,
130 dev_err(&func->dev, "Couldn't initialize netdev\n");
133 sdio_set_drvdata(func, wilc);
134 wilc->dev = &func->dev;
136 dev_info(&func->dev, "Driver Initializing success\n");
140 static void linux_sdio_remove(struct sdio_func *func)
142 wilc_netdev_cleanup(sdio_get_drvdata(func));
145 static struct sdio_driver wilc1000_sdio_driver = {
146 .name = SDIO_MODALIAS,
147 .id_table = wilc_sdio_ids,
148 .probe = linux_sdio_probe,
149 .remove = linux_sdio_remove,
151 module_driver(wilc1000_sdio_driver,
152 sdio_register_driver,
153 sdio_unregister_driver);
154 MODULE_LICENSE("GPL");
156 static int wilc_sdio_enable_interrupt(struct wilc *dev)
158 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
161 sdio_claim_host(func);
162 ret = sdio_claim_irq(func, wilc_sdio_interrupt);
163 sdio_release_host(func);
166 dev_err(&func->dev, "can't claim sdio_irq, err(%d)\n", ret);
172 static void wilc_sdio_disable_interrupt(struct wilc *dev)
174 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
177 dev_dbg(&func->dev, "wilc_sdio_disable_interrupt IN\n");
179 sdio_claim_host(func);
180 ret = sdio_release_irq(func);
182 dev_err(&func->dev, "can't release sdio_irq, err(%d)\n", ret);
183 sdio_release_host(func);
185 dev_info(&func->dev, "wilc_sdio_disable_interrupt OUT\n");
188 static int wilc_sdio_init(void)
193 /********************************************
197 ********************************************/
199 static int sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
201 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
213 ret = wilc_sdio_cmd52(wilc, &cmd);
215 dev_err(&func->dev, "Failed cmd52, set 0x10c data...\n");
220 cmd.data = (u8)(adr >> 8);
221 ret = wilc_sdio_cmd52(wilc, &cmd);
223 dev_err(&func->dev, "Failed cmd52, set 0x10d data...\n");
228 cmd.data = (u8)(adr >> 16);
229 ret = wilc_sdio_cmd52(wilc, &cmd);
231 dev_err(&func->dev, "Failed cmd52, set 0x10e data...\n");
240 static int sdio_set_func0_block_size(struct wilc *wilc, u32 block_size)
242 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
250 cmd.data = (u8)block_size;
251 ret = wilc_sdio_cmd52(wilc, &cmd);
253 dev_err(&func->dev, "Failed cmd52, set 0x10 data...\n");
258 cmd.data = (u8)(block_size >> 8);
259 ret = wilc_sdio_cmd52(wilc, &cmd);
261 dev_err(&func->dev, "Failed cmd52, set 0x11 data...\n");
270 /********************************************
274 ********************************************/
276 static int sdio_set_func1_block_size(struct wilc *wilc, u32 block_size)
278 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
286 cmd.data = (u8)block_size;
287 ret = wilc_sdio_cmd52(wilc, &cmd);
289 dev_err(&func->dev, "Failed cmd52, set 0x110 data...\n");
293 cmd.data = (u8)(block_size >> 8);
294 ret = wilc_sdio_cmd52(wilc, &cmd);
296 dev_err(&func->dev, "Failed cmd52, set 0x111 data...\n");
305 /********************************************
309 ********************************************/
310 static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
312 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
315 data = cpu_to_le32(data);
317 if ((addr >= 0xf0) && (addr <= 0xff)) {
325 ret = wilc_sdio_cmd52(wilc, &cmd);
328 "Failed cmd 52, read reg (%08x) ...\n", addr);
335 * set the AHB address
337 if (!sdio_set_func0_csa_address(wilc, addr))
346 cmd.buffer = (u8 *)&data;
347 cmd.block_size = g_sdio.block_size; /* johnny : prevent it from setting unexpected value */
348 ret = wilc_sdio_cmd53(wilc, &cmd);
351 "Failed cmd53, write reg (%08x)...\n", addr);
363 static int sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
365 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
366 u32 block_size = g_sdio.block_size;
368 int nblk, nleft, ret;
373 * has to be word aligned...
387 * has to be word aligned...
401 nblk = size / block_size;
402 nleft = size % block_size;
409 cmd.block_size = block_size;
411 if (!sdio_set_func0_csa_address(wilc, addr))
414 ret = wilc_sdio_cmd53(wilc, &cmd);
417 "Failed cmd53 [%x], block send...\n", addr);
421 addr += nblk * block_size;
422 buf += nblk * block_size;
431 cmd.block_size = block_size; /* johnny : prevent it from setting unexpected value */
434 if (!sdio_set_func0_csa_address(wilc, addr))
437 ret = wilc_sdio_cmd53(wilc, &cmd);
440 "Failed cmd53 [%x], bytes send...\n", addr);
452 static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
454 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
457 if ((addr >= 0xf0) && (addr <= 0xff)) {
464 ret = wilc_sdio_cmd52(wilc, &cmd);
467 "Failed cmd 52, read reg (%08x) ...\n", addr);
474 if (!sdio_set_func0_csa_address(wilc, addr))
483 cmd.buffer = (u8 *)data;
485 cmd.block_size = g_sdio.block_size; /* johnny : prevent it from setting unexpected value */
486 ret = wilc_sdio_cmd53(wilc, &cmd);
489 "Failed cmd53, read reg (%08x)...\n", addr);
494 *data = cpu_to_le32(*data);
503 static int sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
505 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
506 u32 block_size = g_sdio.block_size;
508 int nblk, nleft, ret;
513 * has to be word aligned...
527 * has to be word aligned...
541 nblk = size / block_size;
542 nleft = size % block_size;
549 cmd.block_size = block_size;
551 if (!sdio_set_func0_csa_address(wilc, addr))
554 ret = wilc_sdio_cmd53(wilc, &cmd);
557 "Failed cmd53 [%x], block read...\n", addr);
561 addr += nblk * block_size;
562 buf += nblk * block_size;
563 } /* if (nblk > 0) */
571 cmd.block_size = block_size; /* johnny : prevent it from setting unexpected value */
574 if (!sdio_set_func0_csa_address(wilc, addr))
577 ret = wilc_sdio_cmd53(wilc, &cmd);
580 "Failed cmd53 [%x], bytes read...\n", addr);
592 /********************************************
596 ********************************************/
598 static int sdio_deinit(struct wilc *wilc)
603 static int sdio_init(struct wilc *wilc)
605 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
610 memset(&g_sdio, 0, sizeof(wilc_sdio_t));
612 g_sdio.irq_gpio = (wilc->dev_irq_num);
614 if (!wilc_sdio_init()) {
615 dev_err(&func->dev, "Failed io init bus...\n");
622 * function 0 csa enable
629 ret = wilc_sdio_cmd52(wilc, &cmd);
631 dev_err(&func->dev, "Fail cmd 52, enable csa...\n");
636 * function 0 block size
638 if (!sdio_set_func0_block_size(wilc, WILC_SDIO_BLOCK_SIZE)) {
639 dev_err(&func->dev, "Fail cmd 52, set func 0 block size...\n");
642 g_sdio.block_size = WILC_SDIO_BLOCK_SIZE;
652 ret = wilc_sdio_cmd52(wilc, &cmd);
655 "Fail cmd 52, set IOE register...\n");
660 * make sure func 1 is up
669 ret = wilc_sdio_cmd52(wilc, &cmd);
672 "Fail cmd 52, get IOR register...\n");
680 dev_err(&func->dev, "Fail func 1 is not ready...\n");
685 * func 1 is ready, set func 1 block size
687 if (!sdio_set_func1_block_size(wilc, WILC_SDIO_BLOCK_SIZE)) {
688 dev_err(&func->dev, "Fail set func 1 block size...\n");
693 * func 1 interrupt enable
700 ret = wilc_sdio_cmd52(wilc, &cmd);
702 dev_err(&func->dev, "Fail cmd 52, set IEN register...\n");
707 * make sure can read back chip id correctly
709 if (!sdio_read_reg(wilc, 0x1000, &chipid)) {
710 dev_err(&func->dev, "Fail cmd read chip id...\n");
713 dev_err(&func->dev, "chipid (%08x)\n", chipid);
714 if ((chipid & 0xfff) > 0x2a0)
715 g_sdio.has_thrpt_enh3 = 1;
717 g_sdio.has_thrpt_enh3 = 0;
718 dev_info(&func->dev, "has_thrpt_enh3 = %d...\n", g_sdio.has_thrpt_enh3);
727 static int sdio_read_size(struct wilc *wilc, u32 *size)
733 * Read DMA count in words
740 wilc_sdio_cmd52(wilc, &cmd);
743 /* cmd.read_write = 0; */
744 /* cmd.function = 0; */
748 wilc_sdio_cmd52(wilc, &cmd);
749 tmp |= (cmd.data << 8);
755 static int sdio_read_int(struct wilc *wilc, u32 *int_status)
757 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
761 sdio_read_size(wilc, &tmp);
766 if (!g_sdio.irq_gpio) {
772 wilc_sdio_cmd52(wilc, &cmd);
774 if (cmd.data & BIT(0))
776 if (cmd.data & BIT(2))
778 if (cmd.data & BIT(3))
780 if (cmd.data & BIT(4))
782 if (cmd.data & BIT(5))
784 if (cmd.data & BIT(6))
786 for (i = g_sdio.nint; i < MAX_NUM_INT; i++) {
787 if ((tmp >> (IRG_FLAGS_OFFSET + i)) & 0x1) {
789 "Unexpected interrupt (1) : tmp=%x, data=%x\n",
802 wilc_sdio_cmd52(wilc, &cmd);
803 irq_flags = cmd.data & 0x1f;
804 tmp |= ((irq_flags >> 0) << IRG_FLAGS_OFFSET);
812 static int sdio_clear_int_ext(struct wilc *wilc, u32 val)
814 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
817 if (g_sdio.has_thrpt_enh3) {
820 if (g_sdio.irq_gpio) {
823 flags = val & (BIT(MAX_NUN_INT_THRPT_ENH2) - 1);
828 /* select VMM table 0 */
829 if ((val & SEL_VMM_TBL0) == SEL_VMM_TBL0)
831 /* select VMM table 1 */
832 if ((val & SEL_VMM_TBL1) == SEL_VMM_TBL1)
835 if ((val & EN_VMM) == EN_VMM)
846 ret = wilc_sdio_cmd52(wilc, &cmd);
849 "Failed cmd52, set 0xf8 data (%d) ...\n",
856 if (g_sdio.irq_gpio) {
857 /* see below. has_thrpt_enh2 uses register 0xf8 to clear interrupts. */
858 /* Cannot clear multiple interrupts. Must clear each interrupt individually */
861 flags = val & (BIT(MAX_NUM_INT) - 1);
866 for (i = 0; i < g_sdio.nint; i++) {
876 ret = wilc_sdio_cmd52(wilc, &cmd);
879 "Failed cmd52, set 0xf8 data (%d) ...\n",
891 for (i = g_sdio.nint; i < MAX_NUM_INT; i++) {
894 "Unexpected interrupt cleared %d...\n",
905 /* select VMM table 0 */
906 if ((val & SEL_VMM_TBL0) == SEL_VMM_TBL0)
908 /* select VMM table 1 */
909 if ((val & SEL_VMM_TBL1) == SEL_VMM_TBL1)
912 if ((val & EN_VMM) == EN_VMM)
923 ret = wilc_sdio_cmd52(wilc, &cmd);
926 "Failed cmd52, set 0xf6 data (%d) ...\n",
939 static int sdio_sync_ext(struct wilc *wilc, int nint)
941 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
944 if (nint > MAX_NUM_INT) {
945 dev_err(&func->dev, "Too many interupts (%d)...\n", nint);
948 if (nint > MAX_NUN_INT_THRPT_ENH2) {
950 "Cannot support more than 5 interrupts when has_thrpt_enh2=1.\n");
957 * Disable power sequencer
959 if (!sdio_read_reg(wilc, WILC_MISC, ®)) {
960 dev_err(&func->dev, "Failed read misc reg...\n");
965 if (!sdio_write_reg(wilc, WILC_MISC, reg)) {
966 dev_err(&func->dev, "Failed write misc reg...\n");
970 if (g_sdio.irq_gpio) {
975 * interrupt pin mux select
977 ret = sdio_read_reg(wilc, WILC_PIN_MUX_0, ®);
979 dev_err(&func->dev, "Failed read reg (%08x)...\n",
984 ret = sdio_write_reg(wilc, WILC_PIN_MUX_0, reg);
986 dev_err(&func->dev, "Failed write reg (%08x)...\n",
994 ret = sdio_read_reg(wilc, WILC_INTR_ENABLE, ®);
996 dev_err(&func->dev, "Failed read reg (%08x)...\n",
1001 for (i = 0; (i < 5) && (nint > 0); i++, nint--)
1002 reg |= BIT((27 + i));
1003 ret = sdio_write_reg(wilc, WILC_INTR_ENABLE, reg);
1005 dev_err(&func->dev, "Failed write reg (%08x)...\n",
1010 ret = sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
1013 "Failed read reg (%08x)...\n",
1018 for (i = 0; (i < 3) && (nint > 0); i++, nint--)
1021 ret = sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
1024 "Failed write reg (%08x)...\n",
1033 /********************************************
1035 * Global sdio HIF function table
1037 ********************************************/
1039 const struct wilc_hif_func wilc_hif_sdio = {
1040 .hif_init = sdio_init,
1041 .hif_deinit = sdio_deinit,
1042 .hif_read_reg = sdio_read_reg,
1043 .hif_write_reg = sdio_write_reg,
1044 .hif_block_rx = sdio_read,
1045 .hif_block_tx = sdio_write,
1046 .hif_read_int = sdio_read_int,
1047 .hif_clear_int_ext = sdio_clear_int_ext,
1048 .hif_read_size = sdio_read_size,
1049 .hif_block_tx_ext = sdio_write,
1050 .hif_block_rx_ext = sdio_read,
1051 .hif_sync_ext = sdio_sync_ext,
1052 .enable_interrupt = wilc_sdio_enable_interrupt,
1053 .disable_interrupt = wilc_sdio_disable_interrupt,