Lines Matching +full:bus +full:- +full:addr
1 /*-
2 * Copyright (c) 2016-2017 Ilya Bakulin
79 …() which is defined as probe function in struct sdio_driver. http://lxr.free-electrons.com/source/…
83 …* ops_sdio_probe() then calls brcmf_sdio_probe() -- at this point it has filled in sdiodev struct …
89 …* Finally it calls brcmf_sdio_probe() http://lxr.free-electrons.com/source/drivers/net/wireless/br…
91 * Here high-level workqueues and sg tables are allocated.
94 …* Here at the beginning there is a pr_debug() call with brcmf_sdiod_regrl() inside to addr #define…
96 * Then turns off PLL: byte-write BRCMF_INIT_CLKCTL1 (0x28) -> SBSDIO_FUNC1_CHIPCLKCSR (0x1000E)
100 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L10…
102 * - brcmf_sdio_buscoreprep(): force clock to ALPAvail req only:
103 * SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ -> SBSDIO_FUNC1_CHIPCLKCSR
106 * SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP (0x21)-> SBSDIO_FUNC1_CHIPCLKCSR
108 * byte 0 -> SBSDIO_FUNC1_SDIOPULLUP (0x0001000f)
111 * http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L908
120 * http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L700
124 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L10…
125 * Bus-specific setup code is NOP for SDIO.
131 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c#L36…
137 …**** Finished reading at http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80…
140 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c#L…
141 * The address to read from is written to three byte-sized registers of F1:
142 * - SBSDIO_FUNC1_SBADDRLOW 0x1000A
143 * - SBSDIO_FUNC1_SBADDRMID 0x1000B
144 * - SBSDIO_FUNC1_SBADDRHIGH 0x1000C
145 …* If this is 32-bit read , a flag is set. The address is ANDed with SBSDIO_SB_OFT_ADDR_MASK which …
147 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c#L…
150 * 1-byte IO is done with CMD52, more is read with CMD53 with address increment (not FIFO mode).
151 * http://lxr.free-electrons.com/source/drivers/mmc/core/sdio_io.c#L458
157 /* BRCM-specific functions */
172 void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
175 static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn, u32 addr,
178 static int brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr);
179 u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
191 brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state) in brcmf_bus_change_state() argument
193 bus->state = state; in brcmf_bus_change_state()
199 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM || in brcmf_sdiod_change_state()
200 state == sdiodev->state) in brcmf_sdiod_change_state()
203 //brcmf_dbg(TRACE, "%d -> %d\n", sdiodev->state, state); in brcmf_sdiod_change_state()
204 switch (sdiodev->state) { in brcmf_sdiod_change_state()
206 /* any other state means bus interface is down */ in brcmf_sdiod_change_state()
207 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN); in brcmf_sdiod_change_state()
210 /* transition from DOWN to DATA means bus interface is up */ in brcmf_sdiod_change_state()
212 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_UP); in brcmf_sdiod_change_state()
217 sdiodev->state = state; in brcmf_sdiod_change_state()
238 static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn, u32 addr, u8 regsz, void… in brcmf_sdiod_request_data() argument
241 int ret = -EINVAL; in brcmf_sdiod_request_data()
243 brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", in brcmf_sdiod_request_data()
244 write, fn, addr, regsz); in brcmf_sdiod_request_data()
248 return -EINVAL; in brcmf_sdiod_request_data()
249 func = sdiodev->func[fn]; in brcmf_sdiod_request_data()
255 sdio_writeb(func, *(u8 *)data, addr, &ret); in brcmf_sdiod_request_data()
257 ret = brcmf_sdiod_f0_writeb(func, addr, in brcmf_sdiod_request_data()
261 *(u8 *)data = sdio_readb(func, addr, &ret); in brcmf_sdiod_request_data()
263 *(u8 *)data = sdio_f0_readb(func, addr, &ret); in brcmf_sdiod_request_data()
268 sdio_writew(func, *(u16 *)data, addr, &ret); in brcmf_sdiod_request_data()
270 *(u16 *)data = sdio_readw(func, addr, &ret); in brcmf_sdiod_request_data()
274 sdio_writel(func, *(u32 *)data, addr, &ret); in brcmf_sdiod_request_data()
276 *(u32 *)data = sdio_readl(func, addr, &ret); in brcmf_sdiod_request_data()
285 write ? "write" : "read", fn, addr, ret); in brcmf_sdiod_request_data()
291 brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr) in brcmf_sdiod_addrprep() argument
293 uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK; in brcmf_sdiod_addrprep()
296 if (bar0 != sdiodev->sbwad) { in brcmf_sdiod_addrprep()
301 sdiodev->sbwad = bar0; in brcmf_sdiod_addrprep()
304 *addr &= SBSDIO_SB_OFT_ADDR_MASK; in brcmf_sdiod_addrprep()
307 *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; in brcmf_sdiod_addrprep()
312 static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, u8 regsz, void *data,… in brcmf_sdiod_regrw_helper() argument
317 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) in brcmf_sdiod_regrw_helper()
318 return -ENOMEDIUM; in brcmf_sdiod_regrw_helper()
326 if ((addr & ~REG_F0_REG_MASK) == 0) in brcmf_sdiod_regrw_helper()
334 /* for retry wait for 1 ms till bus get settled down */ in brcmf_sdiod_regrw_helper()
337 ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz, in brcmf_sdiod_regrw_helper()
339 } while (ret != 0 && ret != -ENOMEDIUM && in brcmf_sdiod_regrw_helper()
342 if (ret == -ENOMEDIUM) in brcmf_sdiod_regrw_helper()
350 if (addr != SBSDIO_FUNC1_SLEEPCSR) in brcmf_sdiod_regrw_helper()
352 write ? "write" : "read", func, addr, ret); in brcmf_sdiod_regrw_helper()
355 write ? "write" : "read", func, addr, ret); in brcmf_sdiod_regrw_helper()
364 u8 addr[3]; in brcmf_sdiod_set_sbaddr_window() local
366 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) in brcmf_sdiod_set_sbaddr_window()
367 return -ENOMEDIUM; in brcmf_sdiod_set_sbaddr_window()
369 addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK; in brcmf_sdiod_set_sbaddr_window()
370 addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK; in brcmf_sdiod_set_sbaddr_window()
371 addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK; in brcmf_sdiod_set_sbaddr_window()
376 sizeof(u8), &addr[i], true); in brcmf_sdiod_set_sbaddr_window()
378 brcmf_err("failed at addr: 0x%0x\n", in brcmf_sdiod_set_sbaddr_window()
387 u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) in brcmf_sdiod_regrl() argument
392 brcmf_dbg(SDIO, "addr:0x%08x\n", addr); in brcmf_sdiod_regrl()
393 retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr); in brcmf_sdiod_regrl()
396 retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data, in brcmf_sdiod_regrl()
425 const char fw_path[] = "/home/kibab/repos/fbsd-bbb/brcm-firmware/brcmfmac4330-sdio.bin"; in mmap_fw()
443 printf("sdiotool -u <pass_dev_unit>\n"); in usage()
466 sdio_func_read_cis(dev, 0, cis_addr, &ci->f[0]); in get_sdio_card_info()
468 ci->f[0].man_id, ci->f[0].prod_id, ci->f[0].max_block_size); in get_sdio_card_info()
474 sdio_func_read_cis(dev, i, cis_addr, &ci->f[i]); in get_sdio_card_info()
476 i, ci->f[i].man_id, ci->f[i].prod_id, ci->f[i].max_block_size); in get_sdio_card_info()
477 if (ci->f[i].man_id == 0) { in get_sdio_card_info()
481 ci->num_funcs++; in get_sdio_card_info()
498 while ((ch = getopt(argc, argv, "fu:")) != -1) { in main()
511 argc -= optind; in main()
519 /* For now, everything non-broadcom is out of the question */ in main()
538 brcmf_dev.func[0]->dev = brcmf_dev.func[1]->dev in main()
539 = brcmf_dev.func[2]->dev = cam_dev; in main()
540 brcmf_dev.func[0]->num = 0; in main()
541 brcmf_dev.func[1]->num = 1; in main()
542 brcmf_dev.func[2]->num = 2; in main()