~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/board/compulab/common/eeprom.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * (C) Copyright 2011 CompuLab, Ltd. <www.compulab.co.il>
 
3
 *
 
4
 * Authors: Nikita Kiryanov <nikita@compulab.co.il>
 
5
 *          Igor Grinberg <grinberg@compulab.co.il>
 
6
 *
 
7
 * SPDX-License-Identifier:     GPL-2.0+
 
8
 */
 
9
 
 
10
#include <common.h>
 
11
#include <i2c.h>
 
12
 
 
13
#define EEPROM_LAYOUT_VER_OFFSET        44
 
14
#define BOARD_SERIAL_OFFSET             20
 
15
#define BOARD_SERIAL_OFFSET_LEGACY      8
 
16
#define BOARD_REV_OFFSET                0
 
17
#define BOARD_REV_OFFSET_LEGACY         6
 
18
#define BOARD_REV_SIZE                  2
 
19
#define MAC_ADDR_OFFSET                 4
 
20
#define MAC_ADDR_OFFSET_LEGACY          0
 
21
 
 
22
#define LAYOUT_INVALID  0
 
23
#define LAYOUT_LEGACY   0xff
 
24
 
 
25
static int cl_eeprom_layout; /* Implicitly LAYOUT_INVALID */
 
26
 
 
27
static int cl_eeprom_read(uint offset, uchar *buf, int len)
 
28
{
 
29
        return i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, offset,
 
30
                        CONFIG_SYS_I2C_EEPROM_ADDR_LEN, buf, len);
 
31
}
 
32
 
 
33
static int cl_eeprom_setup_layout(void)
 
34
{
 
35
        int res;
 
36
 
 
37
        if (cl_eeprom_layout != LAYOUT_INVALID)
 
38
                return 0;
 
39
 
 
40
        res = cl_eeprom_read(EEPROM_LAYOUT_VER_OFFSET,
 
41
                             (uchar *)&cl_eeprom_layout, 1);
 
42
        if (res) {
 
43
                cl_eeprom_layout = LAYOUT_INVALID;
 
44
                return res;
 
45
        }
 
46
 
 
47
        if (cl_eeprom_layout == 0 || cl_eeprom_layout >= 0x20)
 
48
                cl_eeprom_layout = LAYOUT_LEGACY;
 
49
 
 
50
        return 0;
 
51
}
 
52
 
 
53
void get_board_serial(struct tag_serialnr *serialnr)
 
54
{
 
55
        u32 serial[2];
 
56
        uint offset;
 
57
 
 
58
        memset(serialnr, 0, sizeof(*serialnr));
 
59
 
 
60
        if (cl_eeprom_setup_layout())
 
61
                return;
 
62
 
 
63
        offset = (cl_eeprom_layout != LAYOUT_LEGACY) ?
 
64
                BOARD_SERIAL_OFFSET : BOARD_SERIAL_OFFSET_LEGACY;
 
65
 
 
66
        if (cl_eeprom_read(offset, (uchar *)serial, 8))
 
67
                return;
 
68
 
 
69
        if (serial[0] != 0xffffffff && serial[1] != 0xffffffff) {
 
70
                serialnr->low = serial[0];
 
71
                serialnr->high = serial[1];
 
72
        }
 
73
}
 
74
 
 
75
/*
 
76
 * Routine: cl_eeprom_read_mac_addr
 
77
 * Description: read mac address and store it in buf.
 
78
 */
 
79
int cl_eeprom_read_mac_addr(uchar *buf)
 
80
{
 
81
        uint offset;
 
82
 
 
83
        if (cl_eeprom_setup_layout())
 
84
                return 0;
 
85
 
 
86
        offset = (cl_eeprom_layout != LAYOUT_LEGACY) ?
 
87
                        MAC_ADDR_OFFSET : MAC_ADDR_OFFSET_LEGACY;
 
88
 
 
89
        return cl_eeprom_read(offset, buf, 6);
 
90
}
 
91
 
 
92
/*
 
93
 * Routine: cl_eeprom_get_board_rev
 
94
 * Description: read system revision from eeprom
 
95
 */
 
96
u32 cl_eeprom_get_board_rev(void)
 
97
{
 
98
        u32 rev = 0;
 
99
        char str[5]; /* Legacy representation can contain at most 4 digits */
 
100
        uint offset = BOARD_REV_OFFSET_LEGACY;
 
101
 
 
102
        if (cl_eeprom_setup_layout())
 
103
                return 0;
 
104
 
 
105
        if (cl_eeprom_layout != LAYOUT_LEGACY)
 
106
                offset = BOARD_REV_OFFSET;
 
107
 
 
108
        if (cl_eeprom_read(offset, (uchar *)&rev, BOARD_REV_SIZE))
 
109
                return 0;
 
110
 
 
111
        /*
 
112
         * Convert legacy syntactic representation to semantic
 
113
         * representation. i.e. for rev 1.00: 0x100 --> 0x64
 
114
         */
 
115
        if (cl_eeprom_layout == LAYOUT_LEGACY) {
 
116
                sprintf(str, "%x", rev);
 
117
                rev = simple_strtoul(str, NULL, 10);
 
118
        }
 
119
 
 
120
        return rev;
 
121
};