]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
cm-t35: add EEPROM module and pass Linux a serial number
authorNikita Kiryanov <nikita@compulab.co.il>
Thu, 12 Jan 2012 03:26:30 +0000 (03:26 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Mon, 16 Jan 2012 07:40:11 +0000 (08:40 +0100)
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
board/cm_t35/cm_t35.c
board/cm_t35/eeprom.c [new file with mode: 0644]
include/configs/cm_t35.h

index 27693f07ac1dc40893aaeb7115189db685d4a560..894fa097e1be05de0fe0c2595a63e6eb465b961c 100644 (file)
@@ -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))
index ff372d836fe382226ace709b8597798bf0a4695f..0d5a401995f65f75b50dda1737014be9ef7e1f27 100644 (file)
@@ -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;
+};
diff --git a/board/cm_t35/eeprom.c b/board/cm_t35/eeprom.c
new file mode 100644 (file)
index 0000000..93ed6cb
--- /dev/null
@@ -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];
+       }
+}
index 61226d52039fdc2308b80d86911cf0f9f886ea1c..fe91c10409b2cff78f51d9b6223e4c1114f80594 100644 (file)
@@ -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
 #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