• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * SD-SPI Protocol Conversion - BCMSDH->SPI Translation Layer
3  *
4  * Copyright (C) 1999-2017, Broadcom Corporation
5  *
6  *      Unless you and Broadcom execute a separate written software license
7  * agreement governing use of this software, this software is licensed to you
8  * under the terms of the GNU General Public License version 2 (the "GPL"),
9  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10  * following added to such license:
11  *
12  *      As a special exception, the copyright holders of this software give you
13  * permission to link this software with independent modules, and to copy and
14  * distribute the resulting executable under terms of your choice, provided that
15  * you also meet, for each linked independent module, the terms and conditions of
16  * the license of that module.  An independent module is a module which is not
17  * derived from this software.  The special exception does not apply to any
18  * modifications of the software.
19  *
20  *      Notwithstanding the above, under no circumstances may you combine this
21  * software in any way with any other Broadcom software provided under a license
22  * other than the GPL, without Broadcom's express prior written consent.
23  *
24  *
25  * <<Broadcom-WL-IPTag/Open:>>
26  *
27  * $Id: bcmsdspi.h 514727 2014-11-12 03:02:48Z $
28  */
29 #ifndef    _BCM_SD_SPI_H
30 #define    _BCM_SD_SPI_H
31 
32 /* global msglevel for debug messages - bitvals come from sdiovar.h */
33 
34 #define sd_err(x)
35 #define sd_trace(x)
36 #define sd_info(x)
37 #define sd_debug(x)
38 #define sd_data(x)
39 #define sd_ctrl(x)
40 
41 #define sd_log(x)
42 
43 #define SDIOH_ASSERT(exp) \
44     do { if (!(exp)) \
45         printf("!!!ASSERT fail: file %s lines %d", __FILE__, __LINE__); \
46     } while (0)
47 
48 #define BLOCK_SIZE_4318 64
49 #define BLOCK_SIZE_4328 512
50 
51 /* internal return code */
52 #define SUCCESS    0
53 #undef ERROR
54 #define ERROR    1
55 
56 /* private bus modes */
57 #define SDIOH_MODE_SPI        0
58 
59 #define USE_BLOCKMODE        0x2    /* Block mode can be single block or multi */
60 #define USE_MULTIBLOCK        0x4
61 
62 struct sdioh_info {
63     uint cfg_bar;                       /* pci cfg address for bar */
64     uint32 caps;                        /* cached value of capabilities reg */
65     uint        bar0;            /* BAR0 for PCI Device */
66     osl_t         *osh;            /* osh handler */
67     void        *controller;    /* Pointer to SPI Controller's private data struct */
68 
69     uint        lockcount;         /* nest count of sdspi_lock() calls */
70     bool        client_intr_enabled;    /* interrupt connnected flag */
71     bool        intr_handler_valid;    /* client driver interrupt handler valid */
72     sdioh_cb_fn_t    intr_handler;        /* registered interrupt handler */
73     void        *intr_handler_arg;    /* argument to call interrupt handler */
74     bool        initialized;        /* card initialized */
75     uint32        target_dev;        /* Target device ID */
76     uint32        intmask;        /* Current active interrupts */
77     void        *sdos_info;        /* Pointer to per-OS private data */
78 
79     uint32        controller_type;    /* Host controller type */
80     uint8        version;        /* Host Controller Spec Compliance Version */
81     uint         irq;            /* Client irq */
82     uint32         intrcount;        /* Client interrupts */
83     uint32         local_intrcount;    /* Controller interrupts */
84     bool         host_init_done;        /* Controller initted */
85     bool         card_init_done;        /* Client SDIO interface initted */
86     bool         polled_mode;        /* polling for command completion */
87 
88     bool        sd_use_dma;        /* DMA on CMD53 */
89     bool         sd_blockmode;        /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */
90                         /*  Must be on for sd_multiblock to be effective */
91     bool         use_client_ints;    /* If this is false, make sure to restore */
92     bool        got_hcint;        /* Host Controller interrupt. */
93                         /*  polling hack in wl_linux.c:wl_timer() */
94     int         adapter_slot;        /* Maybe dealing with multiple slots/controllers */
95     int         sd_mode;        /* SD1/SD4/SPI */
96     int         client_block_size[SDIOD_MAX_IOFUNCS];        /* Blocksize */
97     uint32         data_xfer_count;    /* Current register transfer size */
98     uint32        cmd53_wr_data;        /* Used to pass CMD53 write data */
99     uint32        card_response;        /* Used to pass back response status byte */
100     uint32        card_rsp_data;        /* Used to pass back response data word */
101     uint16         card_rca;        /* Current Address */
102     uint8         num_funcs;        /* Supported funcs on client */
103     uint32         com_cis_ptr;
104     uint32         func_cis_ptr[SDIOD_MAX_IOFUNCS];
105     void        *dma_buf;
106     ulong        dma_phys;
107     int         r_cnt;            /* rx count */
108     int         t_cnt;            /* tx_count */
109 };
110 
111 /************************************************************
112  * Internal interfaces: per-port references into bcmsdspi.c
113  */
114 
115 /* Global message bits */
116 extern uint sd_msglevel;
117 
118 /**************************************************************
119  * Internal interfaces: bcmsdspi.c references to per-port code
120  */
121 
122 /* Register mapping routines */
123 extern uint32 *spi_reg_map(osl_t *osh, uintptr addr, int size);
124 extern void spi_reg_unmap(osl_t *osh, uintptr addr, int size);
125 
126 /* Interrupt (de)registration routines */
127 extern int spi_register_irq(sdioh_info_t *sd, uint irq);
128 extern void spi_free_irq(uint irq, sdioh_info_t *sd);
129 
130 /* OS-specific interrupt wrappers (atomic interrupt enable/disable) */
131 extern void spi_lock(sdioh_info_t *sd);
132 extern void spi_unlock(sdioh_info_t *sd);
133 
134 /* Allocate/init/free per-OS private data */
135 extern int spi_osinit(sdioh_info_t *sd);
136 extern void spi_osfree(sdioh_info_t *sd);
137 
138 #endif /* _BCM_SD_SPI_H */
139