179 lines
5.9 KiB
C
179 lines
5.9 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||
|
/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||
|
* Copyright (C) 2021 Jernej Skrabec <jernej.skrabec@gmail.com>
|
||
|
*/
|
||
|
|
||
|
#ifndef __REG_SDIO_H_
|
||
|
#define __REG_SDIO_H_
|
||
|
|
||
|
/* I/O bus domain address mapping */
|
||
|
#define SDIO_LOCAL_OFFSET 0x10250000
|
||
|
#define WLAN_IOREG_OFFSET 0x10260000
|
||
|
#define FIRMWARE_FIFO_OFFSET 0x10270000
|
||
|
#define TX_HIQ_OFFSET 0x10310000
|
||
|
#define TX_MIQ_OFFSET 0x10320000
|
||
|
#define TX_LOQ_OFFSET 0x10330000
|
||
|
#define TX_EPQ_OFFSET 0x10350000
|
||
|
#define RX_RX0FF_OFFSET 0x10340000
|
||
|
|
||
|
#define RTW_SDIO_BUS_MSK 0xffff0000
|
||
|
#define SDIO_LOCAL_REG_MSK 0x00000fff
|
||
|
#define WLAN_IOREG_REG_MSK 0x0000ffff
|
||
|
|
||
|
/* SDIO Tx Control */
|
||
|
#define REG_SDIO_TX_CTRL (SDIO_LOCAL_OFFSET + 0x0000)
|
||
|
|
||
|
/*SDIO status timeout*/
|
||
|
#define REG_SDIO_TIMEOUT (SDIO_LOCAL_OFFSET + 0x0002)
|
||
|
|
||
|
/* SDIO Host Interrupt Mask */
|
||
|
#define REG_SDIO_HIMR (SDIO_LOCAL_OFFSET + 0x0014)
|
||
|
#define REG_SDIO_HIMR_RX_REQUEST BIT(0)
|
||
|
#define REG_SDIO_HIMR_AVAL BIT(1)
|
||
|
#define REG_SDIO_HIMR_TXERR BIT(2)
|
||
|
#define REG_SDIO_HIMR_RXERR BIT(3)
|
||
|
#define REG_SDIO_HIMR_TXFOVW BIT(4)
|
||
|
#define REG_SDIO_HIMR_RXFOVW BIT(5)
|
||
|
#define REG_SDIO_HIMR_TXBCNOK BIT(6)
|
||
|
#define REG_SDIO_HIMR_TXBCNERR BIT(7)
|
||
|
#define REG_SDIO_HIMR_BCNERLY_INT BIT(16)
|
||
|
#define REG_SDIO_HIMR_C2HCMD BIT(17)
|
||
|
#define REG_SDIO_HIMR_CPWM1 BIT(18)
|
||
|
#define REG_SDIO_HIMR_CPWM2 BIT(19)
|
||
|
#define REG_SDIO_HIMR_HSISR_IND BIT(20)
|
||
|
#define REG_SDIO_HIMR_GTINT3_IND BIT(21)
|
||
|
#define REG_SDIO_HIMR_GTINT4_IND BIT(22)
|
||
|
#define REG_SDIO_HIMR_PSTIMEOUT BIT(23)
|
||
|
#define REG_SDIO_HIMR_OCPINT BIT(24)
|
||
|
#define REG_SDIO_HIMR_ATIMEND BIT(25)
|
||
|
#define REG_SDIO_HIMR_ATIMEND_E BIT(26)
|
||
|
#define REG_SDIO_HIMR_CTWEND BIT(27)
|
||
|
/* the following two are RTL8188 SDIO Specific */
|
||
|
#define REG_SDIO_HIMR_MCU_ERR BIT(28)
|
||
|
#define REG_SDIO_HIMR_TSF_BIT32_TOGGLE BIT(29)
|
||
|
|
||
|
/* SDIO Host Interrupt Service Routine */
|
||
|
#define REG_SDIO_HISR (SDIO_LOCAL_OFFSET + 0x0018)
|
||
|
#define REG_SDIO_HISR_RX_REQUEST BIT(0)
|
||
|
#define REG_SDIO_HISR_AVAL BIT(1)
|
||
|
#define REG_SDIO_HISR_TXERR BIT(2)
|
||
|
#define REG_SDIO_HISR_RXERR BIT(3)
|
||
|
#define REG_SDIO_HISR_TXFOVW BIT(4)
|
||
|
#define REG_SDIO_HISR_RXFOVW BIT(5)
|
||
|
#define REG_SDIO_HISR_TXBCNOK BIT(6)
|
||
|
#define REG_SDIO_HISR_TXBCNERR BIT(7)
|
||
|
#define REG_SDIO_HISR_BCNERLY_INT BIT(16)
|
||
|
#define REG_SDIO_HISR_C2HCMD BIT(17)
|
||
|
#define REG_SDIO_HISR_CPWM1 BIT(18)
|
||
|
#define REG_SDIO_HISR_CPWM2 BIT(19)
|
||
|
#define REG_SDIO_HISR_HSISR_IND BIT(20)
|
||
|
#define REG_SDIO_HISR_GTINT3_IND BIT(21)
|
||
|
#define REG_SDIO_HISR_GTINT4_IND BIT(22)
|
||
|
#define REG_SDIO_HISR_PSTIMEOUT BIT(23)
|
||
|
#define REG_SDIO_HISR_OCPINT BIT(24)
|
||
|
#define REG_SDIO_HISR_ATIMEND BIT(25)
|
||
|
#define REG_SDIO_HISR_ATIMEND_E BIT(26)
|
||
|
#define REG_SDIO_HISR_CTWEND BIT(27)
|
||
|
/* the following two are RTL8188 SDIO Specific */
|
||
|
#define REG_SDIO_HISR_MCU_ERR BIT(28)
|
||
|
#define REG_SDIO_HISR_TSF_BIT32_TOGGLE BIT(29)
|
||
|
|
||
|
/* HCI Current Power Mode */
|
||
|
#define REG_SDIO_HCPWM (SDIO_LOCAL_OFFSET + 0x0019)
|
||
|
/* RXDMA Request Length */
|
||
|
#define REG_SDIO_RX0_REQ_LEN (SDIO_LOCAL_OFFSET + 0x001C)
|
||
|
/* OQT Free Page */
|
||
|
#define REG_SDIO_OQT_FREE_PG (SDIO_LOCAL_OFFSET + 0x001E)
|
||
|
/* Free Tx Buffer Page */
|
||
|
#define REG_SDIO_FREE_TXPG (SDIO_LOCAL_OFFSET + 0x0020)
|
||
|
/* HCI Current Power Mode 1 */
|
||
|
#define REG_SDIO_HCPWM1 (SDIO_LOCAL_OFFSET + 0x0024)
|
||
|
/* HCI Current Power Mode 2 */
|
||
|
#define REG_SDIO_HCPWM2 (SDIO_LOCAL_OFFSET + 0x0026)
|
||
|
/* Free Tx Page Sequence */
|
||
|
#define REG_SDIO_FREE_TXPG_SEQ (SDIO_LOCAL_OFFSET + 0x0028)
|
||
|
/* HTSF Information */
|
||
|
#define REG_SDIO_HTSFR_INFO (SDIO_LOCAL_OFFSET + 0x0030)
|
||
|
#define REG_SDIO_HCPWM1_V2 (SDIO_LOCAL_OFFSET + 0x0038)
|
||
|
/* H2C */
|
||
|
#define REG_SDIO_H2C (SDIO_LOCAL_OFFSET + 0x0060)
|
||
|
/* HCI Request Power Mode 1 */
|
||
|
#define REG_SDIO_HRPWM1 (SDIO_LOCAL_OFFSET + 0x0080)
|
||
|
/* HCI Request Power Mode 2 */
|
||
|
#define REG_SDIO_HRPWM2 (SDIO_LOCAL_OFFSET + 0x0082)
|
||
|
/* HCI Power Save Clock */
|
||
|
#define REG_SDIO_HPS_CLKR (SDIO_LOCAL_OFFSET + 0x0084)
|
||
|
/* SDIO HCI Suspend Control */
|
||
|
#define REG_SDIO_HSUS_CTRL (SDIO_LOCAL_OFFSET + 0x0086)
|
||
|
#define BIT_HCI_SUS_REQ BIT(0)
|
||
|
#define BIT_HCI_RESUME_RDY BIT(1)
|
||
|
/* SDIO Host Extension Interrupt Mask Always */
|
||
|
#define REG_SDIO_HIMR_ON (SDIO_LOCAL_OFFSET + 0x0090)
|
||
|
/* SDIO Host Extension Interrupt Status Always */
|
||
|
#define REG_SDIO_HISR_ON (SDIO_LOCAL_OFFSET + 0x0091)
|
||
|
|
||
|
#define REG_SDIO_INDIRECT_REG_CFG (SDIO_LOCAL_OFFSET + 0x0040)
|
||
|
#define BIT_SDIO_INDIRECT_REG_CFG_WORD BIT(16)
|
||
|
#define BIT_SDIO_INDIRECT_REG_CFG_DWORD BIT(17)
|
||
|
#define BIT_SDIO_INDIRECT_REG_CFG_WRITE BIT(18)
|
||
|
#define BIT_SDIO_INDIRECT_REG_CFG_READ BIT(19)
|
||
|
#define BIT_SDIO_INDIRECT_REG_CFG_UNK20 BIT(20)
|
||
|
#define REG_SDIO_INDIRECT_REG_DATA (SDIO_LOCAL_OFFSET + 0x0044)
|
||
|
|
||
|
/* Sdio Address for SDIO Local Reg, TRX FIFO, MAC Reg */
|
||
|
#define REG_SDIO_CMD_ADDR_MSK GENMASK(16, 13)
|
||
|
#define REG_SDIO_CMD_ADDR_SDIO_REG 0
|
||
|
#define REG_SDIO_CMD_ADDR_MAC_REG 8
|
||
|
#define REG_SDIO_CMD_ADDR_TXFF_HIGH 4
|
||
|
#define REG_SDIO_CMD_ADDR_TXFF_LOW 6
|
||
|
#define REG_SDIO_CMD_ADDR_TXFF_NORMAL 5
|
||
|
#define REG_SDIO_CMD_ADDR_TXFF_EXTRA 7
|
||
|
#define REG_SDIO_CMD_ADDR_RXFF 7
|
||
|
|
||
|
#define RTW_SDIO_BLOCK_SIZE 512
|
||
|
#define RTW_SDIO_ADDR_RX_RX0FF_GEN(_id) (0x0e000 | ((_id) & 0x3))
|
||
|
|
||
|
#define RTW_SDIO_DATA_PTR_ALIGN 8
|
||
|
|
||
|
struct sdio_func;
|
||
|
struct sdio_device_id;
|
||
|
|
||
|
struct rtw_sdio_tx_data {
|
||
|
u8 sn;
|
||
|
};
|
||
|
|
||
|
struct rtw_sdio_work_data {
|
||
|
struct work_struct work;
|
||
|
struct rtw_dev *rtwdev;
|
||
|
};
|
||
|
|
||
|
struct rtw_sdio {
|
||
|
struct sdio_func *sdio_func;
|
||
|
|
||
|
u32 irq_mask;
|
||
|
u8 rx_addr;
|
||
|
bool sdio3_bus_mode;
|
||
|
|
||
|
void *irq_thread;
|
||
|
|
||
|
struct workqueue_struct *txwq;
|
||
|
struct rtw_sdio_work_data *tx_handler_data;
|
||
|
struct sk_buff_head tx_queue[RTK_MAX_TX_QUEUE_NUM];
|
||
|
};
|
||
|
|
||
|
extern const struct dev_pm_ops rtw_sdio_pm_ops;
|
||
|
|
||
|
int rtw_sdio_probe(struct sdio_func *sdio_func,
|
||
|
const struct sdio_device_id *id);
|
||
|
void rtw_sdio_remove(struct sdio_func *sdio_func);
|
||
|
void rtw_sdio_shutdown(struct device *dev);
|
||
|
|
||
|
static inline bool rtw_sdio_is_sdio30_supported(struct rtw_dev *rtwdev)
|
||
|
{
|
||
|
struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
|
||
|
|
||
|
return rtwsdio->sdio3_bus_mode;
|
||
|
}
|
||
|
|
||
|
#endif
|