xref: /rk3399_rockchip-uboot/drivers/net/ax88796.c (revision 326ea986ac150acdc7656d57fca647db80b50158)
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-VILLARD static 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-VILLARD static 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-VILLARD static 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-VILLARD static 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-VILLARD static 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-VILLARD static 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 Iwamatsu int 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