]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
zynq_qspips:Break infinite loop after 1000 status read after trying to set qbit
authorWendy Liang <jliang@xilinx.com>
Wed, 17 Apr 2013 03:59:18 +0000 (13:59 +1000)
committerMichal Simek <michal.simek@xilinx.com>
Mon, 27 May 2013 06:09:11 +0000 (08:09 +0200)
Currently, u-boot end up in infinite loop when the status reg of the SPI flash
is not 0 after it tries to set the quad bit. If quad bit setting fails, u-boot
hangs because of this infinite loop.

We introduce a counter. If the status register value is still not 0 after 1000
runs, it break the loop.

Signed-off-by: Wendy Liang <jliang@xilinx.com>
drivers/spi/zynq_qspips.c

index 3fd2d1849df14a4d82c5781d3176e94acf58637e..338f250ce052ecdc69dd320de0a7bbab22cc784c 100644 (file)
@@ -899,6 +899,7 @@ void spi_enable_quad_bit(struct spi_slave *spi)
        u8 rcr_cmd = 0x35;      /* RCR */
        u8 rdsr_cmd = 0x05;     /* RDSR */
        u8 wren_cmd = 0x06;     /* WREN */
+       int count = 0;
 
        ret = spi_flash_cmd(spi, rdid_cmd, &idcode, sizeof(idcode));
        if (ret) {
@@ -931,11 +932,12 @@ void spi_enable_quad_bit(struct spi_slave *spi)
                        xqspips_write_quad_bit((void *)ZYNQ_QSPI_BASEADDR);
 
                        /* Read RDSR */
+                       count = 0;
                        do {
                                ret = spi_flash_cmd_read(spi, &rdsr_cmd,
                                                sizeof(rdsr_cmd), &rcr_data,
                                                sizeof(rcr_data));
-                       } while ((ret == 0) && (rcr_data != 0));
+                       } while ((ret == 0) && (rcr_data != 0) && (count++<1000));
 
                        /* Read config register */
                        ret = spi_flash_cmd_read(spi, &rcr_cmd, sizeof(rcr_cmd),