summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2006-12-20 18:19:52 +0000
committerWarner Losh <imp@FreeBSD.org>2006-12-20 18:19:52 +0000
commita9295f4074c6430c3a4ea61c3853aea2bfddb7bb (patch)
tree2ffab3476275255765d7a605b5d868cf1a23c3d3
parenta082bf62436d45b5a7be90c916068d99acc41e6e (diff)
Notes
-rw-r--r--sys/boot/arm/at91/libat91/eeprom.c10
-rw-r--r--sys/boot/arm/at91/libat91/lib.h2
2 files changed, 8 insertions, 4 deletions
diff --git a/sys/boot/arm/at91/libat91/eeprom.c b/sys/boot/arm/at91/libat91/eeprom.c
index 5f5fafd0317cd..8af411ba31fe6 100644
--- a/sys/boot/arm/at91/libat91/eeprom.c
+++ b/sys/boot/arm/at91/libat91/eeprom.c
@@ -82,11 +82,12 @@ InitEEPROM(void)
* This function does not utilize the page read mode to simplify the code.
* .KB_C_FN_DEFINITION_END
*/
-void
+int
ReadEEPROM(unsigned ee_off, char *data_addr, unsigned size)
{
const AT91PS_TWI twiPtr = AT91C_BASE_TWI;
unsigned int status;
+ unsigned int count;
status = twiPtr->TWI_SR;
status = twiPtr->TWI_RHR;
@@ -104,10 +105,12 @@ ReadEEPROM(unsigned ee_off, char *data_addr, unsigned size)
status = twiPtr->TWI_SR;
while (size-- > 1){
-
// Wait RHR Holding register is full
- while (!(twiPtr->TWI_SR & AT91C_TWI_RXRDY))
+ count = 1000000;
+ while (!(twiPtr->TWI_SR & AT91C_TWI_RXRDY) && --count > 0)
continue;
+ if (count <= 0)
+ return -1;
// Read byte
*(data_addr++) = twiPtr->TWI_RHR;
@@ -123,6 +126,7 @@ ReadEEPROM(unsigned ee_off, char *data_addr, unsigned size)
// Read last byte
*data_addr = twiPtr->TWI_RHR;
+ return 0;
}
diff --git a/sys/boot/arm/at91/libat91/lib.h b/sys/boot/arm/at91/libat91/lib.h
index d88b791e88e3d..a0ef8ecf332db 100644
--- a/sys/boot/arm/at91/libat91/lib.h
+++ b/sys/boot/arm/at91/libat91/lib.h
@@ -34,7 +34,7 @@ void printf(const char *fmt,...);
/* The following function write eeprom at ee_addr using data */
/* from data_add for size bytes. */
-void ReadEEPROM(unsigned eeoff, char *data_addr, unsigned size);
+int ReadEEPROM(unsigned eeoff, char *data_addr, unsigned size);
void WriteEEPROM(unsigned eeoff, char *data_addr, unsigned size);
void InitEEPROM(void);