board/freescale/common:Add support of QTAG register
authorPrabhakar Kushwaha <prabhakar@freescale.com>
Sun, 23 Dec 2012 19:24:47 +0000 (19:24 +0000)
committerAndy Fleming <afleming@freescale.com>
Wed, 30 Jan 2013 17:25:10 +0000 (11:25 -0600)
QIXIS FPGA's QIXIS Tag Access register (QTAG) defines TAG, VER, DATE, IMAGE
fields. These fields have FPGA build version, image name and build date
information.

Add support to parse these fields to have complete FPGA image information.

Signed-off-by: York Sun <yorksun@freescale.com>
Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com>
Signed-off-by: Poonam Aggrwal <poonam.aggrwal@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
board/freescale/common/qixis.c
board/freescale/common/qixis.h

index c92902a92edc2b327304d92f2e67ef0f33239ba4..2cf393b01bf155a0a151553487e058d8413104b4 100644 (file)
@@ -14,6 +14,7 @@
 #include <common.h>
 #include <command.h>
 #include <asm/io.h>
+#include <linux/time.h>
 #include "qixis.h"
 
 u8 qixis_read(unsigned int reg)
@@ -30,6 +31,51 @@ void qixis_write(unsigned int reg, u8 value)
        out_8(p + reg, value);
 }
 
+u16 qixis_read_minor(void)
+{
+       u16 minor;
+
+       /* this data is in little endian */
+       QIXIS_WRITE(tagdata, 5);
+       minor = QIXIS_READ(tagdata);
+       QIXIS_WRITE(tagdata, 6);
+       minor += QIXIS_READ(tagdata) << 8;
+
+       return minor;
+}
+
+char *qixis_read_time(char *result)
+{
+       time_t time = 0;
+       int i;
+
+       /* timestamp is in 32-bit big endian */
+       for (i = 8; i <= 11; i++) {
+               QIXIS_WRITE(tagdata, i);
+               time =  (time << 8) + QIXIS_READ(tagdata);
+       }
+
+       return ctime_r(&time, result);
+}
+
+char *qixis_read_tag(char *buf)
+{
+       int i;
+       char tag, *ptr = buf;
+
+       for (i = 16; i <= 63; i++) {
+               QIXIS_WRITE(tagdata, i);
+               tag = QIXIS_READ(tagdata);
+               *(ptr++) = tag;
+               if (!tag)
+                       break;
+       }
+       if (i > 63)
+               *ptr = '\0';
+
+       return buf;
+}
+
 void qixis_reset(void)
 {
        QIXIS_WRITE(rst_ctl, QIXIS_RST_CTL_RESET);
index b98b18065569ee3f1e58413f5c1c0d5e9f21205c..4d73461e49a1d8d7aefcfd9529053dcf4c34dc27 100644 (file)
@@ -88,6 +88,9 @@ struct qixis {
 
 u8 qixis_read(unsigned int reg);
 void qixis_write(unsigned int reg, u8 value);
+u16 qixis_read_minor(void);
+char *qixis_read_time(char *result);
+char *qixis_read_tag(char *buf);
 
 #define QIXIS_READ(reg) qixis_read(offsetof(struct qixis, reg))
 #define QIXIS_WRITE(reg, value) qixis_write(offsetof(struct qixis, reg), value)