1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (c) 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #include <common.h> 7*4882a593Smuzhiyun #include "ax88796.h" 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* 10*4882a593Smuzhiyun * Set 1 bit data 11*4882a593Smuzhiyun */ ax88796_bitset(u32 bit)12*4882a593Smuzhiyunstatic void ax88796_bitset(u32 bit) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun /* DATA1 */ 15*4882a593Smuzhiyun if( bit ) 16*4882a593Smuzhiyun EEDI_HIGH; 17*4882a593Smuzhiyun else 18*4882a593Smuzhiyun EEDI_LOW; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun EECLK_LOW; 21*4882a593Smuzhiyun udelay(1000); 22*4882a593Smuzhiyun EECLK_HIGH; 23*4882a593Smuzhiyun udelay(1000); 24*4882a593Smuzhiyun EEDI_LOW; 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* 28*4882a593Smuzhiyun * Get 1 bit data 29*4882a593Smuzhiyun */ ax88796_bitget(void)30*4882a593Smuzhiyunstatic u8 ax88796_bitget(void) 31*4882a593Smuzhiyun { 32*4882a593Smuzhiyun u8 bit; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun EECLK_LOW; 35*4882a593Smuzhiyun udelay(1000); 36*4882a593Smuzhiyun /* DATA */ 37*4882a593Smuzhiyun bit = EEDO; 38*4882a593Smuzhiyun EECLK_HIGH; 39*4882a593Smuzhiyun udelay(1000); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun return bit; 42*4882a593Smuzhiyun } 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * Send COMMAND to EEPROM 46*4882a593Smuzhiyun */ ax88796_eep_cmd(u8 cmd)47*4882a593Smuzhiyunstatic void ax88796_eep_cmd(u8 cmd) 48*4882a593Smuzhiyun { 49*4882a593Smuzhiyun ax88796_bitset(BIT_DUMMY); 50*4882a593Smuzhiyun switch(cmd){ 51*4882a593Smuzhiyun case MAC_EEP_READ: 52*4882a593Smuzhiyun ax88796_bitset(1); 53*4882a593Smuzhiyun ax88796_bitset(1); 54*4882a593Smuzhiyun ax88796_bitset(0); 55*4882a593Smuzhiyun break; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun case MAC_EEP_WRITE: 58*4882a593Smuzhiyun ax88796_bitset(1); 59*4882a593Smuzhiyun ax88796_bitset(0); 60*4882a593Smuzhiyun ax88796_bitset(1); 61*4882a593Smuzhiyun break; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun case MAC_EEP_ERACE: 64*4882a593Smuzhiyun ax88796_bitset(1); 65*4882a593Smuzhiyun ax88796_bitset(1); 66*4882a593Smuzhiyun ax88796_bitset(1); 67*4882a593Smuzhiyun break; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun case MAC_EEP_EWEN: 70*4882a593Smuzhiyun ax88796_bitset(1); 71*4882a593Smuzhiyun ax88796_bitset(0); 72*4882a593Smuzhiyun ax88796_bitset(0); 73*4882a593Smuzhiyun break; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun case MAC_EEP_EWDS: 76*4882a593Smuzhiyun ax88796_bitset(1); 77*4882a593Smuzhiyun ax88796_bitset(0); 78*4882a593Smuzhiyun ax88796_bitset(0); 79*4882a593Smuzhiyun break; 80*4882a593Smuzhiyun default: 81*4882a593Smuzhiyun break; 82*4882a593Smuzhiyun } 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun ax88796_eep_setaddr(u16 addr)85*4882a593Smuzhiyunstatic void ax88796_eep_setaddr(u16 addr) 86*4882a593Smuzhiyun { 87*4882a593Smuzhiyun int i ; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun for( i = 7 ; i >= 0 ; i-- ) 90*4882a593Smuzhiyun ax88796_bitset(addr & (1 << i)); 91*4882a593Smuzhiyun } 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* 94*4882a593Smuzhiyun * Get data from EEPROM 95*4882a593Smuzhiyun */ ax88796_eep_getdata(void)96*4882a593Smuzhiyunstatic u16 ax88796_eep_getdata(void) 97*4882a593Smuzhiyun { 98*4882a593Smuzhiyun ushort data = 0; 99*4882a593Smuzhiyun int i; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun ax88796_bitget(); /* DUMMY */ 102*4882a593Smuzhiyun for( i = 0 ; i < 16 ; i++ ){ 103*4882a593Smuzhiyun data <<= 1; 104*4882a593Smuzhiyun data |= ax88796_bitget(); 105*4882a593Smuzhiyun } 106*4882a593Smuzhiyun return data; 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun ax88796_mac_read(u8 * buff)109*4882a593Smuzhiyunstatic void ax88796_mac_read(u8 *buff) 110*4882a593Smuzhiyun { 111*4882a593Smuzhiyun int i ; 112*4882a593Smuzhiyun u16 data; 113*4882a593Smuzhiyun u16 addr = 0; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun for( i = 0 ; i < 3; i++ ) 116*4882a593Smuzhiyun { 117*4882a593Smuzhiyun EECS_HIGH; 118*4882a593Smuzhiyun EEDI_LOW; 119*4882a593Smuzhiyun udelay(1000); 120*4882a593Smuzhiyun /* READ COMMAND */ 121*4882a593Smuzhiyun ax88796_eep_cmd(MAC_EEP_READ); 122*4882a593Smuzhiyun /* ADDRESS */ 123*4882a593Smuzhiyun ax88796_eep_setaddr(addr++); 124*4882a593Smuzhiyun /* GET DATA */ 125*4882a593Smuzhiyun data = ax88796_eep_getdata(); 126*4882a593Smuzhiyun *buff++ = (uchar)(data & 0xff); 127*4882a593Smuzhiyun *buff++ = (uchar)((data >> 8) & 0xff); 128*4882a593Smuzhiyun EECLK_LOW; 129*4882a593Smuzhiyun EEDI_LOW; 130*4882a593Smuzhiyun EECS_LOW; 131*4882a593Smuzhiyun } 132*4882a593Smuzhiyun } 133*4882a593Smuzhiyun get_prom(u8 * mac_addr,u8 * base_addr)134*4882a593Smuzhiyunint get_prom(u8* mac_addr, u8* base_addr) 135*4882a593Smuzhiyun { 136*4882a593Smuzhiyun u8 prom[32]; 137*4882a593Smuzhiyun int i; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun ax88796_mac_read(prom); 140*4882a593Smuzhiyun for (i = 0; i < 6; i++){ 141*4882a593Smuzhiyun mac_addr[i] = prom[i]; 142*4882a593Smuzhiyun } 143*4882a593Smuzhiyun return 1; 144*4882a593Smuzhiyun } 145