xref: /rk3399_rockchip-uboot/drivers/fpga/stratixII.c (revision c8aa7dfc18f7cc90d0aea6c7becbb67dfc5bba4b)
1*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /*
2*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2007
3*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * Eran Liberty, Extricom , eran.liberty@gmail.com
4*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  *
5*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * See file CREDITS for list of people who contributed to this
6*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * project.
7*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  *
8*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * This program is free software; you can redistribute it and/or
9*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * modify it under the terms of the GNU General Public License as
10*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * published by the Free Software Foundation; either version 2 of
11*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * the License, or (at your option) any later version.
12*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  *
13*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * This program is distributed in the hope that it will be useful,
14*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
16*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * GNU General Public License for more details.
17*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  *
18*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * You should have received a copy of the GNU General Public License
19*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * along with this program; if not, write to the Free Software
20*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * MA 02111-1307 USA
22*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  *
23*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  */
24*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
25*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <common.h>		/* core U-Boot definitions */
26*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <altera.h>
27*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
28*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_load (Altera_desc * desc, void *buf, size_t bsize,
29*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			   int isSerial, int isSecure);
30*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_dump (Altera_desc * desc, void *buf, size_t bsize);
31*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
32*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /****************************************************************/
33*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /* Stratix II Generic Implementation                            */
34*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_load (Altera_desc * desc, void *buf, size_t bsize)
35*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
36*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int ret_val = FPGA_FAIL;
37*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
38*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	switch (desc->iface) {
39*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case passive_serial:
40*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_load (desc, buf, bsize, 1, 0);
41*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
42*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel:
43*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_load (desc, buf, bsize, 0, 0);
44*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
45*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel_security:
46*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_load (desc, buf, bsize, 0, 1);
47*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
48*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
49*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* Add new interface types here */
50*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	default:
51*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s: Unsupported interface type, %d\n", __FUNCTION__,
52*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			desc->iface);
53*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
54*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return ret_val;
55*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
56*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
57*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_dump (Altera_desc * desc, void *buf, size_t bsize)
58*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
59*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int ret_val = FPGA_FAIL;
60*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
61*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	switch (desc->iface) {
62*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case passive_serial:
63*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel:
64*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel_security:
65*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_dump (desc, buf, bsize);
66*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
67*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* Add new interface types here */
68*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	default:
69*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s: Unsupported interface type, %d\n", __FUNCTION__,
70*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			desc->iface);
71*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
72*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return ret_val;
73*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
74*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
75*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_info (Altera_desc * desc)
76*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
77*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_SUCCESS;
78*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
79*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
80*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_reloc (Altera_desc * desc, ulong reloc_offset)
81*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
82*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int i;
83*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	uint32_t dest = (uint32_t) desc & 0xff000000;
84*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
85*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* we assume a relocated code and non relocated code has different upper 8 bits */
86*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (dest != ((uint32_t) desc->iface_fns & 0xff000000)) {
87*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		desc->iface_fns =
88*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		    (void *)((uint32_t) (desc->iface_fns) + reloc_offset);
89*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
90*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	for (i = 0; i < sizeof (altera_board_specific_func) / sizeof (void *);
91*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	     i++) {
92*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if (dest !=
93*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		    ((uint32_t) (((void **)(desc->iface_fns))[i]) & 0xff000000))
94*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		{
95*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			((void **)(desc->iface_fns))[i] =
96*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			    (void
97*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			     *)(((uint32_t) (((void **)(desc->iface_fns))[i])) +
98*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				reloc_offset);
99*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
100*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
101*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_SUCCESS;
102*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
103*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
104*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_dump (Altera_desc * desc, void *buf, size_t bsize)
105*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
106*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	printf ("Stratix II Fast Passive Parallel dump is not implemented\n");
107*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_FAIL;
108*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
109*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
110*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_load (Altera_desc * desc, void *buf, size_t bsize,
111*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			   int isSerial, int isSecure)
112*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
113*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	altera_board_specific_func *fns;
114*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int cookie;
115*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int ret_val = FPGA_FAIL;
116*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int bytecount;
117*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	char *buff = buf;
118*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int i;
119*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
120*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!desc) {
121*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s(%d) Altera_desc missing\n", __FUNCTION__, __LINE__);
122*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
123*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
124*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!buff) {
125*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s(%d) buffer is missing\n", __FUNCTION__, __LINE__);
126*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
127*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
128*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!bsize) {
129*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s(%d) size is zero\n", __FUNCTION__, __LINE__);
130*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
131*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
132*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!desc->iface_fns) {
133*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf
134*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		    ("%s(%d) Altera_desc function interface table is missing\n",
135*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		     __FUNCTION__, __LINE__);
136*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
137*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
138*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns = (altera_board_specific_func *) (desc->iface_fns);
139*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	cookie = desc->cookie;
140*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
141*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!
142*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	    (fns->config && fns->status && fns->done && fns->data
143*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	     && fns->abort)) {
144*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf
145*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		    ("%s(%d) Missing some function in the function interface table\n",
146*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		     __FUNCTION__, __LINE__);
147*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
148*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
149*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
150*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 1. give board specific a chance to do anything before we start */
151*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (fns->pre) {
152*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if ((ret_val = fns->pre (cookie)) < 0) {
153*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			return ret_val;
154*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
155*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
156*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
157*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* from this point on we must fail gracfully by calling lower layer abort */
158*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
159*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 2. Strat burn cycle by deasserting config for t_CFG and waiting t_CF2CK after reaserted */
160*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->config (0, 1, cookie);
161*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	udelay (5);		/* nCONFIG low pulse width 2usec */
162*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->config (1, 1, cookie);
163*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	udelay (100);		/* nCONFIG high to first rising edge on DCLK */
164*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
165*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 3. Start the Data cycle with clk deasserted */
166*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	bytecount = 0;
167*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->clk (0, 1, cookie);
168*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
169*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	printf ("loading to fpga    ");
170*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	while (bytecount < bsize) {
171*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* 3.1 check stratix has not signaled us an error */
172*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if (fns->status (cookie) != 1) {
173*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			printf
174*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			    ("\n%s(%d) Stratix failed (byte transfered till failure 0x%x)\n",
175*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			     __FUNCTION__, __LINE__, bytecount);
176*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->abort (cookie);
177*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			return FPGA_FAIL;
178*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
179*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if (isSerial) {
180*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			int i;
181*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			uint8_t data = buff[bytecount++];
182*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			for (i = 0; i < 8; i++) {
183*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				/* 3.2(ps) put data on the bus */
184*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->data ((data >> i) & 1, 1, cookie);
185*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
186*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				/* 3.3(ps) clock once */
187*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (1, 1, cookie);
188*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (0, 1, cookie);
189*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			}
190*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		} else {
191*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			/* 3.2(fpp) put data on the bus */
192*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->data (buff[bytecount++], 1, cookie);
193*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
194*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			/* 3.3(fpp) clock once */
195*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->clk (1, 1, cookie);
196*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->clk (0, 1, cookie);
197*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
198*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			/* 3.4(fpp) for secure cycle push 3 more  clocks */
199*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			for (i = 0; isSecure && i < 3; i++) {
200*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (1, 1, cookie);
201*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (0, 1, cookie);
202*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			}
203*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
204*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
205*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* 3.5 while clk is deasserted it is safe to print some progress indication */
206*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if ((bytecount % (bsize / 100)) == 0) {
207*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			printf ("\b\b\b%02d\%", bytecount * 100 / bsize);
208*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
209*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
210*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
211*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 4. Set one last clock and check conf done signal */
212*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->clk (1, 1, cookie);
213*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	udelay (100);
214*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!fns->done (cookie)) {
215*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf (" error!.\n");
216*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		fns->abort (cookie);
217*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
218*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	} else {
219*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("\b\b\b done.\n");
220*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
221*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
222*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 5. call lower layer post configuration */
223*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (fns->post) {
224*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if ((ret_val = fns->post (cookie)) < 0) {
225*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->abort (cookie);
226*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			return ret_val;
227*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
228*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
229*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
230*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_SUCCESS;
231*c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
232