cm-t35: add EEPROM module and pass Linux a serial number
Add board specific EEPROM handling module, read the serial number from the EEPROM and pass it to Linux. Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il> Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>
This commit is contained in:
parent
ce15ec9f69
commit
8230925049
@ -25,7 +25,9 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
COBJS := cm_t35.o leds.o
|
||||
COBJS-$(CONFIG_DRIVER_OMAP34XX_I2C) += eeprom.o
|
||||
|
||||
COBJS := cm_t35.o leds.o $(COBJS-y)
|
||||
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <net.h>
|
||||
#include <i2c.h>
|
||||
#include <twl4030.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/mem.h>
|
||||
@ -421,3 +422,13 @@ int board_eth_init(bd_t *bis)
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
void __weak get_board_serial(struct tag_serialnr *serialnr)
|
||||
{
|
||||
/*
|
||||
* This corresponds to what happens when we can communicate with the
|
||||
* eeprom but don't get a valid board serial value.
|
||||
*/
|
||||
serialnr->low = 0;
|
||||
serialnr->high = 0;
|
||||
};
|
||||
|
78
board/cm_t35/eeprom.c
Normal file
78
board/cm_t35/eeprom.c
Normal file
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* (C) Copyright 2011 CompuLab, Ltd. <www.compulab.co.il>
|
||||
*
|
||||
* Authors: Nikita Kiryanov <nikita@compulab.co.il>
|
||||
* Igor Grinberg <grinberg@compulab.co.il>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <i2c.h>
|
||||
|
||||
#define EEPROM_LAYOUT_VER_OFFSET 44
|
||||
#define BOARD_SERIAL_OFFSET 20
|
||||
#define BOARD_SERIAL_OFFSET_LEGACY 8
|
||||
|
||||
#define LAYOUT_INVALID 0
|
||||
#define LAYOUT_LEGACY 0xff
|
||||
|
||||
static int eeprom_layout; /* Implicitly LAYOUT_INVALID */
|
||||
|
||||
static int cm_t3x_eeprom_read(uint offset, uchar *buf, int len)
|
||||
{
|
||||
return i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, offset,
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR_LEN, buf, len);
|
||||
}
|
||||
|
||||
static int eeprom_setup_layout(void)
|
||||
{
|
||||
int res;
|
||||
|
||||
if (eeprom_layout != LAYOUT_INVALID)
|
||||
return 0;
|
||||
|
||||
res = cm_t3x_eeprom_read(EEPROM_LAYOUT_VER_OFFSET,
|
||||
(uchar *)&eeprom_layout, 1);
|
||||
if (res) {
|
||||
eeprom_layout = LAYOUT_INVALID;
|
||||
return res;
|
||||
}
|
||||
|
||||
if (eeprom_layout == 0 || eeprom_layout >= 0x20)
|
||||
eeprom_layout = LAYOUT_LEGACY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void get_board_serial(struct tag_serialnr *serialnr)
|
||||
{
|
||||
u32 serial[2];
|
||||
uint offset;
|
||||
|
||||
memset(serialnr, 0, sizeof(*serialnr));
|
||||
if (eeprom_setup_layout())
|
||||
return;
|
||||
|
||||
offset = (eeprom_layout != LAYOUT_LEGACY) ?
|
||||
BOARD_SERIAL_OFFSET : BOARD_SERIAL_OFFSET_LEGACY;
|
||||
if (cm_t3x_eeprom_read(offset, (uchar *)serial, 8))
|
||||
return;
|
||||
|
||||
if (serial[0] != 0xffffffff && serial[1] != 0xffffffff) {
|
||||
serialnr->low = serial[0];
|
||||
serialnr->high = serial[1];
|
||||
}
|
||||
}
|
@ -72,6 +72,7 @@
|
||||
#define CONFIG_SETUP_MEMORY_TAGS
|
||||
#define CONFIG_INITRD_TAG
|
||||
#define CONFIG_REVISION_TAG
|
||||
#define CONFIG_SERIAL_TAG
|
||||
|
||||
/*
|
||||
* Size of malloc() pool
|
||||
@ -153,6 +154,8 @@
|
||||
#define CONFIG_SYS_I2C_BUS 0
|
||||
#define CONFIG_SYS_I2C_BUS_SELECT 1
|
||||
#define CONFIG_DRIVER_OMAP34XX_I2C
|
||||
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
|
||||
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
|
||||
|
||||
/*
|
||||
* TWL4030
|
||||
|
Loading…
Reference in New Issue
Block a user