1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 22ef7503aSJean-Christophe PLAGNIOL-VILLARD /* 32ef7503aSJean-Christophe PLAGNIOL-VILLARD * (c) 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> 42ef7503aSJean-Christophe PLAGNIOL-VILLARD */ 52ef7503aSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 62ef7503aSJean-Christophe PLAGNIOL-VILLARD #include "ax88796.h" 72ef7503aSJean-Christophe PLAGNIOL-VILLARD 82ef7503aSJean-Christophe PLAGNIOL-VILLARD /* 92ef7503aSJean-Christophe PLAGNIOL-VILLARD * Set 1 bit data 102ef7503aSJean-Christophe PLAGNIOL-VILLARD */ ax88796_bitset(u32 bit)112ef7503aSJean-Christophe PLAGNIOL-VILLARDstatic void ax88796_bitset(u32 bit) 122ef7503aSJean-Christophe PLAGNIOL-VILLARD { 132ef7503aSJean-Christophe PLAGNIOL-VILLARD /* DATA1 */ 142ef7503aSJean-Christophe PLAGNIOL-VILLARD if( bit ) 152ef7503aSJean-Christophe PLAGNIOL-VILLARD EEDI_HIGH; 162ef7503aSJean-Christophe PLAGNIOL-VILLARD else 172ef7503aSJean-Christophe PLAGNIOL-VILLARD EEDI_LOW; 182ef7503aSJean-Christophe PLAGNIOL-VILLARD 192ef7503aSJean-Christophe PLAGNIOL-VILLARD EECLK_LOW; 202ef7503aSJean-Christophe PLAGNIOL-VILLARD udelay(1000); 212ef7503aSJean-Christophe PLAGNIOL-VILLARD EECLK_HIGH; 222ef7503aSJean-Christophe PLAGNIOL-VILLARD udelay(1000); 232ef7503aSJean-Christophe PLAGNIOL-VILLARD EEDI_LOW; 242ef7503aSJean-Christophe PLAGNIOL-VILLARD } 252ef7503aSJean-Christophe PLAGNIOL-VILLARD 262ef7503aSJean-Christophe PLAGNIOL-VILLARD /* 272ef7503aSJean-Christophe PLAGNIOL-VILLARD * Get 1 bit data 282ef7503aSJean-Christophe PLAGNIOL-VILLARD */ ax88796_bitget(void)292ef7503aSJean-Christophe PLAGNIOL-VILLARDstatic u8 ax88796_bitget(void) 302ef7503aSJean-Christophe PLAGNIOL-VILLARD { 312ef7503aSJean-Christophe PLAGNIOL-VILLARD u8 bit; 322ef7503aSJean-Christophe PLAGNIOL-VILLARD 332ef7503aSJean-Christophe PLAGNIOL-VILLARD EECLK_LOW; 342ef7503aSJean-Christophe PLAGNIOL-VILLARD udelay(1000); 352ef7503aSJean-Christophe PLAGNIOL-VILLARD /* DATA */ 362ef7503aSJean-Christophe PLAGNIOL-VILLARD bit = EEDO; 372ef7503aSJean-Christophe PLAGNIOL-VILLARD EECLK_HIGH; 382ef7503aSJean-Christophe PLAGNIOL-VILLARD udelay(1000); 392ef7503aSJean-Christophe PLAGNIOL-VILLARD 402ef7503aSJean-Christophe PLAGNIOL-VILLARD return bit; 412ef7503aSJean-Christophe PLAGNIOL-VILLARD } 422ef7503aSJean-Christophe PLAGNIOL-VILLARD 432ef7503aSJean-Christophe PLAGNIOL-VILLARD /* 442ef7503aSJean-Christophe PLAGNIOL-VILLARD * Send COMMAND to EEPROM 452ef7503aSJean-Christophe PLAGNIOL-VILLARD */ ax88796_eep_cmd(u8 cmd)462ef7503aSJean-Christophe PLAGNIOL-VILLARDstatic void ax88796_eep_cmd(u8 cmd) 472ef7503aSJean-Christophe PLAGNIOL-VILLARD { 482ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(BIT_DUMMY); 492ef7503aSJean-Christophe PLAGNIOL-VILLARD switch(cmd){ 502ef7503aSJean-Christophe PLAGNIOL-VILLARD case MAC_EEP_READ: 512ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 522ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 532ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(0); 542ef7503aSJean-Christophe PLAGNIOL-VILLARD break; 552ef7503aSJean-Christophe PLAGNIOL-VILLARD 562ef7503aSJean-Christophe PLAGNIOL-VILLARD case MAC_EEP_WRITE: 572ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 582ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(0); 592ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 602ef7503aSJean-Christophe PLAGNIOL-VILLARD break; 612ef7503aSJean-Christophe PLAGNIOL-VILLARD 622ef7503aSJean-Christophe PLAGNIOL-VILLARD case MAC_EEP_ERACE: 632ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 642ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 652ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 662ef7503aSJean-Christophe PLAGNIOL-VILLARD break; 672ef7503aSJean-Christophe PLAGNIOL-VILLARD 682ef7503aSJean-Christophe PLAGNIOL-VILLARD case MAC_EEP_EWEN: 692ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 702ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(0); 712ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(0); 722ef7503aSJean-Christophe PLAGNIOL-VILLARD break; 732ef7503aSJean-Christophe PLAGNIOL-VILLARD 742ef7503aSJean-Christophe PLAGNIOL-VILLARD case MAC_EEP_EWDS: 752ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(1); 762ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(0); 772ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(0); 782ef7503aSJean-Christophe PLAGNIOL-VILLARD break; 792ef7503aSJean-Christophe PLAGNIOL-VILLARD default: 802ef7503aSJean-Christophe PLAGNIOL-VILLARD break; 812ef7503aSJean-Christophe PLAGNIOL-VILLARD } 822ef7503aSJean-Christophe PLAGNIOL-VILLARD } 832ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_eep_setaddr(u16 addr)842ef7503aSJean-Christophe PLAGNIOL-VILLARDstatic void ax88796_eep_setaddr(u16 addr) 852ef7503aSJean-Christophe PLAGNIOL-VILLARD { 862ef7503aSJean-Christophe PLAGNIOL-VILLARD int i ; 872ef7503aSJean-Christophe PLAGNIOL-VILLARD 882ef7503aSJean-Christophe PLAGNIOL-VILLARD for( i = 7 ; i >= 0 ; i-- ) 892ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitset(addr & (1 << i)); 902ef7503aSJean-Christophe PLAGNIOL-VILLARD } 912ef7503aSJean-Christophe PLAGNIOL-VILLARD 922ef7503aSJean-Christophe PLAGNIOL-VILLARD /* 932ef7503aSJean-Christophe PLAGNIOL-VILLARD * Get data from EEPROM 942ef7503aSJean-Christophe PLAGNIOL-VILLARD */ ax88796_eep_getdata(void)952ef7503aSJean-Christophe PLAGNIOL-VILLARDstatic u16 ax88796_eep_getdata(void) 962ef7503aSJean-Christophe PLAGNIOL-VILLARD { 972ef7503aSJean-Christophe PLAGNIOL-VILLARD ushort data = 0; 982ef7503aSJean-Christophe PLAGNIOL-VILLARD int i; 992ef7503aSJean-Christophe PLAGNIOL-VILLARD 1002ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_bitget(); /* DUMMY */ 1012ef7503aSJean-Christophe PLAGNIOL-VILLARD for( i = 0 ; i < 16 ; i++ ){ 1022ef7503aSJean-Christophe PLAGNIOL-VILLARD data <<= 1; 1032ef7503aSJean-Christophe PLAGNIOL-VILLARD data |= ax88796_bitget(); 1042ef7503aSJean-Christophe PLAGNIOL-VILLARD } 1052ef7503aSJean-Christophe PLAGNIOL-VILLARD return data; 1062ef7503aSJean-Christophe PLAGNIOL-VILLARD } 1072ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_mac_read(u8 * buff)1082ef7503aSJean-Christophe PLAGNIOL-VILLARDstatic void ax88796_mac_read(u8 *buff) 1092ef7503aSJean-Christophe PLAGNIOL-VILLARD { 1102ef7503aSJean-Christophe PLAGNIOL-VILLARD int i ; 1112ef7503aSJean-Christophe PLAGNIOL-VILLARD u16 data; 1122ef7503aSJean-Christophe PLAGNIOL-VILLARD u16 addr = 0; 1132ef7503aSJean-Christophe PLAGNIOL-VILLARD 1142ef7503aSJean-Christophe PLAGNIOL-VILLARD for( i = 0 ; i < 3; i++ ) 1152ef7503aSJean-Christophe PLAGNIOL-VILLARD { 1162ef7503aSJean-Christophe PLAGNIOL-VILLARD EECS_HIGH; 1172ef7503aSJean-Christophe PLAGNIOL-VILLARD EEDI_LOW; 1182ef7503aSJean-Christophe PLAGNIOL-VILLARD udelay(1000); 1192ef7503aSJean-Christophe PLAGNIOL-VILLARD /* READ COMMAND */ 1202ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_eep_cmd(MAC_EEP_READ); 1212ef7503aSJean-Christophe PLAGNIOL-VILLARD /* ADDRESS */ 1222ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_eep_setaddr(addr++); 1232ef7503aSJean-Christophe PLAGNIOL-VILLARD /* GET DATA */ 1242ef7503aSJean-Christophe PLAGNIOL-VILLARD data = ax88796_eep_getdata(); 1252ef7503aSJean-Christophe PLAGNIOL-VILLARD *buff++ = (uchar)(data & 0xff); 1262ef7503aSJean-Christophe PLAGNIOL-VILLARD *buff++ = (uchar)((data >> 8) & 0xff); 1272ef7503aSJean-Christophe PLAGNIOL-VILLARD EECLK_LOW; 1282ef7503aSJean-Christophe PLAGNIOL-VILLARD EEDI_LOW; 1292ef7503aSJean-Christophe PLAGNIOL-VILLARD EECS_LOW; 1302ef7503aSJean-Christophe PLAGNIOL-VILLARD } 1312ef7503aSJean-Christophe PLAGNIOL-VILLARD } 1322ef7503aSJean-Christophe PLAGNIOL-VILLARD get_prom(u8 * mac_addr,u8 * base_addr)133702c85b0SNobuhiro Iwamatsuint get_prom(u8* mac_addr, u8* base_addr) 1342ef7503aSJean-Christophe PLAGNIOL-VILLARD { 1352ef7503aSJean-Christophe PLAGNIOL-VILLARD u8 prom[32]; 1362ef7503aSJean-Christophe PLAGNIOL-VILLARD int i; 1372ef7503aSJean-Christophe PLAGNIOL-VILLARD 1382ef7503aSJean-Christophe PLAGNIOL-VILLARD ax88796_mac_read(prom); 1392ef7503aSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < 6; i++){ 1402ef7503aSJean-Christophe PLAGNIOL-VILLARD mac_addr[i] = prom[i]; 1412ef7503aSJean-Christophe PLAGNIOL-VILLARD } 1422ef7503aSJean-Christophe PLAGNIOL-VILLARD return 1; 1432ef7503aSJean-Christophe PLAGNIOL-VILLARD } 144