1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
3  * Copyright (C) 2021 Jernej Skrabec <jernej.skrabec@gmail.com>
4  */
5 
6 #ifndef __REG_SDIO_H_
7 #define __REG_SDIO_H_
8 
9 /* I/O bus domain address mapping */
10 #define SDIO_LOCAL_OFFSET			0x10250000
11 #define WLAN_IOREG_OFFSET			0x10260000
12 #define FIRMWARE_FIFO_OFFSET			0x10270000
13 #define TX_HIQ_OFFSET				0x10310000
14 #define TX_MIQ_OFFSET				0x10320000
15 #define TX_LOQ_OFFSET				0x10330000
16 #define TX_EPQ_OFFSET				0x10350000
17 #define RX_RX0FF_OFFSET				0x10340000
18 
19 #define RTW_SDIO_BUS_MSK			0xffff0000
20 #define SDIO_LOCAL_REG_MSK			0x00000fff
21 #define WLAN_IOREG_REG_MSK			0x0000ffff
22 
23 /* SDIO Tx Control */
24 #define REG_SDIO_TX_CTRL			(SDIO_LOCAL_OFFSET + 0x0000)
25 
26 /*SDIO status timeout*/
27 #define REG_SDIO_TIMEOUT			(SDIO_LOCAL_OFFSET + 0x0002)
28 
29 /* SDIO Host Interrupt Mask */
30 #define REG_SDIO_HIMR				(SDIO_LOCAL_OFFSET + 0x0014)
31 #define REG_SDIO_HIMR_RX_REQUEST		BIT(0)
32 #define REG_SDIO_HIMR_AVAL			BIT(1)
33 #define REG_SDIO_HIMR_TXERR			BIT(2)
34 #define REG_SDIO_HIMR_RXERR			BIT(3)
35 #define REG_SDIO_HIMR_TXFOVW			BIT(4)
36 #define REG_SDIO_HIMR_RXFOVW			BIT(5)
37 #define REG_SDIO_HIMR_TXBCNOK			BIT(6)
38 #define REG_SDIO_HIMR_TXBCNERR			BIT(7)
39 #define REG_SDIO_HIMR_BCNERLY_INT		BIT(16)
40 #define REG_SDIO_HIMR_C2HCMD			BIT(17)
41 #define REG_SDIO_HIMR_CPWM1			BIT(18)
42 #define REG_SDIO_HIMR_CPWM2			BIT(19)
43 #define REG_SDIO_HIMR_HSISR_IND			BIT(20)
44 #define REG_SDIO_HIMR_GTINT3_IND		BIT(21)
45 #define REG_SDIO_HIMR_GTINT4_IND		BIT(22)
46 #define REG_SDIO_HIMR_PSTIMEOUT			BIT(23)
47 #define REG_SDIO_HIMR_OCPINT			BIT(24)
48 #define REG_SDIO_HIMR_ATIMEND			BIT(25)
49 #define REG_SDIO_HIMR_ATIMEND_E			BIT(26)
50 #define REG_SDIO_HIMR_CTWEND			BIT(27)
51 /* the following two are RTL8188 SDIO Specific */
52 #define REG_SDIO_HIMR_MCU_ERR			BIT(28)
53 #define REG_SDIO_HIMR_TSF_BIT32_TOGGLE		BIT(29)
54 
55 /* SDIO Host Interrupt Service Routine */
56 #define REG_SDIO_HISR				(SDIO_LOCAL_OFFSET + 0x0018)
57 #define REG_SDIO_HISR_RX_REQUEST		BIT(0)
58 #define REG_SDIO_HISR_AVAL			BIT(1)
59 #define REG_SDIO_HISR_TXERR			BIT(2)
60 #define REG_SDIO_HISR_RXERR			BIT(3)
61 #define REG_SDIO_HISR_TXFOVW			BIT(4)
62 #define REG_SDIO_HISR_RXFOVW			BIT(5)
63 #define REG_SDIO_HISR_TXBCNOK			BIT(6)
64 #define REG_SDIO_HISR_TXBCNERR			BIT(7)
65 #define REG_SDIO_HISR_BCNERLY_INT		BIT(16)
66 #define REG_SDIO_HISR_C2HCMD			BIT(17)
67 #define REG_SDIO_HISR_CPWM1			BIT(18)
68 #define REG_SDIO_HISR_CPWM2			BIT(19)
69 #define REG_SDIO_HISR_HSISR_IND			BIT(20)
70 #define REG_SDIO_HISR_GTINT3_IND		BIT(21)
71 #define REG_SDIO_HISR_GTINT4_IND		BIT(22)
72 #define REG_SDIO_HISR_PSTIMEOUT			BIT(23)
73 #define REG_SDIO_HISR_OCPINT			BIT(24)
74 #define REG_SDIO_HISR_ATIMEND			BIT(25)
75 #define REG_SDIO_HISR_ATIMEND_E			BIT(26)
76 #define REG_SDIO_HISR_CTWEND			BIT(27)
77 /* the following two are RTL8188 SDIO Specific */
78 #define REG_SDIO_HISR_MCU_ERR			BIT(28)
79 #define REG_SDIO_HISR_TSF_BIT32_TOGGLE		BIT(29)
80 
81 /* HCI Current Power Mode */
82 #define REG_SDIO_HCPWM				(SDIO_LOCAL_OFFSET + 0x0019)
83 /* RXDMA Request Length */
84 #define REG_SDIO_RX0_REQ_LEN			(SDIO_LOCAL_OFFSET + 0x001C)
85 /* OQT Free Page */
86 #define REG_SDIO_OQT_FREE_PG			(SDIO_LOCAL_OFFSET + 0x001E)
87 /* Free Tx Buffer Page */
88 #define REG_SDIO_FREE_TXPG			(SDIO_LOCAL_OFFSET + 0x0020)
89 /* HCI Current Power Mode 1 */
90 #define REG_SDIO_HCPWM1				(SDIO_LOCAL_OFFSET + 0x0024)
91 /* HCI Current Power Mode 2 */
92 #define REG_SDIO_HCPWM2				(SDIO_LOCAL_OFFSET + 0x0026)
93 /* Free Tx Page Sequence */
94 #define REG_SDIO_FREE_TXPG_SEQ			(SDIO_LOCAL_OFFSET + 0x0028)
95 /* HTSF Information */
96 #define REG_SDIO_HTSFR_INFO			(SDIO_LOCAL_OFFSET + 0x0030)
97 #define REG_SDIO_HCPWM1_V2			(SDIO_LOCAL_OFFSET + 0x0038)
98 /* H2C */
99 #define REG_SDIO_H2C				(SDIO_LOCAL_OFFSET + 0x0060)
100 /* HCI Request Power Mode 1 */
101 #define REG_SDIO_HRPWM1				(SDIO_LOCAL_OFFSET + 0x0080)
102 /* HCI Request Power Mode 2 */
103 #define REG_SDIO_HRPWM2				(SDIO_LOCAL_OFFSET + 0x0082)
104 /* HCI Power Save Clock */
105 #define REG_SDIO_HPS_CLKR			(SDIO_LOCAL_OFFSET + 0x0084)
106 /* SDIO HCI Suspend Control */
107 #define REG_SDIO_HSUS_CTRL			(SDIO_LOCAL_OFFSET + 0x0086)
108 #define BIT_HCI_SUS_REQ				BIT(0)
109 #define BIT_HCI_RESUME_RDY			BIT(1)
110 /* SDIO Host Extension Interrupt Mask Always */
111 #define REG_SDIO_HIMR_ON			(SDIO_LOCAL_OFFSET + 0x0090)
112 /* SDIO Host Extension Interrupt Status Always */
113 #define REG_SDIO_HISR_ON			(SDIO_LOCAL_OFFSET + 0x0091)
114 
115 #define REG_SDIO_INDIRECT_REG_CFG		(SDIO_LOCAL_OFFSET + 0x0040)
116 #define BIT_SDIO_INDIRECT_REG_CFG_WORD		BIT(16)
117 #define BIT_SDIO_INDIRECT_REG_CFG_DWORD		BIT(17)
118 #define BIT_SDIO_INDIRECT_REG_CFG_WRITE		BIT(18)
119 #define BIT_SDIO_INDIRECT_REG_CFG_READ		BIT(19)
120 #define BIT_SDIO_INDIRECT_REG_CFG_UNK20		BIT(20)
121 #define REG_SDIO_INDIRECT_REG_DATA		(SDIO_LOCAL_OFFSET + 0x0044)
122 
123 /* Sdio Address for SDIO Local Reg, TRX FIFO, MAC Reg */
124 #define REG_SDIO_CMD_ADDR_MSK			GENMASK(16, 13)
125 #define REG_SDIO_CMD_ADDR_SDIO_REG		0
126 #define REG_SDIO_CMD_ADDR_MAC_REG		8
127 #define REG_SDIO_CMD_ADDR_TXFF_HIGH		4
128 #define REG_SDIO_CMD_ADDR_TXFF_LOW		6
129 #define REG_SDIO_CMD_ADDR_TXFF_NORMAL		5
130 #define REG_SDIO_CMD_ADDR_TXFF_EXTRA		7
131 #define REG_SDIO_CMD_ADDR_RXFF			7
132 
133 #define RTW_SDIO_BLOCK_SIZE			512
134 #define RTW_SDIO_ADDR_RX_RX0FF_GEN(_id)		(0x0e000 | ((_id) & 0x3))
135 
136 #define RTW_SDIO_DATA_PTR_ALIGN			8
137 
138 struct sdio_func;
139 struct sdio_device_id;
140 
141 struct rtw_sdio_tx_data {
142 	u8 sn;
143 };
144 
145 struct rtw_sdio_work_data {
146 	struct work_struct work;
147 	struct rtw_dev *rtwdev;
148 };
149 
150 struct rtw_sdio {
151 	struct sdio_func *sdio_func;
152 
153 	u32 irq_mask;
154 	u8 rx_addr;
155 	bool sdio3_bus_mode;
156 
157 	void *irq_thread;
158 
159 	struct workqueue_struct *txwq;
160 	struct rtw_sdio_work_data *tx_handler_data;
161 	struct sk_buff_head tx_queue[RTK_MAX_TX_QUEUE_NUM];
162 };
163 
164 extern const struct dev_pm_ops rtw_sdio_pm_ops;
165 
166 int rtw_sdio_probe(struct sdio_func *sdio_func,
167 		   const struct sdio_device_id *id);
168 void rtw_sdio_remove(struct sdio_func *sdio_func);
169 void rtw_sdio_shutdown(struct device *dev);
170 
171 static inline bool rtw_sdio_is_sdio30_supported(struct rtw_dev *rtwdev)
172 {
173 	struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
174 
175 	return rtwsdio->sdio3_bus_mode;
176 }
177 
178 #endif
179