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
54 static const struct wilc_hif_func wilc_hif_sdio;
56 static void wilc_sdio_interrupt(struct sdio_func *func)
58 sdio_release_host(func);
59 wilc_handle_isr(sdio_get_drvdata(func));
60 sdio_claim_host(func);
63 static int wilc_sdio_cmd52(struct wilc *wilc, struct sdio_cmd52 *cmd)
65 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
69 sdio_claim_host(func);
71 func->num = cmd->function;
72 if (cmd->read_write) { /* write */
74 sdio_writeb(func, cmd->data, cmd->address, &ret);
75 data = sdio_readb(func, cmd->address, &ret);
78 sdio_writeb(func, cmd->data, cmd->address, &ret);
81 data = sdio_readb(func, cmd->address, &ret);
85 sdio_release_host(func);
88 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
92 static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
94 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
96 struct wilc_sdio *sdio_priv = wilc->bus_data;
97 u8 *buf = cmd->buffer;
99 sdio_claim_host(func);
101 func->num = cmd->function;
102 func->cur_blksize = cmd->block_size;
104 size = cmd->count * cmd->block_size;
108 if (cmd->use_global_buf) {
109 if (size > sizeof(u32)) {
113 buf = sdio_priv->cmd53_buf;
116 if (cmd->read_write) { /* write */
117 if (cmd->use_global_buf)
118 memcpy(buf, cmd->buffer, size);
120 ret = sdio_memcpy_toio(func, cmd->address, buf, size);
122 ret = sdio_memcpy_fromio(func, buf, cmd->address, size);
124 if (cmd->use_global_buf)
125 memcpy(cmd->buffer, buf, size);
128 sdio_release_host(func);
131 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
136 static int wilc_sdio_probe(struct sdio_func *func,
137 const struct sdio_device_id *id)
141 struct wilc_sdio *sdio_priv;
143 sdio_priv = kzalloc(sizeof(*sdio_priv), GFP_KERNEL);
147 sdio_priv->cmd53_buf = kzalloc(sizeof(u32), GFP_KERNEL);
148 if (!sdio_priv->cmd53_buf) {
153 ret = wilc_cfg80211_init(&wilc, &func->dev, WILC_HIF_SDIO,
158 if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
159 struct device_node *np = func->card->dev.of_node;
160 int irq_num = of_irq_get(np, 0);
163 wilc->dev_irq_num = irq_num;
164 sdio_priv->irq_gpio = true;
168 sdio_set_drvdata(func, wilc);
169 wilc->bus_data = sdio_priv;
170 wilc->dev = &func->dev;
172 wilc->rtc_clk = devm_clk_get_optional(&func->card->dev, "rtc");
173 if (IS_ERR(wilc->rtc_clk)) {
174 ret = PTR_ERR(wilc->rtc_clk);
177 clk_prepare_enable(wilc->rtc_clk);
179 dev_info(&func->dev, "Driver Initializing success\n");
183 irq_dispose_mapping(wilc->dev_irq_num);
184 wilc_netdev_cleanup(wilc);
186 kfree(sdio_priv->cmd53_buf);
191 static void wilc_sdio_remove(struct sdio_func *func)
193 struct wilc *wilc = sdio_get_drvdata(func);
194 struct wilc_sdio *sdio_priv = wilc->bus_data;
196 clk_disable_unprepare(wilc->rtc_clk);
197 wilc_netdev_cleanup(wilc);
198 kfree(sdio_priv->cmd53_buf);
202 static int wilc_sdio_reset(struct wilc *wilc)
204 struct sdio_cmd52 cmd;
206 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
211 cmd.address = SDIO_CCCR_ABORT;
212 cmd.data = WILC_SDIO_CCCR_ABORT_RESET;
213 ret = wilc_sdio_cmd52(wilc, &cmd);
215 dev_err(&func->dev, "Fail cmd 52, reset cmd ...\n");
221 static bool wilc_sdio_is_init(struct wilc *wilc)
223 struct wilc_sdio *sdio_priv = wilc->bus_data;
225 return sdio_priv->isinit;
228 static int wilc_sdio_suspend(struct device *dev)
230 struct sdio_func *func = dev_to_sdio_func(dev);
231 struct wilc *wilc = sdio_get_drvdata(func);
234 dev_info(dev, "sdio suspend\n");
237 if (!IS_ERR(wilc->rtc_clk))
238 clk_disable_unprepare(wilc->rtc_clk);
240 if (wilc->suspend_event) {
241 host_sleep_notify(wilc);
242 chip_allow_sleep(wilc);
245 ret = wilc_sdio_reset(wilc);
247 dev_err(&func->dev, "Fail reset sdio\n");
250 sdio_claim_host(func);
255 static int wilc_sdio_enable_interrupt(struct wilc *dev)
257 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
260 sdio_claim_host(func);
261 ret = sdio_claim_irq(func, wilc_sdio_interrupt);
262 sdio_release_host(func);
265 dev_err(&func->dev, "can't claim sdio_irq, err(%d)\n", ret);
271 static void wilc_sdio_disable_interrupt(struct wilc *dev)
273 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
276 sdio_claim_host(func);
277 ret = sdio_release_irq(func);
279 dev_err(&func->dev, "can't release sdio_irq, err(%d)\n", ret);
280 sdio_release_host(func);
283 /********************************************
287 ********************************************/
289 static int wilc_sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
291 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
292 struct sdio_cmd52 cmd;
301 cmd.address = WILC_SDIO_FBR_CSA_REG;
303 ret = wilc_sdio_cmd52(wilc, &cmd);
305 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
310 cmd.address = WILC_SDIO_FBR_CSA_REG + 1;
311 cmd.data = (u8)(adr >> 8);
312 ret = wilc_sdio_cmd52(wilc, &cmd);
314 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
319 cmd.address = WILC_SDIO_FBR_CSA_REG + 2;
320 cmd.data = (u8)(adr >> 16);
321 ret = wilc_sdio_cmd52(wilc, &cmd);
323 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
331 static int wilc_sdio_set_block_size(struct wilc *wilc, u8 func_num,
334 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
335 struct sdio_cmd52 cmd;
341 cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE;
342 cmd.data = (u8)block_size;
343 ret = wilc_sdio_cmd52(wilc, &cmd);
345 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
350 cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE + 1;
351 cmd.data = (u8)(block_size >> 8);
352 ret = wilc_sdio_cmd52(wilc, &cmd);
354 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
362 /********************************************
366 ********************************************/
367 static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
369 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
370 struct wilc_sdio *sdio_priv = wilc->bus_data;
375 if (addr >= 0xf0 && addr <= 0xff) { /* only vendor specific registers */
376 struct sdio_cmd52 cmd;
383 ret = wilc_sdio_cmd52(wilc, &cmd);
386 "Failed cmd 52, read reg (%08x) ...\n", addr);
388 struct sdio_cmd53 cmd;
391 * set the AHB address
393 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
399 cmd.address = WILC_SDIO_FBR_DATA_REG;
402 cmd.count = sizeof(u32);
403 cmd.buffer = (u8 *)&data;
404 cmd.use_global_buf = true;
405 cmd.block_size = sdio_priv->block_size;
406 ret = wilc_sdio_cmd53(wilc, &cmd);
409 "Failed cmd53, write reg (%08x)...\n", addr);
415 static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
417 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
418 struct wilc_sdio *sdio_priv = wilc->bus_data;
419 u32 block_size = sdio_priv->block_size;
420 struct sdio_cmd53 cmd;
421 int nblk, nleft, ret;
429 cmd.address = WILC_SDIO_FBR_DATA_REG;
435 cmd.address = WILC_SDIO_F1_DATA_REG;
438 size = ALIGN(size, 4);
439 nblk = size / block_size;
440 nleft = size % block_size;
442 cmd.use_global_buf = false;
448 cmd.block_size = block_size;
450 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
454 ret = wilc_sdio_cmd53(wilc, &cmd);
457 "Failed cmd53 [%x], block send...\n", addr);
461 addr += nblk * block_size;
462 buf += nblk * block_size;
471 cmd.block_size = block_size;
474 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
478 ret = wilc_sdio_cmd53(wilc, &cmd);
481 "Failed cmd53 [%x], bytes send...\n", addr);
489 static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
491 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
492 struct wilc_sdio *sdio_priv = wilc->bus_data;
495 if (addr >= 0xf0 && addr <= 0xff) { /* only vendor specific registers */
496 struct sdio_cmd52 cmd;
502 ret = wilc_sdio_cmd52(wilc, &cmd);
505 "Failed cmd 52, read reg (%08x) ...\n", addr);
510 struct sdio_cmd53 cmd;
512 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
518 cmd.address = WILC_SDIO_FBR_DATA_REG;
521 cmd.count = sizeof(u32);
522 cmd.buffer = (u8 *)data;
523 cmd.use_global_buf = true;
525 cmd.block_size = sdio_priv->block_size;
526 ret = wilc_sdio_cmd53(wilc, &cmd);
529 "Failed cmd53, read reg (%08x)...\n", addr);
538 static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
540 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
541 struct wilc_sdio *sdio_priv = wilc->bus_data;
542 u32 block_size = sdio_priv->block_size;
543 struct sdio_cmd53 cmd;
544 int nblk, nleft, ret;
552 cmd.address = WILC_SDIO_FBR_DATA_REG;
558 cmd.address = WILC_SDIO_F1_DATA_REG;
561 size = ALIGN(size, 4);
562 nblk = size / block_size;
563 nleft = size % block_size;
565 cmd.use_global_buf = false;
571 cmd.block_size = block_size;
573 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
577 ret = wilc_sdio_cmd53(wilc, &cmd);
580 "Failed cmd53 [%x], block read...\n", addr);
584 addr += nblk * block_size;
585 buf += nblk * block_size;
586 } /* if (nblk > 0) */
594 cmd.block_size = block_size;
597 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
601 ret = wilc_sdio_cmd53(wilc, &cmd);
604 "Failed cmd53 [%x], bytes read...\n", addr);
612 /********************************************
616 ********************************************/
618 static int wilc_sdio_deinit(struct wilc *wilc)
620 struct wilc_sdio *sdio_priv = wilc->bus_data;
622 sdio_priv->isinit = false;
626 static int wilc_sdio_init(struct wilc *wilc, bool resume)
628 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
629 struct wilc_sdio *sdio_priv = wilc->bus_data;
630 struct sdio_cmd52 cmd;
635 * function 0 csa enable
640 cmd.address = SDIO_FBR_BASE(1);
641 cmd.data = SDIO_FBR_ENABLE_CSA;
642 ret = wilc_sdio_cmd52(wilc, &cmd);
644 dev_err(&func->dev, "Fail cmd 52, enable csa...\n");
649 * function 0 block size
651 ret = wilc_sdio_set_block_size(wilc, 0, WILC_SDIO_BLOCK_SIZE);
653 dev_err(&func->dev, "Fail cmd 52, set func 0 block size...\n");
656 sdio_priv->block_size = WILC_SDIO_BLOCK_SIZE;
664 cmd.address = SDIO_CCCR_IOEx;
665 cmd.data = WILC_SDIO_CCCR_IO_EN_FUNC1;
666 ret = wilc_sdio_cmd52(wilc, &cmd);
669 "Fail cmd 52, set IOE register...\n");
674 * make sure func 1 is up
679 cmd.address = SDIO_CCCR_IORx;
683 ret = wilc_sdio_cmd52(wilc, &cmd);
686 "Fail cmd 52, get IOR register...\n");
689 if (cmd.data == WILC_SDIO_CCCR_IO_EN_FUNC1)
694 dev_err(&func->dev, "Fail func 1 is not ready...\n");
699 * func 1 is ready, set func 1 block size
701 ret = wilc_sdio_set_block_size(wilc, 1, WILC_SDIO_BLOCK_SIZE);
703 dev_err(&func->dev, "Fail set func 1 block size...\n");
708 * func 1 interrupt enable
713 cmd.address = SDIO_CCCR_IENx;
714 cmd.data = WILC_SDIO_CCCR_IEN_MASTER | WILC_SDIO_CCCR_IEN_FUNC1;
715 ret = wilc_sdio_cmd52(wilc, &cmd);
717 dev_err(&func->dev, "Fail cmd 52, set IEN register...\n");
722 * make sure can read back chip id correctly
725 ret = wilc_sdio_read_reg(wilc, WILC_CHIPID, &chipid);
727 dev_err(&func->dev, "Fail cmd read chip id...\n");
730 dev_err(&func->dev, "chipid (%08x)\n", chipid);
733 sdio_priv->isinit = true;
737 static int wilc_sdio_read_size(struct wilc *wilc, u32 *size)
740 struct sdio_cmd52 cmd;
743 * Read DMA count in words
748 cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG;
750 wilc_sdio_cmd52(wilc, &cmd);
753 cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG + 1;
755 wilc_sdio_cmd52(wilc, &cmd);
756 tmp |= (cmd.data << 8);
762 static int wilc_sdio_read_int(struct wilc *wilc, u32 *int_status)
764 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
765 struct wilc_sdio *sdio_priv = wilc->bus_data;
768 struct sdio_cmd52 cmd;
770 wilc_sdio_read_size(wilc, &tmp);
775 if (!sdio_priv->irq_gpio) {
777 cmd.address = WILC_SDIO_EXT_IRQ_FLAG_REG;
780 cmd.address = WILC_SDIO_IRQ_FLAG_REG;
785 wilc_sdio_cmd52(wilc, &cmd);
786 irq_flags = cmd.data;
787 tmp |= FIELD_PREP(IRG_FLAGS_MASK, cmd.data);
789 if (FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags))
790 dev_err(&func->dev, "Unexpected interrupt (1) int=%lx\n",
791 FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags));
798 static int wilc_sdio_clear_int_ext(struct wilc *wilc, u32 val)
800 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
801 struct wilc_sdio *sdio_priv = wilc->bus_data;
805 if (sdio_priv->irq_gpio)
806 reg = val & (BIT(MAX_NUM_INT) - 1);
808 /* select VMM table 0 */
809 if (val & SEL_VMM_TBL0)
811 /* select VMM table 1 */
812 if (val & SEL_VMM_TBL1)
818 struct sdio_cmd52 cmd;
823 cmd.address = WILC_SDIO_IRQ_CLEAR_FLAG_REG;
826 ret = wilc_sdio_cmd52(wilc, &cmd);
829 "Failed cmd52, set (%02x) data (%d) ...\n",
830 cmd.address, __LINE__);
837 static int wilc_sdio_sync_ext(struct wilc *wilc, int nint)
839 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
840 struct wilc_sdio *sdio_priv = wilc->bus_data;
843 if (nint > MAX_NUM_INT) {
844 dev_err(&func->dev, "Too many interrupts (%d)...\n", nint);
849 * Disable power sequencer
851 if (wilc_sdio_read_reg(wilc, WILC_MISC, ®)) {
852 dev_err(&func->dev, "Failed read misc reg...\n");
857 if (wilc_sdio_write_reg(wilc, WILC_MISC, reg)) {
858 dev_err(&func->dev, "Failed write misc reg...\n");
862 if (sdio_priv->irq_gpio) {
867 * interrupt pin mux select
869 ret = wilc_sdio_read_reg(wilc, WILC_PIN_MUX_0, ®);
871 dev_err(&func->dev, "Failed read reg (%08x)...\n",
876 ret = wilc_sdio_write_reg(wilc, WILC_PIN_MUX_0, reg);
878 dev_err(&func->dev, "Failed write reg (%08x)...\n",
886 ret = wilc_sdio_read_reg(wilc, WILC_INTR_ENABLE, ®);
888 dev_err(&func->dev, "Failed read reg (%08x)...\n",
893 for (i = 0; (i < 5) && (nint > 0); i++, nint--)
894 reg |= BIT((27 + i));
895 ret = wilc_sdio_write_reg(wilc, WILC_INTR_ENABLE, reg);
897 dev_err(&func->dev, "Failed write reg (%08x)...\n",
902 ret = wilc_sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
905 "Failed read reg (%08x)...\n",
910 for (i = 0; (i < 3) && (nint > 0); i++, nint--)
913 ret = wilc_sdio_write_reg(wilc, WILC_INTR2_ENABLE, reg);
916 "Failed write reg (%08x)...\n",
925 /* Global sdio HIF function table */
926 static const struct wilc_hif_func wilc_hif_sdio = {
927 .hif_init = wilc_sdio_init,
928 .hif_deinit = wilc_sdio_deinit,
929 .hif_read_reg = wilc_sdio_read_reg,
930 .hif_write_reg = wilc_sdio_write_reg,
931 .hif_block_rx = wilc_sdio_read,
932 .hif_block_tx = wilc_sdio_write,
933 .hif_read_int = wilc_sdio_read_int,
934 .hif_clear_int_ext = wilc_sdio_clear_int_ext,
935 .hif_read_size = wilc_sdio_read_size,
936 .hif_block_tx_ext = wilc_sdio_write,
937 .hif_block_rx_ext = wilc_sdio_read,
938 .hif_sync_ext = wilc_sdio_sync_ext,
939 .enable_interrupt = wilc_sdio_enable_interrupt,
940 .disable_interrupt = wilc_sdio_disable_interrupt,
941 .hif_reset = wilc_sdio_reset,
942 .hif_is_init = wilc_sdio_is_init,
945 static int wilc_sdio_resume(struct device *dev)
947 struct sdio_func *func = dev_to_sdio_func(dev);
948 struct wilc *wilc = sdio_get_drvdata(func);
950 dev_info(dev, "sdio resume\n");
951 sdio_release_host(func);
953 wilc_sdio_init(wilc, true);
955 if (wilc->suspend_event)
956 host_wakeup_notify(wilc);
958 chip_allow_sleep(wilc);
963 static const struct of_device_id wilc_of_match[] = {
964 { .compatible = "microchip,wilc1000", },
967 MODULE_DEVICE_TABLE(of, wilc_of_match);
969 static const struct dev_pm_ops wilc_sdio_pm_ops = {
970 .suspend = wilc_sdio_suspend,
971 .resume = wilc_sdio_resume,
974 static struct sdio_driver wilc_sdio_driver = {
975 .name = SDIO_MODALIAS,
976 .id_table = wilc_sdio_ids,
977 .probe = wilc_sdio_probe,
978 .remove = wilc_sdio_remove,
980 .pm = &wilc_sdio_pm_ops,
981 .of_match_table = wilc_of_match,
984 module_driver(wilc_sdio_driver,
985 sdio_register_driver,
986 sdio_unregister_driver);
987 MODULE_DESCRIPTION("Atmel WILC1000 SDIO wireless driver");
988 MODULE_LICENSE("GPL");