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