diff options
Diffstat (limited to 'drivers/mtd/nand/orion_nand.c')
| -rw-r--r-- | drivers/mtd/nand/orion_nand.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index f59c07427af..d60fc5719fe 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c @@ -60,7 +60,13 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)  	}  	buf64 = (uint64_t *)buf;  	while (i < len/8) { -		uint64_t x; +		/* +		 * Since GCC has no proper constraint (PR 43518) +		 * force x variable to r2/r3 registers as ldrd instruction +		 * requires first register to be even. +		 */ +		register uint64_t x asm ("r2"); +  		asm volatile ("ldrd\t%0, [%1]" : "=&r" (x) : "r" (io_base));  		buf64[i++] = x;  	}  |