blob: e90186ebe8579417bcaf2264fa15fcecf0a2cdc3 [file] [log] [blame]
Tim Harvey0dccde72014-06-02 16:13:25 -07001/*
2 * Copyright (C) 2014 Gateworks Corporation
3 * Author: Tim Harvey <tharvey@gateworks.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
9#include <i2c.h>
10
11#include "gsc.h"
12#include "ventana_eeprom.h"
13
14/* read ventana EEPROM, check for validity, and return baseboard type */
15int
16read_eeprom(int bus, struct ventana_board_info *info)
17{
18 int i;
19 int chksum;
20 char baseboard;
21 int type;
22 unsigned char *buf = (unsigned char *)info;
23
24 memset(info, 0, sizeof(*info));
25
26 /*
27 * On a board with a missing/depleted backup battery for GSC, the
28 * board may be ready to probe the GSC before its firmware is
29 * running. We will wait here indefinately for the GSC/EEPROM.
30 */
31 while (1) {
32 if (0 == i2c_set_bus_num(bus) &&
33 0 == i2c_probe(GSC_EEPROM_ADDR))
34 break;
35 mdelay(1);
36 }
37
38 /* read eeprom config section */
39 if (gsc_i2c_read(GSC_EEPROM_ADDR, 0x00, 1, buf, sizeof(*info))) {
40 puts("EEPROM: Failed to read EEPROM\n");
41 info->model[0] = 0;
42 return GW_UNKNOWN;
43 }
44
45 /* sanity checks */
46 if (info->model[0] != 'G' || info->model[1] != 'W') {
47 puts("EEPROM: Invalid Model in EEPROM\n");
48 info->model[0] = 0;
49 return GW_UNKNOWN;
50 }
51
52 /* validate checksum */
53 for (chksum = 0, i = 0; i < sizeof(*info)-2; i++)
54 chksum += buf[i];
55 if ((info->chksum[0] != chksum>>8) ||
56 (info->chksum[1] != (chksum&0xff))) {
57 puts("EEPROM: Failed EEPROM checksum\n");
58 info->model[0] = 0;
59 return GW_UNKNOWN;
60 }
61
62 /* original GW5400-A prototype */
63 baseboard = info->model[3];
64 if (strncasecmp((const char *)info->model, "GW5400-A", 8) == 0)
65 baseboard = '0';
66
67 switch (baseboard) {
68 case '0': /* original GW5400-A prototype */
69 type = GW54proto;
70 break;
71 case '1':
72 type = GW51xx;
73 break;
74 case '2':
75 type = GW52xx;
76 break;
77 case '3':
78 type = GW53xx;
79 break;
80 case '4':
81 type = GW54xx;
82 break;
83 default:
84 printf("EEPROM: Unknown model in EEPROM: %s\n", info->model);
85 type = GW_UNKNOWN;
86 break;
87 }
88 return type;
89}