Lines Matching refs:card

254 static int btmrvl_sdio_get_rx_unit(struct btmrvl_sdio_card *card)  in btmrvl_sdio_get_rx_unit()  argument
259 reg = sdio_readb(card->func, card->reg->card_rx_unit, &ret); in btmrvl_sdio_get_rx_unit()
261 card->rx_unit = reg; in btmrvl_sdio_get_rx_unit()
266 static int btmrvl_sdio_read_fw_status(struct btmrvl_sdio_card *card, u16 *dat) in btmrvl_sdio_read_fw_status() argument
273 fws0 = sdio_readb(card->func, card->reg->card_fw_status0, &ret); in btmrvl_sdio_read_fw_status()
277 fws1 = sdio_readb(card->func, card->reg->card_fw_status1, &ret); in btmrvl_sdio_read_fw_status()
286 static int btmrvl_sdio_read_rx_len(struct btmrvl_sdio_card *card, u16 *dat) in btmrvl_sdio_read_rx_len() argument
291 reg = sdio_readb(card->func, card->reg->card_rx_len, &ret); in btmrvl_sdio_read_rx_len()
293 *dat = (u16) reg << card->rx_unit; in btmrvl_sdio_read_rx_len()
298 static int btmrvl_sdio_enable_host_int_mask(struct btmrvl_sdio_card *card, in btmrvl_sdio_enable_host_int_mask() argument
303 sdio_writeb(card->func, mask, card->reg->host_int_mask, &ret); in btmrvl_sdio_enable_host_int_mask()
312 static int btmrvl_sdio_disable_host_int_mask(struct btmrvl_sdio_card *card, in btmrvl_sdio_disable_host_int_mask() argument
318 host_int_mask = sdio_readb(card->func, card->reg->host_int_mask, &ret); in btmrvl_sdio_disable_host_int_mask()
324 sdio_writeb(card->func, host_int_mask, card->reg->host_int_mask, &ret); in btmrvl_sdio_disable_host_int_mask()
333 static int btmrvl_sdio_poll_card_status(struct btmrvl_sdio_card *card, u8 bits) in btmrvl_sdio_poll_card_status() argument
340 status = sdio_readb(card->func, card->reg->card_status, &ret); in btmrvl_sdio_poll_card_status()
357 static int btmrvl_sdio_verify_fw_download(struct btmrvl_sdio_card *card, in btmrvl_sdio_verify_fw_download() argument
365 sdio_claim_host(card->func); in btmrvl_sdio_verify_fw_download()
366 ret = btmrvl_sdio_read_fw_status(card, &firmwarestat); in btmrvl_sdio_verify_fw_download()
367 sdio_release_host(card->func); in btmrvl_sdio_verify_fw_download()
380 static int btmrvl_sdio_download_helper(struct btmrvl_sdio_card *card) in btmrvl_sdio_download_helper() argument
390 ret = request_firmware(&fw_helper, card->helper, in btmrvl_sdio_download_helper()
391 &card->func->dev); in btmrvl_sdio_download_helper()
423 ret = btmrvl_sdio_poll_card_status(card, in btmrvl_sdio_download_helper()
448 ret = sdio_writesb(card->func, card->ioport, helperbuf, in btmrvl_sdio_download_helper()
463 ret = sdio_writesb(card->func, card->ioport, helperbuf, in btmrvl_sdio_download_helper()
478 static int btmrvl_sdio_download_fw_w_helper(struct btmrvl_sdio_card *card) in btmrvl_sdio_download_fw_w_helper() argument
487 u16 len, blksz_dl = card->sd_blksz_fw_dl; in btmrvl_sdio_download_fw_w_helper()
490 ret = request_firmware(&fw_firmware, card->firmware, in btmrvl_sdio_download_fw_w_helper()
491 &card->func->dev); in btmrvl_sdio_download_fw_w_helper()
519 ret = btmrvl_sdio_poll_card_status(card, in btmrvl_sdio_download_fw_w_helper()
532 base0 = sdio_readb(card->func, in btmrvl_sdio_download_fw_w_helper()
533 card->reg->sq_read_base_addr_a0, &ret); in btmrvl_sdio_download_fw_w_helper()
542 base1 = sdio_readb(card->func, in btmrvl_sdio_download_fw_w_helper()
543 card->reg->sq_read_base_addr_a1, &ret); in btmrvl_sdio_download_fw_w_helper()
596 ret = sdio_writesb(card->func, card->ioport, fwbuf, in btmrvl_sdio_download_fw_w_helper()
602 sdio_writeb(card->func, HOST_CMD53_FIN, in btmrvl_sdio_download_fw_w_helper()
603 card->reg->cfg, &ret); in btmrvl_sdio_download_fw_w_helper()
629 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_card_to_host() local
631 if (!card || !card->func) { in btmrvl_sdio_card_to_host()
638 ret = btmrvl_sdio_read_rx_len(card, &buf_len); in btmrvl_sdio_card_to_host()
672 ret = sdio_readsb(card->func, payload, card->ioport, in btmrvl_sdio_card_to_host()
748 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_process_int_status() local
755 sdio_claim_host(card->func); in btmrvl_sdio_process_int_status()
767 sdio_release_host(card->func); in btmrvl_sdio_process_int_status()
772 static int btmrvl_sdio_read_to_clear(struct btmrvl_sdio_card *card, u8 *ireg) in btmrvl_sdio_read_to_clear() argument
774 struct btmrvl_adapter *adapter = card->priv->adapter; in btmrvl_sdio_read_to_clear()
777 ret = sdio_readsb(card->func, adapter->hw_regs, 0, SDIO_BLOCK_SIZE); in btmrvl_sdio_read_to_clear()
783 *ireg = adapter->hw_regs[card->reg->host_intstatus]; in btmrvl_sdio_read_to_clear()
784 BT_DBG("hw_regs[%#x]=%#x", card->reg->host_intstatus, *ireg); in btmrvl_sdio_read_to_clear()
789 static int btmrvl_sdio_write_to_clear(struct btmrvl_sdio_card *card, u8 *ireg) in btmrvl_sdio_write_to_clear() argument
793 *ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret); in btmrvl_sdio_write_to_clear()
807 sdio_writeb(card->func, ~(*ireg) & (DN_LD_HOST_INT_STATUS | in btmrvl_sdio_write_to_clear()
809 card->reg->host_intstatus, &ret); in btmrvl_sdio_write_to_clear()
822 struct btmrvl_sdio_card *card; in btmrvl_sdio_interrupt() local
827 card = sdio_get_drvdata(func); in btmrvl_sdio_interrupt()
828 if (!card || !card->priv) { in btmrvl_sdio_interrupt()
830 func, card); in btmrvl_sdio_interrupt()
834 priv = card->priv; in btmrvl_sdio_interrupt()
839 if (card->reg->int_read_to_clear) in btmrvl_sdio_interrupt()
840 ret = btmrvl_sdio_read_to_clear(card, &ireg); in btmrvl_sdio_interrupt()
842 ret = btmrvl_sdio_write_to_clear(card, &ireg); in btmrvl_sdio_interrupt()
854 static int btmrvl_sdio_register_dev(struct btmrvl_sdio_card *card) in btmrvl_sdio_register_dev() argument
860 if (!card || !card->func) { in btmrvl_sdio_register_dev()
866 func = card->func; in btmrvl_sdio_register_dev()
884 ret = sdio_set_block_size(card->func, SDIO_BLOCK_SIZE); in btmrvl_sdio_register_dev()
891 reg = sdio_readb(func, card->reg->io_port_0, &ret); in btmrvl_sdio_register_dev()
897 card->ioport = reg; in btmrvl_sdio_register_dev()
899 reg = sdio_readb(func, card->reg->io_port_1, &ret); in btmrvl_sdio_register_dev()
905 card->ioport |= (reg << 8); in btmrvl_sdio_register_dev()
907 reg = sdio_readb(func, card->reg->io_port_2, &ret); in btmrvl_sdio_register_dev()
913 card->ioport |= (reg << 16); in btmrvl_sdio_register_dev()
915 BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport); in btmrvl_sdio_register_dev()
917 if (card->reg->int_read_to_clear) { in btmrvl_sdio_register_dev()
918 reg = sdio_readb(func, card->reg->host_int_rsr, &ret); in btmrvl_sdio_register_dev()
923 sdio_writeb(func, reg | 0x3f, card->reg->host_int_rsr, &ret); in btmrvl_sdio_register_dev()
929 reg = sdio_readb(func, card->reg->card_misc_cfg, &ret); in btmrvl_sdio_register_dev()
934 sdio_writeb(func, reg | 0x10, card->reg->card_misc_cfg, &ret); in btmrvl_sdio_register_dev()
941 sdio_set_drvdata(func, card); in btmrvl_sdio_register_dev()
960 static int btmrvl_sdio_unregister_dev(struct btmrvl_sdio_card *card) in btmrvl_sdio_unregister_dev() argument
962 if (card && card->func) { in btmrvl_sdio_unregister_dev()
963 sdio_claim_host(card->func); in btmrvl_sdio_unregister_dev()
964 sdio_release_irq(card->func); in btmrvl_sdio_unregister_dev()
965 sdio_disable_func(card->func); in btmrvl_sdio_unregister_dev()
966 sdio_release_host(card->func); in btmrvl_sdio_unregister_dev()
967 sdio_set_drvdata(card->func, NULL); in btmrvl_sdio_unregister_dev()
973 static int btmrvl_sdio_enable_host_int(struct btmrvl_sdio_card *card) in btmrvl_sdio_enable_host_int() argument
977 if (!card || !card->func) in btmrvl_sdio_enable_host_int()
980 sdio_claim_host(card->func); in btmrvl_sdio_enable_host_int()
982 ret = btmrvl_sdio_enable_host_int_mask(card, HIM_ENABLE); in btmrvl_sdio_enable_host_int()
984 btmrvl_sdio_get_rx_unit(card); in btmrvl_sdio_enable_host_int()
986 sdio_release_host(card->func); in btmrvl_sdio_enable_host_int()
991 static int btmrvl_sdio_disable_host_int(struct btmrvl_sdio_card *card) in btmrvl_sdio_disable_host_int() argument
995 if (!card || !card->func) in btmrvl_sdio_disable_host_int()
998 sdio_claim_host(card->func); in btmrvl_sdio_disable_host_int()
1000 ret = btmrvl_sdio_disable_host_int_mask(card, HIM_DISABLE); in btmrvl_sdio_disable_host_int()
1002 sdio_release_host(card->func); in btmrvl_sdio_disable_host_int()
1010 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_host_to_card() local
1019 if (!card || !card->func) { in btmrvl_sdio_host_to_card()
1037 sdio_claim_host(card->func); in btmrvl_sdio_host_to_card()
1041 ret = sdio_writesb(card->func, card->ioport, buf, in btmrvl_sdio_host_to_card()
1056 sdio_release_host(card->func); in btmrvl_sdio_host_to_card()
1062 static int btmrvl_sdio_download_fw(struct btmrvl_sdio_card *card) in btmrvl_sdio_download_fw() argument
1068 if (!card || !card->func) { in btmrvl_sdio_download_fw()
1073 if (!btmrvl_sdio_verify_fw_download(card, 1)) { in btmrvl_sdio_download_fw()
1078 sdio_claim_host(card->func); in btmrvl_sdio_download_fw()
1081 fws0 = sdio_readb(card->func, card->reg->card_fw_status0, &ret); in btmrvl_sdio_download_fw()
1093 if (card->helper) { in btmrvl_sdio_download_fw()
1094 ret = btmrvl_sdio_download_helper(card); in btmrvl_sdio_download_fw()
1102 if (btmrvl_sdio_download_fw_w_helper(card)) { in btmrvl_sdio_download_fw()
1113 if (btmrvl_sdio_verify_fw_download(card, pollnum)) { in btmrvl_sdio_download_fw()
1118 sdio_release_host(card->func); in btmrvl_sdio_download_fw()
1123 sdio_release_host(card->func); in btmrvl_sdio_download_fw()
1129 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_wakeup_fw() local
1132 if (!card || !card->func) { in btmrvl_sdio_wakeup_fw()
1137 sdio_claim_host(card->func); in btmrvl_sdio_wakeup_fw()
1139 sdio_writeb(card->func, HOST_POWER_UP, card->reg->cfg, &ret); in btmrvl_sdio_wakeup_fw()
1141 sdio_release_host(card->func); in btmrvl_sdio_wakeup_fw()
1150 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_dump_regs() local
1158 sdio_claim_host(card->func); in btmrvl_sdio_dump_regs()
1179 data = sdio_f0_readb(card->func, reg, &ret); in btmrvl_sdio_dump_regs()
1181 data = sdio_readb(card->func, reg, &ret); in btmrvl_sdio_dump_regs()
1194 sdio_release_host(card->func); in btmrvl_sdio_dump_regs()
1202 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_rdwr_firmware() local
1206 sdio_writeb(card->func, FW_DUMP_HOST_READY, card->reg->fw_dump_ctrl, in btmrvl_sdio_rdwr_firmware()
1215 ctrl_data = sdio_readb(card->func, card->reg->fw_dump_ctrl, in btmrvl_sdio_rdwr_firmware()
1229 sdio_writeb(card->func, FW_DUMP_HOST_READY, in btmrvl_sdio_rdwr_firmware()
1230 card->reg->fw_dump_ctrl, &ret); in btmrvl_sdio_rdwr_firmware()
1250 struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; in btmrvl_sdio_dump_firmware() local
1261 if (!card->supports_fw_dump) { in btmrvl_sdio_dump_firmware()
1277 sdio_claim_host(card->func); in btmrvl_sdio_dump_firmware()
1285 reg = card->reg->fw_dump_start; in btmrvl_sdio_dump_firmware()
1287 dump_num = sdio_readb(card->func, reg, &ret); in btmrvl_sdio_dump_firmware()
1303 reg = card->reg->fw_dump_start; in btmrvl_sdio_dump_firmware()
1305 read_reg = sdio_readb(card->func, reg, &ret); in btmrvl_sdio_dump_firmware()
1316 sdio_writeb(card->func, FW_DUMP_READ_DONE, in btmrvl_sdio_dump_firmware()
1317 card->reg->fw_dump_ctrl, &ret); in btmrvl_sdio_dump_firmware()
1351 reg_start = card->reg->fw_dump_start; in btmrvl_sdio_dump_firmware()
1352 reg_end = card->reg->fw_dump_end; in btmrvl_sdio_dump_firmware()
1354 *dbg_ptr = sdio_readb(card->func, reg, &ret); in btmrvl_sdio_dump_firmware()
1379 sdio_release_host(card->func); in btmrvl_sdio_dump_firmware()
1420 dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL); in btmrvl_sdio_dump_firmware()
1429 struct btmrvl_sdio_card *card = NULL; in btmrvl_sdio_probe() local
1434 card = devm_kzalloc(&func->dev, sizeof(*card), GFP_KERNEL); in btmrvl_sdio_probe()
1435 if (!card) in btmrvl_sdio_probe()
1438 card->func = func; in btmrvl_sdio_probe()
1442 card->helper = data->helper; in btmrvl_sdio_probe()
1443 card->firmware = data->firmware; in btmrvl_sdio_probe()
1444 card->reg = data->reg; in btmrvl_sdio_probe()
1445 card->sd_blksz_fw_dl = data->sd_blksz_fw_dl; in btmrvl_sdio_probe()
1446 card->support_pscan_win_report = data->support_pscan_win_report; in btmrvl_sdio_probe()
1447 card->supports_fw_dump = data->supports_fw_dump; in btmrvl_sdio_probe()
1450 if (btmrvl_sdio_register_dev(card) < 0) { in btmrvl_sdio_probe()
1456 btmrvl_sdio_disable_host_int(card); in btmrvl_sdio_probe()
1458 if (btmrvl_sdio_download_fw(card)) { in btmrvl_sdio_probe()
1464 btmrvl_sdio_enable_host_int(card); in btmrvl_sdio_probe()
1466 priv = btmrvl_add_card(card); in btmrvl_sdio_probe()
1473 card->priv = priv; in btmrvl_sdio_probe()
1490 btmrvl_sdio_disable_host_int(card); in btmrvl_sdio_probe()
1492 btmrvl_sdio_unregister_dev(card); in btmrvl_sdio_probe()
1498 struct btmrvl_sdio_card *card; in btmrvl_sdio_remove() local
1501 card = sdio_get_drvdata(func); in btmrvl_sdio_remove()
1502 if (card) { in btmrvl_sdio_remove()
1507 btmrvl_send_module_cfg_cmd(card->priv, in btmrvl_sdio_remove()
1509 btmrvl_sdio_disable_host_int(card); in btmrvl_sdio_remove()
1512 card->priv->surprise_removed = true; in btmrvl_sdio_remove()
1513 btmrvl_sdio_unregister_dev(card); in btmrvl_sdio_remove()
1514 btmrvl_remove_card(card->priv); in btmrvl_sdio_remove()
1522 struct btmrvl_sdio_card *card; in btmrvl_sdio_suspend() local
1536 card = sdio_get_drvdata(func); in btmrvl_sdio_suspend()
1537 if (!card || !card->priv) { in btmrvl_sdio_suspend()
1546 priv = card->priv; in btmrvl_sdio_suspend()
1574 struct btmrvl_sdio_card *card; in btmrvl_sdio_resume() local
1583 card = sdio_get_drvdata(func); in btmrvl_sdio_resume()
1584 if (!card || !card->priv) { in btmrvl_sdio_resume()
1592 priv = card->priv; in btmrvl_sdio_resume()