diff mbox

[U-Boot] add Xilinx_abort_fn to Xilinx_Spartan3_Slave_Serial_fns

Message ID 1272013685-1032-1-git-send-email-w.wegner@astro-kom.de
State Accepted
Commit b0bc8b70ff74501fd7a6e42013a4a7ea05cf6ade
Delegated to: Wolfgang Denk
Headers show

Commit Message

Wolfgang Wegner April 23, 2010, 9:08 a.m. UTC
Currently the hardware was left in an undefined state in case Spartan3
serial load failed. This patch adds Xilinx_abort_fn to give the board
a possibility to clean up in this case.

Signed-off-by: Wolfgang Wegner <w.wegner@astro-kom.de>
---
All other FPGA drivers already support such an abort function - it seems
Spartan3 serial load was a bit neglected (only discovered this because
it messed up things on my board after a failed FPGA load).

 drivers/fpga/spartan3.c |    6 ++++++
 include/spartan3.h      |    1 +
 2 files changed, 7 insertions(+), 0 deletions(-)

Comments

Wolfgang Denk Nov. 30, 2010, 8:59 p.m. UTC | #1
Dear Wolfgang Wegner,

In message <1272013685-1032-1-git-send-email-w.wegner@astro-kom.de> you wrote:
> Currently the hardware was left in an undefined state in case Spartan3
> serial load failed. This patch adds Xilinx_abort_fn to give the board
> a possibility to clean up in this case.
> 
> Signed-off-by: Wolfgang Wegner <w.wegner@astro-kom.de>
> ---
> All other FPGA drivers already support such an abort function - it seems
> Spartan3 serial load was a bit neglected (only discovered this because
> it messed up things on my board after a failed FPGA load).
> 
>  drivers/fpga/spartan3.c |    6 ++++++
>  include/spartan3.h      |    1 +
>  2 files changed, 7 insertions(+), 0 deletions(-)

Applied to "next". Thanks, and sorry this took so long.

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/drivers/fpga/spartan3.c b/drivers/fpga/spartan3.c
index 7a89b56..1dd6f26 100644
--- a/drivers/fpga/spartan3.c
+++ b/drivers/fpga/spartan3.c
@@ -366,6 +366,8 @@  static int Spartan3_ss_load (Xilinx_desc * desc, void *buf, size_t bsize)
 			CONFIG_FPGA_DELAY ();
 			if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {	/* check the time */
 				puts ("** Timeout waiting for INIT to start.\n");
+				if (*fn->abort)
+					(*fn->abort) (cookie);
 				return FPGA_FAIL;
 			}
 		} while (!(*fn->init) (cookie));
@@ -380,6 +382,8 @@  static int Spartan3_ss_load (Xilinx_desc * desc, void *buf, size_t bsize)
 			CONFIG_FPGA_DELAY ();
 			if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {	/* check the time */
 				puts ("** Timeout waiting for INIT to clear.\n");
+				if (*fn->abort)
+					(*fn->abort) (cookie);
 				return FPGA_FAIL;
 			}
 		} while ((*fn->init) (cookie));
@@ -394,6 +398,8 @@  static int Spartan3_ss_load (Xilinx_desc * desc, void *buf, size_t bsize)
 				   while DONE is low (inactive) */
 				if ((*fn->done) (cookie) == 0 && (*fn->init) (cookie)) {
 					puts ("** CRC error during FPGA load.\n");
+					if (*fn->abort)
+						(*fn->abort) (cookie);
 					return (FPGA_FAIL);
 				}
 				val = data [bytecount ++];
diff --git a/include/spartan3.h b/include/spartan3.h
index d5a589d..0f0b400 100644
--- a/include/spartan3.h
+++ b/include/spartan3.h
@@ -58,6 +58,7 @@  typedef struct {
 	Xilinx_wr_fn	wr;
 	Xilinx_post_fn	post;
 	Xilinx_bwr_fn	bwr; /* block write function */
+	Xilinx_abort_fn abort;
 } Xilinx_Spartan3_Slave_Serial_fns;
 
 /* Device Image Sizes