mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-28 10:01:32 +00: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
4 changed files with 102 additions and 89 deletions
|
@ -6,5 +6,5 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0+
|
# 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;
|
static struct ventana_board_info ventana_info;
|
||||||
|
|
||||||
enum {
|
|
||||||
GW54proto, /* original GW5400-A prototype */
|
|
||||||
GW51xx,
|
|
||||||
GW52xx,
|
|
||||||
GW53xx,
|
|
||||||
GW54xx,
|
|
||||||
GW_UNKNOWN,
|
|
||||||
};
|
|
||||||
|
|
||||||
int board_type;
|
int board_type;
|
||||||
|
|
||||||
/* UART1: Function varies per baseboard */
|
/* UART1: Function varies per baseboard */
|
||||||
|
@ -499,84 +490,6 @@ static void setup_display(void)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_VIDEO_IPUV3 */
|
#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
|
* Baseboard specific GPIO
|
||||||
*/
|
*/
|
||||||
|
@ -1114,7 +1027,7 @@ int board_init(void)
|
||||||
setup_sata();
|
setup_sata();
|
||||||
#endif
|
#endif
|
||||||
/* read Gateworks EEPROM into global struct (used later) */
|
/* read Gateworks EEPROM into global struct (used later) */
|
||||||
board_type = read_eeprom();
|
board_type = read_eeprom(I2C_GSC, &ventana_info);
|
||||||
|
|
||||||
/* board-specifc GPIO iomux */
|
/* board-specifc GPIO iomux */
|
||||||
if (board_type < GW_UNKNOWN) {
|
if (board_type < GW_UNKNOWN) {
|
||||||
|
|
|
@ -103,4 +103,15 @@ enum {
|
||||||
EECONFIG_RES15,
|
EECONFIG_RES15,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
GW54proto, /* original GW5400-A prototype */
|
||||||
|
GW51xx,
|
||||||
|
GW52xx,
|
||||||
|
GW53xx,
|
||||||
|
GW54xx,
|
||||||
|
GW_UNKNOWN,
|
||||||
|
};
|
||||||
|
|
||||||
|
int read_eeprom(int bus, struct ventana_board_info *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue