hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel
 *
 * Copyright (C) 1999-2017, Broadcom Corporation
 * 
 *      Unless you and Broadcom execute a separate written software license
 * agreement governing use of this software, this software is licensed to you
 * under the terms of the GNU General Public License version 2 (the "GPL"),
 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
 * following added to such license:
 * 
 *      As a special exception, the copyright holders of this software give you
 * permission to link this software with independent modules, and to copy and
 * distribute the resulting executable under terms of your choice, provided that
 * you also meet, for each linked independent module, the terms and conditions of
 * the license of that module.  An independent module is a module which is not
 * derived from this software.  The special exception does not apply to any
 * modifications of the software.
 * 
 *      Notwithstanding the above, under no circumstances may you combine this
 * software in any way with any other Broadcom software provided under a license
 * other than the GPL, without Broadcom's express prior written consent.
 *
 *
 * <<Broadcom-WL-IPTag/Proprietary,Open:>>
 *
 * $Id: bcmsdh_sdmmc.h 687253 2017-02-28 09:33:36Z $
 */
 
#ifndef __BCMSDH_SDMMC_H__
#define __BCMSDH_SDMMC_H__
 
#define sd_err(x)    do { if (sd_msglevel & SDH_ERROR_VAL) printf x; } while (0)
#define sd_trace(x)    do { if (sd_msglevel & SDH_TRACE_VAL) printf x; } while (0)
#define sd_info(x)    do { if (sd_msglevel & SDH_INFO_VAL) printf x; } while (0)
#define sd_debug(x)    do { if (sd_msglevel & SDH_DEBUG_VAL) printf x; } while (0)
#define sd_data(x)    do { if (sd_msglevel & SDH_DATA_VAL) printf x; } while (0)
#define sd_ctrl(x)    do { if (sd_msglevel & SDH_CTRL_VAL) printf x; } while (0)
#define sd_cost(x)    do { if (sd_msglevel & SDH_COST_VAL) printf x; } while (0)
 
#define sd_sync_dma(sd, read, nbytes)
#define sd_init_dma(sd)
#define sd_ack_intr(sd)
#define sd_wakeup(sd);
 
#define sd_log(x)
 
#define SDIOH_ASSERT(exp) \
   do { if (!(exp)) \
       printf("!!!ASSERT fail: file %s lines %d", __FILE__, __LINE__); \
   } while (0)
 
#define BLOCK_SIZE_4318 64
#define BLOCK_SIZE_4328 512
 
/* internal return code */
#define SUCCESS    0
#define ERROR    1
 
/* private bus modes */
#define SDIOH_MODE_SD4        2
#define CLIENT_INTR            0x100    /* Get rid of this! */
#define SDIOH_SDMMC_MAX_SG_ENTRIES    (SDPCM_MAXGLOM_SIZE + 2)
 
struct sdioh_info {
   osl_t        *osh;            /* osh handler */
   void        *bcmsdh;        /* upper layer handle */
   bool        client_intr_enabled;    /* interrupt connnected flag */
   bool        intr_handler_valid;    /* client driver interrupt handler valid */
   sdioh_cb_fn_t    intr_handler;        /* registered interrupt handler */
   void        *intr_handler_arg;    /* argument to call interrupt handler */
   uint16        intmask;        /* Current active interrupts */
 
   int        intrcount;        /* Client interrupts */
   bool        sd_use_dma;        /* DMA on CMD53 */
   bool        sd_blockmode;        /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */
                       /*  Must be on for sd_multiblock to be effective */
   bool        use_client_ints;    /* If this is false, make sure to restore */
   int        sd_mode;        /* SD1/SD4/SPI */
   int        client_block_size[SDIOD_MAX_IOFUNCS];        /* Blocksize */
   uint8        num_funcs;        /* Supported funcs on client */
   uint32        com_cis_ptr;
   uint32        func_cis_ptr[SDIOD_MAX_IOFUNCS];
   bool        use_rxchain;
   struct scatterlist    sg_list[SDIOH_SDMMC_MAX_SG_ENTRIES];
   struct sdio_func    fake_func0;
   struct sdio_func    *func[SDIOD_MAX_IOFUNCS];
   uint        sd_clk_rate;
   uint    txglom_mode;        /* Txglom mode: 0 - copy, 1 - multi-descriptor */
   uint32    sdio_spent_time_us;
#ifdef DHD_LOAD_CHIPALIVE
   bool sdmmc_sleep;
#endif
};
 
/************************************************************
 * Internal interfaces: per-port references into bcmsdh_sdmmc.c
 */
 
/* Global message bits */
extern uint sd_msglevel;
 
/* OS-independent interrupt handler */
extern bool check_client_intr(sdioh_info_t *sd);
 
/* Core interrupt enable/disable of device interrupts */
extern void sdioh_sdmmc_devintr_on(sdioh_info_t *sd);
extern void sdioh_sdmmc_devintr_off(sdioh_info_t *sd);
 
 
/**************************************************************
 * Internal interfaces: bcmsdh_sdmmc.c references to per-port code
 */
 
/* Register mapping routines */
extern uint32 *sdioh_sdmmc_reg_map(osl_t *osh, int32 addr, int size);
extern void sdioh_sdmmc_reg_unmap(osl_t *osh, int32 addr, int size);
 
/* Interrupt (de)registration routines */
extern int sdioh_sdmmc_register_irq(sdioh_info_t *sd, uint irq);
extern void sdioh_sdmmc_free_irq(uint irq, sdioh_info_t *sd);
 
extern sdioh_info_t *sdioh_attach(osl_t *osh, struct sdio_func *func);
extern SDIOH_API_RC sdioh_detach(osl_t *osh, sdioh_info_t *sd);
 
#ifdef GLOBAL_SDMMC_INSTANCE
typedef struct _BCMSDH_SDMMC_INSTANCE {
   sdioh_info_t    *sd;
   struct sdio_func *func[SDIOD_MAX_IOFUNCS];
} BCMSDH_SDMMC_INSTANCE, *PBCMSDH_SDMMC_INSTANCE;
#endif
 
#endif /* __BCMSDH_SDMMC_H__ */