2 * (C) Copyright 2011 CompuLab, Ltd. <www.compulab.co.il>
4 * Authors: Nikita Kiryanov <nikita@compulab.co.il>
5 * Igor Grinberg <grinberg@compulab.co.il>
7 * SPDX-License-Identifier: GPL-2.0+
13 #ifndef CONFIG_SYS_I2C_EEPROM_ADDR
14 # define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
15 # define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
18 #ifndef CONFIG_SYS_I2C_EEPROM_BUS
19 #define CONFIG_SYS_I2C_EEPROM_BUS 0
22 #define EEPROM_LAYOUT_VER_OFFSET 44
23 #define BOARD_SERIAL_OFFSET 20
24 #define BOARD_SERIAL_OFFSET_LEGACY 8
25 #define BOARD_REV_OFFSET 0
26 #define BOARD_REV_OFFSET_LEGACY 6
27 #define BOARD_REV_SIZE 2
28 #define MAC_ADDR_OFFSET 4
29 #define MAC_ADDR_OFFSET_LEGACY 0
31 #define LAYOUT_INVALID 0
32 #define LAYOUT_LEGACY 0xff
34 static int cl_eeprom_layout
; /* Implicitly LAYOUT_INVALID */
36 static int cl_eeprom_read(uint offset
, uchar
*buf
, int len
)
39 unsigned int current_i2c_bus
= i2c_get_bus_num();
41 res
= i2c_set_bus_num(CONFIG_SYS_I2C_EEPROM_BUS
);
45 res
= i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR
, offset
,
46 CONFIG_SYS_I2C_EEPROM_ADDR_LEN
, buf
, len
);
48 i2c_set_bus_num(current_i2c_bus
);
53 static int cl_eeprom_setup_layout(void)
57 if (cl_eeprom_layout
!= LAYOUT_INVALID
)
60 res
= cl_eeprom_read(EEPROM_LAYOUT_VER_OFFSET
,
61 (uchar
*)&cl_eeprom_layout
, 1);
63 cl_eeprom_layout
= LAYOUT_INVALID
;
67 if (cl_eeprom_layout
== 0 || cl_eeprom_layout
>= 0x20)
68 cl_eeprom_layout
= LAYOUT_LEGACY
;
73 void get_board_serial(struct tag_serialnr
*serialnr
)
78 memset(serialnr
, 0, sizeof(*serialnr
));
80 if (cl_eeprom_setup_layout())
83 offset
= (cl_eeprom_layout
!= LAYOUT_LEGACY
) ?
84 BOARD_SERIAL_OFFSET
: BOARD_SERIAL_OFFSET_LEGACY
;
86 if (cl_eeprom_read(offset
, (uchar
*)serial
, 8))
89 if (serial
[0] != 0xffffffff && serial
[1] != 0xffffffff) {
90 serialnr
->low
= serial
[0];
91 serialnr
->high
= serial
[1];
96 * Routine: cl_eeprom_read_mac_addr
97 * Description: read mac address and store it in buf.
99 int cl_eeprom_read_mac_addr(uchar
*buf
)
103 if (cl_eeprom_setup_layout())
106 offset
= (cl_eeprom_layout
!= LAYOUT_LEGACY
) ?
107 MAC_ADDR_OFFSET
: MAC_ADDR_OFFSET_LEGACY
;
109 return cl_eeprom_read(offset
, buf
, 6);
113 * Routine: cl_eeprom_get_board_rev
114 * Description: read system revision from eeprom
116 u32
cl_eeprom_get_board_rev(void)
119 char str
[5]; /* Legacy representation can contain at most 4 digits */
120 uint offset
= BOARD_REV_OFFSET_LEGACY
;
122 if (cl_eeprom_setup_layout())
125 if (cl_eeprom_layout
!= LAYOUT_LEGACY
)
126 offset
= BOARD_REV_OFFSET
;
128 if (cl_eeprom_read(offset
, (uchar
*)&rev
, BOARD_REV_SIZE
))
132 * Convert legacy syntactic representation to semantic
133 * representation. i.e. for rev 1.00: 0x100 --> 0x64
135 if (cl_eeprom_layout
== LAYOUT_LEGACY
) {
136 sprintf(str
, "%x", rev
);
137 rev
= simple_strtoul(str
, NULL
, 10);