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