blob: d161f0e09c36e53571f364d8f3a2d26c6a554a06 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Jean-Christophe PLAGNIOL-VILLARD2ef75032008-04-24 07:57:17 +02002/*
3 * (c) 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Jean-Christophe PLAGNIOL-VILLARD2ef75032008-04-24 07:57:17 +02004 */
5#include <common.h>
Simon Glassc05ed002020-05-10 11:40:11 -06006#include <linux/delay.h>
Jean-Christophe PLAGNIOL-VILLARD2ef75032008-04-24 07:57:17 +02007#include "ax88796.h"
8
9/*
10 * Set 1 bit data
11 */
12static 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 */
30static 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 */
47static 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
85static 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 */
96static 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
109static 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
Nobuhiro Iwamatsu702c85b2008-09-30 15:02:53 +0900134int get_prom(u8* mac_addr, u8* base_addr)
Jean-Christophe PLAGNIOL-VILLARD2ef75032008-04-24 07:57:17 +0200135{
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}