xref: /openwifi/driver/xpu/xpu.c (revision a6085186d94dfe08b0e09c18c8d4b1b4fe38ea35)
12ee67178SXianjun Jiao /*
22ee67178SXianjun Jiao  * axi lite register access driver
3*a6085186SLina Ceballos  * SPDX-FileCopyrightText: 2019 Jiao Xianjun <[email protected]>
4*a6085186SLina Ceballos  * SPDX-License-Identifier: AGPL-3.0-or-later
52ee67178SXianjun Jiao */
62ee67178SXianjun Jiao 
72ee67178SXianjun Jiao #include <linux/bitops.h>
82ee67178SXianjun Jiao #include <linux/dmapool.h>
92ee67178SXianjun Jiao #include <linux/dma/xilinx_dma.h>
102ee67178SXianjun Jiao #include <linux/init.h>
112ee67178SXianjun Jiao #include <linux/interrupt.h>
122ee67178SXianjun Jiao #include <linux/io.h>
132ee67178SXianjun Jiao #include <linux/iopoll.h>
142ee67178SXianjun Jiao #include <linux/module.h>
152ee67178SXianjun Jiao #include <linux/of_address.h>
162ee67178SXianjun Jiao #include <linux/of_dma.h>
172ee67178SXianjun Jiao #include <linux/of_platform.h>
182ee67178SXianjun Jiao #include <linux/of_irq.h>
192ee67178SXianjun Jiao #include <linux/slab.h>
202ee67178SXianjun Jiao #include <linux/clk.h>
212ee67178SXianjun Jiao #include <linux/io-64-nonatomic-lo-hi.h>
222ee67178SXianjun Jiao #include <linux/delay.h>
232ee67178SXianjun Jiao #include <net/mac80211.h>
242ee67178SXianjun Jiao 
252ee67178SXianjun Jiao #include "../hw_def.h"
262ee67178SXianjun Jiao 
272ee67178SXianjun 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
282ee67178SXianjun Jiao 
292ee67178SXianjun Jiao /* IO accessors */
302ee67178SXianjun Jiao static inline u32 reg_read(u32 reg)
312ee67178SXianjun Jiao {
322ee67178SXianjun Jiao 	return ioread32(base_addr + reg);
332ee67178SXianjun Jiao }
342ee67178SXianjun Jiao 
352ee67178SXianjun Jiao static inline void reg_write(u32 reg, u32 value)
362ee67178SXianjun Jiao {
372ee67178SXianjun Jiao 	iowrite32(value, base_addr + reg);
382ee67178SXianjun Jiao }
392ee67178SXianjun Jiao 
402ee67178SXianjun Jiao static inline void XPU_REG_MULTI_RST_write(u32 Data) {
412ee67178SXianjun Jiao 	reg_write(XPU_REG_MULTI_RST_ADDR, Data);
422ee67178SXianjun Jiao }
432ee67178SXianjun Jiao 
442ee67178SXianjun Jiao static inline u32 XPU_REG_MULTI_RST_read(void){
452ee67178SXianjun Jiao 	return reg_read(XPU_REG_MULTI_RST_ADDR);
462ee67178SXianjun Jiao }
472ee67178SXianjun Jiao 
482ee67178SXianjun Jiao static inline void XPU_REG_SRC_SEL_write(u32 Data) {
492ee67178SXianjun Jiao 	reg_write(XPU_REG_SRC_SEL_ADDR, Data);
502ee67178SXianjun Jiao }
512ee67178SXianjun Jiao 
522ee67178SXianjun Jiao static inline u32 XPU_REG_SRC_SEL_read(void){
532ee67178SXianjun Jiao 	return reg_read(XPU_REG_SRC_SEL_ADDR);
542ee67178SXianjun Jiao }
552ee67178SXianjun Jiao 
562ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP0_write(u32 Data) {
572ee67178SXianjun Jiao 	reg_write(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR, Data);
582ee67178SXianjun Jiao }
592ee67178SXianjun Jiao 
602ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP0_read(void){
612ee67178SXianjun Jiao 	return reg_read(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR);
622ee67178SXianjun Jiao }
632ee67178SXianjun Jiao 
642ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP1_write(u32 Data) {
652ee67178SXianjun Jiao 	reg_write(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR, Data);
662ee67178SXianjun Jiao }
672ee67178SXianjun Jiao 
682ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP1_read(void){
692ee67178SXianjun Jiao 	return reg_read(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR);
702ee67178SXianjun Jiao }
712ee67178SXianjun Jiao 
722ee67178SXianjun Jiao static inline void XPU_REG_SEND_ACK_WAIT_TOP_write(u32 Data) {
732ee67178SXianjun Jiao 	reg_write(XPU_REG_SEND_ACK_WAIT_TOP_ADDR, Data);
742ee67178SXianjun Jiao }
752ee67178SXianjun Jiao 
762ee67178SXianjun Jiao static inline u32 XPU_REG_SEND_ACK_WAIT_TOP_read(void){
772ee67178SXianjun Jiao 	return reg_read(XPU_REG_SEND_ACK_WAIT_TOP_ADDR);
782ee67178SXianjun Jiao }
792ee67178SXianjun Jiao 
802ee67178SXianjun Jiao static inline void XPU_REG_FILTER_FLAG_write(u32 Data) {
812ee67178SXianjun Jiao 	reg_write(XPU_REG_FILTER_FLAG_ADDR, Data);
822ee67178SXianjun Jiao }
832ee67178SXianjun Jiao 
842ee67178SXianjun Jiao static inline u32 XPU_REG_FILTER_FLAG_read(void){
852ee67178SXianjun Jiao 	return reg_read(XPU_REG_FILTER_FLAG_ADDR);
862ee67178SXianjun Jiao }
872ee67178SXianjun Jiao 
882ee67178SXianjun Jiao static inline void XPU_REG_CTS_TO_RTS_CONFIG_write(u32 Data) {
892ee67178SXianjun Jiao 	reg_write(XPU_REG_CTS_TO_RTS_CONFIG_ADDR, Data);
902ee67178SXianjun Jiao }
912ee67178SXianjun Jiao 
922ee67178SXianjun Jiao static inline u32 XPU_REG_CTS_TO_RTS_CONFIG_read(void){
932ee67178SXianjun Jiao 	return reg_read(XPU_REG_CTS_TO_RTS_CONFIG_ADDR);
942ee67178SXianjun Jiao }
952ee67178SXianjun Jiao 
962ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_LOW_write(u32 Data) {
972ee67178SXianjun Jiao 	reg_write(XPU_REG_MAC_ADDR_LOW_ADDR, Data);
982ee67178SXianjun Jiao }
992ee67178SXianjun Jiao 
1002ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_LOW_read(void){
1012ee67178SXianjun Jiao 	return reg_read(XPU_REG_MAC_ADDR_LOW_ADDR);
1022ee67178SXianjun Jiao }
1032ee67178SXianjun Jiao 
1042ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_HIGH_write(u32 Data) {
1052ee67178SXianjun Jiao 	reg_write(XPU_REG_MAC_ADDR_HIGH_ADDR, Data);
1062ee67178SXianjun Jiao }
1072ee67178SXianjun Jiao 
1082ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_HIGH_read(void){
1092ee67178SXianjun Jiao 	return reg_read(XPU_REG_MAC_ADDR_HIGH_ADDR);
1102ee67178SXianjun Jiao }
1112ee67178SXianjun Jiao 
1122ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_LOW_write(u32 Data) {
1132ee67178SXianjun Jiao 	reg_write(XPU_REG_BSSID_FILTER_LOW_ADDR, Data);
1142ee67178SXianjun Jiao }
1152ee67178SXianjun Jiao 
1162ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_LOW_read(void){
1172ee67178SXianjun Jiao 	return reg_read(XPU_REG_BSSID_FILTER_LOW_ADDR);
1182ee67178SXianjun Jiao }
1192ee67178SXianjun Jiao 
1202ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_HIGH_write(u32 Data) {
1212ee67178SXianjun Jiao 	reg_write(XPU_REG_BSSID_FILTER_HIGH_ADDR, Data);
1222ee67178SXianjun Jiao }
1232ee67178SXianjun Jiao 
1242ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_HIGH_read(void){
1252ee67178SXianjun Jiao 	return reg_read(XPU_REG_BSSID_FILTER_HIGH_ADDR);
1262ee67178SXianjun Jiao }
1272ee67178SXianjun Jiao 
1282ee67178SXianjun Jiao static inline void XPU_REG_BAND_CHANNEL_write(u32 Data) {
1292ee67178SXianjun Jiao 	reg_write(XPU_REG_BAND_CHANNEL_ADDR, Data);
1302ee67178SXianjun Jiao }
1312ee67178SXianjun Jiao 
1322ee67178SXianjun Jiao static inline u32 XPU_REG_BAND_CHANNEL_read(void){
1332ee67178SXianjun Jiao 	return reg_read(XPU_REG_BAND_CHANNEL_ADDR);
1342ee67178SXianjun Jiao }
1352ee67178SXianjun Jiao 
1365deb8d18SXianjun Jiao static inline void XPU_REG_DIFS_ADVANCE_write(u32 Data) {
1375deb8d18SXianjun Jiao 	reg_write(XPU_REG_DIFS_ADVANCE_ADDR, Data);
1385deb8d18SXianjun Jiao }
1395deb8d18SXianjun Jiao 
1405deb8d18SXianjun Jiao static inline u32 XPU_REG_DIFS_ADVANCE_read(void){
1415deb8d18SXianjun Jiao 	return reg_read(XPU_REG_DIFS_ADVANCE_ADDR);
1425deb8d18SXianjun Jiao }
1435deb8d18SXianjun Jiao 
1442ee67178SXianjun Jiao static inline u32 XPU_REG_TRX_STATUS_read(void){
1452ee67178SXianjun Jiao 	return reg_read(XPU_REG_TRX_STATUS_ADDR);
1462ee67178SXianjun Jiao }
1472ee67178SXianjun Jiao 
1482ee67178SXianjun Jiao static inline u32 XPU_REG_TX_RESULT_read(void){
1492ee67178SXianjun Jiao 	return reg_read(XPU_REG_TX_RESULT_ADDR);
1502ee67178SXianjun Jiao }
1512ee67178SXianjun Jiao 
1522ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_LOW_read(void){
1532ee67178SXianjun Jiao 	return reg_read(XPU_REG_TSF_RUNTIME_VAL_LOW_ADDR);
1542ee67178SXianjun Jiao }
1552ee67178SXianjun Jiao 
1562ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_HIGH_read(void){
1572ee67178SXianjun Jiao 	return reg_read(XPU_REG_TSF_RUNTIME_VAL_HIGH_ADDR);
1582ee67178SXianjun Jiao }
1592ee67178SXianjun Jiao 
1602ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_LOW_write(u32 value){
1612ee67178SXianjun Jiao 	reg_write(XPU_REG_TSF_LOAD_VAL_LOW_ADDR, value);
1622ee67178SXianjun Jiao }
1632ee67178SXianjun Jiao 
1642ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_HIGH_write(u32 value){
1652ee67178SXianjun Jiao 	reg_write(XPU_REG_TSF_LOAD_VAL_HIGH_ADDR, value);
1662ee67178SXianjun Jiao }
1672ee67178SXianjun Jiao 
1682ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_write(u32 high_value, u32 low_value){
1692ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_LOW_write(low_value);
1702ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value|0x80000000); // msb high
1712ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value&(~0x80000000)); // msb low
1722ee67178SXianjun Jiao }
1732ee67178SXianjun Jiao 
1742ee67178SXianjun Jiao static inline u32 XPU_REG_FC_DI_read(void){
1752ee67178SXianjun Jiao 	return reg_read(XPU_REG_FC_DI_ADDR);
1762ee67178SXianjun Jiao }
1772ee67178SXianjun Jiao 
1782ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR1_LOW_read(void){
1792ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR1_LOW_ADDR);
1802ee67178SXianjun Jiao }
1812ee67178SXianjun Jiao 
1822ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR1_HIGH_read(void){
1832ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR1_HIGH_ADDR);
1842ee67178SXianjun Jiao }
1852ee67178SXianjun Jiao 
1862ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR2_LOW_read(void){
1872ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR2_LOW_ADDR);
1882ee67178SXianjun Jiao }
1892ee67178SXianjun Jiao 
1902ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR2_HIGH_read(void){
1912ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR2_HIGH_ADDR);
1922ee67178SXianjun Jiao }
1932ee67178SXianjun Jiao 
1942ee67178SXianjun Jiao // static inline void XPU_REG_LBT_TH_write(u32 value, u32 en_flag) {
1952ee67178SXianjun Jiao // 	if (en_flag) {
1962ee67178SXianjun Jiao // 		reg_write(XPU_REG_LBT_TH_ADDR, value&0x7FFFFFFF);
1972ee67178SXianjun Jiao // 	} else {
1982ee67178SXianjun Jiao // 		reg_write(XPU_REG_LBT_TH_ADDR, value|0x80000000);
1992ee67178SXianjun Jiao // 	}
2002ee67178SXianjun Jiao // }
2012ee67178SXianjun Jiao 
2022ee67178SXianjun Jiao static inline void XPU_REG_LBT_TH_write(u32 value) {
2032ee67178SXianjun Jiao 	reg_write(XPU_REG_LBT_TH_ADDR, value);
2042ee67178SXianjun Jiao }
2052ee67178SXianjun Jiao 
2062ee67178SXianjun Jiao static inline u32 XPU_REG_RSSI_DB_CFG_read(void){
2072ee67178SXianjun Jiao 	return reg_read(XPU_REG_RSSI_DB_CFG_ADDR);
2082ee67178SXianjun Jiao }
2092ee67178SXianjun Jiao 
2102ee67178SXianjun Jiao static inline void XPU_REG_RSSI_DB_CFG_write(u32 Data) {
2112ee67178SXianjun Jiao 	reg_write(XPU_REG_RSSI_DB_CFG_ADDR, Data);
2122ee67178SXianjun Jiao }
2132ee67178SXianjun Jiao 
2142ee67178SXianjun Jiao static inline u32 XPU_REG_LBT_TH_read(void){
2152ee67178SXianjun Jiao 	return reg_read(XPU_REG_LBT_TH_ADDR);
2162ee67178SXianjun Jiao }
2172ee67178SXianjun Jiao 
2182ee67178SXianjun Jiao static inline void XPU_REG_CSMA_DEBUG_write(u32 value){
2192ee67178SXianjun Jiao 	reg_write(XPU_REG_CSMA_DEBUG_ADDR, value);
2202ee67178SXianjun Jiao }
2212ee67178SXianjun Jiao 
2222ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_DEBUG_read(void){
2232ee67178SXianjun Jiao 	return reg_read(XPU_REG_CSMA_DEBUG_ADDR);
2242ee67178SXianjun Jiao }
2252ee67178SXianjun Jiao 
2262ee67178SXianjun Jiao static inline void XPU_REG_CSMA_CFG_write(u32 value){
2272ee67178SXianjun Jiao 	reg_write(XPU_REG_CSMA_CFG_ADDR, value);
2282ee67178SXianjun Jiao }
2292ee67178SXianjun Jiao 
2302ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_CFG_read(void){
2312ee67178SXianjun Jiao 	return reg_read(XPU_REG_CSMA_CFG_ADDR);
2322ee67178SXianjun Jiao }
2332ee67178SXianjun Jiao 
234838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_TOTAL_write(u32 value){
235838a9007SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_TOTAL_ADDR, value);
2362ee67178SXianjun Jiao }
237838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_START_write(u32 value){
238838a9007SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_START_ADDR, value);
2392ee67178SXianjun Jiao }
240838a9007SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_END_write(u32 value){
241838a9007SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_END_ADDR, value);
2422ee67178SXianjun Jiao }
2432ee67178SXianjun Jiao 
244838a9007SXianjun Jiao 
245838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_TOTAL_read(void){
246838a9007SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_TOTAL_ADDR);
2472ee67178SXianjun Jiao }
248838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_START_read(void){
249838a9007SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_START_ADDR);
2502ee67178SXianjun Jiao }
251838a9007SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_END_read(void){
252838a9007SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_END_ADDR);
2532ee67178SXianjun Jiao }
254838a9007SXianjun Jiao 
2552ee67178SXianjun Jiao 
2562ee67178SXianjun Jiao static inline void XPU_REG_BB_RF_DELAY_write(u32 value){
2572ee67178SXianjun Jiao 	reg_write(XPU_REG_BB_RF_DELAY_ADDR, value);
2582ee67178SXianjun Jiao }
2592ee67178SXianjun Jiao 
2602ee67178SXianjun Jiao static inline void XPU_REG_MAX_NUM_RETRANS_write(u32 value){
2612ee67178SXianjun Jiao 	reg_write(XPU_REG_MAX_NUM_RETRANS_ADDR, value);
2622ee67178SXianjun Jiao }
2632ee67178SXianjun Jiao 
2642ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_write(u8 *mac_addr) {//, u32 en_flag){
2652ee67178SXianjun Jiao 	XPU_REG_MAC_ADDR_LOW_write( *( (u32*)(mac_addr) ) );
2662ee67178SXianjun Jiao 	XPU_REG_MAC_ADDR_HIGH_write( *( (u16*)(mac_addr + 4) ) );
2672ee67178SXianjun Jiao 	#if 0
2682ee67178SXianjun Jiao 	if (en_flag) {
2692ee67178SXianjun Jiao 		XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) | 0x80000000 ); // 0x80000000 by default we turn on mac addr filter
2702ee67178SXianjun Jiao 	} else {
2712ee67178SXianjun Jiao 		XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) & 0x7FFFFFFF );
2722ee67178SXianjun Jiao 	}
2732ee67178SXianjun Jiao 	#endif
2742ee67178SXianjun Jiao }
2752ee67178SXianjun Jiao 
2762ee67178SXianjun Jiao static const struct of_device_id dev_of_ids[] = {
2772ee67178SXianjun Jiao 	{ .compatible = "sdr,xpu", },
2782ee67178SXianjun Jiao 	{}
2792ee67178SXianjun Jiao };
2802ee67178SXianjun Jiao MODULE_DEVICE_TABLE(of, dev_of_ids);
2812ee67178SXianjun Jiao 
2822ee67178SXianjun Jiao static struct xpu_driver_api xpu_driver_api_inst;
2832ee67178SXianjun Jiao static struct xpu_driver_api *xpu_api = &xpu_driver_api_inst;
2842ee67178SXianjun Jiao EXPORT_SYMBOL(xpu_api);
2852ee67178SXianjun Jiao 
2862ee67178SXianjun Jiao static inline u32 hw_init(enum xpu_mode mode){
287838a9007SXianjun Jiao 	int err=0, i, rssi_half_db_th, rssi_half_db_offset, agc_gain_delay;
2882ee67178SXianjun Jiao 	u32 filter_flag = 0;
2892ee67178SXianjun Jiao 
2902ee67178SXianjun Jiao 	printk("%s hw_init mode %d\n", xpu_compatible_str, mode);
2912ee67178SXianjun Jiao 
292838a9007SXianjun Jiao 	//rst
293838a9007SXianjun Jiao 	for (i=0;i<8;i++)
294838a9007SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0);
295838a9007SXianjun Jiao 	for (i=0;i<32;i++)
2962ee67178SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0xFFFFFFFF);
297838a9007SXianjun Jiao 	for (i=0;i<8;i++)
2982ee67178SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0);
2992ee67178SXianjun Jiao 
3002ee67178SXianjun Jiao 	// http://www.studioreti.it/slide/802-11-Frame_E_C.pdf
3012ee67178SXianjun Jiao 	// https://mrncciew.com/2014/10/14/cwap-802-11-phy-ppdu/
3022ee67178SXianjun Jiao 	// https://mrncciew.com/2014/09/27/cwap-mac-header-frame-control/
3032ee67178SXianjun Jiao 	// https://mrncciew.com/2014/10/25/cwap-mac-header-durationid/
3042ee67178SXianjun Jiao 	// https://mrncciew.com/2014/11/01/cwap-mac-header-sequence-control/
3052ee67178SXianjun Jiao 	// https://witestlab.poly.edu/blog/802-11-wireless-lan-2/
3062ee67178SXianjun Jiao 	// phy_rx byte idx:
3072ee67178SXianjun Jiao 	// 5(3 sig + 2 service), -- PHY
3082ee67178SXianjun Jiao 	// 2 frame control, 2 duration/conn ID, --MAC PDU
3092ee67178SXianjun Jiao 	// 6 receiver address, 6 destination address, 6 transmitter address
3102ee67178SXianjun Jiao 	// 2 sequence control
3112ee67178SXianjun Jiao 	// 6 source address
3122ee67178SXianjun Jiao 	// reg_val = 5 + 0;
3132ee67178SXianjun Jiao 	// xpu_api->XPU_REG_PHY_RX_PKT_READ_OFFSET_write(reg_val);
3142ee67178SXianjun Jiao 	// printk("%s hw_init XPU_REG_PHY_RX_PKT_READ_OFFSET_write %d\n", xpu_compatible_str, reg_val);
3152ee67178SXianjun Jiao 
3162ee67178SXianjun Jiao 	// by default turn off filter, because all register are zeros
3172ee67178SXianjun Jiao 	// let's filter out packet according to: enum ieee80211_filter_flags at: https://www.kernel.org/doc/html/v4.9/80211/mac80211.html
3182ee67178SXianjun Jiao 	#if 0 // define in FPGA
3192ee67178SXianjun 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
3202ee67178SXianjun Jiao                         FIF_FCSFAIL =            14b00000000000100, //not support
3212ee67178SXianjun Jiao                         FIF_PLCPFAIL =           14b00000000001000, //not support
3222ee67178SXianjun Jiao                         FIF_BCN_PRBRESP_PROMISC= 14b00000000010000,
3232ee67178SXianjun Jiao                         FIF_CONTROL =            14b00000000100000,
3242ee67178SXianjun Jiao                         FIF_OTHER_BSS =          14b00000001000000,
3252ee67178SXianjun Jiao                         FIF_PSPOLL =             14b00000010000000,
3262ee67178SXianjun Jiao                         FIF_PROBE_REQ =          14b00000100000000,
3272ee67178SXianjun Jiao                         UNICAST_FOR_US =         14b00001000000000,
3282ee67178SXianjun Jiao                         BROADCAST_ALL_ONE =      14b00010000000000,
3292ee67178SXianjun Jiao                         BROADCAST_ALL_ZERO =     14b00100000000000,
3302ee67178SXianjun Jiao                         MY_BEACON          =     14b01000000000000,
3312ee67178SXianjun Jiao                         MONITOR_ALL =            14b10000000000000;
3322ee67178SXianjun Jiao 	#endif
3332ee67178SXianjun 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);
3342ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write(filter_flag);
3352ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write(0xB<<16);//6M 1011:0xB
3362ee67178SXianjun Jiao 
3372ee67178SXianjun Jiao 	// after send data frame wait for ACK, this will be set in real time in function ad9361_rf_set_channel
338febc5adfSXianjun 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"!
339febc5adfSXianjun Jiao 	// xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( 6*10 ); // +6 = 16us for 5GHz
3402ee67178SXianjun Jiao 
3412ee67178SXianjun Jiao 	//xpu_api->XPU_REG_MAX_NUM_RETRANS_write(3); // if this > 0, it will override mac80211 set value, and set static retransmission limit
3422ee67178SXianjun Jiao 
3435deb8d18SXianjun Jiao 	// xpu_api->XPU_REG_BB_RF_DELAY_write((1<<8)|47);
3445deb8d18SXianjun Jiao 	xpu_api->XPU_REG_BB_RF_DELAY_write((10<<8)|40); // extended rf is ongoing for perfect muting. (10<<8)|40 is verified good for zcu102/zed
3452ee67178SXianjun Jiao 
346838a9007SXianjun Jiao 	// setup time schedule of 4 slices
347838a9007SXianjun Jiao 	// slice 0
348838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write(50000-1); // total 50ms
349838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write(0); //start 0ms
350838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write(50000-1); //end 50ms
351838a9007SXianjun Jiao 
352838a9007SXianjun Jiao 	// slice 1
353838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((1<<20)|(50000-1)); // total 50ms
354838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((1<<20)|(0)); //start 0ms
355838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((1<<20)|(20000-1)); //end 20ms
356838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((1<<20)|(50000-1)); //end 20ms
357838a9007SXianjun Jiao 
358838a9007SXianjun Jiao 	// slice 2
359838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((2<<20)|(50000-1)); // total 50ms
360838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_START_write((2<<20)|(20000)); //start 20ms
361838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((2<<20)|(0)); //start 20ms
362838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((2<<20)|(40000-1)); //end 20ms
363838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((2<<20)|(50000-1)); //end 20ms
364838a9007SXianjun Jiao 
365838a9007SXianjun Jiao 	// slice 3
366838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write((3<<20)|(50000-1)); // total 50ms
367838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_START_write((3<<20)|(40000)); //start 40ms
368838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write((3<<20)|(0)); //start 40ms
369838a9007SXianjun Jiao 	//xpu_api->XPU_REG_SLICE_COUNT_END_write((3<<20)|(50000-1)); //end 20ms
370838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write((3<<20)|(50000-1)); //end 20ms
371838a9007SXianjun Jiao 
372838a9007SXianjun Jiao 	// all slice sync rest
373838a9007SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(1<<7); //bit7 reset the counter for all queues at the same time
374838a9007SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(0<<7);
3752ee67178SXianjun Jiao 
3762ee67178SXianjun Jiao 	switch(mode)
3772ee67178SXianjun Jiao 	{
3782ee67178SXianjun Jiao 		case XPU_TEST:
3792ee67178SXianjun Jiao 			printk("%s hw_init mode XPU_TEST\n", xpu_compatible_str);
3802ee67178SXianjun Jiao 			break;
3812ee67178SXianjun Jiao 
3822ee67178SXianjun Jiao 		case XPU_NORMAL:
3832ee67178SXianjun Jiao 			printk("%s hw_init mode XPU_NORMAL\n", xpu_compatible_str);
3842ee67178SXianjun Jiao 			break;
3852ee67178SXianjun Jiao 
3862ee67178SXianjun Jiao 		default:
3872ee67178SXianjun Jiao 			printk("%s hw_init mode %d is wrong!\n", xpu_compatible_str, mode);
3882ee67178SXianjun Jiao 			err=1;
3892ee67178SXianjun Jiao 	}
3902ee67178SXianjun 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
3912ee67178SXianjun Jiao 
3922ee67178SXianjun Jiao 	agc_gain_delay = 50; //samples
3932ee67178SXianjun Jiao 	rssi_half_db_offset = 75<<1;
3942ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write(0x80000000|((rssi_half_db_offset<<16)|agc_gain_delay) );
3952ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write((~0x80000000)&((rssi_half_db_offset<<16)|agc_gain_delay) );
3962ee67178SXianjun Jiao 
3972ee67178SXianjun Jiao 	//rssi_half_db_th = 70<<1; // with splitter
3982ee67178SXianjun Jiao 	rssi_half_db_th = 87<<1; // -62dBm
3992ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_write(rssi_half_db_th); // set IQ rssi th step .5dB to xxx and enable it
4002ee67178SXianjun Jiao 
4012ee67178SXianjun Jiao 	//xpu_api->XPU_REG_CSMA_DEBUG_write((1<<31)|(20<<24)|(4<<19)|(3<<14)|(10<<7)|(5));
4022ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_write(0);
4032ee67178SXianjun Jiao 
4045deb8d18SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_write(3); //normal CSMA
4055deb8d18SXianjun Jiao 	// xpu_api->XPU_REG_CSMA_CFG_write(0xe0000000); //high priority
4062ee67178SXianjun Jiao 
407febc5adfSXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((51)<<16)|0 );//now our tx send out I/Q immediately
4082ee67178SXianjun Jiao 
409febc5adfSXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write( (((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)
410febc5adfSXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write( (((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)
4112ee67178SXianjun Jiao 
4125deb8d18SXianjun Jiao 	xpu_api->XPU_REG_DIFS_ADVANCE_write(2); //us
4135deb8d18SXianjun Jiao 
4142ee67178SXianjun Jiao 	printk("%s hw_init err %d\n", xpu_compatible_str, err);
4152ee67178SXianjun Jiao 	return(err);
4162ee67178SXianjun Jiao }
4172ee67178SXianjun Jiao 
4182ee67178SXianjun Jiao static int dev_probe(struct platform_device *pdev)
4192ee67178SXianjun Jiao {
4202ee67178SXianjun Jiao 	struct device_node *np = pdev->dev.of_node;
4212ee67178SXianjun Jiao 	struct resource *io;
4222ee67178SXianjun Jiao 	u32 test_us0, test_us1, test_us2;
4232ee67178SXianjun Jiao 	int err=1;
4242ee67178SXianjun Jiao 
4252ee67178SXianjun Jiao 	printk("\n");
4262ee67178SXianjun Jiao 
4272ee67178SXianjun Jiao 	if (np) {
4282ee67178SXianjun Jiao 		const struct of_device_id *match;
4292ee67178SXianjun Jiao 
4302ee67178SXianjun Jiao 		match = of_match_node(dev_of_ids, np);
4312ee67178SXianjun Jiao 		if (match) {
4322ee67178SXianjun Jiao 			printk("%s dev_probe match!\n", xpu_compatible_str);
4332ee67178SXianjun Jiao 			err = 0;
4342ee67178SXianjun Jiao 		}
4352ee67178SXianjun Jiao 	}
4362ee67178SXianjun Jiao 
4372ee67178SXianjun Jiao 	if (err)
4382ee67178SXianjun Jiao 		return err;
4392ee67178SXianjun Jiao 
4402ee67178SXianjun Jiao 	xpu_api->hw_init=hw_init;
4412ee67178SXianjun Jiao 
4422ee67178SXianjun Jiao 	xpu_api->reg_read=reg_read;
4432ee67178SXianjun Jiao 	xpu_api->reg_write=reg_write;
4442ee67178SXianjun Jiao 
4452ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write=XPU_REG_MULTI_RST_write;
4462ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_read=XPU_REG_MULTI_RST_read;
4472ee67178SXianjun Jiao 	xpu_api->XPU_REG_SRC_SEL_write=XPU_REG_SRC_SEL_write;
4482ee67178SXianjun Jiao 	xpu_api->XPU_REG_SRC_SEL_read=XPU_REG_SRC_SEL_read;
4492ee67178SXianjun Jiao 
4502ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write=XPU_REG_RECV_ACK_COUNT_TOP0_write;
4512ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_read=XPU_REG_RECV_ACK_COUNT_TOP0_read;
4522ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write=XPU_REG_RECV_ACK_COUNT_TOP1_write;
4532ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_read=XPU_REG_RECV_ACK_COUNT_TOP1_read;
4542ee67178SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write=XPU_REG_SEND_ACK_WAIT_TOP_write;
4552ee67178SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_read=XPU_REG_SEND_ACK_WAIT_TOP_read;
4562ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_LOW_write=XPU_REG_MAC_ADDR_LOW_write;
4572ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_LOW_read=XPU_REG_MAC_ADDR_LOW_read;
4582ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_HIGH_write=XPU_REG_MAC_ADDR_HIGH_write;
4592ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_HIGH_read=XPU_REG_MAC_ADDR_HIGH_read;
4602ee67178SXianjun Jiao 
4612ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write=XPU_REG_FILTER_FLAG_write;
4622ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_read=XPU_REG_FILTER_FLAG_read;
4632ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write=XPU_REG_CTS_TO_RTS_CONFIG_write;
4642ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_read=XPU_REG_CTS_TO_RTS_CONFIG_read;
4652ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_LOW_write=XPU_REG_BSSID_FILTER_LOW_write;
4662ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_LOW_read=XPU_REG_BSSID_FILTER_LOW_read;
4672ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_HIGH_write=XPU_REG_BSSID_FILTER_HIGH_write;
4682ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_HIGH_read=XPU_REG_BSSID_FILTER_HIGH_read;
4692ee67178SXianjun Jiao 
4702ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_write=XPU_REG_BAND_CHANNEL_write;
4712ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_read=XPU_REG_BAND_CHANNEL_read;
4722ee67178SXianjun Jiao 
4735deb8d18SXianjun Jiao 	xpu_api->XPU_REG_DIFS_ADVANCE_write=XPU_REG_DIFS_ADVANCE_write;
4745deb8d18SXianjun Jiao 	xpu_api->XPU_REG_DIFS_ADVANCE_read=XPU_REG_DIFS_ADVANCE_read;
4755deb8d18SXianjun Jiao 
4762ee67178SXianjun Jiao 	xpu_api->XPU_REG_TRX_STATUS_read=XPU_REG_TRX_STATUS_read;
4772ee67178SXianjun Jiao 	xpu_api->XPU_REG_TX_RESULT_read=XPU_REG_TX_RESULT_read;
4782ee67178SXianjun Jiao 
4792ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read=XPU_REG_TSF_RUNTIME_VAL_LOW_read;
4802ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_RUNTIME_VAL_HIGH_read=XPU_REG_TSF_RUNTIME_VAL_HIGH_read;
4812ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_LOW_write=XPU_REG_TSF_LOAD_VAL_LOW_write;
4822ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_HIGH_write=XPU_REG_TSF_LOAD_VAL_HIGH_write;
4832ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_write=XPU_REG_TSF_LOAD_VAL_write;
4842ee67178SXianjun Jiao 
4852ee67178SXianjun Jiao 	xpu_api->XPU_REG_FC_DI_read=XPU_REG_FC_DI_read;
4862ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR1_LOW_read=XPU_REG_ADDR1_LOW_read;
4872ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR1_HIGH_read=XPU_REG_ADDR1_HIGH_read;
4882ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR2_LOW_read=XPU_REG_ADDR2_LOW_read;
4892ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR2_HIGH_read=XPU_REG_ADDR2_HIGH_read;
4902ee67178SXianjun Jiao 
4912ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_write=XPU_REG_LBT_TH_write;
4922ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_read=XPU_REG_LBT_TH_read;
4932ee67178SXianjun Jiao 
4942ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_read=XPU_REG_RSSI_DB_CFG_read;
4952ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write=XPU_REG_RSSI_DB_CFG_write;
4962ee67178SXianjun Jiao 
4972ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_write=XPU_REG_CSMA_DEBUG_write;
4982ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_read=XPU_REG_CSMA_DEBUG_read;
4992ee67178SXianjun Jiao 
5002ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_write=XPU_REG_CSMA_CFG_write;
5012ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_read=XPU_REG_CSMA_CFG_read;
5022ee67178SXianjun Jiao 
503838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_write=XPU_REG_SLICE_COUNT_TOTAL_write;
504838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_write=XPU_REG_SLICE_COUNT_START_write;
505838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_write=XPU_REG_SLICE_COUNT_END_write;
5062ee67178SXianjun Jiao 
507838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL_read=XPU_REG_SLICE_COUNT_TOTAL_read;
508838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START_read=XPU_REG_SLICE_COUNT_START_read;
509838a9007SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END_read=XPU_REG_SLICE_COUNT_END_read;
5102ee67178SXianjun Jiao 
5112ee67178SXianjun Jiao 	xpu_api->XPU_REG_BB_RF_DELAY_write=XPU_REG_BB_RF_DELAY_write;
5122ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAX_NUM_RETRANS_write=XPU_REG_MAX_NUM_RETRANS_write;
5132ee67178SXianjun Jiao 
5142ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_write=XPU_REG_MAC_ADDR_write;
5152ee67178SXianjun Jiao 
5162ee67178SXianjun Jiao 	/* Request and map I/O memory */
5172ee67178SXianjun Jiao 	io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5182ee67178SXianjun Jiao 	base_addr = devm_ioremap_resource(&pdev->dev, io);
5192ee67178SXianjun Jiao 	if (IS_ERR(base_addr))
5202ee67178SXianjun Jiao 		return PTR_ERR(base_addr);
5212ee67178SXianjun Jiao 
5222ee67178SXianjun 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);
5232ee67178SXianjun Jiao 	printk("%s dev_probe base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5242ee67178SXianjun Jiao 	printk("%s dev_probe xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5252ee67178SXianjun Jiao 	printk("%s dev_probe             xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
5262ee67178SXianjun Jiao 
5272ee67178SXianjun Jiao 	printk("%s dev_probe reset tsf timer\n", xpu_compatible_str);
5282ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_write(0,0);
5292ee67178SXianjun Jiao 	test_us0 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5302ee67178SXianjun Jiao 	mdelay(33);
5312ee67178SXianjun Jiao 	test_us1 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5322ee67178SXianjun Jiao 	mdelay(67);
5332ee67178SXianjun Jiao 	test_us2 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5342ee67178SXianjun 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);
5352ee67178SXianjun Jiao 
5362ee67178SXianjun Jiao 	printk("%s dev_probe succeed!\n", xpu_compatible_str);
5372ee67178SXianjun Jiao 
5382ee67178SXianjun Jiao 	err = hw_init(XPU_NORMAL);
5392ee67178SXianjun Jiao 
5402ee67178SXianjun Jiao 	return err;
5412ee67178SXianjun Jiao }
5422ee67178SXianjun Jiao 
5432ee67178SXianjun Jiao static int dev_remove(struct platform_device *pdev)
5442ee67178SXianjun Jiao {
5452ee67178SXianjun Jiao 	printk("\n");
5462ee67178SXianjun Jiao 
5472ee67178SXianjun Jiao 	printk("%s dev_remove base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5482ee67178SXianjun Jiao 	printk("%s dev_remove xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5492ee67178SXianjun Jiao 	printk("%s dev_remove             xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
5502ee67178SXianjun Jiao 
5512ee67178SXianjun Jiao 	printk("%s dev_remove succeed!\n", xpu_compatible_str);
5522ee67178SXianjun Jiao 	return 0;
5532ee67178SXianjun Jiao }
5542ee67178SXianjun Jiao 
5552ee67178SXianjun Jiao static struct platform_driver dev_driver = {
5562ee67178SXianjun Jiao 	.driver = {
5572ee67178SXianjun Jiao 		.name = "sdr,xpu",
5582ee67178SXianjun Jiao 		.owner = THIS_MODULE,
5592ee67178SXianjun Jiao 		.of_match_table = dev_of_ids,
5602ee67178SXianjun Jiao 	},
5612ee67178SXianjun Jiao 	.probe = dev_probe,
5622ee67178SXianjun Jiao 	.remove = dev_remove,
5632ee67178SXianjun Jiao };
5642ee67178SXianjun Jiao 
5652ee67178SXianjun Jiao module_platform_driver(dev_driver);
5662ee67178SXianjun Jiao 
5672ee67178SXianjun Jiao MODULE_AUTHOR("Xianjun Jiao");
5682ee67178SXianjun Jiao MODULE_DESCRIPTION("sdr,xpu");
5692ee67178SXianjun Jiao MODULE_LICENSE("GPL v2");
570