When the DONE pin does not go high after programming to confirm programming
success, the INIT_B pin provides some info on the reason. Use it if
available to provide a more explanatory error message.

Signed-off-by: Luca Ceresoli <l...@lucaceresoli.net>

---

Changes in v3: none.

Changes in v2:
 - also check for gpiod_get_value() errors (Tom Rix)
---
 drivers/fpga/xilinx-spi.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/fpga/xilinx-spi.c b/drivers/fpga/xilinx-spi.c
index 9488c8fbaefd..c2e0a42cd4f2 100644
--- a/drivers/fpga/xilinx-spi.c
+++ b/drivers/fpga/xilinx-spi.c
@@ -195,7 +195,21 @@ static int xilinx_spi_write_complete(struct fpga_manager 
*mgr,
                        return 0;
        }
 
-       dev_err(&mgr->dev, "Timeout after config data transfer\n");
+       if (conf->init_b) {
+               ret = gpiod_get_value(conf->init_b);
+
+               if (ret < 0) {
+                       dev_err(&mgr->dev, "Error reading INIT_B (%d)\n", ret);
+                       return ret;
+               }
+
+               dev_err(&mgr->dev,
+                       ret ? "CRC error or invalid device\n"
+                       : "Missing sync word or incomplete bitstream\n");
+       } else {
+               dev_err(&mgr->dev, "Timeout after config data transfer\n");
+       }
+
        return -ETIMEDOUT;
 }
 
-- 
2.28.0

Reply via email to