Commit 2012f238bd4383904e898cfc26c9fd433af835aa

Authored by Marek Vasut
1 parent d44ef7ffbf

fpga: altera: Turn the switches into table lookup

Add a table of FPGA family with matching functions associated with
it and make all the code just look up the family in that table and
call the associated function instead of the horrible switch voodoo
which was duplicated all over the place.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Chin Liang See <clsee@altera.com>
Cc: Dinh Nguyen <dinguyen@altera.com>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
Cc: Tom Rini <trini@ti.com>
Cc: Wolfgang Denk <wd@denx.de>
Cc: Pavel Machek <pavel@denx.de>
Acked-by: Pavel Machek <pavel@denx.de>

Showing 1 changed file with 60 additions and 111 deletions Side-by-side Diff

drivers/fpga/altera.c
... ... @@ -19,6 +19,26 @@
19 19 /* Define FPGA_DEBUG to 1 to get debug printf's */
20 20 #define FPGA_DEBUG 0
21 21  
  22 +static const struct altera_fpga {
  23 + enum altera_family family;
  24 + const char *name;
  25 + int (*load)(Altera_desc *, const void *, size_t);
  26 + int (*dump)(Altera_desc *, const void *, size_t);
  27 + int (*info)(Altera_desc *);
  28 +} altera_fpga[] = {
  29 +#if defined(CONFIG_FPGA_ACEX1K)
  30 + { Altera_ACEX1K, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info },
  31 + { Altera_CYC2, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info },
  32 +#elif defined(CONFIG_FPGA_CYCLON2)
  33 + { Altera_ACEX1K, "CycloneII", CYC2_load, CYC2_dump, CYC2_info },
  34 + { Altera_CYC2, "CycloneII", CYC2_load, CYC2_dump, CYC2_info },
  35 +#endif
  36 +#if defined(CONFIG_FPGA_STRATIX_II)
  37 + { Altera_StratixII, "StratixII", StratixII_load,
  38 + StratixII_dump, StratixII_info },
  39 +#endif
  40 +};
  41 +
22 42 static int altera_validate(Altera_desc *desc, const char *fn)
23 43 {
24 44 if (!desc) {
25 45  
26 46  
27 47  
28 48  
29 49  
30 50  
31 51  
32 52  
33 53  
34 54  
35 55  
36 56  
37 57  
38 58  
39 59  
40 60  
... ... @@ -46,113 +66,65 @@
46 66 return 0;
47 67 }
48 68  
49   -/* ------------------------------------------------------------------------- */
50   -int altera_load(Altera_desc *desc, const void *buf, size_t bsize)
  69 +static const struct altera_fpga *
  70 +altera_desc_to_fpga(Altera_desc *desc, const char *fn)
51 71 {
52   - int ret_val = FPGA_FAIL; /* assume a failure */
  72 + int i;
53 73  
54   - if (altera_validate(desc, (char *)__func__)) {
55   - printf("%s: Invalid device descriptor\n", __func__);
56   - return FPGA_FAIL;
  74 + if (altera_validate(desc, fn)) {
  75 + printf("%s: Invalid device descriptor\n", fn);
  76 + return NULL;
57 77 }
58 78  
59   - switch (desc->family) {
60   - case Altera_ACEX1K:
61   - case Altera_CYC2:
62   -#if defined(CONFIG_FPGA_ACEX1K)
63   - debug_cond(FPGA_DEBUG,
64   - "%s: Launching the ACEX1K Loader...\n",
65   - __func__);
66   - ret_val = ACEX1K_load (desc, buf, bsize);
67   -#elif defined(CONFIG_FPGA_CYCLON2)
68   - debug_cond(FPGA_DEBUG,
69   - "%s: Launching the CYCLONE II Loader...\n",
70   - __func__);
71   - ret_val = CYC2_load (desc, buf, bsize);
72   -#else
73   - printf("%s: No support for ACEX1K devices.\n",
74   - __func__);
75   -#endif
76   - break;
  79 + for (i = 0; i < ARRAY_SIZE(altera_fpga); i++) {
  80 + if (desc->family == altera_fpga[i].family)
  81 + break;
  82 + }
77 83  
78   -#if defined(CONFIG_FPGA_STRATIX_II)
79   - case Altera_StratixII:
80   - debug_cond(FPGA_DEBUG,
81   - "%s: Launching the Stratix II Loader...\n",
82   - __func__);
83   - ret_val = StratixII_load (desc, buf, bsize);
84   - break;
85   -#endif
86   - default:
87   - printf("%s: Unsupported family type, %d\n",
88   - __func__, desc->family);
  84 + if (i == ARRAY_SIZE(altera_fpga)) {
  85 + printf("%s: Unsupported family type, %d\n", fn, desc->family);
  86 + return NULL;
89 87 }
90 88  
91   - return ret_val;
  89 + return &altera_fpga[i];
92 90 }
93 91  
94   -int altera_dump(Altera_desc *desc, const void *buf, size_t bsize)
  92 +int altera_load(Altera_desc *desc, const void *buf, size_t bsize)
95 93 {
96   - int ret_val = FPGA_FAIL; /* assume a failure */
  94 + const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__);
97 95  
98   - if (altera_validate(desc, (char *)__func__)) {
99   - printf("%s: Invalid device descriptor\n", __func__);
  96 + if (!fpga)
100 97 return FPGA_FAIL;
101   - }
102 98  
103   - switch (desc->family) {
104   - case Altera_ACEX1K:
105   -#if defined(CONFIG_FPGA_ACEX)
106   - debug_cond(FPGA_DEBUG,
107   - "%s: Launching the ACEX1K Reader...\n",
108   - __func__);
109   - ret_val = ACEX1K_dump (desc, buf, bsize);
110   -#else
111   - printf("%s: No support for ACEX1K devices.\n",
112   - __func__);
113   -#endif
114   - break;
  99 + debug_cond(FPGA_DEBUG, "%s: Launching the %s Loader...\n",
  100 + __func__, fpga->name);
  101 + if (fpga->load)
  102 + return fpga->load(desc, buf, bsize);
  103 + return 0;
  104 +}
115 105  
116   -#if defined(CONFIG_FPGA_STRATIX_II)
117   - case Altera_StratixII:
118   - debug_cond(FPGA_DEBUG,
119   - "%s: Launching the Stratix II Reader...\n",
120   - __func__);
121   - ret_val = StratixII_dump (desc, buf, bsize);
122   - break;
123   -#endif
124   - default:
125   - printf("%s: Unsupported family type, %d\n",
126   - __func__, desc->family);
127   - }
  106 +int altera_dump(Altera_desc *desc, const void *buf, size_t bsize)
  107 +{
  108 + const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__);
128 109  
129   - return ret_val;
  110 + if (!fpga)
  111 + return FPGA_FAIL;
  112 +
  113 + debug_cond(FPGA_DEBUG, "%s: Launching the %s Reader...\n",
  114 + __func__, fpga->name);
  115 + if (fpga->dump)
  116 + return fpga->dump(desc, buf, bsize);
  117 + return 0;
130 118 }
131 119  
132 120 int altera_info(Altera_desc *desc)
133 121 {
134   - int ret_val = FPGA_FAIL;
  122 + const struct altera_fpga *fpga = altera_desc_to_fpga(desc, __func__);
135 123  
136   - if (altera_validate (desc, (char *)__func__)) {
137   - printf("%s: Invalid device descriptor\n", __func__);
  124 + if (!fpga)
138 125 return FPGA_FAIL;
139   - }
140 126  
141   - printf("Family: \t");
142   - switch (desc->family) {
143   - case Altera_ACEX1K:
144   - printf("ACEX1K\n");
145   - break;
146   - case Altera_CYC2:
147   - printf("CYCLON II\n");
148   - break;
149   - case Altera_StratixII:
150   - printf("Stratix II\n");
151   - break;
152   - /* Add new family types here */
153   - default:
154   - printf("Unknown family type, %d\n", desc->family);
155   - }
  127 + printf("Family: \t%s\n", fpga->name);
156 128  
157 129 printf("Interface type:\t");
158 130 switch (desc->iface) {
159 131  
... ... @@ -188,35 +160,12 @@
188 160  
189 161 if (desc->iface_fns) {
190 162 printf("Device Function Table @ 0x%p\n", desc->iface_fns);
191   - switch (desc->family) {
192   - case Altera_ACEX1K:
193   - case Altera_CYC2:
194   -#if defined(CONFIG_FPGA_ACEX1K)
195   - ACEX1K_info(desc);
196   -#elif defined(CONFIG_FPGA_CYCLON2)
197   - CYC2_info(desc);
198   -#else
199   - /* just in case */
200   - printf("%s: No support for ACEX1K devices.\n",
201   - __func__);
202   -#endif
203   - break;
204   -#if defined(CONFIG_FPGA_STRATIX_II)
205   - case Altera_StratixII:
206   - StratixII_info(desc);
207   - break;
208   -#endif
209   - /* Add new family types here */
210   - default:
211   - /* we don't need a message here - we give one up above */
212   - break;
213   - }
  163 + if (fpga->info)
  164 + fpga->info(desc);
214 165 } else {
215 166 printf("No Device Function Table.\n");
216 167 }
217 168  
218   - ret_val = FPGA_SUCCESS;
219   -
220   - return ret_val;
  169 + return FPGA_SUCCESS;
221 170 }