Split the read_eeprom function out so that it can be shared (ie with SPL) Cc: Stefan Roese <sr@denx.de> Cc: Otavio Salvador <otavio@ossystems.com.br> Cc: Andy Ng <andreas2025@gmail.com> Cc: Eric Nelson <eric.nelson@boundarydevices.com> Cc: Tapani Utriainen <tapani@technexion.com> Cc: Tom Rini <trini@ti.com> Signed-off-by: Tim Harvey <tharvey@gateworks.com>master
parent
5bf497e3fd
commit
1badf2f47c
@ -0,0 +1,89 @@ |
||||
/*
|
||||
* Copyright (C) 2014 Gateworks Corporation |
||||
* Author: Tim Harvey <tharvey@gateworks.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <i2c.h> |
||||
|
||||
#include "gsc.h" |
||||
#include "ventana_eeprom.h" |
||||
|
||||
/* read ventana EEPROM, check for validity, and return baseboard type */ |
||||
int |
||||
read_eeprom(int bus, struct ventana_board_info *info) |
||||
{ |
||||
int i; |
||||
int chksum; |
||||
char baseboard; |
||||
int type; |
||||
unsigned char *buf = (unsigned char *)info; |
||||
|
||||
memset(info, 0, sizeof(*info)); |
||||
|
||||
/*
|
||||
* On a board with a missing/depleted backup battery for GSC, the |
||||
* board may be ready to probe the GSC before its firmware is |
||||
* running. We will wait here indefinately for the GSC/EEPROM. |
||||
*/ |
||||
while (1) { |
||||
if (0 == i2c_set_bus_num(bus) && |
||||
0 == i2c_probe(GSC_EEPROM_ADDR)) |
||||
break; |
||||
mdelay(1); |
||||
} |
||||
|
||||
/* read eeprom config section */ |
||||
if (gsc_i2c_read(GSC_EEPROM_ADDR, 0x00, 1, buf, sizeof(*info))) { |
||||
puts("EEPROM: Failed to read EEPROM\n"); |
||||
info->model[0] = 0; |
||||
return GW_UNKNOWN; |
||||
} |
||||
|
||||
/* sanity checks */ |
||||
if (info->model[0] != 'G' || info->model[1] != 'W') { |
||||
puts("EEPROM: Invalid Model in EEPROM\n"); |
||||
info->model[0] = 0; |
||||
return GW_UNKNOWN; |
||||
} |
||||
|
||||
/* validate checksum */ |
||||
for (chksum = 0, i = 0; i < sizeof(*info)-2; i++) |
||||
chksum += buf[i]; |
||||
if ((info->chksum[0] != chksum>>8) || |
||||
(info->chksum[1] != (chksum&0xff))) { |
||||
puts("EEPROM: Failed EEPROM checksum\n"); |
||||
info->model[0] = 0; |
||||
return GW_UNKNOWN; |
||||
} |
||||
|
||||
/* original GW5400-A prototype */ |
||||
baseboard = info->model[3]; |
||||
if (strncasecmp((const char *)info->model, "GW5400-A", 8) == 0) |
||||
baseboard = '0'; |
||||
|
||||
switch (baseboard) { |
||||
case '0': /* original GW5400-A prototype */ |
||||
type = GW54proto; |
||||
break; |
||||
case '1': |
||||
type = GW51xx; |
||||
break; |
||||
case '2': |
||||
type = GW52xx; |
||||
break; |
||||
case '3': |
||||
type = GW53xx; |
||||
break; |
||||
case '4': |
||||
type = GW54xx; |
||||
break; |
||||
default: |
||||
printf("EEPROM: Unknown model in EEPROM: %s\n", info->model); |
||||
type = GW_UNKNOWN; |
||||
break; |
||||
} |
||||
return type; |
||||
} |
Loading…
Reference in new issue