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