xref: /openwifi/driver/xpu/xpu.c (revision febc5adf733169748a775e25fb7c1837236cb71e)
12ee67178SXianjun Jiao /*
22ee67178SXianjun Jiao  * axi lite register access driver
32ee67178SXianjun Jiao  * Xianjun jiao. [email protected]; [email protected]
42ee67178SXianjun Jiao  */
52ee67178SXianjun Jiao 
62ee67178SXianjun Jiao #include <linux/bitops.h>
72ee67178SXianjun Jiao #include <linux/dmapool.h>
82ee67178SXianjun Jiao #include <linux/dma/xilinx_dma.h>
92ee67178SXianjun Jiao #include <linux/init.h>
102ee67178SXianjun Jiao #include <linux/interrupt.h>
112ee67178SXianjun Jiao #include <linux/io.h>
122ee67178SXianjun Jiao #include <linux/iopoll.h>
132ee67178SXianjun Jiao #include <linux/module.h>
142ee67178SXianjun Jiao #include <linux/of_address.h>
152ee67178SXianjun Jiao #include <linux/of_dma.h>
162ee67178SXianjun Jiao #include <linux/of_platform.h>
172ee67178SXianjun Jiao #include <linux/of_irq.h>
182ee67178SXianjun Jiao #include <linux/slab.h>
192ee67178SXianjun Jiao #include <linux/clk.h>
202ee67178SXianjun Jiao #include <linux/io-64-nonatomic-lo-hi.h>
212ee67178SXianjun Jiao #include <linux/delay.h>
222ee67178SXianjun Jiao #include <net/mac80211.h>
232ee67178SXianjun Jiao 
242ee67178SXianjun Jiao #include "../hw_def.h"
252ee67178SXianjun Jiao 
262ee67178SXianjun 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
272ee67178SXianjun Jiao 
282ee67178SXianjun Jiao /* IO accessors */
292ee67178SXianjun Jiao static inline u32 reg_read(u32 reg)
302ee67178SXianjun Jiao {
312ee67178SXianjun Jiao 	return ioread32(base_addr + reg);
322ee67178SXianjun Jiao }
332ee67178SXianjun Jiao 
342ee67178SXianjun Jiao static inline void reg_write(u32 reg, u32 value)
352ee67178SXianjun Jiao {
362ee67178SXianjun Jiao 	iowrite32(value, base_addr + reg);
372ee67178SXianjun Jiao }
382ee67178SXianjun Jiao 
392ee67178SXianjun Jiao static inline void XPU_REG_MULTI_RST_write(u32 Data) {
402ee67178SXianjun Jiao 	reg_write(XPU_REG_MULTI_RST_ADDR, Data);
412ee67178SXianjun Jiao }
422ee67178SXianjun Jiao 
432ee67178SXianjun Jiao static inline u32 XPU_REG_MULTI_RST_read(void){
442ee67178SXianjun Jiao 	return reg_read(XPU_REG_MULTI_RST_ADDR);
452ee67178SXianjun Jiao }
462ee67178SXianjun Jiao 
472ee67178SXianjun Jiao static inline void XPU_REG_SRC_SEL_write(u32 Data) {
482ee67178SXianjun Jiao 	reg_write(XPU_REG_SRC_SEL_ADDR, Data);
492ee67178SXianjun Jiao }
502ee67178SXianjun Jiao 
512ee67178SXianjun Jiao static inline u32 XPU_REG_SRC_SEL_read(void){
522ee67178SXianjun Jiao 	return reg_read(XPU_REG_SRC_SEL_ADDR);
532ee67178SXianjun Jiao }
542ee67178SXianjun Jiao 
552ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP0_write(u32 Data) {
562ee67178SXianjun Jiao 	reg_write(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR, Data);
572ee67178SXianjun Jiao }
582ee67178SXianjun Jiao 
592ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP0_read(void){
602ee67178SXianjun Jiao 	return reg_read(XPU_REG_RECV_ACK_COUNT_TOP0_ADDR);
612ee67178SXianjun Jiao }
622ee67178SXianjun Jiao 
632ee67178SXianjun Jiao static inline void XPU_REG_RECV_ACK_COUNT_TOP1_write(u32 Data) {
642ee67178SXianjun Jiao 	reg_write(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR, Data);
652ee67178SXianjun Jiao }
662ee67178SXianjun Jiao 
672ee67178SXianjun Jiao static inline u32 XPU_REG_RECV_ACK_COUNT_TOP1_read(void){
682ee67178SXianjun Jiao 	return reg_read(XPU_REG_RECV_ACK_COUNT_TOP1_ADDR);
692ee67178SXianjun Jiao }
702ee67178SXianjun Jiao 
712ee67178SXianjun Jiao static inline void XPU_REG_SEND_ACK_WAIT_TOP_write(u32 Data) {
722ee67178SXianjun Jiao 	reg_write(XPU_REG_SEND_ACK_WAIT_TOP_ADDR, Data);
732ee67178SXianjun Jiao }
742ee67178SXianjun Jiao 
752ee67178SXianjun Jiao static inline u32 XPU_REG_SEND_ACK_WAIT_TOP_read(void){
762ee67178SXianjun Jiao 	return reg_read(XPU_REG_SEND_ACK_WAIT_TOP_ADDR);
772ee67178SXianjun Jiao }
782ee67178SXianjun Jiao 
792ee67178SXianjun Jiao static inline void XPU_REG_FILTER_FLAG_write(u32 Data) {
802ee67178SXianjun Jiao 	reg_write(XPU_REG_FILTER_FLAG_ADDR, Data);
812ee67178SXianjun Jiao }
822ee67178SXianjun Jiao 
832ee67178SXianjun Jiao static inline u32 XPU_REG_FILTER_FLAG_read(void){
842ee67178SXianjun Jiao 	return reg_read(XPU_REG_FILTER_FLAG_ADDR);
852ee67178SXianjun Jiao }
862ee67178SXianjun Jiao 
872ee67178SXianjun Jiao static inline void XPU_REG_CTS_TO_RTS_CONFIG_write(u32 Data) {
882ee67178SXianjun Jiao 	reg_write(XPU_REG_CTS_TO_RTS_CONFIG_ADDR, Data);
892ee67178SXianjun Jiao }
902ee67178SXianjun Jiao 
912ee67178SXianjun Jiao static inline u32 XPU_REG_CTS_TO_RTS_CONFIG_read(void){
922ee67178SXianjun Jiao 	return reg_read(XPU_REG_CTS_TO_RTS_CONFIG_ADDR);
932ee67178SXianjun Jiao }
942ee67178SXianjun Jiao 
952ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_LOW_write(u32 Data) {
962ee67178SXianjun Jiao 	reg_write(XPU_REG_MAC_ADDR_LOW_ADDR, Data);
972ee67178SXianjun Jiao }
982ee67178SXianjun Jiao 
992ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_LOW_read(void){
1002ee67178SXianjun Jiao 	return reg_read(XPU_REG_MAC_ADDR_LOW_ADDR);
1012ee67178SXianjun Jiao }
1022ee67178SXianjun Jiao 
1032ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_HIGH_write(u32 Data) {
1042ee67178SXianjun Jiao 	reg_write(XPU_REG_MAC_ADDR_HIGH_ADDR, Data);
1052ee67178SXianjun Jiao }
1062ee67178SXianjun Jiao 
1072ee67178SXianjun Jiao static inline u32 XPU_REG_MAC_ADDR_HIGH_read(void){
1082ee67178SXianjun Jiao 	return reg_read(XPU_REG_MAC_ADDR_HIGH_ADDR);
1092ee67178SXianjun Jiao }
1102ee67178SXianjun Jiao 
1112ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_LOW_write(u32 Data) {
1122ee67178SXianjun Jiao 	reg_write(XPU_REG_BSSID_FILTER_LOW_ADDR, Data);
1132ee67178SXianjun Jiao }
1142ee67178SXianjun Jiao 
1152ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_LOW_read(void){
1162ee67178SXianjun Jiao 	return reg_read(XPU_REG_BSSID_FILTER_LOW_ADDR);
1172ee67178SXianjun Jiao }
1182ee67178SXianjun Jiao 
1192ee67178SXianjun Jiao static inline void XPU_REG_BSSID_FILTER_HIGH_write(u32 Data) {
1202ee67178SXianjun Jiao 	reg_write(XPU_REG_BSSID_FILTER_HIGH_ADDR, Data);
1212ee67178SXianjun Jiao }
1222ee67178SXianjun Jiao 
1232ee67178SXianjun Jiao static inline u32 XPU_REG_BSSID_FILTER_HIGH_read(void){
1242ee67178SXianjun Jiao 	return reg_read(XPU_REG_BSSID_FILTER_HIGH_ADDR);
1252ee67178SXianjun Jiao }
1262ee67178SXianjun Jiao 
1272ee67178SXianjun Jiao static inline void XPU_REG_BAND_CHANNEL_write(u32 Data) {
1282ee67178SXianjun Jiao 	reg_write(XPU_REG_BAND_CHANNEL_ADDR, Data);
1292ee67178SXianjun Jiao }
1302ee67178SXianjun Jiao 
1312ee67178SXianjun Jiao static inline u32 XPU_REG_BAND_CHANNEL_read(void){
1322ee67178SXianjun Jiao 	return reg_read(XPU_REG_BAND_CHANNEL_ADDR);
1332ee67178SXianjun Jiao }
1342ee67178SXianjun Jiao 
1352ee67178SXianjun Jiao static inline u32 XPU_REG_TRX_STATUS_read(void){
1362ee67178SXianjun Jiao 	return reg_read(XPU_REG_TRX_STATUS_ADDR);
1372ee67178SXianjun Jiao }
1382ee67178SXianjun Jiao 
1392ee67178SXianjun Jiao static inline u32 XPU_REG_TX_RESULT_read(void){
1402ee67178SXianjun Jiao 	return reg_read(XPU_REG_TX_RESULT_ADDR);
1412ee67178SXianjun Jiao }
1422ee67178SXianjun Jiao 
1432ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_LOW_read(void){
1442ee67178SXianjun Jiao 	return reg_read(XPU_REG_TSF_RUNTIME_VAL_LOW_ADDR);
1452ee67178SXianjun Jiao }
1462ee67178SXianjun Jiao 
1472ee67178SXianjun Jiao static inline u32 XPU_REG_TSF_RUNTIME_VAL_HIGH_read(void){
1482ee67178SXianjun Jiao 	return reg_read(XPU_REG_TSF_RUNTIME_VAL_HIGH_ADDR);
1492ee67178SXianjun Jiao }
1502ee67178SXianjun Jiao 
1512ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_LOW_write(u32 value){
1522ee67178SXianjun Jiao 	reg_write(XPU_REG_TSF_LOAD_VAL_LOW_ADDR, value);
1532ee67178SXianjun Jiao }
1542ee67178SXianjun Jiao 
1552ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_HIGH_write(u32 value){
1562ee67178SXianjun Jiao 	reg_write(XPU_REG_TSF_LOAD_VAL_HIGH_ADDR, value);
1572ee67178SXianjun Jiao }
1582ee67178SXianjun Jiao 
1592ee67178SXianjun Jiao static inline void XPU_REG_TSF_LOAD_VAL_write(u32 high_value, u32 low_value){
1602ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_LOW_write(low_value);
1612ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value|0x80000000); // msb high
1622ee67178SXianjun Jiao 	XPU_REG_TSF_LOAD_VAL_HIGH_write(high_value&(~0x80000000)); // msb low
1632ee67178SXianjun Jiao }
1642ee67178SXianjun Jiao 
1652ee67178SXianjun Jiao static inline u32 XPU_REG_FC_DI_read(void){
1662ee67178SXianjun Jiao 	return reg_read(XPU_REG_FC_DI_ADDR);
1672ee67178SXianjun Jiao }
1682ee67178SXianjun Jiao 
1692ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR1_LOW_read(void){
1702ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR1_LOW_ADDR);
1712ee67178SXianjun Jiao }
1722ee67178SXianjun Jiao 
1732ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR1_HIGH_read(void){
1742ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR1_HIGH_ADDR);
1752ee67178SXianjun Jiao }
1762ee67178SXianjun Jiao 
1772ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR2_LOW_read(void){
1782ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR2_LOW_ADDR);
1792ee67178SXianjun Jiao }
1802ee67178SXianjun Jiao 
1812ee67178SXianjun Jiao static inline u32 XPU_REG_ADDR2_HIGH_read(void){
1822ee67178SXianjun Jiao 	return reg_read(XPU_REG_ADDR2_HIGH_ADDR);
1832ee67178SXianjun Jiao }
1842ee67178SXianjun Jiao 
1852ee67178SXianjun Jiao // static inline void XPU_REG_LBT_TH_write(u32 value, u32 en_flag) {
1862ee67178SXianjun Jiao // 	if (en_flag) {
1872ee67178SXianjun Jiao // 		reg_write(XPU_REG_LBT_TH_ADDR, value&0x7FFFFFFF);
1882ee67178SXianjun Jiao // 	} else {
1892ee67178SXianjun Jiao // 		reg_write(XPU_REG_LBT_TH_ADDR, value|0x80000000);
1902ee67178SXianjun Jiao // 	}
1912ee67178SXianjun Jiao // }
1922ee67178SXianjun Jiao 
1932ee67178SXianjun Jiao static inline void XPU_REG_LBT_TH_write(u32 value) {
1942ee67178SXianjun Jiao 	reg_write(XPU_REG_LBT_TH_ADDR, value);
1952ee67178SXianjun Jiao }
1962ee67178SXianjun Jiao 
1972ee67178SXianjun Jiao static inline u32 XPU_REG_RSSI_DB_CFG_read(void){
1982ee67178SXianjun Jiao 	return reg_read(XPU_REG_RSSI_DB_CFG_ADDR);
1992ee67178SXianjun Jiao }
2002ee67178SXianjun Jiao 
2012ee67178SXianjun Jiao static inline void XPU_REG_RSSI_DB_CFG_write(u32 Data) {
2022ee67178SXianjun Jiao 	reg_write(XPU_REG_RSSI_DB_CFG_ADDR, Data);
2032ee67178SXianjun Jiao }
2042ee67178SXianjun Jiao 
2052ee67178SXianjun Jiao static inline u32 XPU_REG_LBT_TH_read(void){
2062ee67178SXianjun Jiao 	return reg_read(XPU_REG_LBT_TH_ADDR);
2072ee67178SXianjun Jiao }
2082ee67178SXianjun Jiao 
2092ee67178SXianjun Jiao static inline void XPU_REG_CSMA_DEBUG_write(u32 value){
2102ee67178SXianjun Jiao 	reg_write(XPU_REG_CSMA_DEBUG_ADDR, value);
2112ee67178SXianjun Jiao }
2122ee67178SXianjun Jiao 
2132ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_DEBUG_read(void){
2142ee67178SXianjun Jiao 	return reg_read(XPU_REG_CSMA_DEBUG_ADDR);
2152ee67178SXianjun Jiao }
2162ee67178SXianjun Jiao 
2172ee67178SXianjun Jiao static inline void XPU_REG_CSMA_CFG_write(u32 value){
2182ee67178SXianjun Jiao 	reg_write(XPU_REG_CSMA_CFG_ADDR, value);
2192ee67178SXianjun Jiao }
2202ee67178SXianjun Jiao 
2212ee67178SXianjun Jiao static inline u32 XPU_REG_CSMA_CFG_read(void){
2222ee67178SXianjun Jiao 	return reg_read(XPU_REG_CSMA_CFG_ADDR);
2232ee67178SXianjun Jiao }
2242ee67178SXianjun Jiao 
2252ee67178SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_TOTAL0_write(u32 value){
2262ee67178SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_TOTAL0_ADDR, value);
2272ee67178SXianjun Jiao }
2282ee67178SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_START0_write(u32 value){
2292ee67178SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_START0_ADDR, value);
2302ee67178SXianjun Jiao }
2312ee67178SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_END0_write(u32 value){
2322ee67178SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_END0_ADDR, value);
2332ee67178SXianjun Jiao }
2342ee67178SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_TOTAL1_write(u32 value){
2352ee67178SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_TOTAL1_ADDR, value);
2362ee67178SXianjun Jiao }
2372ee67178SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_START1_write(u32 value){
2382ee67178SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_START1_ADDR, value);
2392ee67178SXianjun Jiao }
2402ee67178SXianjun Jiao static inline void XPU_REG_SLICE_COUNT_END1_write(u32 value){
2412ee67178SXianjun Jiao 	reg_write(XPU_REG_SLICE_COUNT_END1_ADDR, value);
2422ee67178SXianjun Jiao }
2432ee67178SXianjun Jiao 
2442ee67178SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_TOTAL0_read(void){
2452ee67178SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_TOTAL0_ADDR);
2462ee67178SXianjun Jiao }
2472ee67178SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_START0_read(void){
2482ee67178SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_START0_ADDR);
2492ee67178SXianjun Jiao }
2502ee67178SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_END0_read(void){
2512ee67178SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_END0_ADDR);
2522ee67178SXianjun Jiao }
2532ee67178SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_TOTAL1_read(void){
2542ee67178SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_TOTAL1_ADDR);
2552ee67178SXianjun Jiao }
2562ee67178SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_START1_read(void){
2572ee67178SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_START1_ADDR);
2582ee67178SXianjun Jiao }
2592ee67178SXianjun Jiao static inline u32 XPU_REG_SLICE_COUNT_END1_read(void){
2602ee67178SXianjun Jiao 	return reg_read(XPU_REG_SLICE_COUNT_END1_ADDR);
2612ee67178SXianjun Jiao }
2622ee67178SXianjun Jiao 
2632ee67178SXianjun Jiao static inline void XPU_REG_BB_RF_DELAY_write(u32 value){
2642ee67178SXianjun Jiao 	reg_write(XPU_REG_BB_RF_DELAY_ADDR, value);
2652ee67178SXianjun Jiao }
2662ee67178SXianjun Jiao 
2672ee67178SXianjun Jiao static inline void XPU_REG_MAX_NUM_RETRANS_write(u32 value){
2682ee67178SXianjun Jiao 	reg_write(XPU_REG_MAX_NUM_RETRANS_ADDR, value);
2692ee67178SXianjun Jiao }
2702ee67178SXianjun Jiao 
2712ee67178SXianjun Jiao static inline void XPU_REG_MAC_ADDR_write(u8 *mac_addr) {//, u32 en_flag){
2722ee67178SXianjun Jiao 	XPU_REG_MAC_ADDR_LOW_write( *( (u32*)(mac_addr) ) );
2732ee67178SXianjun Jiao 	XPU_REG_MAC_ADDR_HIGH_write( *( (u16*)(mac_addr + 4) ) );
2742ee67178SXianjun Jiao 	#if 0
2752ee67178SXianjun Jiao 	if (en_flag) {
2762ee67178SXianjun Jiao 		XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) | 0x80000000 ); // 0x80000000 by default we turn on mac addr filter
2772ee67178SXianjun Jiao 	} else {
2782ee67178SXianjun Jiao 		XPU_REG_MAC_ADDR_HIGH_write( (*( (u16*)(mac_addr + 4) )) & 0x7FFFFFFF );
2792ee67178SXianjun Jiao 	}
2802ee67178SXianjun Jiao 	#endif
2812ee67178SXianjun Jiao }
2822ee67178SXianjun Jiao 
2832ee67178SXianjun Jiao static const struct of_device_id dev_of_ids[] = {
2842ee67178SXianjun Jiao 	{ .compatible = "sdr,xpu", },
2852ee67178SXianjun Jiao 	{}
2862ee67178SXianjun Jiao };
2872ee67178SXianjun Jiao MODULE_DEVICE_TABLE(of, dev_of_ids);
2882ee67178SXianjun Jiao 
2892ee67178SXianjun Jiao static struct xpu_driver_api xpu_driver_api_inst;
2902ee67178SXianjun Jiao static struct xpu_driver_api *xpu_api = &xpu_driver_api_inst;
2912ee67178SXianjun Jiao EXPORT_SYMBOL(xpu_api);
2922ee67178SXianjun Jiao 
2932ee67178SXianjun Jiao static inline u32 hw_init(enum xpu_mode mode){
2942ee67178SXianjun Jiao 	int err=0, rssi_half_db_th, rssi_half_db_offset, agc_gain_delay;
2952ee67178SXianjun Jiao 	u32 reg_val;
2962ee67178SXianjun Jiao 	u32 filter_flag = 0;
2972ee67178SXianjun Jiao 
2982ee67178SXianjun Jiao 	printk("%s hw_init mode %d\n", xpu_compatible_str, mode);
2992ee67178SXianjun Jiao 
3002ee67178SXianjun Jiao 	//rst internal module
3012ee67178SXianjun Jiao 	for (reg_val=0;reg_val<32;reg_val++)
3022ee67178SXianjun Jiao 		xpu_api->XPU_REG_MULTI_RST_write(0xFFFFFFFF);
3032ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write(0);
3042ee67178SXianjun Jiao 
3052ee67178SXianjun Jiao 	// http://www.studioreti.it/slide/802-11-Frame_E_C.pdf
3062ee67178SXianjun Jiao 	// https://mrncciew.com/2014/10/14/cwap-802-11-phy-ppdu/
3072ee67178SXianjun Jiao 	// https://mrncciew.com/2014/09/27/cwap-mac-header-frame-control/
3082ee67178SXianjun Jiao 	// https://mrncciew.com/2014/10/25/cwap-mac-header-durationid/
3092ee67178SXianjun Jiao 	// https://mrncciew.com/2014/11/01/cwap-mac-header-sequence-control/
3102ee67178SXianjun Jiao 	// https://witestlab.poly.edu/blog/802-11-wireless-lan-2/
3112ee67178SXianjun Jiao 	// phy_rx byte idx:
3122ee67178SXianjun Jiao 	// 5(3 sig + 2 service), -- PHY
3132ee67178SXianjun Jiao 	// 2 frame control, 2 duration/conn ID, --MAC PDU
3142ee67178SXianjun Jiao 	// 6 receiver address, 6 destination address, 6 transmitter address
3152ee67178SXianjun Jiao 	// 2 sequence control
3162ee67178SXianjun Jiao 	// 6 source address
3172ee67178SXianjun Jiao 	// reg_val = 5 + 0;
3182ee67178SXianjun Jiao 	// xpu_api->XPU_REG_PHY_RX_PKT_READ_OFFSET_write(reg_val);
3192ee67178SXianjun Jiao 	// printk("%s hw_init XPU_REG_PHY_RX_PKT_READ_OFFSET_write %d\n", xpu_compatible_str, reg_val);
3202ee67178SXianjun Jiao 
3212ee67178SXianjun Jiao 	// by default turn off filter, because all register are zeros
3222ee67178SXianjun Jiao 	// let's filter out packet according to: enum ieee80211_filter_flags at: https://www.kernel.org/doc/html/v4.9/80211/mac80211.html
3232ee67178SXianjun Jiao 	#if 0 // define in FPGA
3242ee67178SXianjun 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
3252ee67178SXianjun Jiao                         FIF_FCSFAIL =            14b00000000000100, //not support
3262ee67178SXianjun Jiao                         FIF_PLCPFAIL =           14b00000000001000, //not support
3272ee67178SXianjun Jiao                         FIF_BCN_PRBRESP_PROMISC= 14b00000000010000,
3282ee67178SXianjun Jiao                         FIF_CONTROL =            14b00000000100000,
3292ee67178SXianjun Jiao                         FIF_OTHER_BSS =          14b00000001000000,
3302ee67178SXianjun Jiao                         FIF_PSPOLL =             14b00000010000000,
3312ee67178SXianjun Jiao                         FIF_PROBE_REQ =          14b00000100000000,
3322ee67178SXianjun Jiao                         UNICAST_FOR_US =         14b00001000000000,
3332ee67178SXianjun Jiao                         BROADCAST_ALL_ONE =      14b00010000000000,
3342ee67178SXianjun Jiao                         BROADCAST_ALL_ZERO =     14b00100000000000,
3352ee67178SXianjun Jiao                         MY_BEACON          =     14b01000000000000,
3362ee67178SXianjun Jiao                         MONITOR_ALL =            14b10000000000000;
3372ee67178SXianjun Jiao 	#endif
3382ee67178SXianjun 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);
3392ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write(filter_flag);
3402ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write(0xB<<16);//6M 1011:0xB
3412ee67178SXianjun Jiao 
3422ee67178SXianjun Jiao 	////set up FC type filter for packet needs ACK -- no use, FPGA handle by itself
3432ee67178SXianjun Jiao 	//xpu_api->XPU_REG_ACK_FC_FILTER_write((3<<(2+16))|(2<<2)); // low 16 bits target FC 16 bits; high 16 bits -- mask
3442ee67178SXianjun Jiao 
3452ee67178SXianjun Jiao 	// after send data frame wait for ACK, this will be set in real time in function ad9361_rf_set_channel
346*febc5adfSXianjun 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"!
347*febc5adfSXianjun Jiao 	// xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( 6*10 ); // +6 = 16us for 5GHz
3482ee67178SXianjun Jiao 
3492ee67178SXianjun Jiao 	//xpu_api->XPU_REG_MAX_NUM_RETRANS_write(3); // if this > 0, it will override mac80211 set value, and set static retransmission limit
3502ee67178SXianjun Jiao 
351*febc5adfSXianjun Jiao 	xpu_api->XPU_REG_BB_RF_DELAY_write(49);
3522ee67178SXianjun Jiao 
3532ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL0_write(50000-1); // total 50ms
3542ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START0_write(0); //start 0ms
3552ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END0_write(50000-1); //end 10ms
3562ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL1_write(50000-1); // total 50ms
3572ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START1_write(0000); //start 0ms
3582ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END1_write(1000-1); //end 1ms
3592ee67178SXianjun Jiao 
3602ee67178SXianjun Jiao 	switch(mode)
3612ee67178SXianjun Jiao 	{
3622ee67178SXianjun Jiao 		case XPU_TEST:
3632ee67178SXianjun Jiao 			printk("%s hw_init mode XPU_TEST\n", xpu_compatible_str);
3642ee67178SXianjun Jiao 			break;
3652ee67178SXianjun Jiao 
3662ee67178SXianjun Jiao 		case XPU_NORMAL:
3672ee67178SXianjun Jiao 			printk("%s hw_init mode XPU_NORMAL\n", xpu_compatible_str);
3682ee67178SXianjun Jiao 			break;
3692ee67178SXianjun Jiao 
3702ee67178SXianjun Jiao 		default:
3712ee67178SXianjun Jiao 			printk("%s hw_init mode %d is wrong!\n", xpu_compatible_str, mode);
3722ee67178SXianjun Jiao 			err=1;
3732ee67178SXianjun Jiao 	}
3742ee67178SXianjun 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
3752ee67178SXianjun Jiao 
3762ee67178SXianjun Jiao 	agc_gain_delay = 50; //samples
3772ee67178SXianjun Jiao 	rssi_half_db_offset = 75<<1;
3782ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write(0x80000000|((rssi_half_db_offset<<16)|agc_gain_delay) );
3792ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write((~0x80000000)&((rssi_half_db_offset<<16)|agc_gain_delay) );
3802ee67178SXianjun Jiao 
3812ee67178SXianjun Jiao 	//rssi_half_db_th = 70<<1; // with splitter
3822ee67178SXianjun Jiao 	rssi_half_db_th = 87<<1; // -62dBm
3832ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_write(rssi_half_db_th); // set IQ rssi th step .5dB to xxx and enable it
3842ee67178SXianjun Jiao 
3852ee67178SXianjun Jiao 	//xpu_api->XPU_REG_CSMA_DEBUG_write((1<<31)|(20<<24)|(4<<19)|(3<<14)|(10<<7)|(5));
3862ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_write(0);
3872ee67178SXianjun Jiao 
3882ee67178SXianjun Jiao 	//xpu_api->XPU_REG_CSMA_CFG_write(3); //normal CSMA
3892ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_write(0xe0000000); //high priority
3902ee67178SXianjun Jiao 
391*febc5adfSXianjun Jiao 	// xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((40)<<16)|0 );//high 16bit 5GHz; low 16 bit 2.4GHz (Attention, current tx core has around 1.19us starting delay that makes the ack fall behind 10us SIFS in 2.4GHz! Need to improve TX in 2.4GHz!)
392*febc5adfSXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write( ((51)<<16)|0 );//now our tx send out I/Q immediately
3932ee67178SXianjun Jiao 
394*febc5adfSXianjun 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)
395*febc5adfSXianjun 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)
3962ee67178SXianjun Jiao 
3972ee67178SXianjun Jiao 	printk("%s hw_init err %d\n", xpu_compatible_str, err);
3982ee67178SXianjun Jiao 	return(err);
3992ee67178SXianjun Jiao }
4002ee67178SXianjun Jiao 
4012ee67178SXianjun Jiao static int dev_probe(struct platform_device *pdev)
4022ee67178SXianjun Jiao {
4032ee67178SXianjun Jiao 	struct device_node *np = pdev->dev.of_node;
4042ee67178SXianjun Jiao 	struct resource *io;
4052ee67178SXianjun Jiao 	u32 test_us0, test_us1, test_us2;
4062ee67178SXianjun Jiao 	int err=1;
4072ee67178SXianjun Jiao 
4082ee67178SXianjun Jiao 	printk("\n");
4092ee67178SXianjun Jiao 
4102ee67178SXianjun Jiao 	if (np) {
4112ee67178SXianjun Jiao 		const struct of_device_id *match;
4122ee67178SXianjun Jiao 
4132ee67178SXianjun Jiao 		match = of_match_node(dev_of_ids, np);
4142ee67178SXianjun Jiao 		if (match) {
4152ee67178SXianjun Jiao 			printk("%s dev_probe match!\n", xpu_compatible_str);
4162ee67178SXianjun Jiao 			err = 0;
4172ee67178SXianjun Jiao 		}
4182ee67178SXianjun Jiao 	}
4192ee67178SXianjun Jiao 
4202ee67178SXianjun Jiao 	if (err)
4212ee67178SXianjun Jiao 		return err;
4222ee67178SXianjun Jiao 
4232ee67178SXianjun Jiao 	xpu_api->hw_init=hw_init;
4242ee67178SXianjun Jiao 
4252ee67178SXianjun Jiao 	xpu_api->reg_read=reg_read;
4262ee67178SXianjun Jiao 	xpu_api->reg_write=reg_write;
4272ee67178SXianjun Jiao 
4282ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_write=XPU_REG_MULTI_RST_write;
4292ee67178SXianjun Jiao 	xpu_api->XPU_REG_MULTI_RST_read=XPU_REG_MULTI_RST_read;
4302ee67178SXianjun Jiao 	xpu_api->XPU_REG_SRC_SEL_write=XPU_REG_SRC_SEL_write;
4312ee67178SXianjun Jiao 	xpu_api->XPU_REG_SRC_SEL_read=XPU_REG_SRC_SEL_read;
4322ee67178SXianjun Jiao 
4332ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_write=XPU_REG_RECV_ACK_COUNT_TOP0_write;
4342ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP0_read=XPU_REG_RECV_ACK_COUNT_TOP0_read;
4352ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_write=XPU_REG_RECV_ACK_COUNT_TOP1_write;
4362ee67178SXianjun Jiao 	xpu_api->XPU_REG_RECV_ACK_COUNT_TOP1_read=XPU_REG_RECV_ACK_COUNT_TOP1_read;
4372ee67178SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_write=XPU_REG_SEND_ACK_WAIT_TOP_write;
4382ee67178SXianjun Jiao 	xpu_api->XPU_REG_SEND_ACK_WAIT_TOP_read=XPU_REG_SEND_ACK_WAIT_TOP_read;
4392ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_LOW_write=XPU_REG_MAC_ADDR_LOW_write;
4402ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_LOW_read=XPU_REG_MAC_ADDR_LOW_read;
4412ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_HIGH_write=XPU_REG_MAC_ADDR_HIGH_write;
4422ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_HIGH_read=XPU_REG_MAC_ADDR_HIGH_read;
4432ee67178SXianjun Jiao 
4442ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write=XPU_REG_FILTER_FLAG_write;
4452ee67178SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_read=XPU_REG_FILTER_FLAG_read;
4462ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_write=XPU_REG_CTS_TO_RTS_CONFIG_write;
4472ee67178SXianjun Jiao 	xpu_api->XPU_REG_CTS_TO_RTS_CONFIG_read=XPU_REG_CTS_TO_RTS_CONFIG_read;
4482ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_LOW_write=XPU_REG_BSSID_FILTER_LOW_write;
4492ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_LOW_read=XPU_REG_BSSID_FILTER_LOW_read;
4502ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_HIGH_write=XPU_REG_BSSID_FILTER_HIGH_write;
4512ee67178SXianjun Jiao 	xpu_api->XPU_REG_BSSID_FILTER_HIGH_read=XPU_REG_BSSID_FILTER_HIGH_read;
4522ee67178SXianjun Jiao 
4532ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_write=XPU_REG_BAND_CHANNEL_write;
4542ee67178SXianjun Jiao 	xpu_api->XPU_REG_BAND_CHANNEL_read=XPU_REG_BAND_CHANNEL_read;
4552ee67178SXianjun Jiao 
4562ee67178SXianjun Jiao 	xpu_api->XPU_REG_TRX_STATUS_read=XPU_REG_TRX_STATUS_read;
4572ee67178SXianjun Jiao 	xpu_api->XPU_REG_TX_RESULT_read=XPU_REG_TX_RESULT_read;
4582ee67178SXianjun 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_FC_DI_read=XPU_REG_FC_DI_read;
4662ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR1_LOW_read=XPU_REG_ADDR1_LOW_read;
4672ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR1_HIGH_read=XPU_REG_ADDR1_HIGH_read;
4682ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR2_LOW_read=XPU_REG_ADDR2_LOW_read;
4692ee67178SXianjun Jiao 	xpu_api->XPU_REG_ADDR2_HIGH_read=XPU_REG_ADDR2_HIGH_read;
4702ee67178SXianjun Jiao 
4712ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_write=XPU_REG_LBT_TH_write;
4722ee67178SXianjun Jiao 	xpu_api->XPU_REG_LBT_TH_read=XPU_REG_LBT_TH_read;
4732ee67178SXianjun Jiao 
4742ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_read=XPU_REG_RSSI_DB_CFG_read;
4752ee67178SXianjun Jiao 	xpu_api->XPU_REG_RSSI_DB_CFG_write=XPU_REG_RSSI_DB_CFG_write;
4762ee67178SXianjun Jiao 
4772ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_write=XPU_REG_CSMA_DEBUG_write;
4782ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_DEBUG_read=XPU_REG_CSMA_DEBUG_read;
4792ee67178SXianjun Jiao 
4802ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_write=XPU_REG_CSMA_CFG_write;
4812ee67178SXianjun Jiao 	xpu_api->XPU_REG_CSMA_CFG_read=XPU_REG_CSMA_CFG_read;
4822ee67178SXianjun Jiao 
4832ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL0_write=XPU_REG_SLICE_COUNT_TOTAL0_write;
4842ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START0_write=XPU_REG_SLICE_COUNT_START0_write;
4852ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END0_write=XPU_REG_SLICE_COUNT_END0_write;
4862ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL1_write=XPU_REG_SLICE_COUNT_TOTAL1_write;
4872ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START1_write=XPU_REG_SLICE_COUNT_START1_write;
4882ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END1_write=XPU_REG_SLICE_COUNT_END1_write;
4892ee67178SXianjun Jiao 
4902ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL0_read=XPU_REG_SLICE_COUNT_TOTAL0_read;
4912ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START0_read=XPU_REG_SLICE_COUNT_START0_read;
4922ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END0_read=XPU_REG_SLICE_COUNT_END0_read;
4932ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_TOTAL1_read=XPU_REG_SLICE_COUNT_TOTAL1_read;
4942ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_START1_read=XPU_REG_SLICE_COUNT_START1_read;
4952ee67178SXianjun Jiao 	xpu_api->XPU_REG_SLICE_COUNT_END1_read=XPU_REG_SLICE_COUNT_END1_read;
4962ee67178SXianjun Jiao 
4972ee67178SXianjun Jiao 	xpu_api->XPU_REG_BB_RF_DELAY_write=XPU_REG_BB_RF_DELAY_write;
4982ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAX_NUM_RETRANS_write=XPU_REG_MAX_NUM_RETRANS_write;
4992ee67178SXianjun Jiao 
5002ee67178SXianjun Jiao 	xpu_api->XPU_REG_MAC_ADDR_write=XPU_REG_MAC_ADDR_write;
5012ee67178SXianjun Jiao 
5022ee67178SXianjun Jiao 	/* Request and map I/O memory */
5032ee67178SXianjun Jiao 	io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5042ee67178SXianjun Jiao 	base_addr = devm_ioremap_resource(&pdev->dev, io);
5052ee67178SXianjun Jiao 	if (IS_ERR(base_addr))
5062ee67178SXianjun Jiao 		return PTR_ERR(base_addr);
5072ee67178SXianjun Jiao 
5082ee67178SXianjun 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);
5092ee67178SXianjun Jiao 	printk("%s dev_probe base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5102ee67178SXianjun Jiao 	printk("%s dev_probe xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5112ee67178SXianjun Jiao 	printk("%s dev_probe             xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
5122ee67178SXianjun Jiao 
5132ee67178SXianjun Jiao 	printk("%s dev_probe reset tsf timer\n", xpu_compatible_str);
5142ee67178SXianjun Jiao 	xpu_api->XPU_REG_TSF_LOAD_VAL_write(0,0);
5152ee67178SXianjun Jiao 	test_us0 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5162ee67178SXianjun Jiao 	mdelay(33);
5172ee67178SXianjun Jiao 	test_us1 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5182ee67178SXianjun Jiao 	mdelay(67);
5192ee67178SXianjun Jiao 	test_us2 = xpu_api->XPU_REG_TSF_RUNTIME_VAL_LOW_read();
5202ee67178SXianjun 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);
5212ee67178SXianjun Jiao 
5222ee67178SXianjun Jiao 	printk("%s dev_probe succeed!\n", xpu_compatible_str);
5232ee67178SXianjun Jiao 
5242ee67178SXianjun Jiao 	err = hw_init(XPU_NORMAL);
5252ee67178SXianjun Jiao 
5262ee67178SXianjun Jiao 	return err;
5272ee67178SXianjun Jiao }
5282ee67178SXianjun Jiao 
5292ee67178SXianjun Jiao static int dev_remove(struct platform_device *pdev)
5302ee67178SXianjun Jiao {
5312ee67178SXianjun Jiao 	printk("\n");
5322ee67178SXianjun Jiao 
5332ee67178SXianjun Jiao 	printk("%s dev_remove base_addr 0x%08x\n", xpu_compatible_str,(u32)base_addr);
5342ee67178SXianjun Jiao 	printk("%s dev_remove xpu_driver_api_inst 0x%08x\n", xpu_compatible_str, (u32)&xpu_driver_api_inst);
5352ee67178SXianjun Jiao 	printk("%s dev_remove             xpu_api 0x%08x\n", xpu_compatible_str, (u32)xpu_api);
5362ee67178SXianjun Jiao 
5372ee67178SXianjun Jiao 	printk("%s dev_remove succeed!\n", xpu_compatible_str);
5382ee67178SXianjun Jiao 	return 0;
5392ee67178SXianjun Jiao }
5402ee67178SXianjun Jiao 
5412ee67178SXianjun Jiao static struct platform_driver dev_driver = {
5422ee67178SXianjun Jiao 	.driver = {
5432ee67178SXianjun Jiao 		.name = "sdr,xpu",
5442ee67178SXianjun Jiao 		.owner = THIS_MODULE,
5452ee67178SXianjun Jiao 		.of_match_table = dev_of_ids,
5462ee67178SXianjun Jiao 	},
5472ee67178SXianjun Jiao 	.probe = dev_probe,
5482ee67178SXianjun Jiao 	.remove = dev_remove,
5492ee67178SXianjun Jiao };
5502ee67178SXianjun Jiao 
5512ee67178SXianjun Jiao module_platform_driver(dev_driver);
5522ee67178SXianjun Jiao 
5532ee67178SXianjun Jiao MODULE_AUTHOR("Xianjun Jiao");
5542ee67178SXianjun Jiao MODULE_DESCRIPTION("sdr,xpu");
5552ee67178SXianjun Jiao MODULE_LICENSE("GPL v2");
556