mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 05:04:23 +08:00
imx: ventana: split read_eeprom into standalone file
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>
This commit is contained in:
parent
5bf497e3fd
commit
1badf2f47c
@ -6,5 +6,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y := gw_ventana.o gsc.o
|
||||
obj-y := gw_ventana.o gsc.o eeprom.o
|
||||
|
||||
|
89
board/gateworks/gw_ventana/eeprom.c
Normal file
89
board/gateworks/gw_ventana/eeprom.c
Normal file
@ -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;
|
||||
}
|
@ -84,15 +84,6 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
*/
|
||||
static struct ventana_board_info ventana_info;
|
||||
|
||||
enum {
|
||||
GW54proto, /* original GW5400-A prototype */
|
||||
GW51xx,
|
||||
GW52xx,
|
||||
GW53xx,
|
||||
GW54xx,
|
||||
GW_UNKNOWN,
|
||||
};
|
||||
|
||||
int board_type;
|
||||
|
||||
/* UART1: Function varies per baseboard */
|
||||
@ -499,84 +490,6 @@ static void setup_display(void)
|
||||
}
|
||||
#endif /* CONFIG_VIDEO_IPUV3 */
|
||||
|
||||
/* read ventana EEPROM, check for validity, and return baseboard type */
|
||||
static int
|
||||
read_eeprom(void)
|
||||
{
|
||||
int i;
|
||||
int chksum;
|
||||
char baseboard;
|
||||
int type;
|
||||
struct ventana_board_info *info = &ventana_info;
|
||||
unsigned char *buf = (unsigned char *)&ventana_info;
|
||||
|
||||
memset(info, 0, sizeof(ventana_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(I2C_GSC) &&
|
||||
0 == i2c_probe(GSC_EEPROM_ADDR))
|
||||
break;
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
/* read eeprom config section */
|
||||
if (gsc_i2c_read(GSC_EEPROM_ADDR, 0x00, 1, buf, sizeof(ventana_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;
|
||||
}
|
||||
|
||||
/*
|
||||
* Baseboard specific GPIO
|
||||
*/
|
||||
@ -1114,7 +1027,7 @@ int board_init(void)
|
||||
setup_sata();
|
||||
#endif
|
||||
/* read Gateworks EEPROM into global struct (used later) */
|
||||
board_type = read_eeprom();
|
||||
board_type = read_eeprom(I2C_GSC, &ventana_info);
|
||||
|
||||
/* board-specifc GPIO iomux */
|
||||
if (board_type < GW_UNKNOWN) {
|
||||
|
@ -103,4 +103,15 @@ enum {
|
||||
EECONFIG_RES15,
|
||||
};
|
||||
|
||||
enum {
|
||||
GW54proto, /* original GW5400-A prototype */
|
||||
GW51xx,
|
||||
GW52xx,
|
||||
GW53xx,
|
||||
GW54xx,
|
||||
GW_UNKNOWN,
|
||||
};
|
||||
|
||||
int read_eeprom(int bus, struct ventana_board_info *);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user