12ee67178SXianjun Jiao /*
22ee67178SXianjun Jiao * axi lite register access driver
39e7be83fSJiao Xianjun * Author: Xianjun Jiao, Michael Mehari, Wei Liu
49e7be83fSJiao Xianjun * SPDX-FileCopyrightText: 2019 UGent
5a6085186SLina Ceballos * SPDX-License-Identifier: AGPL-3.0-or-later
62ee67178SXianjun Jiao */
72ee67178SXianjun Jiao
82ee67178SXianjun Jiao #include <linux/bitops.h>
92ee67178SXianjun Jiao #include <linux/dmapool.h>
102ee67178SXianjun Jiao #include <linux/dma/xilinx_dma.h>
112ee67178SXianjun Jiao #include <linux/init.h>
122ee67178SXianjun Jiao #include <linux/interrupt.h>
132ee67178SXianjun Jiao #include <linux/io.h>
142ee67178SXianjun Jiao #include <linux/iopoll.h>
152ee67178SXianjun Jiao #include <linux/module.h>
162ee67178SXianjun Jiao #include <linux/of_address.h>
172ee67178SXianjun Jiao #include <linux/of_dma.h>
182ee67178SXianjun Jiao #include <linux/of_platform.h>
192ee67178SXianjun Jiao #include <linux/of_irq.h>
202ee67178SXianjun Jiao #include <linux/slab.h>
212ee67178SXianjun Jiao #include <linux/clk.h>
222ee67178SXianjun Jiao #include <linux/io-64-nonatomic-lo-hi.h>
232ee67178SXianjun Jiao #include <linux/delay.h>
242ee67178SXianjun Jiao #include <net/mac80211.h>
252ee67178SXianjun Jiao
262ee67178SXianjun Jiao #include "../hw_def.h"
272ee67178SXianjun Jiao
282ee67178SXianjun Jiao static void __iomem *base_addr; // to store driver specific base address needed for mmu to translate virtual address to physical address in our FPGA design
292ee67178SXianjun Jiao
302ee67178SXianjun Jiao /* IO accessors */
reg_read(u32 reg)312ee67178SXianjun Jiao static inline u32 reg_read(u32 reg)
322ee67178SXianjun Jiao {
332ee67178SXianjun Jiao return ioread32(base_addr + reg);
342ee67178SXianjun Jiao }
352ee67178SXianjun Jiao
reg_write(u32 reg,u32 value)362ee67178SXianjun Jiao static inline void reg_write(u32 reg, u32 value)
372ee67178SXianjun Jiao {
382ee67178SXianjun Jiao iowrite32(value, base_addr + reg);
392ee67178SXianjun Jiao }
402ee67178SXianjun Jiao
XPU_REG_MULTI_RST_write(u32 Data)412ee67178SXianjun Jiao static inline void XPU_REG_MULTI_RST_write(u32 Data) {
422ee67178SXianjun Jiao reg_write(XPU_REG_MULTI_RST_ADDR, Data);
432ee67178SXianjun Jiao }
442ee67178SXianjun Jiao
XPU_REG_MULTI_RST_read(void)452ee67178SXianjun Jiao static inline u32 XPU_REG_MULTI_RST_read(void){
462ee67178SXianjun Jiao return reg_read(XPU_REG_MULTI_RST_ADDR);
472ee67178SXianjun Jiao }
482ee67178SXianjun Jiao
XPU_REG_SRC_SEL_write(u32 Data)492ee67178SXianjun Jiao static inline void XPU_REG_SRC_SEL_write(u32 Data) {
502ee67178SXianjun Jiao reg_write(XPU_REG_SRC_SEL_ADDR, Data);
512ee67178SXianjun Jiao }
522ee67178SXianjun Jiao
XPU_REG_SRC_SEL_read(void)532ee67178SXianjun Jiao static inline u32 XPU_REG_SRC_SEL_read(void){
542ee67178SXianjun Jiao return reg_read(XPU_REG_SRC_SEL_ADDR);
552ee67178SXianjun Jiao }
562ee67178SXianjun Jiao
XPU_REG_RECV_ACK_COUNT_TOP0_write(u32 Data)572ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP0_write(u32 Data) {
582ee67178SXianjun Jiao reg_write(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR, Data);
592ee67178SXianjun Jiao }
602ee67178SXianjun Jiao
XPU_REG_RECV_ACK_COUNT_TOP0_read(void)612ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP0_read(void){
622ee67178SXianjun Jiao return reg_read(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR);
632ee67178SXianjun Jiao }
642ee67178SXianjun Jiao
XPU_REG_RECV_ACK_COUNT_TOP1_write(u32 Data)652ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP1_write(u32 Data) {
662ee67178SXianjun Jiao reg_write(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR, Data);
672ee67178SXianjun Jiao }
682ee67178SXianjun Jiao
XPU_REG_RECV_ACK_COUNT_TOP1_read(void)692ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP1_read(void){
702ee67178SXianjun Jiao return reg_read(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR);
712ee67178SXianjun Jiao }
722ee67178SXianjun Jiao
XPU_REG_SEND_ACK_WAIT_TOP_write(u32 Data)732ee67178SXianjun Jiao static inline void XPU_REG_SEND_ACK_WAIT_TOP_write(u32 Data) {
742ee67178SXianjun Jiao reg_write(XPU_REG_SEND_ACK_WAIT_TOP_ADDR, Data);
752ee67178SXianjun Jiao }
762ee67178SXianjun Jiao
XPU_REG_SEND_ACK_WAIT_TOP_read(void)772ee67178SXianjun Jiao static inline u32 XPU_REG_SEND_ACK_WAIT_TOP_read(void){
782ee67178SXianjun Jiao return reg_read(XPU_REG_SEND_ACK_WAIT_TOP_ADDR);
792ee67178SXianjun Jiao }
802ee67178SXianjun Jiao
XPU_REG_FILTER_FLAG_write(u32 Data)812ee67178SXianjun Jiao static inline void XPU_REG_FILTER_FLAG_write(u32 Data) {
822ee67178SXianjun Jiao reg_write(XPU_REG_FILTER_FLAG_ADDR, Data);
832ee67178SXianjun Jiao }
842ee67178SXianjun Jiao
XPU_REG_FILTER_FLAG_read(void)852ee67178SXianjun Jiao static inline u32 XPU_REG_FILTER_FLAG_read(void){
862ee67178SXianjun Jiao return reg_read(XPU_REG_FILTER_FLAG_ADDR);
872ee67178SXianjun Jiao }
882ee67178SXianjun Jiao
XPU_REG_CTS_TO_RTS_CONFIG_write(u32 Data)892ee67178SXianjun Jiao static inline void XPU_REG_CTS_TO_RTS_CONFIG_write(u32 Data) {
902ee67178SXianjun Jiao reg_write(XPU_REG_CTS_TO_RTS_CONFIG_ADDR, Data);
912ee67178SXianjun Jiao }
922ee67178SXianjun Jiao
XPU_REG_CTS_TO_RTS_CONFIG_read(void)932ee67178SXianjun Jiao static inline u32 XPU_REG_CTS_TO_RTS_CONFIG_read(void){
942ee67178SXianjun Jiao return reg_read(XPU_REG_CTS_TO_RTS_CONFIG_ADDR);
952ee67178SXianjun Jiao }
962ee67178SXianjun Jiao
XPU_REG_MAC_ADDR_LOW_write(u32 Data)972ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_LOW_write(u32 Data) {
982ee67178SXianjun Jiao reg_write(XPU_REG_MAC_ADDR_LOW_ADDR, Data);
992ee67178SXianjun Jiao }
1002ee67178SXianjun Jiao
XPU_REG_MAC_ADDR_LOW_read(void)1012ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_LOW_read(void){
1022ee67178SXianjun Jiao return reg_read(XPU_REG_MAC_ADDR_LOW_ADDR);
1032ee67178SXianjun Jiao }
1042ee67178SXianjun Jiao
XPU_REG_MAC_ADDR_HIGH_write(u32 Data)1052ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_HIGH_write(u32 Data) {
1062ee67178SXianjun Jiao reg_write(XPU_REG_MAC_ADDR_HIGH_ADDR, Data);
1072ee67178SXianjun Jiao }
1082ee67178SXianjun Jiao
XPU_REG_MAC_ADDR_HIGH_read(void)1092ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_HIGH_read(void){
1102ee67178SXianjun Jiao return reg_read(XPU_REG_MAC_ADDR_HIGH_ADDR);
1112ee67178SXianjun Jiao }
1122ee67178SXianjun Jiao
XPU_REG_BSSID_FILTER_LOW_write(u32 Data)1132ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_LOW_write(u32 Data) {
1142ee67178SXianjun Jiao reg_write(XPU_REG_BSSID_FILTER_LOW_ADDR, Data);
1152ee67178SXianjun Jiao }
1162ee67178SXianjun Jiao
XPU_REG_BSSID_FILTER_LOW_read(void)1172ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_LOW_read(void){
1182ee67178SXianjun Jiao return reg_read(XPU_REG_BSSID_FILTER_LOW_ADDR);
1192ee67178SXianjun Jiao }
1202ee67178SXianjun Jiao
XPU_REG_BSSID_FILTER_HIGH_write(u32 Data)1212ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_HIGH_write(u32 Data) {
1222ee67178SXianjun Jiao reg_write(XPU_REG_BSSID_FILTER_HIGH_ADDR, Data);
1232ee67178SXianjun Jiao }
1242ee67178SXianjun Jiao
XPU_REG_BSSID_FILTER_HIGH_read(void)1252ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_HIGH_read(void){
1262ee67178SXianjun Jiao return reg_read(XPU_REG_BSSID_FILTER_HIGH_ADDR);
1272ee67178SXianjun Jiao }
1282ee67178SXianjun Jiao
XPU_REG_BAND_CHANNEL_write(u32 Data)1292ee67178SXianjun Jiao static inline void XPU_REG_BAND_CHANNEL_write(u32 Data) {
1302ee67178SXianjun Jiao reg_write(XPU_REG_BAND_CHANNEL_ADDR, Data);
1312ee67178SXianjun Jiao }
1322ee67178SXianjun Jiao
XPU_REG_BAND_CHANNEL_read(void)1332ee67178SXianjun Jiao static inline u32 XPU_REG_BAND_CHANNEL_read(void){
1342ee67178SXianjun Jiao return reg_read(XPU_REG_BAND_CHANNEL_ADDR);
1352ee67178SXianjun Jiao }
1362ee67178SXianjun Jiao
XPU_REG_DIFS_ADVANCE_write(u32 Data)1375deb8d18SXianjun Jiao static inline void XPU_REG_DIFS_ADVANCE_write(u32 Data) {
1385deb8d18SXianjun Jiao reg_write(XPU_REG_DIFS_ADVANCE_ADDR, Data);
1395deb8d18SXianjun Jiao }
1405deb8d18SXianjun Jiao
XPU_REG_DIFS_ADVANCE_read(void)1415deb8d18SXianjun Jiao static inline u32 XPU_REG_DIFS_ADVANCE_read(void){
1425deb8d18SXianjun Jiao return reg_read(XPU_REG_DIFS_ADVANCE_ADDR);
1435deb8d18SXianjun Jiao }
1445deb8d18SXianjun Jiao
XPU_REG_FORCE_IDLE_MISC_write(u32 Data)145bb0a2c58SXianjun Jiao static inline void XPU_REG_FORCE_IDLE_MISC_write(u32 Data) {
146bb0a2c58SXianjun Jiao reg_write(XPU_REG_FORCE_IDLE_MISC_ADDR, Data);
147bb0a2c58SXianjun Jiao }
148bb0a2c58SXianjun Jiao
XPU_REG_FORCE_IDLE_MISC_read(void)149bb0a2c58SXianjun Jiao static inline u32 XPU_REG_FORCE_IDLE_MISC_read(void){
150bb0a2c58SXianjun Jiao return reg_read(XPU_REG_FORCE_IDLE_MISC_ADDR);
151bb0a2c58SXianjun Jiao }
152bb0a2c58SXianjun Jiao
XPU_REG_TSF_RUNTIME_VAL_LOW_read(void)1532ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_LOW_read(void){
1542ee67178SXianjun Jiao return reg_read(XPU_REG_TSF_RUNTIME_VAL_LOW_ADDR);
1552ee67178SXianjun Jiao }
1562ee67178SXianjun Jiao
XPU_REG_TSF_RUNTIME_VAL_HIGH_read(void)1572ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_HIGH_read(void){
1582ee67178SXianjun Jiao return reg_read(XPU_REG_TSF_RUNTIME_VAL_HIGH_ADDR);
1592ee67178SXianjun Jiao }
1602ee67178SXianjun Jiao
XPU_REG_TSF_LOAD_VAL_LOW_write(u32 value)1612ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_LOW_write(u32 value){
1622ee67178SXianjun Jiao reg_write(XPU_REG_TSF_LOAD_VAL_LOW_ADDR, value);
1632ee67178SXianjun Jiao }
1642ee67178SXianjun Jiao
XPU_REG_TSF_LOAD_VAL_HIGH_write(u32 value)1652ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_HIGH_write(u32 value){
1662ee67178SXianjun Jiao reg_write(XPU_REG_TSF_LOAD_VAL_HIGH_ADDR, value);
1672ee67178SXianjun Jiao }
1682ee67178SXianjun Jiao
XPU_REG_TSF_LOAD_VAL_write(u32 high_value,u32 low_value)1692ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_write(u32 high_value, u32 low_value){
1702ee67178SXianjun Jiao XPU_REG_TSF_LOAD_VAL_LOW_write(low_value);
1712ee67178SXianjun Jiao XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value|0x80000000); // msb high
1722ee67178SXianjun Jiao XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value&(~0x80000000)); // msb low
1732ee67178SXianjun Jiao }
1742ee67178SXianjun Jiao
XPU_REG_LBT_TH_write(u32 value)1752ee67178SXianjun Jiao static inline void XPU_REG_LBT_TH_write(u32 value) {
1762ee67178SXianjun Jiao reg_write(XPU_REG_LBT_TH_ADDR, value);
1772ee67178SXianjun Jiao }
1782ee67178SXianjun Jiao
XPU_REG_RSSI_DB_CFG_read(void)1792ee67178SXianjun Jiao static inline u32 XPU_REG_RSSI_DB_CFG_read(void){
1802ee67178SXianjun Jiao return reg_read(XPU_REG_RSSI_DB_CFG_ADDR);
1812ee67178SXianjun Jiao }
1822ee67178SXianjun Jiao
XPU_REG_RSSI_DB_CFG_write(u32 Data)1832ee67178SXianjun Jiao static inline void XPU_REG_RSSI_DB_CFG_write(u32 Data) {
1842ee67178SXianjun Jiao reg_write(XPU_REG_RSSI_DB_CFG_ADDR, Data);
1852ee67178SXianjun Jiao }
1862ee67178SXianjun Jiao
XPU_REG_LBT_TH_read(void)1872ee67178SXianjun Jiao static inline u32 XPU_REG_LBT_TH_read(void){
1882ee67178SXianjun Jiao return reg_read(XPU_REG_LBT_TH_ADDR);
1892ee67178SXianjun Jiao }
1902ee67178SXianjun Jiao
XPU_REG_CSMA_DEBUG_write(u32 value)1912ee67178SXianjun Jiao static inline void XPU_REG_CSMA_DEBUG_write(u32 value){
1922ee67178SXianjun Jiao reg_write(XPU_REG_CSMA_DEBUG_ADDR, value);
1932ee67178SXianjun Jiao }
1942ee67178SXianjun Jiao
XPU_REG_CSMA_DEBUG_read(void)1952ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_DEBUG_read(void){
1962ee67178SXianjun Jiao return reg_read(XPU_REG_CSMA_DEBUG_ADDR);
1972ee67178SXianjun Jiao }
1982ee67178SXianjun Jiao
XPU_REG_CSMA_CFG_write(u32 value)1992ee67178SXianjun Jiao static inline void XPU_REG_CSMA_CFG_write(u32 value){
2002ee67178SXianjun Jiao reg_write(XPU_REG_CSMA_CFG_ADDR, value);
2012ee67178SXianjun Jiao }
2022ee67178SXianjun Jiao
XPU_REG_CSMA_CFG_read(void)2032ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_CFG_read(void){
2042ee67178SXianjun Jiao return reg_read(XPU_REG_CSMA_CFG_ADDR);
2052ee67178SXianjun Jiao }
2062ee67178SXianjun Jiao
XPU_REG_SLICE_COUNT_TOTAL_write(u32 value)207838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_TOTAL_write(u32 value){
208838a9007SXianjun Jiao reg_write(XPU_REG_SLICE_COUNT_TOTAL_ADDR, value);
2092ee67178SXianjun Jiao }
XPU_REG_SLICE_COUNT_START_write(u32 value)210838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_START_write(u32 value){
211838a9007SXianjun Jiao reg_write(XPU_REG_SLICE_COUNT_START_ADDR, value);
2122ee67178SXianjun Jiao }
XPU_REG_SLICE_COUNT_END_write(u32 value)213838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_END_write(u32 value){
214838a9007SXianjun Jiao reg_write(XPU_REG_SLICE_COUNT_END_ADDR, value);
2152ee67178SXianjun Jiao }
2162ee67178SXianjun Jiao
217838a9007SXianjun Jiao
XPU_REG_SLICE_COUNT_TOTAL_read(void)218838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_TOTAL_read(void){
219838a9007SXianjun Jiao return reg_read(XPU_REG_SLICE_COUNT_TOTAL_ADDR);
2202ee67178SXianjun Jiao }
XPU_REG_SLICE_COUNT_START_read(void)221838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_START_read(void){
222838a9007SXianjun Jiao return reg_read(XPU_REG_SLICE_COUNT_START_ADDR);
2232ee67178SXianjun Jiao }
XPU_REG_SLICE_COUNT_END_read(void)224838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_END_read(void){
225838a9007SXianjun Jiao return reg_read(XPU_REG_SLICE_COUNT_END_ADDR);
2262ee67178SXianjun Jiao }
227838a9007SXianjun Jiao
XPU_REG_BB_RF_DELAY_write(u32 value)2282ee67178SXianjun Jiao static inline void XPU_REG_BB_RF_DELAY_write(u32 value){
2292ee67178SXianjun Jiao reg_write(XPU_REG_BB_RF_DELAY_ADDR, value);
2302ee67178SXianjun Jiao }
2312ee67178SXianjun Jiao
XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write(u32 value)232913a9e94SXianjun Jiao static inline void XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write(u32 value){
233913a9e94SXianjun Jiao reg_write(XPU_REG_ACK_CTL_MAX_NUM_RETRANS_ADDR, value);
234913a9e94SXianjun Jiao }
XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read(void)235913a9e94SXianjun Jiao static inline u32 XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read(void){
236913a9e94SXianjun Jiao return reg_read(XPU_REG_ACK_CTL_MAX_NUM_RETRANS_ADDR);
2372ee67178SXianjun Jiao }
2382ee67178SXianjun Jiao
XPU_REG_AMPDU_ACTION_write(u32 Data)239261bb9eeSmmehari static inline void XPU_REG_AMPDU_ACTION_write(u32 Data) {
240261bb9eeSmmehari reg_write(XPU_REG_AMPDU_ACTION_ADDR, Data);
241261bb9eeSmmehari }
242261bb9eeSmmehari
XPU_REG_AMPDU_ACTION_read(void)243261bb9eeSmmehari static inline u32 XPU_REG_AMPDU_ACTION_read(void){
244261bb9eeSmmehari return reg_read(XPU_REG_AMPDU_ACTION_ADDR);
245261bb9eeSmmehari }
246261bb9eeSmmehari
XPU_REG_SPI_DISABLE_write(u32 Data)247bc98f5bbSthavinga static inline void XPU_REG_SPI_DISABLE_write(u32 Data) {
248bc98f5bbSthavinga reg_write(XPU_REG_SPI_DISABLE_ADDR, Data);
249bc98f5bbSthavinga }
250bc98f5bbSthavinga
XPU_REG_SPI_DISABLE_read(void)251bc98f5bbSthavinga static inline u32 XPU_REG_SPI_DISABLE_read(void){
252bc98f5bbSthavinga return reg_read(XPU_REG_SPI_DISABLE_ADDR);
253bc98f5bbSthavinga }
254bc98f5bbSthavinga
XPU_REG_MAC_ADDR_write(u8 * mac_addr)2552ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_write(u8 *mac_addr) {//, u32 en_flag){
2562ee67178SXianjun Jiao XPU_REG_MAC_ADDR_LOW_write( *( (u32*)(mac_addr) ) );
2572ee67178SXianjun Jiao XPU_REG_MAC_ADDR_HIGH_write( *( (u16*)(mac_addr + 4) ) );
2582ee67178SXianjun Jiao #if 0
2592ee67178SXianjun Jiao if (en_flag) {
2602ee67178SXianjun Jiao XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) | 0x80000000 ); // 0x80000000 by default we turn on mac addr filter
2612ee67178SXianjun Jiao } else {
2622ee67178SXianjun Jiao XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) & 0x7FFFFFFF );
2632ee67178SXianjun Jiao }
2642ee67178SXianjun Jiao #endif
2652ee67178SXianjun Jiao }
2662ee67178SXianjun Jiao
2672ee67178SXianjun Jiao static const struct of_device_id dev_of_ids[] = {
2682ee67178SXianjun Jiao { .compatible = "sdr,xpu", },
2692ee67178SXianjun Jiao {}
2702ee67178SXianjun Jiao };
2712ee67178SXianjun Jiao MODULE_DEVICE_TABLE(of, dev_of_ids);
2722ee67178SXianjun Jiao
2732ee67178SXianjun Jiao static struct xpu_driver_api xpu_driver_api_inst;
274*db8c69b6Srobgar2001 struct xpu_driver_api *xpu_api = &xpu_driver_api_inst;
2752ee67178SXianjun Jiao EXPORT_SYMBOL(xpu_api);
2762ee67178SXianjun Jiao
hw_init(enum xpu_mode mode)2772ee67178SXianjun Jiao static inline u32 hw_init(enum xpu_mode mode){
278838a9007SXianjun Jiao int err=0, i, rssi_half_db_th, rssi_half_db_offset, agc_gain_delay;
279bb0a2c58SXianjun Jiao u32 filter_flag = 0;
2802ee67178SXianjun Jiao
2812ee67178SXianjun Jiao printk("%s hw_init mode %d\n", xpu_compatible_str, mode);
2822ee67178SXianjun Jiao
283838a9007SXianjun Jiao //rst
284838a9007SXianjun Jiao for (i=0;i<8;i++)
285838a9007SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_write(0);
286838a9007SXianjun Jiao for (i=0;i<32;i++)
2872ee67178SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_write(0xFFFFFFFF);
288838a9007SXianjun Jiao for (i=0;i<8;i++)
2892ee67178SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_write(0);
2902ee67178SXianjun Jiao
2912ee67178SXianjun Jiao // http://www.studioreti.it/slide/802-11-Frame_E_C.pdf
2922ee67178SXianjun Jiao // https://mrncciew.com/2014/10/14/cwap-802-11-phy-ppdu/
2932ee67178SXianjun Jiao // https://mrncciew.com/2014/09/27/cwap-mac-header-frame-control/
2942ee67178SXianjun Jiao // https://mrncciew.com/2014/10/25/cwap-mac-header-durationid/
2952ee67178SXianjun Jiao // https://mrncciew.com/2014/11/01/cwap-mac-header-sequence-control/
2962ee67178SXianjun Jiao // https://witestlab.poly.edu/blog/802-11-wireless-lan-2/
2972ee67178SXianjun Jiao // phy_rx byte idx:
2982ee67178SXianjun Jiao // 5(3 sig + 2 service), -- PHY
2992ee67178SXianjun Jiao // 2 frame control, 2 duration/conn ID, --MAC PDU
3002ee67178SXianjun Jiao // 6 receiver address, 6 destination address, 6 transmitter address
3012ee67178SXianjun Jiao // 2 sequence control
3022ee67178SXianjun Jiao // 6 source address
3032ee67178SXianjun Jiao // reg_val = 5 + 0;
3042ee67178SXianjun Jiao // xpu_api->XPU_REG_PHY_RX_PKT_READ_OFFSET_write(reg_val);
3052ee67178SXianjun Jiao // printk("%s hw_init XPU_REG_PHY_RX_PKT_READ_OFFSET_write %d\n", xpu_compatible_str, reg_val);
3062ee67178SXianjun Jiao
3072ee67178SXianjun Jiao // by default turn off filter, because all register are zeros
3082ee67178SXianjun Jiao // let's filter out packet according to: enum ieee80211_filter_flags at: https://www.kernel.org/doc/html/v4.9/80211/mac80211.html
3092ee67178SXianjun Jiao #if 0 // define in FPGA
3102ee67178SXianjun Jiao localparam [13:0] FIF_ALLMULTI = 14b00000000000010, //get all mac addr like 01:00:5E:xx:xx:xx and 33:33:xx:xx:xx:xx through to ARM
3112ee67178SXianjun Jiao FIF_FCSFAIL = 14b00000000000100, //not support
3122ee67178SXianjun Jiao FIF_PLCPFAIL = 14b00000000001000, //not support
3132ee67178SXianjun Jiao FIF_BCN_PRBRESP_PROMISC= 14b00000000010000,
3142ee67178SXianjun Jiao FIF_CONTROL = 14b00000000100000,
3152ee67178SXianjun Jiao FIF_OTHER_BSS = 14b00000001000000,
3162ee67178SXianjun Jiao FIF_PSPOLL = 14b00000010000000,
3172ee67178SXianjun Jiao FIF_PROBE_REQ = 14b00000100000000,
3182ee67178SXianjun Jiao UNICAST_FOR_US = 14b00001000000000,
3192ee67178SXianjun Jiao BROADCAST_ALL_ONE = 14b00010000000000,
3202ee67178SXianjun Jiao BROADCAST_ALL_ZERO = 14b00100000000000,
3212ee67178SXianjun Jiao MY_BEACON = 14b01000000000000,
3222ee67178SXianjun Jiao MONITOR_ALL = 14b10000000000000;
3232ee67178SXianjun Jiao #endif
3242ee67178SXianjun Jiao filter_flag = (FIF_ALLMULTI|FIF_FCSFAIL|FIF_PLCPFAIL|FIF_BCN_PRBRESP_PROMISC|FIF_CONTROL|FIF_OTHER_BSS|FIF_PSPOLL|FIF_PROBE_REQ|UNICAST_FOR_US|BROADCAST_ALL_ONE|BROADCAST_ALL_ZERO|MY_BEACON|MONITOR_ALL);
3252ee67178SXianjun Jiao xpu_api->XPU_REG_FILTER_FLAG_write(filter_flag);
3262ee67178SXianjun Jiao xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write(0xB<<16);//6M 1011:0xB
3272ee67178SXianjun Jiao
3282ee67178SXianjun Jiao // after send data frame wait for ACK, this will be set in real time in function ad9361_rf_set_channel
329febc5adfSXianjun Jiao // xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (((51+2)*10)<<16) | 10 ); // high 16 bits to cover sig valid of ACK packet, low 16 bits is adjustment of fcs valid waiting time. let's add 2us for those device that is really "slow"!
330febc5adfSXianjun Jiao // xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( 6*10 ); // +6 = 16us for 5GHz
3312ee67178SXianjun Jiao
332bb0a2c58SXianjun Jiao //xpu_api->XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write(3); // if this > 0, it will override mac80211 set value, and set static retransmission limit
3332ee67178SXianjun Jiao
334bc98f5bbSthavinga // From CMW measurement: lo up 1us before the packet; lo down 0.4us after the packet/RF port switches 1.2us before and 0.2us after
335bc98f5bbSthavinga xpu_api->XPU_REG_BB_RF_DELAY_write((16<<24)|(0<<16)|(26<<8)|9); // calibrated by ila and spectrum analyzer (trigger mode)
3362ee67178SXianjun Jiao
3371265742eSXianjun Jiao // setup time schedule of all queues. all time open.
3381265742eSXianjun Jiao for (i=0; i<4; i++) {
3391265742eSXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((i<<20)|16);//total 16us
3401265742eSXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_START_write((i<<20)|0); //start 0us
3411265742eSXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_END_write((i<<20)|16); //end 16us
3421265742eSXianjun Jiao }
343838a9007SXianjun Jiao
344838a9007SXianjun Jiao // all slice sync rest
345838a9007SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_write(1<<7); //bit7 reset the counter for all queues at the same time
346838a9007SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_write(0<<7);
3472ee67178SXianjun Jiao
3482ee67178SXianjun Jiao switch(mode)
3492ee67178SXianjun Jiao {
3502ee67178SXianjun Jiao case XPU_TEST:
3512ee67178SXianjun Jiao printk("%s hw_init mode XPU_TEST\n", xpu_compatible_str);
3522ee67178SXianjun Jiao break;
3532ee67178SXianjun Jiao
3542ee67178SXianjun Jiao case XPU_NORMAL:
3552ee67178SXianjun Jiao printk("%s hw_init mode XPU_NORMAL\n", xpu_compatible_str);
3562ee67178SXianjun Jiao break;
3572ee67178SXianjun Jiao
3582ee67178SXianjun Jiao default:
3592ee67178SXianjun Jiao printk("%s hw_init mode %d is wrong!\n", xpu_compatible_str, mode);
3602ee67178SXianjun Jiao err=1;
3612ee67178SXianjun Jiao }
3622ee67178SXianjun Jiao xpu_api->XPU_REG_BAND_CHANNEL_write((false<<24)|(BAND_5_8GHZ<<16)|44);//use_short_slot==false; 5.8GHz; channel 44 -- default setting to sync with priv->band/channel/use_short_slot
3632ee67178SXianjun Jiao
364e3fb22a4SXianjun Jiao agc_gain_delay = 39; //samples
3652ee67178SXianjun Jiao rssi_half_db_offset = 75<<1;
3662ee67178SXianjun Jiao xpu_api->XPU_REG_RSSI_DB_CFG_write(0x80000000|((rssi_half_db_offset<<16)|agc_gain_delay) );
3672ee67178SXianjun Jiao xpu_api->XPU_REG_RSSI_DB_CFG_write((~0x80000000)&((rssi_half_db_offset<<16)|agc_gain_delay) );
3682ee67178SXianjun Jiao
3692ee67178SXianjun Jiao //rssi_half_db_th = 70<<1; // with splitter
3702ee67178SXianjun Jiao rssi_half_db_th = 87<<1; // -62dBm
371bb0a2c58SXianjun Jiao xpu_api->XPU_REG_LBT_TH_write(rssi_half_db_th); // set IQ rssi th step .5dB to xxx and enable it
372bb0a2c58SXianjun Jiao
373c9989970SXianjun Jiao // control the duration to force ch_idle after decoding a packet due to imperfection of agc and signals
374c9989970SXianjun Jiao // (1<<26) to disable eifs_trigger_by_last_tx_fail by default (standard does not ask so)
375c9989970SXianjun Jiao xpu_api->XPU_REG_FORCE_IDLE_MISC_write((1<<26)|75);
3762ee67178SXianjun Jiao
3772ee67178SXianjun Jiao //xpu_api->XPU_REG_CSMA_DEBUG_write((1<<31)|(20<<24)|(4<<19)|(3<<14)|(10<<7)|(5));
3782ee67178SXianjun Jiao xpu_api->XPU_REG_CSMA_DEBUG_write(0);
3792ee67178SXianjun Jiao
380bb0a2c58SXianjun Jiao // xpu_api->XPU_REG_CSMA_CFG_write(268435459); // Linux will do config for each queue via openwifi_conf_tx
381bb0a2c58SXianjun Jiao // xpu_api->XPU_REG_CSMA_CFG_write(0xe0000000); // Linux will do config for each queue via openwifi_conf_tx
3822ee67178SXianjun Jiao
383d4c3d810SXianjun Jiao // // ------- assume 2.4 and 5GHz have the same SIFS (6us signal extension) --------
384d4c3d810SXianjun Jiao xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((16+25)<<16)|((16+25)<<0) );
385d4c3d810SXianjun Jiao xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write( (1<<31) | (((51+2+2)*10 + 15)<<16) | 10 );//2.4GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
386b597510cSXianjun Jiao xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (1<<31) | (((51+2+2)*10 + 15)<<16) | 10 );//5GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
387d4c3d810SXianjun Jiao // // ------- assume 2.4 and 5GHz have different SIFS --------
388d4c3d810SXianjun Jiao // xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((16+23)<<16)|(0+23) );
389d4c3d810SXianjun Jiao // xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write( (1<<31) | (((45+2+2)*10 + 15)<<16) | 10 );//2.4GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
390d4c3d810SXianjun Jiao // xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (1<<31) | (((51+2+2)*10 + 15)<<16) | 10 );//5GHz. extra 300 clocks are needed when rx core fall into fake ht detection phase (rx mcs 6M)
3912ee67178SXianjun Jiao
392585a5601SXianjun Jiao xpu_api->XPU_REG_DIFS_ADVANCE_write((OPENWIFI_MAX_SIGNAL_LEN_TH<<16)|2); //us. bit31~16 max pkt length threshold
3935deb8d18SXianjun Jiao
3942ee67178SXianjun Jiao printk("%s hw_init err %d\n", xpu_compatible_str, err);
3952ee67178SXianjun Jiao return(err);
3962ee67178SXianjun Jiao }
3972ee67178SXianjun Jiao
dev_probe(struct platform_device * pdev)3982ee67178SXianjun Jiao static int dev_probe(struct platform_device *pdev)
3992ee67178SXianjun Jiao {
4002ee67178SXianjun Jiao struct device_node *np = pdev->dev.of_node;
4012ee67178SXianjun Jiao struct resource *io;
4022ee67178SXianjun Jiao u32 test_us0, test_us1, test_us2;
4032ee67178SXianjun Jiao int err=1;
4042ee67178SXianjun Jiao
4052ee67178SXianjun Jiao printk("\n");
4062ee67178SXianjun Jiao
4072ee67178SXianjun Jiao if (np) {
4082ee67178SXianjun Jiao const struct of_device_id *match;
4092ee67178SXianjun Jiao
4102ee67178SXianjun Jiao match = of_match_node(dev_of_ids, np);
4112ee67178SXianjun Jiao if (match) {
4122ee67178SXianjun Jiao printk("%s dev_probe match!\n", xpu_compatible_str);
4132ee67178SXianjun Jiao err = 0;
4142ee67178SXianjun Jiao }
4152ee67178SXianjun Jiao }
4162ee67178SXianjun Jiao
4172ee67178SXianjun Jiao if (err)
4182ee67178SXianjun Jiao return err;
4192ee67178SXianjun Jiao
4202ee67178SXianjun Jiao xpu_api->hw_init=hw_init;
4212ee67178SXianjun Jiao
4222ee67178SXianjun Jiao xpu_api->reg_read=reg_read;
4232ee67178SXianjun Jiao xpu_api->reg_write=reg_write;
4242ee67178SXianjun Jiao
4252ee67178SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_write=XPU_REG_MULTI_RST_write;
4262ee67178SXianjun Jiao xpu_api->XPU_REG_MULTI_RST_read=XPU_REG_MULTI_RST_read;
4272ee67178SXianjun Jiao xpu_api->XPU_REG_SRC_SEL_write=XPU_REG_SRC_SEL_write;
4282ee67178SXianjun Jiao xpu_api->XPU_REG_SRC_SEL_read=XPU_REG_SRC_SEL_read;
4292ee67178SXianjun Jiao
4302ee67178SXianjun Jiao xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write=XPU_REG_RECV_ACK_COUNT_TOP0_write;
4312ee67178SXianjun Jiao xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_read=XPU_REG_RECV_ACK_COUNT_TOP0_read;
4322ee67178SXianjun Jiao xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write=XPU_REG_RECV_ACK_COUNT_TOP1_write;
4332ee67178SXianjun Jiao xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_read=XPU_REG_RECV_ACK_COUNT_TOP1_read;
4342ee67178SXianjun Jiao xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write=XPU_REG_SEND_ACK_WAIT_TOP_write;
4352ee67178SXianjun Jiao xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_read=XPU_REG_SEND_ACK_WAIT_TOP_read;
4362ee67178SXianjun Jiao xpu_api->XPU_REG_MAC_ADDR_LOW_write=XPU_REG_MAC_ADDR_LOW_write;
4372ee67178SXianjun Jiao xpu_api->XPU_REG_MAC_ADDR_LOW_read=XPU_REG_MAC_ADDR_LOW_read;
4382ee67178SXianjun Jiao xpu_api->XPU_REG_MAC_ADDR_HIGH_write=XPU_REG_MAC_ADDR_HIGH_write;
4392ee67178SXianjun Jiao xpu_api->XPU_REG_MAC_ADDR_HIGH_read=XPU_REG_MAC_ADDR_HIGH_read;
4402ee67178SXianjun Jiao
4412ee67178SXianjun Jiao xpu_api->XPU_REG_FILTER_FLAG_write=XPU_REG_FILTER_FLAG_write;
4422ee67178SXianjun Jiao xpu_api->XPU_REG_FILTER_FLAG_read=XPU_REG_FILTER_FLAG_read;
4432ee67178SXianjun Jiao xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write=XPU_REG_CTS_TO_RTS_CONFIG_write;
4442ee67178SXianjun Jiao xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_read=XPU_REG_CTS_TO_RTS_CONFIG_read;
4452ee67178SXianjun Jiao xpu_api->XPU_REG_BSSID_FILTER_LOW_write=XPU_REG_BSSID_FILTER_LOW_write;
4462ee67178SXianjun Jiao xpu_api->XPU_REG_BSSID_FILTER_LOW_read=XPU_REG_BSSID_FILTER_LOW_read;
4472ee67178SXianjun Jiao xpu_api->XPU_REG_BSSID_FILTER_HIGH_write=XPU_REG_BSSID_FILTER_HIGH_write;
4482ee67178SXianjun Jiao xpu_api->XPU_REG_BSSID_FILTER_HIGH_read=XPU_REG_BSSID_FILTER_HIGH_read;
4492ee67178SXianjun Jiao
4502ee67178SXianjun Jiao xpu_api->XPU_REG_BAND_CHANNEL_write=XPU_REG_BAND_CHANNEL_write;
4512ee67178SXianjun Jiao xpu_api->XPU_REG_BAND_CHANNEL_read=XPU_REG_BAND_CHANNEL_read;
4522ee67178SXianjun Jiao
4535deb8d18SXianjun Jiao xpu_api->XPU_REG_DIFS_ADVANCE_write=XPU_REG_DIFS_ADVANCE_write;
4545deb8d18SXianjun Jiao xpu_api->XPU_REG_DIFS_ADVANCE_read=XPU_REG_DIFS_ADVANCE_read;
4555deb8d18SXianjun Jiao
456bb0a2c58SXianjun Jiao xpu_api->XPU_REG_FORCE_IDLE_MISC_write=XPU_REG_FORCE_IDLE_MISC_write;
457bb0a2c58SXianjun Jiao xpu_api->XPU_REG_FORCE_IDLE_MISC_read=XPU_REG_FORCE_IDLE_MISC_read;
458bb0a2c58SXianjun Jiao
4592ee67178SXianjun Jiao xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read=XPU_REG_TSF_RUNTIME_VAL_LOW_read;
4602ee67178SXianjun Jiao xpu_api->XPU_REG_TSF_RUNTIME_VAL_HIGH_read=XPU_REG_TSF_RUNTIME_VAL_HIGH_read;
4612ee67178SXianjun Jiao xpu_api->XPU_REG_TSF_LOAD_VAL_LOW_write=XPU_REG_TSF_LOAD_VAL_LOW_write;
4622ee67178SXianjun Jiao xpu_api->XPU_REG_TSF_LOAD_VAL_HIGH_write=XPU_REG_TSF_LOAD_VAL_HIGH_write;
4632ee67178SXianjun Jiao xpu_api->XPU_REG_TSF_LOAD_VAL_write=XPU_REG_TSF_LOAD_VAL_write;
4642ee67178SXianjun Jiao
4652ee67178SXianjun Jiao xpu_api->XPU_REG_LBT_TH_write=XPU_REG_LBT_TH_write;
4662ee67178SXianjun Jiao xpu_api->XPU_REG_LBT_TH_read=XPU_REG_LBT_TH_read;
4672ee67178SXianjun Jiao
4682ee67178SXianjun Jiao xpu_api->XPU_REG_RSSI_DB_CFG_read=XPU_REG_RSSI_DB_CFG_read;
4692ee67178SXianjun Jiao xpu_api->XPU_REG_RSSI_DB_CFG_write=XPU_REG_RSSI_DB_CFG_write;
4702ee67178SXianjun Jiao
4712ee67178SXianjun Jiao xpu_api->XPU_REG_CSMA_DEBUG_write=XPU_REG_CSMA_DEBUG_write;
4722ee67178SXianjun Jiao xpu_api->XPU_REG_CSMA_DEBUG_read=XPU_REG_CSMA_DEBUG_read;
4732ee67178SXianjun Jiao
4742ee67178SXianjun Jiao xpu_api->XPU_REG_CSMA_CFG_write=XPU_REG_CSMA_CFG_write;
4752ee67178SXianjun Jiao xpu_api->XPU_REG_CSMA_CFG_read=XPU_REG_CSMA_CFG_read;
4762ee67178SXianjun Jiao
477838a9007SXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write=XPU_REG_SLICE_COUNT_TOTAL_write;
478838a9007SXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_START_write=XPU_REG_SLICE_COUNT_START_write;
479838a9007SXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_END_write=XPU_REG_SLICE_COUNT_END_write;
4802ee67178SXianjun Jiao
481838a9007SXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_TOTAL_read=XPU_REG_SLICE_COUNT_TOTAL_read;
482838a9007SXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_START_read=XPU_REG_SLICE_COUNT_START_read;
483838a9007SXianjun Jiao xpu_api->XPU_REG_SLICE_COUNT_END_read=XPU_REG_SLICE_COUNT_END_read;
4842ee67178SXianjun Jiao
4852ee67178SXianjun Jiao xpu_api->XPU_REG_BB_RF_DELAY_write=XPU_REG_BB_RF_DELAY_write;
486913a9e94SXianjun Jiao
487913a9e94SXianjun Jiao xpu_api->XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write=XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write;
488913a9e94SXianjun Jiao xpu_api->XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read=XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read;
4892ee67178SXianjun Jiao
490261bb9eeSmmehari xpu_api->XPU_REG_AMPDU_ACTION_write=XPU_REG_AMPDU_ACTION_write;
491261bb9eeSmmehari xpu_api->XPU_REG_AMPDU_ACTION_read=XPU_REG_AMPDU_ACTION_read;
492261bb9eeSmmehari
493bc98f5bbSthavinga xpu_api->XPU_REG_SPI_DISABLE_write=XPU_REG_SPI_DISABLE_write;
494bc98f5bbSthavinga xpu_api->XPU_REG_SPI_DISABLE_read=XPU_REG_SPI_DISABLE_read;
495bc98f5bbSthavinga
4962ee67178SXianjun Jiao xpu_api->XPU_REG_MAC_ADDR_write=XPU_REG_MAC_ADDR_write;
4972ee67178SXianjun Jiao
4982ee67178SXianjun Jiao /* Request and map I/O memory */
4992ee67178SXianjun Jiao io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5002ee67178SXianjun Jiao base_addr = devm_ioremap_resource(&pdev->dev, io);
5012ee67178SXianjun Jiao if (IS_ERR(base_addr))
5022ee67178SXianjun Jiao return PTR_ERR(base_addr);
5032ee67178SXianjun Jiao
5042ee67178SXianjun Jiao printk("%s dev_probe io start 0x%08x end 0x%08x name %s flags 0x%08x desc 0x%08x\n", xpu_compatible_str,io->start,io->end,io->name,(u32)io->flags,(u32)io->desc);
5052ee67178SXianjun Jiao printk("%s dev_probe base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5062ee67178SXianjun Jiao printk("%s dev_probe xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5072ee67178SXianjun Jiao printk("%s dev_probe xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
5082ee67178SXianjun Jiao
5092ee67178SXianjun Jiao printk("%s dev_probe reset tsf timer\n", xpu_compatible_str);
5102ee67178SXianjun Jiao xpu_api->XPU_REG_TSF_LOAD_VAL_write(0,0);
5112ee67178SXianjun Jiao test_us0 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5122ee67178SXianjun Jiao mdelay(33);
5132ee67178SXianjun Jiao test_us1 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5142ee67178SXianjun Jiao mdelay(67);
5152ee67178SXianjun Jiao test_us2 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5162ee67178SXianjun Jiao printk("%s dev_probe XPU_REG_TSF_RUNTIME_VAL_LOW_read %d %d %dus\n", xpu_compatible_str, test_us0, test_us1, test_us2);
5172ee67178SXianjun Jiao
5182ee67178SXianjun Jiao printk("%s dev_probe succeed!\n", xpu_compatible_str);
5192ee67178SXianjun Jiao
5202ee67178SXianjun Jiao err = hw_init(XPU_NORMAL);
5212ee67178SXianjun Jiao
5222ee67178SXianjun Jiao return err;
5232ee67178SXianjun Jiao }
5242ee67178SXianjun Jiao
dev_remove(struct platform_device * pdev)5252ee67178SXianjun Jiao static int dev_remove(struct platform_device *pdev)
5262ee67178SXianjun Jiao {
5272ee67178SXianjun Jiao printk("\n");
5282ee67178SXianjun Jiao
5292ee67178SXianjun Jiao printk("%s dev_remove base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5302ee67178SXianjun Jiao printk("%s dev_remove xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5312ee67178SXianjun Jiao printk("%s dev_remove xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
5322ee67178SXianjun Jiao
5332ee67178SXianjun Jiao printk("%s dev_remove succeed!\n", xpu_compatible_str);
5342ee67178SXianjun Jiao return 0;
5352ee67178SXianjun Jiao }
5362ee67178SXianjun Jiao
5372ee67178SXianjun Jiao static struct platform_driver dev_driver = {
5382ee67178SXianjun Jiao .driver = {
5392ee67178SXianjun Jiao .name = "sdr,xpu",
5402ee67178SXianjun Jiao .owner = THIS_MODULE,
5412ee67178SXianjun Jiao .of_match_table = dev_of_ids,
5422ee67178SXianjun Jiao },
5432ee67178SXianjun Jiao .probe = dev_probe,
5442ee67178SXianjun Jiao .remove = dev_remove,
5452ee67178SXianjun Jiao };
5462ee67178SXianjun Jiao
5472ee67178SXianjun Jiao module_platform_driver(dev_driver);
5482ee67178SXianjun Jiao
5492ee67178SXianjun Jiao MODULE_AUTHOR("Xianjun Jiao");
5502ee67178SXianjun Jiao MODULE_DESCRIPTION("sdr,xpu");
5512ee67178SXianjun Jiao MODULE_LICENSE("GPL v2");
552