Lines Matching +full:no +full:- +full:sdio
1 // SPDX-License-Identifier: ISC
5 /* ****************** SDIO CARD Interface Functions **************************/
15 #include <linux/mmc/sdio.h>
36 #include "sdio.h"
65 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; in brcmf_sdiod_oob_irqhandler()
69 /* out-of-band interrupt is level-triggered which won't in brcmf_sdiod_oob_irqhandler()
72 if (sdiodev->irq_en) { in brcmf_sdiod_oob_irqhandler()
74 sdiodev->irq_en = false; in brcmf_sdiod_oob_irqhandler()
77 brcmf_sdio_isr(sdiodev->bus, true); in brcmf_sdiod_oob_irqhandler()
84 struct brcmf_bus *bus_if = dev_get_drvdata(&func->dev); in brcmf_sdiod_ib_irqhandler()
85 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; in brcmf_sdiod_ib_irqhandler()
89 brcmf_sdio_isr(sdiodev->bus, false); in brcmf_sdiod_ib_irqhandler()
92 /* dummy handler for SDIO function 2 interrupt */
104 pdata = &sdiodev->settings->bus.sdio; in brcmf_sdiod_intr_register()
105 if (pdata->oob_irq_supported) { in brcmf_sdiod_intr_register()
106 brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", in brcmf_sdiod_intr_register()
107 pdata->oob_irq_nr); in brcmf_sdiod_intr_register()
108 spin_lock_init(&sdiodev->irq_en_lock); in brcmf_sdiod_intr_register()
109 sdiodev->irq_en = true; in brcmf_sdiod_intr_register()
111 ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler, in brcmf_sdiod_intr_register()
112 pdata->oob_irq_flags, "brcmf_oob_intr", in brcmf_sdiod_intr_register()
113 &sdiodev->func1->dev); in brcmf_sdiod_intr_register()
118 sdiodev->oob_irq_requested = true; in brcmf_sdiod_intr_register()
120 ret = enable_irq_wake(pdata->oob_irq_nr); in brcmf_sdiod_intr_register()
125 disable_irq_wake(pdata->oob_irq_nr); in brcmf_sdiod_intr_register()
127 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_intr_register()
129 if (sdiodev->bus_if->chip == BRCM_CC_43362_CHIP_ID) { in brcmf_sdiod_intr_register()
130 /* assign GPIO to SDIO core */ in brcmf_sdiod_intr_register()
131 addr = brcmf_chip_enum_base(sdiodev->func1->device); in brcmf_sdiod_intr_register()
151 if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) in brcmf_sdiod_intr_register()
155 sdio_release_host(sdiodev->func1); in brcmf_sdiod_intr_register()
157 brcmf_dbg(SDIO, "Entering\n"); in brcmf_sdiod_intr_register()
158 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_intr_register()
159 sdio_claim_irq(sdiodev->func1, brcmf_sdiod_ib_irqhandler); in brcmf_sdiod_intr_register()
160 sdio_claim_irq(sdiodev->func2, brcmf_sdiod_dummy_irqhandler); in brcmf_sdiod_intr_register()
161 sdio_release_host(sdiodev->func1); in brcmf_sdiod_intr_register()
162 sdiodev->sd_irq_requested = true; in brcmf_sdiod_intr_register()
171 brcmf_dbg(SDIO, "Entering oob=%d sd=%d\n", in brcmf_sdiod_intr_unregister()
172 sdiodev->oob_irq_requested, in brcmf_sdiod_intr_unregister()
173 sdiodev->sd_irq_requested); in brcmf_sdiod_intr_unregister()
175 if (sdiodev->oob_irq_requested) { in brcmf_sdiod_intr_unregister()
178 pdata = &sdiodev->settings->bus.sdio; in brcmf_sdiod_intr_unregister()
179 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_intr_unregister()
182 sdio_release_host(sdiodev->func1); in brcmf_sdiod_intr_unregister()
184 sdiodev->oob_irq_requested = false; in brcmf_sdiod_intr_unregister()
185 free_irq(pdata->oob_irq_nr, &sdiodev->func1->dev); in brcmf_sdiod_intr_unregister()
186 sdiodev->irq_en = false; in brcmf_sdiod_intr_unregister()
187 sdiodev->oob_irq_requested = false; in brcmf_sdiod_intr_unregister()
190 if (sdiodev->sd_irq_requested) { in brcmf_sdiod_intr_unregister()
191 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_intr_unregister()
192 sdio_release_irq(sdiodev->func2); in brcmf_sdiod_intr_unregister()
193 sdio_release_irq(sdiodev->func1); in brcmf_sdiod_intr_unregister()
194 sdio_release_host(sdiodev->func1); in brcmf_sdiod_intr_unregister()
195 sdiodev->sd_irq_requested = false; in brcmf_sdiod_intr_unregister()
202 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM || in brcmf_sdiod_change_state()
203 state == sdiodev->state) in brcmf_sdiod_change_state()
206 brcmf_dbg(TRACE, "%d -> %d\n", sdiodev->state, state); in brcmf_sdiod_change_state()
207 switch (sdiodev->state) { in brcmf_sdiod_change_state()
210 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN); in brcmf_sdiod_change_state()
215 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_UP); in brcmf_sdiod_change_state()
220 sdiodev->state = state; in brcmf_sdiod_change_state()
229 if (bar0 == sdiodev->sbwad) in brcmf_sdiod_set_backplane_window()
239 sdiodev->sbwad = bar0; in brcmf_sdiod_set_backplane_window()
256 data = sdio_readl(sdiodev->func1, addr, &retval); in brcmf_sdiod_readl()
277 sdio_writel(sdiodev->func1, data, addr, &retval); in brcmf_sdiod_writel()
292 req_sz = skb->len + 3; in brcmf_sdiod_skbuff_read()
295 switch (func->num) { in brcmf_sdiod_skbuff_read()
297 err = sdio_memcpy_fromio(func, ((u8 *)(skb->data)), addr, in brcmf_sdiod_skbuff_read()
301 err = sdio_readsb(func, ((u8 *)(skb->data)), addr, req_sz); in brcmf_sdiod_skbuff_read()
305 WARN(1, "invalid sdio function number: %d\n", func->num); in brcmf_sdiod_skbuff_read()
306 err = -ENOMEDIUM; in brcmf_sdiod_skbuff_read()
309 if (err == -ENOMEDIUM) in brcmf_sdiod_skbuff_read()
323 req_sz = skb->len + 3; in brcmf_sdiod_skbuff_write()
326 err = sdio_memcpy_toio(func, addr, ((u8 *)(skb->data)), req_sz); in brcmf_sdiod_skbuff_write()
328 if (err == -ENOMEDIUM) in brcmf_sdiod_skbuff_write()
342 md->sg_len = sg_cnt; in mmc_submit_one()
343 md->blocks = req_sz / func_blk_sz; in mmc_submit_one()
344 mc->arg |= (*addr & 0x1FFFF) << 9; /* address */ in mmc_submit_one()
345 mc->arg |= md->blocks & 0x1FF; /* block count */ in mmc_submit_one()
347 if (func->num == 1) in mmc_submit_one()
350 mmc_set_data_timeout(md, func->card); in mmc_submit_one()
351 mmc_wait_for_req(func->card->host, mr); in mmc_submit_one()
353 ret = mc->error ? mc->error : md->error; in mmc_submit_one()
354 if (ret == -ENOMEDIUM) { in mmc_submit_one()
359 ret = -EIO; in mmc_submit_one()
366 * brcmf_sdiod_sglist_rw - SDIO interface function for block data access
367 * @sdiodev: brcmfmac sdio device
368 * @func: SDIO function
394 if (!pktlist->qlen) in brcmf_sdiod_sglist_rw()
395 return -EINVAL; in brcmf_sdiod_sglist_rw()
400 if (!write && sdiodev->settings->bus.sdio.broken_sg_support) { in brcmf_sdiod_sglist_rw()
403 req_sz += pkt_next->len; in brcmf_sdiod_sglist_rw()
404 req_sz = ALIGN(req_sz, func->cur_blksize); in brcmf_sdiod_sglist_rw()
408 ret = -ENOMEM; in brcmf_sdiod_sglist_rw()
412 req_sz -= PAGE_SIZE; in brcmf_sdiod_sglist_rw()
416 ret = -ENOMEM; in brcmf_sdiod_sglist_rw()
423 func_blk_sz = func->cur_blksize; in brcmf_sdiod_sglist_rw()
424 max_req_sz = sdiodev->max_request_size; in brcmf_sdiod_sglist_rw()
425 max_seg_cnt = min_t(unsigned short, sdiodev->max_segment_count, in brcmf_sdiod_sglist_rw()
426 target_list->qlen); in brcmf_sdiod_sglist_rw()
432 mmc_dat.sg = sdiodev->sgtable.sgl; in brcmf_sdiod_sglist_rw()
437 mmc_cmd.arg |= (func->num & 0x7) << 28; /* SDIO func num */ in brcmf_sdiod_sglist_rw()
440 mmc_cmd.arg |= (func->num == 1) ? 1 << 26 : 0; in brcmf_sdiod_sglist_rw()
447 sgl = sdiodev->sgtable.sgl; in brcmf_sdiod_sglist_rw()
450 while (pkt_offset < pkt_next->len) { in brcmf_sdiod_sglist_rw()
451 pkt_data = pkt_next->data + pkt_offset; in brcmf_sdiod_sglist_rw()
452 sg_data_sz = pkt_next->len - pkt_offset; in brcmf_sdiod_sglist_rw()
453 if (sg_data_sz > sdiodev->max_segment_size) in brcmf_sdiod_sglist_rw()
454 sg_data_sz = sdiodev->max_segment_size; in brcmf_sdiod_sglist_rw()
455 if (sg_data_sz > max_req_sz - req_sz) in brcmf_sdiod_sglist_rw()
456 sg_data_sz = max_req_sz - req_sz; in brcmf_sdiod_sglist_rw()
472 sgl = sdiodev->sgtable.sgl; in brcmf_sdiod_sglist_rw()
481 if (!write && sdiodev->settings->bus.sdio.broken_sg_support) { in brcmf_sdiod_sglist_rw()
491 req_sz = pkt_next->len - dst_offset; in brcmf_sdiod_sglist_rw()
492 if (req_sz > src->len - src_offset) in brcmf_sdiod_sglist_rw()
493 req_sz = src->len - src_offset; in brcmf_sdiod_sglist_rw()
495 orig_data = src->data + src_offset; in brcmf_sdiod_sglist_rw()
496 dst_data = pkt_next->data + dst_offset; in brcmf_sdiod_sglist_rw()
500 if (src_offset == src->len) { in brcmf_sdiod_sglist_rw()
505 if (dst_offset == pkt_next->len) in brcmf_sdiod_sglist_rw()
512 sg_init_table(sdiodev->sgtable.sgl, sdiodev->sgtable.orig_nents); in brcmf_sdiod_sglist_rw()
528 return -EIO; in brcmf_sdiod_recv_buf()
533 memcpy(buf, mypkt->data, nbytes); in brcmf_sdiod_recv_buf()
541 u32 addr = sdiodev->cc_core->base; in brcmf_sdiod_recv_pkt()
544 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); in brcmf_sdiod_recv_pkt()
553 err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr, pkt); in brcmf_sdiod_recv_pkt()
564 u32 addr = sdiodev->cc_core->base; in brcmf_sdiod_recv_chain()
567 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", in brcmf_sdiod_recv_chain()
568 addr, pktq->qlen); in brcmf_sdiod_recv_chain()
577 if (pktq->qlen == 1) in brcmf_sdiod_recv_chain()
578 err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr, in brcmf_sdiod_recv_chain()
580 else if (!sdiodev->sg_support) { in brcmf_sdiod_recv_chain()
583 return -ENOMEM; in brcmf_sdiod_recv_chain()
584 err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr, in brcmf_sdiod_recv_chain()
590 memcpy(skb->data, glom_skb->data, skb->len); in brcmf_sdiod_recv_chain()
591 skb_pull(glom_skb, skb->len); in brcmf_sdiod_recv_chain()
594 err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func2, false, in brcmf_sdiod_recv_chain()
605 u32 addr = sdiodev->cc_core->base; in brcmf_sdiod_send_buf()
613 return -EIO; in brcmf_sdiod_send_buf()
616 memcpy(mypkt->data, buf, nbytes); in brcmf_sdiod_send_buf()
625 err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr, mypkt); in brcmf_sdiod_send_buf()
636 u32 addr = sdiodev->cc_core->base; in brcmf_sdiod_send_pkt()
639 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); in brcmf_sdiod_send_pkt()
648 if (pktq->qlen == 1 || !sdiodev->sg_support) { in brcmf_sdiod_send_pkt()
650 err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, in brcmf_sdiod_send_pkt()
656 err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func2, true, in brcmf_sdiod_send_pkt()
676 return -EIO; in brcmf_sdiod_ramrw()
678 pkt->priority = 0; in brcmf_sdiod_ramrw()
683 dsize = (SBSDIO_SB_OFT_ADDR_LIMIT - sdaddr); in brcmf_sdiod_ramrw()
687 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_ramrw()
696 brcmf_dbg(SDIO, "%s %d bytes at offset 0x%08x in window 0x%08x\n", in brcmf_sdiod_ramrw()
706 memcpy(pkt->data, data, dsize); in brcmf_sdiod_ramrw()
707 err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func1, in brcmf_sdiod_ramrw()
710 err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func1, in brcmf_sdiod_ramrw()
719 memcpy(data, pkt->data, dsize); in brcmf_sdiod_ramrw()
723 size -= dsize; in brcmf_sdiod_ramrw()
734 sdio_release_host(sdiodev->func1); in brcmf_sdiod_ramrw()
741 brcmf_dbg(SDIO, "Enter\n"); in brcmf_sdiod_abort()
744 brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, func->num, NULL); in brcmf_sdiod_abort()
746 brcmf_dbg(SDIO, "Exit\n"); in brcmf_sdiod_abort()
758 func = sdiodev->func2; in brcmf_sdiod_sgtable_alloc()
759 host = func->card->host; in brcmf_sdiod_sgtable_alloc()
760 sdiodev->sg_support = host->max_segs > 1; in brcmf_sdiod_sgtable_alloc()
761 max_blocks = min_t(uint, host->max_blk_count, 511u); in brcmf_sdiod_sgtable_alloc()
762 sdiodev->max_request_size = min_t(uint, host->max_req_size, in brcmf_sdiod_sgtable_alloc()
763 max_blocks * func->cur_blksize); in brcmf_sdiod_sgtable_alloc()
764 sdiodev->max_segment_count = min_t(uint, host->max_segs, in brcmf_sdiod_sgtable_alloc()
766 sdiodev->max_segment_size = host->max_seg_size; in brcmf_sdiod_sgtable_alloc()
768 if (!sdiodev->sg_support) in brcmf_sdiod_sgtable_alloc()
772 sdiodev->settings->bus.sdio.txglomsz); in brcmf_sdiod_sgtable_alloc()
775 WARN_ON(nents > sdiodev->max_segment_count); in brcmf_sdiod_sgtable_alloc()
778 err = sg_alloc_table(&sdiodev->sgtable, nents, GFP_KERNEL); in brcmf_sdiod_sgtable_alloc()
780 brcmf_err("allocation failed: disable scatter-gather"); in brcmf_sdiod_sgtable_alloc()
781 sdiodev->sg_support = false; in brcmf_sdiod_sgtable_alloc()
784 sdiodev->txglomsz = sdiodev->settings->bus.sdio.txglomsz; in brcmf_sdiod_sgtable_alloc()
792 sdiodev->freezer = kzalloc(sizeof(*sdiodev->freezer), GFP_KERNEL); in brcmf_sdiod_freezer_attach()
793 if (!sdiodev->freezer) in brcmf_sdiod_freezer_attach()
794 return -ENOMEM; in brcmf_sdiod_freezer_attach()
795 atomic_set(&sdiodev->freezer->thread_count, 0); in brcmf_sdiod_freezer_attach()
796 atomic_set(&sdiodev->freezer->freezing, 0); in brcmf_sdiod_freezer_attach()
797 init_waitqueue_head(&sdiodev->freezer->thread_freeze); in brcmf_sdiod_freezer_attach()
798 init_completion(&sdiodev->freezer->resumed); in brcmf_sdiod_freezer_attach()
804 if (sdiodev->freezer) { in brcmf_sdiod_freezer_detach()
805 WARN_ON(atomic_read(&sdiodev->freezer->freezing)); in brcmf_sdiod_freezer_detach()
806 kfree(sdiodev->freezer); in brcmf_sdiod_freezer_detach()
807 sdiodev->freezer = NULL; in brcmf_sdiod_freezer_detach()
813 atomic_t *expect = &sdiodev->freezer->thread_count; in brcmf_sdiod_freezer_on()
816 sdiodev->freezer->frozen_count = 0; in brcmf_sdiod_freezer_on()
817 reinit_completion(&sdiodev->freezer->resumed); in brcmf_sdiod_freezer_on()
818 atomic_set(&sdiodev->freezer->freezing, 1); in brcmf_sdiod_freezer_on()
819 brcmf_sdio_trigger_dpc(sdiodev->bus); in brcmf_sdiod_freezer_on()
820 wait_event(sdiodev->freezer->thread_freeze, in brcmf_sdiod_freezer_on()
821 atomic_read(expect) == sdiodev->freezer->frozen_count); in brcmf_sdiod_freezer_on()
822 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_freezer_on()
823 res = brcmf_sdio_sleep(sdiodev->bus, true); in brcmf_sdiod_freezer_on()
824 sdio_release_host(sdiodev->func1); in brcmf_sdiod_freezer_on()
830 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_freezer_off()
831 brcmf_sdio_sleep(sdiodev->bus, false); in brcmf_sdiod_freezer_off()
832 sdio_release_host(sdiodev->func1); in brcmf_sdiod_freezer_off()
833 atomic_set(&sdiodev->freezer->freezing, 0); in brcmf_sdiod_freezer_off()
834 complete_all(&sdiodev->freezer->resumed); in brcmf_sdiod_freezer_off()
840 atomic_read(&sdiodev->freezer->freezing); in brcmf_sdiod_freezing()
847 sdiodev->freezer->frozen_count++; in brcmf_sdiod_try_freeze()
848 wake_up(&sdiodev->freezer->thread_freeze); in brcmf_sdiod_try_freeze()
849 wait_for_completion(&sdiodev->freezer->resumed); in brcmf_sdiod_try_freeze()
855 atomic_inc(&sdiodev->freezer->thread_count); in brcmf_sdiod_freezer_count()
861 atomic_dec(&sdiodev->freezer->thread_count); in brcmf_sdiod_freezer_uncount()
866 sdiodev->state = BRCMF_SDIOD_DOWN; in brcmf_sdiod_remove()
867 if (sdiodev->bus) { in brcmf_sdiod_remove()
868 brcmf_sdio_remove(sdiodev->bus); in brcmf_sdiod_remove()
869 sdiodev->bus = NULL; in brcmf_sdiod_remove()
875 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_remove()
876 sdio_disable_func(sdiodev->func2); in brcmf_sdiod_remove()
877 sdio_disable_func(sdiodev->func1); in brcmf_sdiod_remove()
878 sdio_release_host(sdiodev->func1); in brcmf_sdiod_remove()
880 sg_free_table(&sdiodev->sgtable); in brcmf_sdiod_remove()
881 sdiodev->sbwad = 0; in brcmf_sdiod_remove()
883 pm_runtime_allow(sdiodev->func1->card->host->parent); in brcmf_sdiod_remove()
889 /* runtime-pm powers off the device */ in brcmf_sdiod_host_fixup()
890 pm_runtime_forbid(host->parent); in brcmf_sdiod_host_fixup()
892 host->caps |= MMC_CAP_NONREMOVABLE; in brcmf_sdiod_host_fixup()
900 sdio_claim_host(sdiodev->func1); in brcmf_sdiod_probe()
902 ret = sdio_set_block_size(sdiodev->func1, SDIO_FUNC1_BLOCKSIZE); in brcmf_sdiod_probe()
905 sdio_release_host(sdiodev->func1); in brcmf_sdiod_probe()
908 switch (sdiodev->func2->device) { in brcmf_sdiod_probe()
924 ret = sdio_set_block_size(sdiodev->func2, f2_blksz); in brcmf_sdiod_probe()
927 sdio_release_host(sdiodev->func1); in brcmf_sdiod_probe()
930 brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz); in brcmf_sdiod_probe()
934 sdiodev->func2->enable_timeout = SDIO_WAIT_F2RDY; in brcmf_sdiod_probe()
937 ret = sdio_enable_func(sdiodev->func1); in brcmf_sdiod_probe()
938 sdio_release_host(sdiodev->func1); in brcmf_sdiod_probe()
949 sdiodev->bus = brcmf_sdio_probe(sdiodev); in brcmf_sdiod_probe()
950 if (!sdiodev->bus) { in brcmf_sdiod_probe()
951 ret = -ENODEV; in brcmf_sdiod_probe()
954 brcmf_sdiod_host_fixup(sdiodev->func2->card->host); in brcmf_sdiod_probe()
1001 MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
1009 adev = ACPI_COMPANION(&sdiodev->func1->dev); in brcmf_sdiod_acpi_save_power_manageable()
1011 sdiodev->func1_power_manageable = adev->flags.power_manageable; in brcmf_sdiod_acpi_save_power_manageable()
1013 adev = ACPI_COMPANION(&sdiodev->func2->dev); in brcmf_sdiod_acpi_save_power_manageable()
1015 sdiodev->func2_power_manageable = adev->flags.power_manageable; in brcmf_sdiod_acpi_save_power_manageable()
1025 adev = ACPI_COMPANION(&sdiodev->func1->dev); in brcmf_sdiod_acpi_set_power_manageable()
1027 adev->flags.power_manageable = enable ? sdiodev->func1_power_manageable : 0; in brcmf_sdiod_acpi_set_power_manageable()
1029 adev = ACPI_COMPANION(&sdiodev->func2->dev); in brcmf_sdiod_acpi_set_power_manageable()
1031 adev->flags.power_manageable = enable ? sdiodev->func2_power_manageable : 0; in brcmf_sdiod_acpi_set_power_manageable()
1043 dev_err(&func->dev, "Error no sdio_device_id passed for %x:%x\n", func->vendor, func->device); in brcmf_ops_sdio_probe()
1044 return -ENODEV; in brcmf_ops_sdio_probe()
1047 brcmf_dbg(SDIO, "Enter\n"); in brcmf_ops_sdio_probe()
1048 brcmf_dbg(SDIO, "Class=%x\n", func->class); in brcmf_ops_sdio_probe()
1049 brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor); in brcmf_ops_sdio_probe()
1050 brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); in brcmf_ops_sdio_probe()
1051 brcmf_dbg(SDIO, "Function#: %d\n", func->num); in brcmf_ops_sdio_probe()
1054 func->card->quirks |= MMC_QUIRK_LENIENT_FN0; in brcmf_ops_sdio_probe()
1057 if (func->num == 1) in brcmf_ops_sdio_probe()
1061 if (func->num != 2) in brcmf_ops_sdio_probe()
1062 return -ENODEV; in brcmf_ops_sdio_probe()
1066 return -ENOMEM; in brcmf_ops_sdio_probe()
1070 return -ENOMEM; in brcmf_ops_sdio_probe()
1076 sdiodev->func1 = func->card->sdio_func[0]; in brcmf_ops_sdio_probe()
1077 sdiodev->func2 = func; in brcmf_ops_sdio_probe()
1079 sdiodev->bus_if = bus_if; in brcmf_ops_sdio_probe()
1080 bus_if->bus_priv.sdio = sdiodev; in brcmf_ops_sdio_probe()
1081 bus_if->proto_type = BRCMF_PROTO_BCDC; in brcmf_ops_sdio_probe()
1082 bus_if->fwvid = id->driver_data; in brcmf_ops_sdio_probe()
1083 dev_set_drvdata(&func->dev, bus_if); in brcmf_ops_sdio_probe()
1084 dev_set_drvdata(&sdiodev->func1->dev, bus_if); in brcmf_ops_sdio_probe()
1085 sdiodev->dev = &sdiodev->func1->dev; in brcmf_ops_sdio_probe()
1090 brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n"); in brcmf_ops_sdio_probe()
1097 brcmf_dbg(SDIO, "F2 init completed...\n"); in brcmf_ops_sdio_probe()
1101 dev_set_drvdata(&func->dev, NULL); in brcmf_ops_sdio_probe()
1102 dev_set_drvdata(&sdiodev->func1->dev, NULL); in brcmf_ops_sdio_probe()
1113 brcmf_dbg(SDIO, "Enter\n"); in brcmf_ops_sdio_remove()
1114 brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor); in brcmf_ops_sdio_remove()
1115 brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); in brcmf_ops_sdio_remove()
1116 brcmf_dbg(SDIO, "Function: %d\n", func->num); in brcmf_ops_sdio_remove()
1118 bus_if = dev_get_drvdata(&func->dev); in brcmf_ops_sdio_remove()
1120 sdiodev = bus_if->bus_priv.sdio; in brcmf_ops_sdio_remove()
1125 if (func->num != 1) in brcmf_ops_sdio_remove()
1131 dev_set_drvdata(&sdiodev->func1->dev, NULL); in brcmf_ops_sdio_remove()
1132 dev_set_drvdata(&sdiodev->func2->dev, NULL); in brcmf_ops_sdio_remove()
1138 brcmf_dbg(SDIO, "Exit\n"); in brcmf_ops_sdio_remove()
1144 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; in brcmf_sdio_wowl_config()
1145 mmc_pm_flag_t pm_caps = sdio_get_host_pm_caps(sdiodev->func1); in brcmf_sdio_wowl_config()
1151 if (sdiodev->settings->bus.sdio.oob_irq_supported || in brcmf_sdio_wowl_config()
1155 sdiodev->wowl_enabled = enabled; in brcmf_sdio_wowl_config()
1156 brcmf_dbg(SDIO, "Configuring WOWL, enabled=%d\n", enabled); in brcmf_sdio_wowl_config()
1161 brcmf_dbg(SDIO, "WOWL not supported\n"); in brcmf_sdio_wowl_config()
1173 brcmf_dbg(SDIO, "Enter: F%d\n", func->num); in brcmf_ops_sdio_suspend()
1174 if (func->num != 1) in brcmf_ops_sdio_suspend()
1179 sdiodev = bus_if->bus_priv.sdio; in brcmf_ops_sdio_suspend()
1181 if (sdiodev->wowl_enabled) { in brcmf_ops_sdio_suspend()
1183 brcmf_sdio_wd_timer(sdiodev->bus, 0); in brcmf_ops_sdio_suspend()
1186 if (sdiodev->settings->bus.sdio.oob_irq_supported) in brcmf_ops_sdio_suspend()
1187 enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr); in brcmf_ops_sdio_suspend()
1191 if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags)) in brcmf_ops_sdio_suspend()
1208 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; in brcmf_ops_sdio_resume()
1212 brcmf_dbg(SDIO, "Enter: F%d\n", func->num); in brcmf_ops_sdio_resume()
1213 if (func->num != 2) in brcmf_ops_sdio_resume()
1216 if (!sdiodev->wowl_enabled) { in brcmf_ops_sdio_resume()
1222 if (sdiodev->settings->bus.sdio.oob_irq_supported) in brcmf_ops_sdio_resume()
1223 disable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr); in brcmf_ops_sdio_resume()
1254 brcmf_dbg(SDIO, "Enter\n"); in brcmf_sdio_exit()