Patchwork [U-Boot,3/6] cm-t35: add EEPROM module and pass Linux a serial number

login
register
mail settings
Submitter Igor Grinberg
Date Jan. 2, 2012, 2:01 p.m.
Message ID <1325512895-10917-4-git-send-email-grinberg@compulab.co.il>
Download mbox | patch
Permalink /patch/133847/
State Changes Requested
Delegated to: Tom Rini
Headers show

Comments

Igor Grinberg - Jan. 2, 2012, 2:01 p.m.
From: Nikita Kiryanov <nikita@compulab.co.il>

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>
---
 board/cm_t35/Makefile    |    4 ++-
 board/cm_t35/eeprom.c    |   79 ++++++++++++++++++++++++++++++++++++++++++++++
 board/cm_t35/eeprom.h    |   38 ++++++++++++++++++++++
 include/configs/cm_t35.h |    2 +
 4 files changed, 122 insertions(+), 1 deletions(-)
 create mode 100644 board/cm_t35/eeprom.c
 create mode 100644 board/cm_t35/eeprom.h
Tom Rini - Jan. 3, 2012, 2:52 p.m.
On 01/02/2012 07:01 AM, Igor Grinberg wrote:
> From: Nikita Kiryanov <nikita@compulab.co.il>
> 
> 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>
[snip]
> +#define EEPROM_ADDR			0x50

Some grepping around says this is usually CONFIG_SYS_I2C_EEPROM_ADDR (in
the config.h).  Thanks.

Patch

diff --git a/board/cm_t35/Makefile b/board/cm_t35/Makefile
index 27693f0..894fa09 100644
--- a/board/cm_t35/Makefile
+++ b/board/cm_t35/Makefile
@@ -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))
diff --git a/board/cm_t35/eeprom.c b/board/cm_t35/eeprom.c
new file mode 100644
index 0000000..3bd7751
--- /dev/null
+++ b/board/cm_t35/eeprom.c
@@ -0,0 +1,79 @@ 
+/*
+ * (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_ADDR			0x50
+
+#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 uchar eeprom_layout; /* Implicitly LAYOUT_INVALID */
+
+static int cm_t3x_eeprom_read(uint offset, uchar *buf, int len)
+{
+	return i2c_read(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, &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];
+	}
+}
diff --git a/board/cm_t35/eeprom.h b/board/cm_t35/eeprom.h
new file mode 100644
index 0000000..97a002a
--- /dev/null
+++ b/board/cm_t35/eeprom.h
@@ -0,0 +1,38 @@ 
+/*
+ * (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.
+ */
+#ifndef _EEPROM_
+#define _EEPROM_
+
+#include <common.h>
+
+#ifndef CONFIG_DRIVER_OMAP34XX_I2C
+void 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;
+};
+#endif /* CONFIG_DRIVER_OMAP34XX_I2C */
+
+#endif
diff --git a/include/configs/cm_t35.h b/include/configs/cm_t35.h
index 61226d5..f868f78 100644
--- a/include/configs/cm_t35.h
+++ b/include/configs/cm_t35.h
@@ -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,7 @@ 
 #define CONFIG_SYS_I2C_BUS		0
 #define CONFIG_SYS_I2C_BUS_SELECT	1
 #define CONFIG_DRIVER_OMAP34XX_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
 
 /*
  * TWL4030