.. | .. |
---|
1 | | -/* SPDX-License-Identifier: GPL-2.0 */ |
---|
2 | 1 | /* |
---|
3 | 2 | * BCMSDH interface glue |
---|
4 | 3 | * implement bcmsdh API for SDIOH driver |
---|
5 | 4 | * |
---|
6 | | - * Copyright (C) 1999-2019, Broadcom Corporation |
---|
7 | | - * |
---|
| 5 | + * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation |
---|
| 6 | + * |
---|
| 7 | + * Copyright (C) 1999-2017, Broadcom Corporation |
---|
| 8 | + * |
---|
8 | 9 | * Unless you and Broadcom execute a separate written software license |
---|
9 | 10 | * agreement governing use of this software, this software is licensed to you |
---|
10 | 11 | * under the terms of the GNU General Public License version 2 (the "GPL"), |
---|
11 | 12 | * available at http://www.broadcom.com/licenses/GPLv2.php, with the |
---|
12 | 13 | * following added to such license: |
---|
13 | | - * |
---|
| 14 | + * |
---|
14 | 15 | * As a special exception, the copyright holders of this software give you |
---|
15 | 16 | * permission to link this software with independent modules, and to copy and |
---|
16 | 17 | * distribute the resulting executable under terms of your choice, provided that |
---|
.. | .. |
---|
18 | 19 | * the license of that module. An independent module is a module which is not |
---|
19 | 20 | * derived from this software. The special exception does not apply to any |
---|
20 | 21 | * modifications of the software. |
---|
21 | | - * |
---|
| 22 | + * |
---|
22 | 23 | * Notwithstanding the above, under no circumstances may you combine this |
---|
23 | 24 | * software in any way with any other Broadcom software provided under a license |
---|
24 | 25 | * other than the GPL, without Broadcom's express prior written consent. |
---|
.. | .. |
---|
26 | 27 | * |
---|
27 | 28 | * <<Broadcom-WL-IPTag/Open:>> |
---|
28 | 29 | * |
---|
29 | | - * $Id: bcmsdh.c 572557 2015-07-20 07:12:29Z $ |
---|
| 30 | + * $Id: bcmsdh.c 700323 2017-05-18 16:12:11Z $ |
---|
30 | 31 | */ |
---|
31 | 32 | |
---|
32 | 33 | /** |
---|
.. | .. |
---|
48 | 49 | #include <sbsdio.h> /* SDIO device core hardware definitions. */ |
---|
49 | 50 | #include <sdio.h> /* SDIO Device and Protocol Specs */ |
---|
50 | 51 | |
---|
| 52 | +#if defined(BT_OVER_SDIO) |
---|
| 53 | +#include <dhd_bt_interface.h> |
---|
| 54 | +#endif /* defined (BT_OVER_SDIO) */ |
---|
| 55 | + |
---|
51 | 56 | #define SDIOH_API_ACCESS_RETRY_LIMIT 2 |
---|
52 | 57 | const uint bcmsdh_msglevel = BCMSDH_ERROR_VAL; |
---|
53 | 58 | |
---|
54 | 59 | /* local copy of bcm sd handler */ |
---|
55 | 60 | bcmsdh_info_t * l_bcmsdh = NULL; |
---|
56 | 61 | |
---|
| 62 | +#if defined(BT_OVER_SDIO) |
---|
| 63 | +struct sdio_func *func_f3 = NULL; |
---|
| 64 | +static f3intr_handler processf3intr = NULL; |
---|
| 65 | +static dhd_hang_notification process_dhd_hang_notification = NULL; |
---|
| 66 | +static dhd_hang_state_t g_dhd_hang_state = NO_HANG_STATE; |
---|
| 67 | +#endif /* defined (BT_OVER_SDIO) */ |
---|
57 | 68 | |
---|
58 | 69 | #if defined(OOB_INTR_ONLY) && defined(HW_OOB) |
---|
59 | 70 | extern int |
---|
.. | .. |
---|
64 | 75 | { |
---|
65 | 76 | sdioh_enable_hw_oob_intr(sdh->sdioh, enable); |
---|
66 | 77 | } |
---|
67 | | -#endif |
---|
| 78 | +#endif // endif |
---|
| 79 | + |
---|
| 80 | +#if defined(BT_OVER_SDIO) |
---|
| 81 | +void bcmsdh_btsdio_process_hang_state(dhd_hang_state_t new_state) |
---|
| 82 | +{ |
---|
| 83 | + bool state_change = false; |
---|
| 84 | + |
---|
| 85 | + BCMSDH_ERROR(("%s: DHD hang state changed - [%d] -> [%d]\n", |
---|
| 86 | + __FUNCTION__, g_dhd_hang_state, new_state)); |
---|
| 87 | + |
---|
| 88 | + if (g_dhd_hang_state == new_state) |
---|
| 89 | + return; |
---|
| 90 | + |
---|
| 91 | + switch (g_dhd_hang_state) { |
---|
| 92 | + case NO_HANG_STATE: |
---|
| 93 | + if (HANG_START_STATE == new_state) |
---|
| 94 | + state_change = true; |
---|
| 95 | + break; |
---|
| 96 | + |
---|
| 97 | + case HANG_START_STATE: |
---|
| 98 | + if (HANG_RECOVERY_STATE == new_state || |
---|
| 99 | + NO_HANG_STATE == new_state) |
---|
| 100 | + state_change = true; |
---|
| 101 | + |
---|
| 102 | + break; |
---|
| 103 | + |
---|
| 104 | + case HANG_RECOVERY_STATE: |
---|
| 105 | + if (NO_HANG_STATE == new_state) |
---|
| 106 | + state_change = true; |
---|
| 107 | + break; |
---|
| 108 | + |
---|
| 109 | + default: |
---|
| 110 | + BCMSDH_ERROR(("%s: Unhandled Hang state\n", __FUNCTION__)); |
---|
| 111 | + break; |
---|
| 112 | + } |
---|
| 113 | + |
---|
| 114 | + if (!state_change) { |
---|
| 115 | + BCMSDH_ERROR(("%s: Hang state cannot be changed\n", __FUNCTION__)); |
---|
| 116 | + return; |
---|
| 117 | + } |
---|
| 118 | + |
---|
| 119 | + g_dhd_hang_state = new_state; |
---|
| 120 | +} |
---|
| 121 | + |
---|
| 122 | +void bcmsdh_btsdio_process_f3_intr(void) |
---|
| 123 | +{ |
---|
| 124 | + if (processf3intr && (g_dhd_hang_state == NO_HANG_STATE)) |
---|
| 125 | + processf3intr(func_f3); |
---|
| 126 | +} |
---|
| 127 | + |
---|
| 128 | +void bcmsdh_btsdio_process_dhd_hang_notification(bool wifi_recovery_completed) |
---|
| 129 | +{ |
---|
| 130 | + bcmsdh_btsdio_process_hang_state(HANG_START_STATE); |
---|
| 131 | + |
---|
| 132 | + if (process_dhd_hang_notification) |
---|
| 133 | + process_dhd_hang_notification(func_f3, wifi_recovery_completed); |
---|
| 134 | + |
---|
| 135 | + /* WiFi was off, so HANG_RECOVERY_STATE is not needed */ |
---|
| 136 | + if (wifi_recovery_completed) |
---|
| 137 | + bcmsdh_btsdio_process_hang_state(NO_HANG_STATE); |
---|
| 138 | + else { |
---|
| 139 | + bcmsdh_btsdio_process_hang_state(HANG_RECOVERY_STATE); |
---|
| 140 | + } |
---|
| 141 | +} |
---|
| 142 | + |
---|
| 143 | +void bcmsdh_btsdio_interface_init(struct sdio_func *func, |
---|
| 144 | + f3intr_handler f3intr_fun, dhd_hang_notification hang_notification) |
---|
| 145 | +{ |
---|
| 146 | + bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)l_bcmsdh; |
---|
| 147 | + BCMSDH_INFO(("%s: func %p \n", __FUNCTION__, func)); |
---|
| 148 | + func_f3 = func; |
---|
| 149 | + processf3intr = f3intr_fun; |
---|
| 150 | +#if defined(BCMLXSDMMC) |
---|
| 151 | + sdioh_sdmmc_card_enable_func_f3(bcmsdh->sdioh, func); |
---|
| 152 | +#else |
---|
| 153 | + BCMSDH_ERROR(("bcmsdh_btsdio_interface_init: not support f3 enable on non-sdmmc build\n")); |
---|
| 154 | +#endif /* defined(BCMLXSDMMC) */ |
---|
| 155 | + process_dhd_hang_notification = hang_notification; |
---|
| 156 | + |
---|
| 157 | +} EXPORT_SYMBOL(bcmsdh_btsdio_interface_init); |
---|
| 158 | +#endif /* defined (BT_OVER_SDIO) */ |
---|
68 | 159 | |
---|
69 | 160 | /* Attach BCMSDH layer to SDIO Host Controller Driver |
---|
70 | 161 | * |
---|
.. | .. |
---|
88 | 179 | bcmsdh->sdioh = sdioh; |
---|
89 | 180 | bcmsdh->osh = osh; |
---|
90 | 181 | bcmsdh->init_success = TRUE; |
---|
91 | | - *regsva = SI_ENUM_BASE; |
---|
| 182 | + *regsva = si_enum_base(0); |
---|
92 | 183 | |
---|
93 | 184 | bcmsdh_force_sbwad_calc(bcmsdh, FALSE); |
---|
94 | 185 | |
---|
95 | 186 | /* Report the BAR, to fix if needed */ |
---|
96 | | - bcmsdh->sbwad = SI_ENUM_BASE; |
---|
| 187 | + bcmsdh->sbwad = si_enum_base(0); |
---|
97 | 188 | |
---|
98 | 189 | /* save the handler locally */ |
---|
99 | 190 | l_bcmsdh = bcmsdh; |
---|
.. | .. |
---|
117 | 208 | |
---|
118 | 209 | int |
---|
119 | 210 | bcmsdh_iovar_op(void *sdh, const char *name, |
---|
120 | | - void *params, int plen, void *arg, int len, bool set) |
---|
| 211 | + void *params, uint plen, void *arg, uint len, bool set) |
---|
121 | 212 | { |
---|
122 | 213 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
123 | 214 | return sdioh_iovar_op(bcmsdh->sdioh, name, params, plen, arg, len, set); |
---|
.. | .. |
---|
143 | 234 | { |
---|
144 | 235 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
145 | 236 | SDIOH_API_RC status; |
---|
| 237 | +#ifdef BCMSPI_ANDROID |
---|
| 238 | + uint32 data; |
---|
| 239 | +#endif /* BCMSPI_ANDROID */ |
---|
146 | 240 | ASSERT(bcmsdh); |
---|
147 | 241 | |
---|
148 | 242 | status = sdioh_interrupt_set(bcmsdh->sdioh, TRUE); |
---|
| 243 | +#ifdef BCMSPI_ANDROID |
---|
| 244 | + data = bcmsdh_cfg_read_word(sdh, 0, 4, NULL); |
---|
| 245 | + data |= 0xE0E70000; |
---|
| 246 | + bcmsdh_cfg_write_word(sdh, 0, 4, data, NULL); |
---|
| 247 | +#endif /* BCMSPI_ANDROID */ |
---|
149 | 248 | return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); |
---|
150 | 249 | } |
---|
151 | 250 | |
---|
.. | .. |
---|
154 | 253 | { |
---|
155 | 254 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
156 | 255 | SDIOH_API_RC status; |
---|
| 256 | +#ifdef BCMSPI_ANDROID |
---|
| 257 | + uint32 data; |
---|
| 258 | +#endif /* BCMSPI_ANDROID */ |
---|
157 | 259 | ASSERT(bcmsdh); |
---|
158 | 260 | |
---|
159 | 261 | status = sdioh_interrupt_set(bcmsdh->sdioh, FALSE); |
---|
| 262 | +#ifdef BCMSPI_ANDROID |
---|
| 263 | + data = bcmsdh_cfg_read_word(sdh, 0, 4, NULL); |
---|
| 264 | + data &= ~0xE0E70000; |
---|
| 265 | + bcmsdh_cfg_write_word(sdh, 0, 4, data, NULL); |
---|
| 266 | +#endif /* BCMSPI_ANDROID */ |
---|
160 | 267 | return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); |
---|
161 | 268 | } |
---|
162 | 269 | |
---|
.. | .. |
---|
165 | 272 | { |
---|
166 | 273 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
167 | 274 | SDIOH_API_RC status; |
---|
| 275 | + |
---|
| 276 | + if (!bcmsdh) |
---|
| 277 | + bcmsdh = l_bcmsdh; |
---|
| 278 | + |
---|
168 | 279 | ASSERT(bcmsdh); |
---|
169 | 280 | |
---|
170 | 281 | status = sdioh_interrupt_register(bcmsdh->sdioh, fn, argh); |
---|
.. | .. |
---|
176 | 287 | { |
---|
177 | 288 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
178 | 289 | SDIOH_API_RC status; |
---|
| 290 | + |
---|
| 291 | + if (!bcmsdh) |
---|
| 292 | + bcmsdh = l_bcmsdh; |
---|
| 293 | + |
---|
179 | 294 | ASSERT(bcmsdh); |
---|
180 | 295 | |
---|
181 | 296 | status = sdioh_interrupt_deregister(bcmsdh->sdioh); |
---|
.. | .. |
---|
191 | 306 | ASSERT(sdh); |
---|
192 | 307 | return sdioh_interrupt_pending(bcmsdh->sdioh); |
---|
193 | 308 | } |
---|
194 | | -#endif |
---|
195 | | - |
---|
| 309 | +#endif // endif |
---|
196 | 310 | |
---|
197 | 311 | int |
---|
198 | 312 | bcmsdh_devremove_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh) |
---|
.. | .. |
---|
218 | 332 | SDIOH_API_RC status; |
---|
219 | 333 | #ifdef SDIOH_API_ACCESS_RETRY_LIMIT |
---|
220 | 334 | int32 retry = 0; |
---|
221 | | -#endif |
---|
| 335 | +#endif // endif |
---|
222 | 336 | uint8 data = 0; |
---|
223 | 337 | |
---|
224 | 338 | if (!bcmsdh) |
---|
.. | .. |
---|
230 | 344 | do { |
---|
231 | 345 | if (retry) /* wait for 1 ms till bus get settled down */ |
---|
232 | 346 | OSL_DELAY(1000); |
---|
233 | | -#endif |
---|
| 347 | +#endif // endif |
---|
234 | 348 | status = sdioh_cfg_read(bcmsdh->sdioh, fnc_num, addr, (uint8 *)&data); |
---|
235 | 349 | #ifdef SDIOH_API_ACCESS_RETRY_LIMIT |
---|
236 | 350 | } while (!SDIOH_API_SUCCESS(status) && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); |
---|
237 | | -#endif |
---|
| 351 | +#endif // endif |
---|
238 | 352 | if (err) |
---|
239 | 353 | *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); |
---|
240 | 354 | |
---|
.. | .. |
---|
242 | 356 | fnc_num, addr, data)); |
---|
243 | 357 | |
---|
244 | 358 | return data; |
---|
245 | | -} |
---|
| 359 | +} EXPORT_SYMBOL(bcmsdh_cfg_read); |
---|
246 | 360 | |
---|
247 | 361 | void |
---|
248 | 362 | bcmsdh_cfg_write(void *sdh, uint fnc_num, uint32 addr, uint8 data, int *err) |
---|
.. | .. |
---|
251 | 365 | SDIOH_API_RC status; |
---|
252 | 366 | #ifdef SDIOH_API_ACCESS_RETRY_LIMIT |
---|
253 | 367 | int32 retry = 0; |
---|
254 | | -#endif |
---|
| 368 | +#endif // endif |
---|
255 | 369 | |
---|
256 | 370 | if (!bcmsdh) |
---|
257 | 371 | bcmsdh = l_bcmsdh; |
---|
.. | .. |
---|
262 | 376 | do { |
---|
263 | 377 | if (retry) /* wait for 1 ms till bus get settled down */ |
---|
264 | 378 | OSL_DELAY(1000); |
---|
265 | | -#endif |
---|
| 379 | +#endif // endif |
---|
266 | 380 | status = sdioh_cfg_write(bcmsdh->sdioh, fnc_num, addr, (uint8 *)&data); |
---|
267 | 381 | #ifdef SDIOH_API_ACCESS_RETRY_LIMIT |
---|
268 | 382 | } while (!SDIOH_API_SUCCESS(status) && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); |
---|
269 | | -#endif |
---|
| 383 | +#endif // endif |
---|
270 | 384 | if (err) |
---|
271 | 385 | *err = SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR; |
---|
272 | 386 | |
---|
273 | 387 | BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint8data = 0x%x\n", __FUNCTION__, |
---|
274 | 388 | fnc_num, addr, data)); |
---|
275 | | -} |
---|
| 389 | +} EXPORT_SYMBOL(bcmsdh_cfg_write); |
---|
276 | 390 | |
---|
277 | 391 | uint32 |
---|
278 | 392 | bcmsdh_cfg_read_word(void *sdh, uint fnc_num, uint32 addr, int *err) |
---|
.. | .. |
---|
319 | 433 | addr, data)); |
---|
320 | 434 | } |
---|
321 | 435 | |
---|
322 | | - |
---|
323 | 436 | int |
---|
324 | 437 | bcmsdh_cis_read(void *sdh, uint func, uint8 *cis, uint length) |
---|
325 | 438 | { |
---|
.. | .. |
---|
359 | 472 | return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); |
---|
360 | 473 | } |
---|
361 | 474 | |
---|
362 | | - |
---|
363 | 475 | int |
---|
364 | 476 | bcmsdhsdio_set_sbaddr_window(void *sdh, uint32 address, bool force_set) |
---|
365 | 477 | { |
---|
.. | .. |
---|
389 | 501 | } |
---|
390 | 502 | |
---|
391 | 503 | uint32 |
---|
392 | | -bcmsdh_reg_read(void *sdh, uint32 addr, uint size) |
---|
| 504 | +bcmsdh_reg_read(void *sdh, uintptr addr, uint size) |
---|
393 | 505 | { |
---|
394 | 506 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
395 | 507 | SDIOH_API_RC status; |
---|
396 | 508 | uint32 word = 0; |
---|
397 | 509 | |
---|
398 | | - BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, ", __FUNCTION__, addr)); |
---|
| 510 | + BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, ", |
---|
| 511 | + __FUNCTION__, (unsigned int)addr)); |
---|
399 | 512 | |
---|
400 | 513 | if (!bcmsdh) |
---|
401 | 514 | bcmsdh = l_bcmsdh; |
---|
.. | .. |
---|
432 | 545 | } |
---|
433 | 546 | |
---|
434 | 547 | /* otherwise, bad sdio access or invalid size */ |
---|
435 | | - BCMSDH_ERROR(("%s: error reading addr 0x%04x size %d\n", __FUNCTION__, addr, size)); |
---|
| 548 | + BCMSDH_ERROR(("%s: error reading addr 0x%x size %d\n", |
---|
| 549 | + __FUNCTION__, (unsigned int)addr, size)); |
---|
436 | 550 | return 0xFFFFFFFF; |
---|
437 | 551 | } |
---|
438 | 552 | |
---|
439 | 553 | uint32 |
---|
440 | | -bcmsdh_reg_write(void *sdh, uint32 addr, uint size, uint32 data) |
---|
| 554 | +bcmsdh_reg_write(void *sdh, uintptr addr, uint size, uint32 data) |
---|
441 | 555 | { |
---|
442 | 556 | bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; |
---|
443 | 557 | SDIOH_API_RC status; |
---|
444 | 558 | int err = 0; |
---|
445 | 559 | |
---|
446 | 560 | BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, uint%ddata = 0x%x\n", |
---|
447 | | - __FUNCTION__, addr, size*8, data)); |
---|
| 561 | + __FUNCTION__, (unsigned int)addr, size*8, data)); |
---|
448 | 562 | |
---|
449 | 563 | if (!bcmsdh) |
---|
450 | 564 | bcmsdh = l_bcmsdh; |
---|
.. | .. |
---|
465 | 579 | return 0; |
---|
466 | 580 | |
---|
467 | 581 | BCMSDH_ERROR(("%s: error writing 0x%08x to addr 0x%04x size %d\n", |
---|
468 | | - __FUNCTION__, data, addr, size)); |
---|
| 582 | + __FUNCTION__, data, (unsigned int)addr, size)); |
---|
469 | 583 | return 0xFFFFFFFF; |
---|
470 | 584 | } |
---|
471 | 585 | |
---|
.. | .. |
---|
504 | 618 | |
---|
505 | 619 | incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; |
---|
506 | 620 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; |
---|
507 | | - if (width == 4) |
---|
| 621 | + if (fn != SDIO_FUNC_3 && width == 4) |
---|
508 | 622 | addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; |
---|
509 | 623 | |
---|
510 | 624 | status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix, |
---|
.. | .. |
---|
542 | 656 | |
---|
543 | 657 | incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; |
---|
544 | 658 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; |
---|
545 | | - if (width == 4) |
---|
| 659 | + if (fn != SDIO_FUNC_3 && width == 4) |
---|
546 | 660 | addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; |
---|
547 | 661 | |
---|
548 | 662 | status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix, |
---|
.. | .. |
---|
603 | 717 | return sdioh_waitlockfree(bcmsdh->sdioh); |
---|
604 | 718 | } |
---|
605 | 719 | |
---|
606 | | - |
---|
607 | 720 | int |
---|
608 | 721 | bcmsdh_query_device(void *sdh) |
---|
609 | 722 | { |
---|
.. | .. |
---|
641 | 754 | uint32 |
---|
642 | 755 | bcmsdh_get_dstatus(void *sdh) |
---|
643 | 756 | { |
---|
| 757 | +#ifdef BCMSPI |
---|
| 758 | + bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; |
---|
| 759 | + sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); |
---|
| 760 | + return sdioh_get_dstatus(sd); |
---|
| 761 | +#else |
---|
644 | 762 | return 0; |
---|
| 763 | +#endif /* BCMSPI */ |
---|
645 | 764 | } |
---|
646 | 765 | uint32 |
---|
647 | 766 | bcmsdh_cur_sbwad(void *sdh) |
---|
.. | .. |
---|
670 | 789 | void |
---|
671 | 790 | bcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev) |
---|
672 | 791 | { |
---|
| 792 | +#ifdef BCMSPI |
---|
| 793 | + bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; |
---|
| 794 | + sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); |
---|
| 795 | + sdioh_chipinfo(sd, chip, chiprev); |
---|
| 796 | +#else |
---|
673 | 797 | return; |
---|
| 798 | +#endif /* BCMSPI */ |
---|
674 | 799 | } |
---|
675 | 800 | |
---|
| 801 | +#ifdef BCMSPI |
---|
| 802 | +void |
---|
| 803 | +bcmsdh_dwordmode(void *sdh, bool set) |
---|
| 804 | +{ |
---|
| 805 | + bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; |
---|
| 806 | + sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); |
---|
| 807 | + sdioh_dwordmode(sd, set); |
---|
| 808 | + return; |
---|
| 809 | +} |
---|
| 810 | +#endif /* BCMSPI */ |
---|
676 | 811 | |
---|
677 | 812 | int |
---|
678 | 813 | bcmsdh_sleep(void *sdh, bool enab) |
---|
.. | .. |
---|
684 | 819 | return sdioh_sleep(sd, enab); |
---|
685 | 820 | #else |
---|
686 | 821 | return BCME_UNSUPPORTED; |
---|
687 | | -#endif |
---|
| 822 | +#endif // endif |
---|
688 | 823 | } |
---|
689 | 824 | |
---|
690 | 825 | int |
---|