0001
0002
0003
0004
0005
0006
0007 #include <linux/clk.h>
0008 #include <linux/mmc/sdio_func.h>
0009 #include <linux/mmc/sdio_ids.h>
0010 #include <linux/mmc/host.h>
0011 #include <linux/mmc/sdio.h>
0012 #include <linux/of_irq.h>
0013
0014 #include "netdev.h"
0015 #include "cfg80211.h"
0016
0017 #define SDIO_MODALIAS "wilc1000_sdio"
0018
0019 static const struct sdio_device_id wilc_sdio_ids[] = {
0020 { SDIO_DEVICE(SDIO_VENDOR_ID_MICROCHIP_WILC, SDIO_DEVICE_ID_MICROCHIP_WILC1000) },
0021 { },
0022 };
0023
0024 #define WILC_SDIO_BLOCK_SIZE 512
0025
0026 struct wilc_sdio {
0027 bool irq_gpio;
0028 u32 block_size;
0029 bool isinit;
0030 int has_thrpt_enh3;
0031 u8 *cmd53_buf;
0032 };
0033
0034 struct sdio_cmd52 {
0035 u32 read_write: 1;
0036 u32 function: 3;
0037 u32 raw: 1;
0038 u32 address: 17;
0039 u32 data: 8;
0040 };
0041
0042 struct sdio_cmd53 {
0043 u32 read_write: 1;
0044 u32 function: 3;
0045 u32 block_mode: 1;
0046 u32 increment: 1;
0047 u32 address: 17;
0048 u32 count: 9;
0049 u8 *buffer;
0050 u32 block_size;
0051 bool use_global_buf;
0052 };
0053
0054 static const struct wilc_hif_func wilc_hif_sdio;
0055
0056 static void wilc_sdio_interrupt(struct sdio_func *func)
0057 {
0058 sdio_release_host(func);
0059 wilc_handle_isr(sdio_get_drvdata(func));
0060 sdio_claim_host(func);
0061 }
0062
0063 static int wilc_sdio_cmd52(struct wilc *wilc, struct sdio_cmd52 *cmd)
0064 {
0065 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
0066 int ret;
0067 u8 data;
0068
0069 sdio_claim_host(func);
0070
0071 func->num = cmd->function;
0072 if (cmd->read_write) {
0073 if (cmd->raw) {
0074 sdio_writeb(func, cmd->data, cmd->address, &ret);
0075 data = sdio_readb(func, cmd->address, &ret);
0076 cmd->data = data;
0077 } else {
0078 sdio_writeb(func, cmd->data, cmd->address, &ret);
0079 }
0080 } else {
0081 data = sdio_readb(func, cmd->address, &ret);
0082 cmd->data = data;
0083 }
0084
0085 sdio_release_host(func);
0086
0087 if (ret)
0088 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
0089 return ret;
0090 }
0091
0092 static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
0093 {
0094 struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
0095 int size, ret;
0096 struct wilc_sdio *sdio_priv = wilc->bus_data;
0097 u8 *buf = cmd->buffer;
0098
0099 sdio_claim_host(func);
0100
0101 func->num = cmd->function;
0102 func->cur_blksize = cmd->block_size;
0103 if (cmd->block_mode)
0104 size = cmd->count * cmd->block_size;
0105 else
0106 size = cmd->count;
0107
0108 if (cmd->use_global_buf) {
0109 if (size > sizeof(u32))
0110 return -EINVAL;
0111
0112 buf = sdio_priv->cmd53_buf;
0113 }
0114
0115 if (cmd->read_write) {
0116 if (cmd->use_global_buf)
0117 memcpy(buf, cmd->buffer, size);
0118
0119 ret = sdio_memcpy_toio(func, cmd->address, buf, size);
0120 } else {
0121 ret = sdio_memcpy_fromio(func, buf, cmd->address, size);
0122
0123 if (cmd->use_global_buf)
0124 memcpy(cmd->buffer, buf, size);
0125 }
0126
0127 sdio_release_host(func);
0128
0129 if (ret)
0130 dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
0131
0132 return ret;
0133 }
0134
0135 static int wilc_sdio_probe(struct sdio_func *func,
0136 const struct sdio_device_id *id)
0137 {
0138 struct wilc *wilc;
0139 int ret;
0140 struct wilc_sdio *sdio_priv;
0141
0142 sdio_priv = kzalloc(sizeof(*sdio_priv), GFP_KERNEL);
0143 if (!sdio_priv)
0144 return -ENOMEM;
0145
0146 sdio_priv->cmd53_buf = kzalloc(sizeof(u32), GFP_KERNEL);
0147 if (!sdio_priv->cmd53_buf) {
0148 ret = -ENOMEM;
0149 goto free;
0150 }
0151
0152 ret = wilc_cfg80211_init(&wilc, &func->dev, WILC_HIF_SDIO,
0153 &wilc_hif_sdio);
0154 if (ret)
0155 goto free;
0156
0157 if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
0158 struct device_node *np = func->card->dev.of_node;
0159 int irq_num = of_irq_get(np, 0);
0160
0161 if (irq_num > 0) {
0162 wilc->dev_irq_num = irq_num;
0163 sdio_priv->irq_gpio = true;
0164 }
0165 }
0166
0167 sdio_set_drvdata(func, wilc);
0168 wilc->bus_data = sdio_priv;
0169 wilc->dev = &func->dev;
0170
0171 wilc->rtc_clk = devm_clk_get_optional(&func->card->dev, "rtc");
0172 if (IS_ERR(wilc->rtc_clk)) {
0173 ret = PTR_ERR(wilc->rtc_clk);
0174 goto dispose_irq;
0175 }
0176 clk_prepare_enable(wilc->rtc_clk);
0177
0178 dev_info(&func->dev, "Driver Initializing success\n");
0179 return 0;
0180
0181 dispose_irq:
0182 irq_dispose_mapping(wilc->dev_irq_num);
0183 wilc_netdev_cleanup(wilc);
0184 free:
0185 kfree(sdio_priv->cmd53_buf);
0186 kfree(sdio_priv);
0187 return ret;
0188 }
0189
0190 static void wilc_sdio_remove(struct sdio_func *func)
0191 {
0192 struct wilc *wilc = sdio_get_drvdata(func);
0193 struct wilc_sdio *sdio_priv = wilc->bus_data;
0194
0195 clk_disable_unprepare(wilc->rtc_clk);
0196 wilc_netdev_cleanup(wilc);
0197 kfree(sdio_priv->cmd53_buf);
0198 kfree(sdio_priv);
0199 }
0200
0201 static int wilc_sdio_reset(struct wilc *wilc)
0202 {
0203 struct sdio_cmd52 cmd;
0204 int ret;
0205 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0206
0207 cmd.read_write = 1;
0208 cmd.function = 0;
0209 cmd.raw = 0;
0210 cmd.address = SDIO_CCCR_ABORT;
0211 cmd.data = WILC_SDIO_CCCR_ABORT_RESET;
0212 ret = wilc_sdio_cmd52(wilc, &cmd);
0213 if (ret) {
0214 dev_err(&func->dev, "Fail cmd 52, reset cmd ...\n");
0215 return ret;
0216 }
0217 return 0;
0218 }
0219
0220 static bool wilc_sdio_is_init(struct wilc *wilc)
0221 {
0222 struct wilc_sdio *sdio_priv = wilc->bus_data;
0223
0224 return sdio_priv->isinit;
0225 }
0226
0227 static int wilc_sdio_suspend(struct device *dev)
0228 {
0229 struct sdio_func *func = dev_to_sdio_func(dev);
0230 struct wilc *wilc = sdio_get_drvdata(func);
0231 int ret;
0232
0233 dev_info(dev, "sdio suspend\n");
0234 chip_wakeup(wilc);
0235
0236 if (!IS_ERR(wilc->rtc_clk))
0237 clk_disable_unprepare(wilc->rtc_clk);
0238
0239 if (wilc->suspend_event) {
0240 host_sleep_notify(wilc);
0241 chip_allow_sleep(wilc);
0242 }
0243
0244 ret = wilc_sdio_reset(wilc);
0245 if (ret) {
0246 dev_err(&func->dev, "Fail reset sdio\n");
0247 return ret;
0248 }
0249 sdio_claim_host(func);
0250
0251 return 0;
0252 }
0253
0254 static int wilc_sdio_enable_interrupt(struct wilc *dev)
0255 {
0256 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
0257 int ret = 0;
0258
0259 sdio_claim_host(func);
0260 ret = sdio_claim_irq(func, wilc_sdio_interrupt);
0261 sdio_release_host(func);
0262
0263 if (ret < 0) {
0264 dev_err(&func->dev, "can't claim sdio_irq, err(%d)\n", ret);
0265 ret = -EIO;
0266 }
0267 return ret;
0268 }
0269
0270 static void wilc_sdio_disable_interrupt(struct wilc *dev)
0271 {
0272 struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
0273 int ret;
0274
0275 sdio_claim_host(func);
0276 ret = sdio_release_irq(func);
0277 if (ret < 0)
0278 dev_err(&func->dev, "can't release sdio_irq, err(%d)\n", ret);
0279 sdio_release_host(func);
0280 }
0281
0282
0283
0284
0285
0286
0287
0288 static int wilc_sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
0289 {
0290 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0291 struct sdio_cmd52 cmd;
0292 int ret;
0293
0294
0295
0296
0297 cmd.read_write = 1;
0298 cmd.function = 0;
0299 cmd.raw = 0;
0300 cmd.address = WILC_SDIO_FBR_CSA_REG;
0301 cmd.data = (u8)adr;
0302 ret = wilc_sdio_cmd52(wilc, &cmd);
0303 if (ret) {
0304 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
0305 cmd.address);
0306 return ret;
0307 }
0308
0309 cmd.address = WILC_SDIO_FBR_CSA_REG + 1;
0310 cmd.data = (u8)(adr >> 8);
0311 ret = wilc_sdio_cmd52(wilc, &cmd);
0312 if (ret) {
0313 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
0314 cmd.address);
0315 return ret;
0316 }
0317
0318 cmd.address = WILC_SDIO_FBR_CSA_REG + 2;
0319 cmd.data = (u8)(adr >> 16);
0320 ret = wilc_sdio_cmd52(wilc, &cmd);
0321 if (ret) {
0322 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
0323 cmd.address);
0324 return ret;
0325 }
0326
0327 return 0;
0328 }
0329
0330 static int wilc_sdio_set_block_size(struct wilc *wilc, u8 func_num,
0331 u32 block_size)
0332 {
0333 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0334 struct sdio_cmd52 cmd;
0335 int ret;
0336
0337 cmd.read_write = 1;
0338 cmd.function = 0;
0339 cmd.raw = 0;
0340 cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE;
0341 cmd.data = (u8)block_size;
0342 ret = wilc_sdio_cmd52(wilc, &cmd);
0343 if (ret) {
0344 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
0345 cmd.address);
0346 return ret;
0347 }
0348
0349 cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE + 1;
0350 cmd.data = (u8)(block_size >> 8);
0351 ret = wilc_sdio_cmd52(wilc, &cmd);
0352 if (ret) {
0353 dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
0354 cmd.address);
0355 return ret;
0356 }
0357
0358 return 0;
0359 }
0360
0361
0362
0363
0364
0365
0366 static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
0367 {
0368 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0369 struct wilc_sdio *sdio_priv = wilc->bus_data;
0370 int ret;
0371
0372 cpu_to_le32s(&data);
0373
0374 if (addr >= 0xf0 && addr <= 0xff) {
0375 struct sdio_cmd52 cmd;
0376
0377 cmd.read_write = 1;
0378 cmd.function = 0;
0379 cmd.raw = 0;
0380 cmd.address = addr;
0381 cmd.data = data;
0382 ret = wilc_sdio_cmd52(wilc, &cmd);
0383 if (ret)
0384 dev_err(&func->dev,
0385 "Failed cmd 52, read reg (%08x) ...\n", addr);
0386 } else {
0387 struct sdio_cmd53 cmd;
0388
0389
0390
0391
0392 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
0393 if (ret)
0394 return ret;
0395
0396 cmd.read_write = 1;
0397 cmd.function = 0;
0398 cmd.address = WILC_SDIO_FBR_DATA_REG;
0399 cmd.block_mode = 0;
0400 cmd.increment = 1;
0401 cmd.count = sizeof(u32);
0402 cmd.buffer = (u8 *)&data;
0403 cmd.use_global_buf = true;
0404 cmd.block_size = sdio_priv->block_size;
0405 ret = wilc_sdio_cmd53(wilc, &cmd);
0406 if (ret)
0407 dev_err(&func->dev,
0408 "Failed cmd53, write reg (%08x)...\n", addr);
0409 }
0410
0411 return ret;
0412 }
0413
0414 static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
0415 {
0416 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0417 struct wilc_sdio *sdio_priv = wilc->bus_data;
0418 u32 block_size = sdio_priv->block_size;
0419 struct sdio_cmd53 cmd;
0420 int nblk, nleft, ret;
0421
0422 cmd.read_write = 1;
0423 if (addr > 0) {
0424
0425
0426
0427 cmd.function = 0;
0428 cmd.address = WILC_SDIO_FBR_DATA_REG;
0429 } else {
0430
0431
0432
0433 cmd.function = 1;
0434 cmd.address = WILC_SDIO_F1_DATA_REG;
0435 }
0436
0437 size = ALIGN(size, 4);
0438 nblk = size / block_size;
0439 nleft = size % block_size;
0440
0441 cmd.use_global_buf = false;
0442 if (nblk > 0) {
0443 cmd.block_mode = 1;
0444 cmd.increment = 1;
0445 cmd.count = nblk;
0446 cmd.buffer = buf;
0447 cmd.block_size = block_size;
0448 if (addr > 0) {
0449 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
0450 if (ret)
0451 return ret;
0452 }
0453 ret = wilc_sdio_cmd53(wilc, &cmd);
0454 if (ret) {
0455 dev_err(&func->dev,
0456 "Failed cmd53 [%x], block send...\n", addr);
0457 return ret;
0458 }
0459 if (addr > 0)
0460 addr += nblk * block_size;
0461 buf += nblk * block_size;
0462 }
0463
0464 if (nleft > 0) {
0465 cmd.block_mode = 0;
0466 cmd.increment = 1;
0467 cmd.count = nleft;
0468 cmd.buffer = buf;
0469
0470 cmd.block_size = block_size;
0471
0472 if (addr > 0) {
0473 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
0474 if (ret)
0475 return ret;
0476 }
0477 ret = wilc_sdio_cmd53(wilc, &cmd);
0478 if (ret) {
0479 dev_err(&func->dev,
0480 "Failed cmd53 [%x], bytes send...\n", addr);
0481 return ret;
0482 }
0483 }
0484
0485 return 0;
0486 }
0487
0488 static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
0489 {
0490 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0491 struct wilc_sdio *sdio_priv = wilc->bus_data;
0492 int ret;
0493
0494 if (addr >= 0xf0 && addr <= 0xff) {
0495 struct sdio_cmd52 cmd;
0496
0497 cmd.read_write = 0;
0498 cmd.function = 0;
0499 cmd.raw = 0;
0500 cmd.address = addr;
0501 ret = wilc_sdio_cmd52(wilc, &cmd);
0502 if (ret) {
0503 dev_err(&func->dev,
0504 "Failed cmd 52, read reg (%08x) ...\n", addr);
0505 return ret;
0506 }
0507 *data = cmd.data;
0508 } else {
0509 struct sdio_cmd53 cmd;
0510
0511 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
0512 if (ret)
0513 return ret;
0514
0515 cmd.read_write = 0;
0516 cmd.function = 0;
0517 cmd.address = WILC_SDIO_FBR_DATA_REG;
0518 cmd.block_mode = 0;
0519 cmd.increment = 1;
0520 cmd.count = sizeof(u32);
0521 cmd.buffer = (u8 *)data;
0522 cmd.use_global_buf = true;
0523
0524 cmd.block_size = sdio_priv->block_size;
0525 ret = wilc_sdio_cmd53(wilc, &cmd);
0526 if (ret) {
0527 dev_err(&func->dev,
0528 "Failed cmd53, read reg (%08x)...\n", addr);
0529 return ret;
0530 }
0531 }
0532
0533 le32_to_cpus(data);
0534 return 0;
0535 }
0536
0537 static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
0538 {
0539 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0540 struct wilc_sdio *sdio_priv = wilc->bus_data;
0541 u32 block_size = sdio_priv->block_size;
0542 struct sdio_cmd53 cmd;
0543 int nblk, nleft, ret;
0544
0545 cmd.read_write = 0;
0546 if (addr > 0) {
0547
0548
0549
0550 cmd.function = 0;
0551 cmd.address = WILC_SDIO_FBR_DATA_REG;
0552 } else {
0553
0554
0555
0556 cmd.function = 1;
0557 cmd.address = WILC_SDIO_F1_DATA_REG;
0558 }
0559
0560 size = ALIGN(size, 4);
0561 nblk = size / block_size;
0562 nleft = size % block_size;
0563
0564 cmd.use_global_buf = false;
0565 if (nblk > 0) {
0566 cmd.block_mode = 1;
0567 cmd.increment = 1;
0568 cmd.count = nblk;
0569 cmd.buffer = buf;
0570 cmd.block_size = block_size;
0571 if (addr > 0) {
0572 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
0573 if (ret)
0574 return ret;
0575 }
0576 ret = wilc_sdio_cmd53(wilc, &cmd);
0577 if (ret) {
0578 dev_err(&func->dev,
0579 "Failed cmd53 [%x], block read...\n", addr);
0580 return ret;
0581 }
0582 if (addr > 0)
0583 addr += nblk * block_size;
0584 buf += nblk * block_size;
0585 }
0586
0587 if (nleft > 0) {
0588 cmd.block_mode = 0;
0589 cmd.increment = 1;
0590 cmd.count = nleft;
0591 cmd.buffer = buf;
0592
0593 cmd.block_size = block_size;
0594
0595 if (addr > 0) {
0596 ret = wilc_sdio_set_func0_csa_address(wilc, addr);
0597 if (ret)
0598 return ret;
0599 }
0600 ret = wilc_sdio_cmd53(wilc, &cmd);
0601 if (ret) {
0602 dev_err(&func->dev,
0603 "Failed cmd53 [%x], bytes read...\n", addr);
0604 return ret;
0605 }
0606 }
0607
0608 return 0;
0609 }
0610
0611
0612
0613
0614
0615
0616
0617 static int wilc_sdio_deinit(struct wilc *wilc)
0618 {
0619 struct wilc_sdio *sdio_priv = wilc->bus_data;
0620
0621 sdio_priv->isinit = false;
0622 return 0;
0623 }
0624
0625 static int wilc_sdio_init(struct wilc *wilc, bool resume)
0626 {
0627 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0628 struct wilc_sdio *sdio_priv = wilc->bus_data;
0629 struct sdio_cmd52 cmd;
0630 int loop, ret;
0631 u32 chipid;
0632
0633
0634
0635
0636 cmd.read_write = 1;
0637 cmd.function = 0;
0638 cmd.raw = 1;
0639 cmd.address = SDIO_FBR_BASE(1);
0640 cmd.data = SDIO_FBR_ENABLE_CSA;
0641 ret = wilc_sdio_cmd52(wilc, &cmd);
0642 if (ret) {
0643 dev_err(&func->dev, "Fail cmd 52, enable csa...\n");
0644 return ret;
0645 }
0646
0647
0648
0649
0650 ret = wilc_sdio_set_block_size(wilc, 0, WILC_SDIO_BLOCK_SIZE);
0651 if (ret) {
0652 dev_err(&func->dev, "Fail cmd 52, set func 0 block size...\n");
0653 return ret;
0654 }
0655 sdio_priv->block_size = WILC_SDIO_BLOCK_SIZE;
0656
0657
0658
0659
0660 cmd.read_write = 1;
0661 cmd.function = 0;
0662 cmd.raw = 1;
0663 cmd.address = SDIO_CCCR_IOEx;
0664 cmd.data = WILC_SDIO_CCCR_IO_EN_FUNC1;
0665 ret = wilc_sdio_cmd52(wilc, &cmd);
0666 if (ret) {
0667 dev_err(&func->dev,
0668 "Fail cmd 52, set IOE register...\n");
0669 return ret;
0670 }
0671
0672
0673
0674
0675 cmd.read_write = 0;
0676 cmd.function = 0;
0677 cmd.raw = 0;
0678 cmd.address = SDIO_CCCR_IORx;
0679 loop = 3;
0680 do {
0681 cmd.data = 0;
0682 ret = wilc_sdio_cmd52(wilc, &cmd);
0683 if (ret) {
0684 dev_err(&func->dev,
0685 "Fail cmd 52, get IOR register...\n");
0686 return ret;
0687 }
0688 if (cmd.data == WILC_SDIO_CCCR_IO_EN_FUNC1)
0689 break;
0690 } while (loop--);
0691
0692 if (loop <= 0) {
0693 dev_err(&func->dev, "Fail func 1 is not ready...\n");
0694 return -EINVAL;
0695 }
0696
0697
0698
0699
0700 ret = wilc_sdio_set_block_size(wilc, 1, WILC_SDIO_BLOCK_SIZE);
0701 if (ret) {
0702 dev_err(&func->dev, "Fail set func 1 block size...\n");
0703 return ret;
0704 }
0705
0706
0707
0708
0709 cmd.read_write = 1;
0710 cmd.function = 0;
0711 cmd.raw = 1;
0712 cmd.address = SDIO_CCCR_IENx;
0713 cmd.data = WILC_SDIO_CCCR_IEN_MASTER | WILC_SDIO_CCCR_IEN_FUNC1;
0714 ret = wilc_sdio_cmd52(wilc, &cmd);
0715 if (ret) {
0716 dev_err(&func->dev, "Fail cmd 52, set IEN register...\n");
0717 return ret;
0718 }
0719
0720
0721
0722
0723 if (!resume) {
0724 int rev;
0725
0726 ret = wilc_sdio_read_reg(wilc, WILC_CHIPID, &chipid);
0727 if (ret) {
0728 dev_err(&func->dev, "Fail cmd read chip id...\n");
0729 return ret;
0730 }
0731 dev_err(&func->dev, "chipid (%08x)\n", chipid);
0732 rev = FIELD_GET(WILC_CHIP_REV_FIELD, chipid);
0733 if (rev > FIELD_GET(WILC_CHIP_REV_FIELD, WILC_1000_BASE_ID_2A))
0734 sdio_priv->has_thrpt_enh3 = 1;
0735 else
0736 sdio_priv->has_thrpt_enh3 = 0;
0737 dev_info(&func->dev, "has_thrpt_enh3 = %d...\n",
0738 sdio_priv->has_thrpt_enh3);
0739 }
0740
0741 sdio_priv->isinit = true;
0742 return 0;
0743 }
0744
0745 static int wilc_sdio_read_size(struct wilc *wilc, u32 *size)
0746 {
0747 u32 tmp;
0748 struct sdio_cmd52 cmd;
0749
0750
0751
0752
0753 cmd.read_write = 0;
0754 cmd.function = 0;
0755 cmd.raw = 0;
0756 cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG;
0757 cmd.data = 0;
0758 wilc_sdio_cmd52(wilc, &cmd);
0759 tmp = cmd.data;
0760
0761 cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG + 1;
0762 cmd.data = 0;
0763 wilc_sdio_cmd52(wilc, &cmd);
0764 tmp |= (cmd.data << 8);
0765
0766 *size = tmp;
0767 return 0;
0768 }
0769
0770 static int wilc_sdio_read_int(struct wilc *wilc, u32 *int_status)
0771 {
0772 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0773 struct wilc_sdio *sdio_priv = wilc->bus_data;
0774 u32 tmp;
0775 u8 irq_flags;
0776 struct sdio_cmd52 cmd;
0777
0778 wilc_sdio_read_size(wilc, &tmp);
0779
0780
0781
0782
0783 if (!sdio_priv->irq_gpio) {
0784 cmd.function = 1;
0785 cmd.address = WILC_SDIO_EXT_IRQ_FLAG_REG;
0786 } else {
0787 cmd.function = 0;
0788 cmd.address = WILC_SDIO_IRQ_FLAG_REG;
0789 }
0790 cmd.raw = 0;
0791 cmd.read_write = 0;
0792 cmd.data = 0;
0793 wilc_sdio_cmd52(wilc, &cmd);
0794 irq_flags = cmd.data;
0795 tmp |= FIELD_PREP(IRG_FLAGS_MASK, cmd.data);
0796
0797 if (FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags))
0798 dev_err(&func->dev, "Unexpected interrupt (1) int=%lx\n",
0799 FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags));
0800
0801 *int_status = tmp;
0802
0803 return 0;
0804 }
0805
0806 static int wilc_sdio_clear_int_ext(struct wilc *wilc, u32 val)
0807 {
0808 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0809 struct wilc_sdio *sdio_priv = wilc->bus_data;
0810 int ret;
0811 int vmm_ctl;
0812
0813 if (sdio_priv->has_thrpt_enh3) {
0814 u32 reg = 0;
0815
0816 if (sdio_priv->irq_gpio)
0817 reg = val & (BIT(MAX_NUM_INT) - 1);
0818
0819
0820 if (val & SEL_VMM_TBL0)
0821 reg |= BIT(5);
0822
0823 if (val & SEL_VMM_TBL1)
0824 reg |= BIT(6);
0825
0826 if (val & EN_VMM)
0827 reg |= BIT(7);
0828 if (reg) {
0829 struct sdio_cmd52 cmd;
0830
0831 cmd.read_write = 1;
0832 cmd.function = 0;
0833 cmd.raw = 0;
0834 cmd.address = WILC_SDIO_IRQ_CLEAR_FLAG_REG;
0835 cmd.data = reg;
0836
0837 ret = wilc_sdio_cmd52(wilc, &cmd);
0838 if (ret) {
0839 dev_err(&func->dev,
0840 "Failed cmd52, set (%02x) data (%d) ...\n",
0841 cmd.address, __LINE__);
0842 return ret;
0843 }
0844 }
0845 return 0;
0846 }
0847 if (sdio_priv->irq_gpio) {
0848
0849
0850
0851
0852
0853 u32 flags;
0854 int i;
0855
0856 flags = val & (BIT(MAX_NUM_INT) - 1);
0857 for (i = 0; i < NUM_INT_EXT && flags; i++) {
0858 if (flags & BIT(i)) {
0859 struct sdio_cmd52 cmd;
0860
0861 cmd.read_write = 1;
0862 cmd.function = 0;
0863 cmd.raw = 0;
0864 cmd.address = WILC_SDIO_IRQ_CLEAR_FLAG_REG;
0865 cmd.data = BIT(i);
0866
0867 ret = wilc_sdio_cmd52(wilc, &cmd);
0868 if (ret) {
0869 dev_err(&func->dev,
0870 "Failed cmd52, set (%02x) data (%d) ...\n",
0871 cmd.address, __LINE__);
0872 return ret;
0873 }
0874 flags &= ~BIT(i);
0875 }
0876 }
0877
0878 for (i = NUM_INT_EXT; i < MAX_NUM_INT && flags; i++) {
0879 if (flags & BIT(i)) {
0880 dev_err(&func->dev,
0881 "Unexpected interrupt cleared %d...\n",
0882 i);
0883 flags &= ~BIT(i);
0884 }
0885 }
0886 }
0887
0888 vmm_ctl = 0;
0889
0890 if (val & SEL_VMM_TBL0)
0891 vmm_ctl |= BIT(0);
0892
0893 if (val & SEL_VMM_TBL1)
0894 vmm_ctl |= BIT(1);
0895
0896 if (val & EN_VMM)
0897 vmm_ctl |= BIT(2);
0898
0899 if (vmm_ctl) {
0900 struct sdio_cmd52 cmd;
0901
0902 cmd.read_write = 1;
0903 cmd.function = 0;
0904 cmd.raw = 0;
0905 cmd.address = WILC_SDIO_VMM_TBL_CTRL_REG;
0906 cmd.data = vmm_ctl;
0907 ret = wilc_sdio_cmd52(wilc, &cmd);
0908 if (ret) {
0909 dev_err(&func->dev,
0910 "Failed cmd52, set (%02x) data (%d) ...\n",
0911 cmd.address, __LINE__);
0912 return ret;
0913 }
0914 }
0915 return 0;
0916 }
0917
0918 static int wilc_sdio_sync_ext(struct wilc *wilc, int nint)
0919 {
0920 struct sdio_func *func = dev_to_sdio_func(wilc->dev);
0921 struct wilc_sdio *sdio_priv = wilc->bus_data;
0922 u32 reg;
0923
0924 if (nint > MAX_NUM_INT) {
0925 dev_err(&func->dev, "Too many interrupts (%d)...\n", nint);
0926 return -EINVAL;
0927 }
0928
0929
0930
0931
0932 if (wilc_sdio_read_reg(wilc, WILC_MISC, ®)) {
0933 dev_err(&func->dev, "Failed read misc reg...\n");
0934 return -EINVAL;
0935 }
0936
0937 reg &= ~BIT(8);
0938 if (wilc_sdio_write_reg(wilc, WILC_MISC, reg)) {
0939 dev_err(&func->dev, "Failed write misc reg...\n");
0940 return -EINVAL;
0941 }
0942
0943 if (sdio_priv->irq_gpio) {
0944 u32 reg;
0945 int ret, i;
0946
0947
0948
0949
0950 ret = wilc_sdio_read_reg(wilc, WILC_PIN_MUX_0, ®);
0951 if (ret) {
0952 dev_err(&func->dev, "Failed read reg (%08x)...\n",
0953 WILC_PIN_MUX_0);
0954 return ret;
0955 }
0956 reg |= BIT(8);
0957 ret = wilc_sdio_write_reg(wilc, WILC_PIN_MUX_0, reg);
0958 if (ret) {
0959 dev_err(&func->dev, "Failed write reg (%08x)...\n",
0960 WILC_PIN_MUX_0);
0961 return ret;
0962 }
0963
0964
0965
0966
0967 ret = wilc_sdio_read_reg(wilc, WILC_INTR_ENABLE, ®);
0968 if (ret) {
0969 dev_err(&func->dev, "Failed read reg (%08x)...\n",
0970 WILC_INTR_ENABLE);
0971 return ret;
0972 }
0973
0974 for (i = 0; (i < 5) && (nint > 0); i++, nint--)
0975 reg |= BIT((27 + i));
0976 ret = wilc_sdio_write_reg(wilc, WILC_INTR_ENABLE, reg);
0977 if (ret) {
0978 dev_err(&func->dev, "Failed write reg (%08x)...\n",
0979 WILC_INTR_ENABLE);
0980 return ret;
0981 }
0982 if (nint) {
0983 ret = wilc_sdio_read_reg(wilc, WILC_INTR2_ENABLE, ®);
0984 if (ret) {
0985 dev_err(&func->dev,
0986 "Failed read reg (%08x)...\n",
0987 WILC_INTR2_ENABLE);
0988 return ret;
0989 }
0990
0991 for (i = 0; (i < 3) && (nint > 0); i++, nint--)
0992 reg |= BIT(i);
0993
0994 ret = wilc_sdio_write_reg(wilc, WILC_INTR2_ENABLE, reg);
0995 if (ret) {
0996 dev_err(&func->dev,
0997 "Failed write reg (%08x)...\n",
0998 WILC_INTR2_ENABLE);
0999 return ret;
1000 }
1001 }
1002 }
1003 return 0;
1004 }
1005
1006
1007 static const struct wilc_hif_func wilc_hif_sdio = {
1008 .hif_init = wilc_sdio_init,
1009 .hif_deinit = wilc_sdio_deinit,
1010 .hif_read_reg = wilc_sdio_read_reg,
1011 .hif_write_reg = wilc_sdio_write_reg,
1012 .hif_block_rx = wilc_sdio_read,
1013 .hif_block_tx = wilc_sdio_write,
1014 .hif_read_int = wilc_sdio_read_int,
1015 .hif_clear_int_ext = wilc_sdio_clear_int_ext,
1016 .hif_read_size = wilc_sdio_read_size,
1017 .hif_block_tx_ext = wilc_sdio_write,
1018 .hif_block_rx_ext = wilc_sdio_read,
1019 .hif_sync_ext = wilc_sdio_sync_ext,
1020 .enable_interrupt = wilc_sdio_enable_interrupt,
1021 .disable_interrupt = wilc_sdio_disable_interrupt,
1022 .hif_reset = wilc_sdio_reset,
1023 .hif_is_init = wilc_sdio_is_init,
1024 };
1025
1026 static int wilc_sdio_resume(struct device *dev)
1027 {
1028 struct sdio_func *func = dev_to_sdio_func(dev);
1029 struct wilc *wilc = sdio_get_drvdata(func);
1030
1031 dev_info(dev, "sdio resume\n");
1032 sdio_release_host(func);
1033 chip_wakeup(wilc);
1034 wilc_sdio_init(wilc, true);
1035
1036 if (wilc->suspend_event)
1037 host_wakeup_notify(wilc);
1038
1039 chip_allow_sleep(wilc);
1040
1041 return 0;
1042 }
1043
1044 static const struct of_device_id wilc_of_match[] = {
1045 { .compatible = "microchip,wilc1000", },
1046 { }
1047 };
1048 MODULE_DEVICE_TABLE(of, wilc_of_match);
1049
1050 static const struct dev_pm_ops wilc_sdio_pm_ops = {
1051 .suspend = wilc_sdio_suspend,
1052 .resume = wilc_sdio_resume,
1053 };
1054
1055 static struct sdio_driver wilc_sdio_driver = {
1056 .name = SDIO_MODALIAS,
1057 .id_table = wilc_sdio_ids,
1058 .probe = wilc_sdio_probe,
1059 .remove = wilc_sdio_remove,
1060 .drv = {
1061 .pm = &wilc_sdio_pm_ops,
1062 .of_match_table = wilc_of_match,
1063 }
1064 };
1065 module_driver(wilc_sdio_driver,
1066 sdio_register_driver,
1067 sdio_unregister_driver);
1068 MODULE_LICENSE("GPL");