1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
8 #include <linux/mmc/sdio_func.h>
9 #include <linux/mmc/sdio_ids.h>
10 #include <linux/mmc/host.h>
11 #include <linux/mmc/sdio.h>
12 #include <linux/of_irq.h>
17 #define SDIO_MODALIAS "wilc1000_sdio"
19 static const struct sdio_device_id wilc_sdio_ids[] = {
20 { SDIO_DEVICE(SDIO_VENDOR_ID_MICROCHIP_WILC, SDIO_DEVICE_ID_MICROCHIP_WILC1000) },
23 MODULE_DEVICE_TABLE(sdio, wilc_sdio_ids);
25 #define WILC_SDIO_BLOCK_SIZE 512
27 static int wilc_sdio_init(struct wilc *wilc, bool resume);
28 static int wilc_sdio_deinit(struct wilc *wilc);
57 static const struct wilc_hif_func wilc_hif_sdio;
59 static void wilc_sdio_interrupt(struct sdio_func *func)
61 sdio_release_host(func);
62 wilc_handle_isr(sdio_get_drvdata(func));
63 sdio_claim_host(func);
66 static int wilc_sdio_cmd52(struct wilc *wilc, struct sdio_cmd52 *cmd)
68 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
72 sdio_claim_host(func);
74 func->num = cmd->function;
75 if (cmd->read_write) { /* write */
77 sdio_writeb(func, cmd->data, cmd->address, &ret);
78 data = sdio_readb(func, cmd->address, &ret);
81 sdio_writeb(func, cmd->data, cmd->address, &ret);
84 data = sdio_readb(func, cmd->address, &ret);
88 sdio_release_host(func);
91 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
95 static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
97 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
99 struct wilc_sdio *sdio_priv = wilc->bus_data;
100 u8 *buf = cmd->buffer;
102 sdio_claim_host(func);
104 func->num = cmd->function;
105 func->cur_blksize = cmd->block_size;
107 size = cmd->count * cmd->block_size;
111 if (cmd->use_global_buf) {
112 if (size > sizeof(u32)) {
116 buf = sdio_priv->cmd53_buf;
119 if (cmd->read_write) { /* write */
120 if (cmd->use_global_buf)
121 memcpy(buf, cmd->buffer, size);
123 ret = sdio_memcpy_toio(func, cmd->address, buf, size);
125 ret = sdio_memcpy_fromio(func, buf, cmd->address, size);
127 if (cmd->use_global_buf)
128 memcpy(cmd->buffer, buf, size);
131 sdio_release_host(func);
134 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
139 static int wilc_sdio_probe(struct sdio_func *func,
140 const struct sdio_device_id *id)
142 struct wilc_sdio *sdio_priv;
143 struct wilc_vif *vif;
148 sdio_priv = kzalloc(sizeof(*sdio_priv), GFP_KERNEL);
152 sdio_priv->cmd53_buf = kzalloc(sizeof(u32), GFP_KERNEL);
153 if (!sdio_priv->cmd53_buf) {
158 ret = wilc_cfg80211_init(&wilc, &func->dev, WILC_HIF_SDIO,
163 if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
164 struct device_node *np = func->card->dev.of_node;
165 int irq_num = of_irq_get(np, 0);
168 wilc->dev_irq_num = irq_num;
169 sdio_priv->irq_gpio = true;
173 sdio_set_drvdata(func, wilc);
174 wilc->bus_data = sdio_priv;
175 wilc->dev = &func->dev;
177 wilc->rtc_clk = devm_clk_get_optional_enabled(&func->card->dev, "rtc");
178 if (IS_ERR(wilc->rtc_clk)) {
179 ret = PTR_ERR(wilc->rtc_clk);
183 wilc_sdio_init(wilc, false);
185 ret = wilc_get_chipid(wilc);
189 ret = wilc_cfg80211_register(wilc);
193 ret = wilc_load_mac_from_nv(wilc);
195 pr_err("Can not retrieve MAC address from chip\n");
196 goto unregister_wiphy;
199 wilc_sdio_deinit(wilc);
201 vif = wilc_netdev_ifc_init(wilc, "wlan%d", WILC_STATION_MODE,
202 NL80211_IFTYPE_STATION, false);
205 goto unregister_wiphy;
208 dev_info(&func->dev, "Driver Initializing success\n");
212 wiphy_unregister(wilc->wiphy);
214 irq_dispose_mapping(wilc->dev_irq_num);
215 wilc_netdev_cleanup(wilc);
216 wiphy_free(wilc->wiphy);
218 kfree(sdio_priv->cmd53_buf);
223 static void wilc_sdio_remove(struct sdio_func *func)
225 struct wilc *wilc = sdio_get_drvdata(func);
226 struct wilc_sdio *sdio_priv = wilc->bus_data;
228 wilc_netdev_cleanup(wilc);
229 wiphy_unregister(wilc->wiphy);
230 wiphy_free(wilc->wiphy);
231 kfree(sdio_priv->cmd53_buf);
235 static int wilc_sdio_reset(struct wilc *wilc)
237 struct sdio_cmd52 cmd;
239 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
244 cmd.address = SDIO_CCCR_ABORT;
245 cmd.data = WILC_SDIO_CCCR_ABORT_RESET;
246 ret = wilc_sdio_cmd52(wilc, &cmd);
248 dev_err(&func->dev, "Fail cmd 52, reset cmd ...\n");
254 static bool wilc_sdio_is_init(struct wilc *wilc)
256 struct wilc_sdio *sdio_priv = wilc->bus_data;
258 return sdio_priv->isinit;
261 static int wilc_sdio_enable_interrupt(struct wilc *dev)
263 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
266 sdio_claim_host(func);
267 ret = sdio_claim_irq(func, wilc_sdio_interrupt);
268 sdio_release_host(func);
271 dev_err(&func->dev, "can't claim sdio_irq, err(%d)\n", ret);
277 static void wilc_sdio_disable_interrupt(struct wilc *dev)
279 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
282 sdio_claim_host(func);
283 ret = sdio_release_irq(func);
285 dev_err(&func->dev, "can't release sdio_irq, err(%d)\n", ret);
286 sdio_release_host(func);
289 /********************************************
293 ********************************************/
295 static int wilc_sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
297 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
298 struct sdio_cmd52 cmd;
307 cmd.address = WILC_SDIO_FBR_CSA_REG;
309 ret = wilc_sdio_cmd52(wilc, &cmd);
311 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
316 cmd.address = WILC_SDIO_FBR_CSA_REG + 1;
317 cmd.data = (u8)(adr >> 8);
318 ret = wilc_sdio_cmd52(wilc, &cmd);
320 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
325 cmd.address = WILC_SDIO_FBR_CSA_REG + 2;
326 cmd.data = (u8)(adr >> 16);
327 ret = wilc_sdio_cmd52(wilc, &cmd);
329 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
337 static int wilc_sdio_set_block_size(struct wilc *wilc, u8 func_num,
340 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
341 struct sdio_cmd52 cmd;
347 cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE;
348 cmd.data = (u8)block_size;
349 ret = wilc_sdio_cmd52(wilc, &cmd);
351 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
356 cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE + 1;
357 cmd.data = (u8)(block_size >> 8);
358 ret = wilc_sdio_cmd52(wilc, &cmd);
360 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
368 /********************************************
372 ********************************************/
373 static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
375 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
376 struct wilc_sdio *sdio_priv = wilc->bus_data;
381 if (addr >= 0xf0 && addr <= 0xff) { /* only vendor specific registers */
382 struct sdio_cmd52 cmd;
389 ret = wilc_sdio_cmd52(wilc, &cmd);
392 "Failed cmd 52, read reg (%08x) ...\n", addr);
394 struct sdio_cmd53 cmd;
397 * set the AHB address
399 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
405 cmd.address = WILC_SDIO_FBR_DATA_REG;
408 cmd.count = sizeof(u32);
409 cmd.buffer = (u8 *)&data;
410 cmd.use_global_buf = true;
411 cmd.block_size = sdio_priv->block_size;
412 ret = wilc_sdio_cmd53(wilc, &cmd);
415 "Failed cmd53, write reg (%08x)...\n", addr);
421 static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
423 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
424 struct wilc_sdio *sdio_priv = wilc->bus_data;
425 u32 block_size = sdio_priv->block_size;
426 struct sdio_cmd53 cmd;
427 int nblk, nleft, ret;
435 cmd.address = WILC_SDIO_FBR_DATA_REG;
441 cmd.address = WILC_SDIO_F1_DATA_REG;
444 size = ALIGN(size, 4);
445 nblk = size / block_size;
446 nleft = size % block_size;
448 cmd.use_global_buf = false;
454 cmd.block_size = block_size;
456 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
460 ret = wilc_sdio_cmd53(wilc, &cmd);
463 "Failed cmd53 [%x], block send...\n", addr);
467 addr += nblk * block_size;
468 buf += nblk * block_size;
477 cmd.block_size = block_size;
480 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
484 ret = wilc_sdio_cmd53(wilc, &cmd);
487 "Failed cmd53 [%x], bytes send...\n", addr);
495 static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
497 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
498 struct wilc_sdio *sdio_priv = wilc->bus_data;
501 if (addr >= 0xf0 && addr <= 0xff) { /* only vendor specific registers */
502 struct sdio_cmd52 cmd;
508 ret = wilc_sdio_cmd52(wilc, &cmd);
511 "Failed cmd 52, read reg (%08x) ...\n", addr);
516 struct sdio_cmd53 cmd;
518 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
524 cmd.address = WILC_SDIO_FBR_DATA_REG;
527 cmd.count = sizeof(u32);
528 cmd.buffer = (u8 *)data;
529 cmd.use_global_buf = true;
531 cmd.block_size = sdio_priv->block_size;
532 ret = wilc_sdio_cmd53(wilc, &cmd);
535 "Failed cmd53, read reg (%08x)...\n", addr);
544 static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
546 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
547 struct wilc_sdio *sdio_priv = wilc->bus_data;
548 u32 block_size = sdio_priv->block_size;
549 struct sdio_cmd53 cmd;
550 int nblk, nleft, ret;
558 cmd.address = WILC_SDIO_FBR_DATA_REG;
564 cmd.address = WILC_SDIO_F1_DATA_REG;
567 size = ALIGN(size, 4);
568 nblk = size / block_size;
569 nleft = size % block_size;
571 cmd.use_global_buf = false;
577 cmd.block_size = block_size;
579 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
583 ret = wilc_sdio_cmd53(wilc, &cmd);
586 "Failed cmd53 [%x], block read...\n", addr);
590 addr += nblk * block_size;
591 buf += nblk * block_size;
592 } /* if (nblk > 0) */
600 cmd.block_size = block_size;
603 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
607 ret = wilc_sdio_cmd53(wilc, &cmd);
610 "Failed cmd53 [%x], bytes read...\n", addr);
618 /********************************************
622 ********************************************/
624 static int wilc_sdio_deinit(struct wilc *wilc)
626 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
627 struct wilc_sdio *sdio_priv = wilc->bus_data;
628 struct sdio_cmd52 cmd;
635 /* Disable all functions interrupts */
636 cmd.address = SDIO_CCCR_IENx;
638 ret = wilc_sdio_cmd52(wilc, &cmd);
640 dev_err(&func->dev, "Failed to disable functions interrupts\n");
644 /* Disable all functions */
645 cmd.address = SDIO_CCCR_IOEx;
647 ret = wilc_sdio_cmd52(wilc, &cmd);
650 "Failed to reset all functions\n");
656 cmd.address = SDIO_FBR_BASE(1);
657 ret = wilc_sdio_cmd52(wilc, &cmd);
660 "Failed to read CSA for function 1\n");
664 cmd.address = SDIO_FBR_BASE(1);
665 cmd.data &= ~SDIO_FBR_ENABLE_CSA;
666 ret = wilc_sdio_cmd52(wilc, &cmd);
669 "Failed to disable CSA for function 1\n");
673 sdio_priv->isinit = false;
677 static int wilc_sdio_init(struct wilc *wilc, bool resume)
679 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
680 struct wilc_sdio *sdio_priv = wilc->bus_data;
681 struct sdio_cmd52 cmd;
685 * function 0 csa enable
690 cmd.address = SDIO_FBR_BASE(1);
691 cmd.data = SDIO_FBR_ENABLE_CSA;
692 ret = wilc_sdio_cmd52(wilc, &cmd);
694 dev_err(&func->dev, "Fail cmd 52, enable csa...\n");
699 * function 0 block size
701 ret = wilc_sdio_set_block_size(wilc, 0, WILC_SDIO_BLOCK_SIZE);
703 dev_err(&func->dev, "Fail cmd 52, set func 0 block size...\n");
706 sdio_priv->block_size = WILC_SDIO_BLOCK_SIZE;
714 cmd.address = SDIO_CCCR_IOEx;
715 cmd.data = WILC_SDIO_CCCR_IO_EN_FUNC1;
716 ret = wilc_sdio_cmd52(wilc, &cmd);
719 "Fail cmd 52, set IOE register...\n");
724 * make sure func 1 is up
729 cmd.address = SDIO_CCCR_IORx;
733 ret = wilc_sdio_cmd52(wilc, &cmd);
736 "Fail cmd 52, get IOR register...\n");
739 if (cmd.data == WILC_SDIO_CCCR_IO_EN_FUNC1)
744 dev_err(&func->dev, "Fail func 1 is not ready...\n");
749 * func 1 is ready, set func 1 block size
751 ret = wilc_sdio_set_block_size(wilc, 1, WILC_SDIO_BLOCK_SIZE);
753 dev_err(&func->dev, "Fail set func 1 block size...\n");
758 * func 1 interrupt enable
763 cmd.address = SDIO_CCCR_IENx;
764 cmd.data = WILC_SDIO_CCCR_IEN_MASTER | WILC_SDIO_CCCR_IEN_FUNC1;
765 ret = wilc_sdio_cmd52(wilc, &cmd);
767 dev_err(&func->dev, "Fail cmd 52, set IEN register...\n");
771 sdio_priv->isinit = true;
775 static int wilc_sdio_read_size(struct wilc *wilc, u32 *size)
778 struct sdio_cmd52 cmd;
781 * Read DMA count in words
786 cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG;
788 wilc_sdio_cmd52(wilc, &cmd);
791 cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG + 1;
793 wilc_sdio_cmd52(wilc, &cmd);
794 tmp |= (cmd.data << 8);
800 static int wilc_sdio_read_int(struct wilc *wilc, u32 *int_status)
802 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
803 struct wilc_sdio *sdio_priv = wilc->bus_data;
806 struct sdio_cmd52 cmd;
808 wilc_sdio_read_size(wilc, &tmp);
813 if (!sdio_priv->irq_gpio) {
815 cmd.address = WILC_SDIO_EXT_IRQ_FLAG_REG;
818 cmd.address = is_wilc1000(wilc->chipid) ?
819 WILC1000_SDIO_IRQ_FLAG_REG :
820 WILC3000_SDIO_IRQ_FLAG_REG;
825 wilc_sdio_cmd52(wilc, &cmd);
826 irq_flags = cmd.data;
828 if (sdio_priv->irq_gpio)
829 irq_flags &= is_wilc1000(wilc->chipid) ? 0x1f : 0x0f;
831 tmp |= FIELD_PREP(IRG_FLAGS_MASK, cmd.data);
833 if (FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags))
834 dev_err(&func->dev, "Unexpected interrupt (1) int=%lx\n",
835 FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags));
842 static int wilc_sdio_clear_int_ext(struct wilc *wilc, u32 val)
844 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
845 struct wilc_sdio *sdio_priv = wilc->bus_data;
849 if (sdio_priv->irq_gpio)
850 reg = val & (BIT(MAX_NUM_INT) - 1);
852 if (is_wilc1000(wilc->chipid)) {
853 /* select VMM table 0 */
854 if (val & SEL_VMM_TBL0)
856 /* select VMM table 1 */
857 if (val & SEL_VMM_TBL1)
863 if (sdio_priv->irq_gpio && reg) {
864 struct sdio_cmd52 cmd;
869 cmd.address = WILC3000_SDIO_IRQ_FLAG_REG;
872 ret = wilc_sdio_cmd52(wilc, &cmd);
875 "Failed cmd52, set 0xfe data (%d) ...\n",
882 /* select VMM table 0 */
883 if (val & SEL_VMM_TBL0)
885 /* select VMM table 1 */
886 if (val & SEL_VMM_TBL1)
894 struct sdio_cmd52 cmd;
899 cmd.address = is_wilc1000(wilc->chipid) ?
900 WILC1000_SDIO_IRQ_CLEAR_FLAG_REG :
901 WILC3000_SDIO_VMM_TBL_CTRL_REG;
904 ret = wilc_sdio_cmd52(wilc, &cmd);
907 "Failed cmd52, set (%02x) data (%d) ...\n",
908 cmd.address, __LINE__);
915 static int wilc_sdio_sync_ext(struct wilc *wilc, int nint)
917 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
918 struct wilc_sdio *sdio_priv = wilc->bus_data;
920 if (nint > MAX_NUM_INT) {
921 dev_err(&func->dev, "Too many interrupts (%d)...\n", nint);
925 if (sdio_priv->irq_gpio) {
930 * interrupt pin mux select
932 ret = wilc_sdio_read_reg(wilc, WILC_PIN_MUX_0, ®);
934 dev_err(&func->dev, "Failed read reg (%08x)...\n",
939 ret = wilc_sdio_write_reg(wilc, WILC_PIN_MUX_0, reg);
941 dev_err(&func->dev, "Failed write reg (%08x)...\n",
949 ret = wilc_sdio_read_reg(wilc, WILC_INTR_ENABLE, ®);
951 dev_err(&func->dev, "Failed read reg (%08x)...\n",
956 for (i = 0; (i < 5) && (nint > 0); i++, nint--)
957 reg |= BIT((27 + i));
958 ret = wilc_sdio_write_reg(wilc, WILC_INTR_ENABLE, reg);
960 dev_err(&func->dev, "Failed write reg (%08x)...\n",
965 ret = wilc_sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
968 "Failed read reg (%08x)...\n",
973 for (i = 0; (i < 3) && (nint > 0); i++, nint--)
976 ret = wilc_sdio_write_reg(wilc, WILC_INTR2_ENABLE, reg);
979 "Failed write reg (%08x)...\n",
988 /* Global sdio HIF function table */
989 static const struct wilc_hif_func wilc_hif_sdio = {
990 .hif_init = wilc_sdio_init,
991 .hif_deinit = wilc_sdio_deinit,
992 .hif_read_reg = wilc_sdio_read_reg,
993 .hif_write_reg = wilc_sdio_write_reg,
994 .hif_block_rx = wilc_sdio_read,
995 .hif_block_tx = wilc_sdio_write,
996 .hif_read_int = wilc_sdio_read_int,
997 .hif_clear_int_ext = wilc_sdio_clear_int_ext,
998 .hif_read_size = wilc_sdio_read_size,
999 .hif_block_tx_ext = wilc_sdio_write,
1000 .hif_block_rx_ext = wilc_sdio_read,
1001 .hif_sync_ext = wilc_sdio_sync_ext,
1002 .enable_interrupt = wilc_sdio_enable_interrupt,
1003 .disable_interrupt = wilc_sdio_disable_interrupt,
1004 .hif_reset = wilc_sdio_reset,
1005 .hif_is_init = wilc_sdio_is_init,
1008 static int wilc_sdio_suspend(struct device *dev)
1010 struct sdio_func *func = dev_to_sdio_func(dev);
1011 struct wilc *wilc = sdio_get_drvdata(func);
1014 dev_info(dev, "sdio suspend\n");
1016 if (!wilc->initialized)
1019 if (!IS_ERR(wilc->rtc_clk))
1020 clk_disable_unprepare(wilc->rtc_clk);
1022 ret = host_sleep_notify(wilc);
1024 clk_prepare_enable(wilc->rtc_clk);
1028 wilc_sdio_disable_interrupt(wilc);
1030 return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
1033 static int wilc_sdio_resume(struct device *dev)
1035 struct sdio_func *func = dev_to_sdio_func(dev);
1036 struct wilc *wilc = sdio_get_drvdata(func);
1038 dev_info(dev, "sdio resume\n");
1040 if (!wilc->initialized)
1043 if (!IS_ERR(wilc->rtc_clk))
1044 clk_prepare_enable(wilc->rtc_clk);
1046 wilc_sdio_init(wilc, true);
1047 wilc_sdio_enable_interrupt(wilc);
1049 return host_wakeup_notify(wilc);
1052 static const struct of_device_id wilc_of_match[] = {
1053 { .compatible = "microchip,wilc1000", },
1056 MODULE_DEVICE_TABLE(of, wilc_of_match);
1058 static const struct dev_pm_ops wilc_sdio_pm_ops = {
1059 .suspend = wilc_sdio_suspend,
1060 .resume = wilc_sdio_resume,
1063 static struct sdio_driver wilc_sdio_driver = {
1064 .name = SDIO_MODALIAS,
1065 .id_table = wilc_sdio_ids,
1066 .probe = wilc_sdio_probe,
1067 .remove = wilc_sdio_remove,
1069 .pm = &wilc_sdio_pm_ops,
1070 .of_match_table = wilc_of_match,
1073 module_sdio_driver(wilc_sdio_driver);
1075 MODULE_DESCRIPTION("Atmel WILC1000 SDIO wireless driver");
1076 MODULE_LICENSE("GPL");