diff options
| -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 f59c07427af3..d60fc5719fef 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) | |||
| 60 | } | 60 | } |
| 61 | buf64 = (uint64_t *)buf; | 61 | buf64 = (uint64_t *)buf; |
| 62 | while (i < len/8) { | 62 | while (i < len/8) { |
| 63 | uint64_t x; | 63 | /* |
| 64 | * Since GCC has no proper constraint (PR 43518) | ||
| 65 | * force x variable to r2/r3 registers as ldrd instruction | ||
| 66 | * requires first register to be even. | ||
| 67 | */ | ||
| 68 | register uint64_t x asm ("r2"); | ||
| 69 | |||
| 64 | asm volatile ("ldrd\t%0, [%1]" : "=&r" (x) : "r" (io_base)); | 70 | asm volatile ("ldrd\t%0, [%1]" : "=&r" (x) : "r" (io_base)); |
| 65 | buf64[i++] = x; | 71 | buf64[i++] = x; |
| 66 | } | 72 | } |
