]> Git Repo - J-u-boot.git/blob - drivers/fpga/ACEX1K.c
pinctrl: renesas: Minimize R8A77970 V3M PFC tables
[J-u-boot.git] / drivers / fpga / ACEX1K.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2003
4  * Steven Scholz, imc Measurement & Control, [email protected]
5  *
6  * (C) Copyright 2002
7  * Rich Ireland, Enterasys Networks, [email protected].
8  */
9
10 #define LOG_CATEGORY UCLASS_FPGA
11
12 #include <config.h>             /* core U-Boot definitions */
13 #include <console.h>
14 #include <log.h>
15 #include <ACEX1K.h>             /* ACEX device family */
16 #include <linux/delay.h>
17
18 /* Note: The assumption is that we cannot possibly run fast enough to
19  * overrun the device (the Slave Parallel mode can free run at 50MHz).
20  * If there is a need to operate slower, define CFG_FPGA_DELAY in
21  * the board config file to slow things down.
22  */
23 #ifndef CFG_FPGA_DELAY
24 #define CFG_FPGA_DELAY()
25 #endif
26
27 #ifndef CFG_SYS_FPGA_WAIT
28 #define CFG_SYS_FPGA_WAIT CONFIG_SYS_HZ/10              /* 100 ms */
29 #endif
30
31 static int ACEX1K_ps_load(Altera_desc *desc, const void *buf, size_t bsize);
32 static int ACEX1K_ps_dump(Altera_desc *desc, const void *buf, size_t bsize);
33 /* static int ACEX1K_ps_info(Altera_desc *desc); */
34
35 /* ------------------------------------------------------------------------- */
36 /* ACEX1K Generic Implementation */
37 int ACEX1K_load(Altera_desc *desc, const void *buf, size_t bsize)
38 {
39         int ret_val = FPGA_FAIL;
40
41         switch (desc->iface) {
42         case passive_serial:
43                 log_debug("Launching Passive Serial Loader\n");
44                 ret_val = ACEX1K_ps_load (desc, buf, bsize);
45                 break;
46
47                 /* Add new interface types here */
48
49         default:
50                 printf ("%s: Unsupported interface type, %d\n",
51                                 __FUNCTION__, desc->iface);
52         }
53
54         return ret_val;
55 }
56
57 int ACEX1K_dump(Altera_desc *desc, const void *buf, size_t bsize)
58 {
59         int ret_val = FPGA_FAIL;
60
61         switch (desc->iface) {
62         case passive_serial:
63                 log_debug("Launching Passive Serial Dump\n");
64                 ret_val = ACEX1K_ps_dump (desc, buf, bsize);
65                 break;
66
67                 /* Add new interface types here */
68
69         default:
70                 printf ("%s: Unsupported interface type, %d\n",
71                                 __FUNCTION__, desc->iface);
72         }
73
74         return ret_val;
75 }
76
77 int ACEX1K_info( Altera_desc *desc )
78 {
79         return FPGA_SUCCESS;
80 }
81
82 /* ------------------------------------------------------------------------- */
83 /* ACEX1K Passive Serial Generic Implementation                                  */
84
85 static int ACEX1K_ps_load(Altera_desc *desc, const void *buf, size_t bsize)
86 {
87         int ret_val = FPGA_FAIL;        /* assume the worst */
88         Altera_ACEX1K_Passive_Serial_fns *fn = desc->iface_fns;
89         int i;
90
91         log_debug("start with interface functions @ 0x%p\n", fn);
92
93         if (fn) {
94                 size_t bytecount = 0;
95                 unsigned char *data = (unsigned char *) buf;
96                 int cookie = desc->cookie;      /* make a local copy */
97                 unsigned long ts;               /* timestamp */
98
99                 log_debug("Function Table:\n"
100                           "ptr:\t0x%p\n"
101                           "struct: 0x%p\n"
102                           "config:\t0x%p\n"
103                           "status:\t0x%p\n"
104                           "clk:\t0x%p\n"
105                           "data:\t0x%p\n"
106                           "done:\t0x%p\n\n",
107                           &fn, fn, fn->config, fn->status,
108                           fn->clk, fn->data, fn->done);
109 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
110                 printf ("Loading FPGA Device %d...", cookie);
111 #endif
112
113                 /*
114                  * Run the pre configuration function if there is one.
115                  */
116                 if (*fn->pre) {
117                         (*fn->pre) (cookie);
118                 }
119
120                 /* Establish the initial state */
121                 (*fn->config) (true, true, cookie);     /* Assert nCONFIG */
122
123                 udelay(2);              /* T_cfg > 2us  */
124
125                 /* nSTATUS should be asserted now */
126                 (*fn->done) (cookie);
127                 if ( !(*fn->status) (cookie) ) {
128                         puts ("** nSTATUS is not asserted.\n");
129                         (*fn->abort) (cookie);
130                         return FPGA_FAIL;
131                 }
132
133                 (*fn->config) (false, true, cookie);    /* Deassert nCONFIG */
134                 udelay(2);              /* T_cf2st1 < 4us       */
135
136                 /* Wait for nSTATUS to be released (i.e. deasserted) */
137                 ts = get_timer (0);             /* get current time */
138                 do {
139                         CFG_FPGA_DELAY ();
140                         if (get_timer (ts) > CFG_SYS_FPGA_WAIT) {       /* check the time */
141                                 puts ("** Timeout waiting for STATUS to go high.\n");
142                                 (*fn->abort) (cookie);
143                                 return FPGA_FAIL;
144                         }
145                         (*fn->done) (cookie);
146                 } while ((*fn->status) (cookie));
147
148                 /* Get ready for the burn */
149                 CFG_FPGA_DELAY ();
150
151                 /* Load the data */
152                 while (bytecount < bsize) {
153                         unsigned char val=0;
154 #ifdef CONFIG_SYS_FPGA_CHECK_CTRLC
155                         if (ctrlc ()) {
156                                 (*fn->abort) (cookie);
157                                 return FPGA_FAIL;
158                         }
159 #endif
160                         /* Altera detects an error if INIT goes low (active)
161                            while DONE is low (inactive) */
162 #if 0 /* not yet implemented */
163                         if ((*fn->done) (cookie) == 0 && (*fn->init) (cookie)) {
164                                 puts ("** CRC error during FPGA load.\n");
165                                 (*fn->abort) (cookie);
166                                 return (FPGA_FAIL);
167                         }
168 #endif
169                         val = data [bytecount ++ ];
170                         i = 8;
171                         do {
172                                 /* Deassert the clock */
173                                 (*fn->clk) (false, true, cookie);
174                                 CFG_FPGA_DELAY ();
175                                 /* Write data */
176                                 (*fn->data) ((val & 0x01), true, cookie);
177                                 CFG_FPGA_DELAY ();
178                                 /* Assert the clock */
179                                 (*fn->clk) (true, true, cookie);
180                                 CFG_FPGA_DELAY ();
181                                 val >>= 1;
182                                 i --;
183                         } while (i > 0);
184
185 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
186                         if (bytecount % (bsize / 40) == 0)
187                                 putc ('.');             /* let them know we are alive */
188 #endif
189                 }
190
191                 CFG_FPGA_DELAY ();
192
193 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
194                 putc (' ');                     /* terminate the dotted line */
195 #endif
196
197         /*
198          * Checking FPGA's CONF_DONE signal - correctly booted ?
199          */
200
201         if ( ! (*fn->done) (cookie) ) {
202                 puts ("** Booting failed! CONF_DONE is still deasserted.\n");
203                 (*fn->abort) (cookie);
204                 return (FPGA_FAIL);
205         }
206
207         /*
208          * "DCLK must be clocked an additional 10 times fpr ACEX 1K..."
209          */
210
211         for (i = 0; i < 12; i++) {
212                 CFG_FPGA_DELAY ();
213                 (*fn->clk) (true, true, cookie);        /* Assert the clock pin */
214                 CFG_FPGA_DELAY ();
215                 (*fn->clk) (false, true, cookie);       /* Deassert the clock pin */
216         }
217
218         ret_val = FPGA_SUCCESS;
219
220 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
221                 if (ret_val == FPGA_SUCCESS) {
222                         puts ("Done.\n");
223                 }
224                 else {
225                         puts ("Fail.\n");
226                 }
227 #endif
228         (*fn->post) (cookie);
229
230         } else {
231                 printf ("%s: NULL Interface function table!\n", __FUNCTION__);
232         }
233
234         return ret_val;
235 }
236
237 static int ACEX1K_ps_dump(Altera_desc *desc, const void *buf, size_t bsize)
238 {
239         /* Readback is only available through the Slave Parallel and         */
240         /* boundary-scan interfaces.                                         */
241         printf ("%s: Passive Serial Dumping is unavailable\n",
242                         __FUNCTION__);
243         return FPGA_FAIL;
244 }
This page took 0.039408 seconds and 4 git commands to generate.