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