xref: /openbmc/u-boot/drivers/net/ax88796.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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-VILLARD static 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-VILLARD static 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-VILLARD static 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-VILLARD static 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-VILLARD static 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-VILLARD static 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 Iwamatsu int 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