diff options
| -rw-r--r-- | board/freescale/common/qixis.c | 46 | ||||
| -rw-r--r-- | board/freescale/common/qixis.h | 3 | 
2 files changed, 49 insertions, 0 deletions
| diff --git a/board/freescale/common/qixis.c b/board/freescale/common/qixis.c index c92902a92..2cf393b01 100644 --- a/board/freescale/common/qixis.c +++ b/board/freescale/common/qixis.c @@ -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); diff --git a/board/freescale/common/qixis.h b/board/freescale/common/qixis.h index b98b18065..4d73461e4 100644 --- a/board/freescale/common/qixis.h +++ b/board/freescale/common/qixis.h @@ -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) |