1 // SPDX-License-Identifier: GPL-2.0
2 
3 /*
4  * Microcode patches for the CPM as supplied by Motorola.
5  * This is the one for IIC/SPI.  There is a newer one that
6  * also relocates SMC2, but this would require additional changes
7  * to uart.c, so I am holding off on that for a moment.
8  */
9 #include <linux/init.h>
10 #include <linux/errno.h>
11 #include <linux/sched.h>
12 #include <linux/kernel.h>
13 #include <linux/param.h>
14 #include <linux/string.h>
15 #include <linux/mm.h>
16 #include <linux/interrupt.h>
17 #include <asm/irq.h>
18 #include <asm/page.h>
19 #include <asm/pgtable.h>
20 #include <asm/8xx_immap.h>
21 #include <asm/cpm.h>
22 #include <asm/cpm1.h>
23 
24 struct patch_params {
25 	ushort rccr;
26 	ushort cpmcr1;
27 	ushort cpmcr2;
28 	ushort cpmcr3;
29 	ushort cpmcr4;
30 };
31 
32 /*
33  * I2C/SPI relocation patch arrays.
34  */
35 
36 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
37 
38 static char patch_name[] __initdata = "I2C/SPI";
39 
40 static struct patch_params patch_params __initdata = {
41 	1, 0x802a, 0x8028, 0x802e, 0x802c,
42 };
43 
44 static uint patch_2000[] __initdata = {
45 	0x7FFFEFD9, 0x3FFD0000, 0x7FFB49F7, 0x7FF90000,
46 	0x5FEFADF7, 0x5F89ADF7, 0x5FEFAFF7, 0x5F89AFF7,
47 	0x3A9CFBC8, 0xE7C0EDF0, 0x77C1E1BB, 0xF4DC7F1D,
48 	0xABAD932F, 0x4E08FDCF, 0x6E0FAFF8, 0x7CCF76CF,
49 	0xFD1FF9CF, 0xABF88DC6, 0xAB5679F7, 0xB0937383,
50 	0xDFCE79F7, 0xB091E6BB, 0xE5BBE74F, 0xB3FA6F0F,
51 	0x6FFB76CE, 0xEE0DF9CF, 0x2BFBEFEF, 0xCFEEF9CF,
52 	0x76CEAD24, 0x90B2DF9A, 0x7FDDD0BF, 0x4BF847FD,
53 	0x7CCF76CE, 0xCFEF7E1F, 0x7F1D7DFD, 0xF0B6EF71,
54 	0x7FC177C1, 0xFBC86079, 0xE722FBC8, 0x5FFFDFFF,
55 	0x5FB2FFFB, 0xFBC8F3C8, 0x94A67F01, 0x7F1D5F39,
56 	0xAFE85F5E, 0xFFDFDF96, 0xCB9FAF7D, 0x5FC1AFED,
57 	0x8C1C5FC1, 0xAFDD5FC3, 0xDF9A7EFD, 0xB0B25FB2,
58 	0xFFFEABAD, 0x5FB2FFFE, 0x5FCE600B, 0xE6BB600B,
59 	0x5FCEDFC6, 0x27FBEFDF, 0x5FC8CFDE, 0x3A9CE7C0,
60 	0xEDF0F3C8, 0x7F0154CD, 0x7F1D2D3D, 0x363A7570,
61 	0x7E0AF1CE, 0x37EF2E68, 0x7FEE10EC, 0xADF8EFDE,
62 	0xCFEAE52F, 0x7D0FE12B, 0xF1CE5F65, 0x7E0A4DF8,
63 	0xCFEA5F72, 0x7D0BEFEE, 0xCFEA5F74, 0xE522EFDE,
64 	0x5F74CFDA, 0x0B627385, 0xDF627E0A, 0x30D8145B,
65 	0xBFFFF3C8, 0x5FFFDFFF, 0xA7F85F5E, 0xBFFE7F7D,
66 	0x10D31450, 0x5F36BFFF, 0xAF785F5E, 0xBFFDA7F8,
67 	0x5F36BFFE, 0x77FD30C0, 0x4E08FDCF, 0xE5FF6E0F,
68 	0xAFF87E1F, 0x7E0FFD1F, 0xF1CF5F1B, 0xABF80D5E,
69 	0x5F5EFFEF, 0x79F730A2, 0xAFDD5F34, 0x47F85F34,
70 	0xAFED7FDD, 0x50B24978, 0x47FD7F1D, 0x7DFD70AD,
71 	0xEF717EC1, 0x6BA47F01, 0x2D267EFD, 0x30DE5F5E,
72 	0xFFFD5F5E, 0xFFEF5F5E, 0xFFDF0CA0, 0xAFED0A9E,
73 	0xAFDD0C3A, 0x5F3AAFBD, 0x7FBDB082, 0x5F8247F8
74 };
75 
76 static uint patch_2f00[] __initdata = {
77 	0x3E303430, 0x34343737, 0xABF7BF9B, 0x994B4FBD,
78 	0xBD599493, 0x349FFF37, 0xFB9B177D, 0xD9936956,
79 	0xBBFDD697, 0xBDD2FD11, 0x31DB9BB3, 0x63139637,
80 	0x93733693, 0x193137F7, 0x331737AF, 0x7BB9B999,
81 	0xBB197957, 0x7FDFD3D5, 0x73B773F7, 0x37933B99,
82 	0x1D115316, 0x99315315, 0x31694BF4, 0xFBDBD359,
83 	0x31497353, 0x76956D69, 0x7B9D9693, 0x13131979,
84 	0x79376935
85 };
86 
87 static uint patch_2e00[] __initdata = {};
88 #endif
89 
90 /*
91  * I2C/SPI/SMC1 relocation patch arrays.
92  */
93 
94 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
95 
96 static char patch_name[] __initdata = "I2C/SPI/SMC1";
97 
98 static struct patch_params patch_params __initdata = {
99 	3, 0x8080, 0x808a, 0x8028, 0x802a,
100 };
101 
102 static uint patch_2000[] __initdata = {
103 	0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
104 	0x5f13eff8, 0x5eb5eff8, 0x5f88adf7, 0x5fefadf7,
105 	0x3a9cfbc8, 0x77cae1bb, 0xf4de7fad, 0xabae9330,
106 	0x4e08fdcf, 0x6e0faff8, 0x7ccf76cf, 0xfdaff9cf,
107 	0xabf88dc8, 0xab5879f7, 0xb0925d8d, 0xdfd079f7,
108 	0xb090e6bb, 0xe5bbe74f, 0x9e046f0f, 0x6ffb76ce,
109 	0xee0cf9cf, 0x2bfbefef, 0xcfeef9cf, 0x76cead23,
110 	0x90b3df99, 0x7fddd0c1, 0x4bf847fd, 0x7ccf76ce,
111 	0xcfef77ca, 0x7eaf7fad, 0x7dfdf0b7, 0xef7a7fca,
112 	0x77cafbc8, 0x6079e722, 0xfbc85fff, 0xdfff5fb3,
113 	0xfffbfbc8, 0xf3c894a5, 0xe7c9edf9, 0x7f9a7fad,
114 	0x5f36afe8, 0x5f5bffdf, 0xdf95cb9e, 0xaf7d5fc3,
115 	0xafed8c1b, 0x5fc3afdd, 0x5fc5df99, 0x7efdb0b3,
116 	0x5fb3fffe, 0xabae5fb3, 0xfffe5fd0, 0x600be6bb,
117 	0x600b5fd0, 0xdfc827fb, 0xefdf5fca, 0xcfde3a9c,
118 	0xe7c9edf9, 0xf3c87f9e, 0x54ca7fed, 0x2d3a3637,
119 	0x756f7e9a, 0xf1ce37ef, 0x2e677fee, 0x10ebadf8,
120 	0xefdecfea, 0xe52f7d9f, 0xe12bf1ce, 0x5f647e9a,
121 	0x4df8cfea, 0x5f717d9b, 0xefeecfea, 0x5f73e522,
122 	0xefde5f73, 0xcfda0b61, 0x5d8fdf61, 0xe7c9edf9,
123 	0x7e9a30d5, 0x1458bfff, 0xf3c85fff, 0xdfffa7f8,
124 	0x5f5bbffe, 0x7f7d10d0, 0x144d5f33, 0xbfffaf78,
125 	0x5f5bbffd, 0xa7f85f33, 0xbffe77fd, 0x30bd4e08,
126 	0xfdcfe5ff, 0x6e0faff8, 0x7eef7e9f, 0xfdeff1cf,
127 	0x5f17abf8, 0x0d5b5f5b, 0xffef79f7, 0x309eafdd,
128 	0x5f3147f8, 0x5f31afed, 0x7fdd50af, 0x497847fd,
129 	0x7f9e7fed, 0x7dfd70a9, 0xef7e7ece, 0x6ba07f9e,
130 	0x2d227efd, 0x30db5f5b, 0xfffd5f5b, 0xffef5f5b,
131 	0xffdf0c9c, 0xafed0a9a, 0xafdd0c37, 0x5f37afbd,
132 	0x7fbdb081, 0x5f8147f8, 0x3a11e710, 0xedf0ccdd,
133 	0xf3186d0a, 0x7f0e5f06, 0x7fedbb38, 0x3afe7468,
134 	0x7fedf4fc, 0x8ffbb951, 0xb85f77fd, 0xb0df5ddd,
135 	0xdefe7fed, 0x90e1e74d, 0x6f0dcbf7, 0xe7decfed,
136 	0xcb74cfed, 0xcfeddf6d, 0x91714f74, 0x5dd2deef,
137 	0x9e04e7df, 0xefbb6ffb, 0xe7ef7f0e, 0x9e097fed,
138 	0xebdbeffa, 0xeb54affb, 0x7fea90d7, 0x7e0cf0c3,
139 	0xbffff318, 0x5fffdfff, 0xac59efea, 0x7fce1ee5,
140 	0xe2ff5ee1, 0xaffbe2ff, 0x5ee3affb, 0xf9cc7d0f,
141 	0xaef8770f, 0x7d0fb0c6, 0xeffbbfff, 0xcfef5ede,
142 	0x7d0fbfff, 0x5ede4cf8, 0x7fddd0bf, 0x49f847fd,
143 	0x7efdf0bb, 0x7fedfffd, 0x7dfdf0b7, 0xef7e7e1e,
144 	0x5ede7f0e, 0x3a11e710, 0xedf0ccab, 0xfb18ad2e,
145 	0x1ea9bbb8, 0x74283b7e, 0x73c2e4bb, 0x2ada4fb8,
146 	0xdc21e4bb, 0xb2a1ffbf, 0x5e2c43f8, 0xfc87e1bb,
147 	0xe74ffd91, 0x6f0f4fe8, 0xc7ba32e2, 0xf396efeb,
148 	0x600b4f78, 0xe5bb760b, 0x53acaef8, 0x4ef88b0e,
149 	0xcfef9e09, 0xabf8751f, 0xefef5bac, 0x741f4fe8,
150 	0x751e760d, 0x7fdbf081, 0x741cafce, 0xefcc7fce,
151 	0x751e70ac, 0x741ce7bb, 0x3372cfed, 0xafdbefeb,
152 	0xe5bb760b, 0x53f2aef8, 0xafe8e7eb, 0x4bf8771e,
153 	0x7e247fed, 0x4fcbe2cc, 0x7fbc30a9, 0x7b0f7a0f,
154 	0x34d577fd, 0x308b5db7, 0xde553e5f, 0xaf78741f,
155 	0x741f30f0, 0xcfef5e2c, 0x741f3eac, 0xafb8771e,
156 	0x5e677fed, 0x0bd3e2cc, 0x741ccfec, 0xe5ca53cd,
157 	0x6fcb4f74, 0x5dadde4b, 0x2ab63d38, 0x4bb3de30,
158 	0x751f741c, 0x6c42effa, 0xefea7fce, 0x6ffc30be,
159 	0xefec3fca, 0x30b3de2e, 0xadf85d9e, 0xaf7daefd,
160 	0x5d9ede2e, 0x5d9eafdd, 0x761f10ac, 0x1da07efd,
161 	0x30adfffe, 0x4908fb18, 0x5fffdfff, 0xafbb709b,
162 	0x4ef85e67, 0xadf814ad, 0x7a0f70ad, 0xcfef50ad,
163 	0x7a0fde30, 0x5da0afed, 0x3c12780f, 0xefef780f,
164 	0xefef790f, 0xa7f85e0f, 0xffef790f, 0xefef790f,
165 	0x14adde2e, 0x5d9eadfd, 0x5e2dfffb, 0xe79addfd,
166 	0xeff96079, 0x607ae79a, 0xddfceff9, 0x60795dff,
167 	0x607acfef, 0xefefefdf, 0xefbfef7f, 0xeeffedff,
168 	0xebffe7ff, 0xafefafdf, 0xafbfaf7f, 0xaeffadff,
169 	0xabffa7ff, 0x6fef6fdf, 0x6fbf6f7f, 0x6eff6dff,
170 	0x6bff67ff, 0x2fef2fdf, 0x2fbf2f7f, 0x2eff2dff,
171 	0x2bff27ff, 0x4e08fd1f, 0xe5ff6e0f, 0xaff87eef,
172 	0x7e0ffdef, 0xf11f6079, 0xabf8f542, 0x7e0af11c,
173 	0x37cfae3a, 0x7fec90be, 0xadf8efdc, 0xcfeae52f,
174 	0x7d0fe12b, 0xf11c6079, 0x7e0a4df8, 0xcfea5dc4,
175 	0x7d0befec, 0xcfea5dc6, 0xe522efdc, 0x5dc6cfda,
176 	0x4e08fd1f, 0x6e0faff8, 0x7c1f761f, 0xfdeff91f,
177 	0x6079abf8, 0x761cee24, 0xf91f2bfb, 0xefefcfec,
178 	0xf91f6079, 0x761c27fb, 0xefdf5da7, 0xcfdc7fdd,
179 	0xd09c4bf8, 0x47fd7c1f, 0x761ccfcf, 0x7eef7fed,
180 	0x7dfdf093, 0xef7e7f1e, 0x771efb18, 0x6079e722,
181 	0xe6bbe5bb, 0xae0ae5bb, 0x600bae85, 0xe2bbe2bb,
182 	0xe2bbe2bb, 0xaf02e2bb, 0xe2bb2ff9, 0x6079e2bb
183 };
184 
185 static uint patch_2f00[] __initdata = {
186 	0x30303030, 0x3e3e3434, 0xabbf9b99, 0x4b4fbdbd,
187 	0x59949334, 0x9fff37fb, 0x9b177dd9, 0x936956bb,
188 	0xfbdd697b, 0xdd2fd113, 0x1db9f7bb, 0x36313963,
189 	0x79373369, 0x3193137f, 0x7331737a, 0xf7bb9b99,
190 	0x9bb19795, 0x77fdfd3d, 0x573b773f, 0x737933f7,
191 	0xb991d115, 0x31699315, 0x31531694, 0xbf4fbdbd,
192 	0x35931497, 0x35376956, 0xbd697b9d, 0x96931313,
193 	0x19797937, 0x6935af78, 0xb9b3baa3, 0xb8788683,
194 	0x368f78f7, 0x87778733, 0x3ffffb3b, 0x8e8f78b8,
195 	0x1d118e13, 0xf3ff3f8b, 0x6bd8e173, 0xd1366856,
196 	0x68d1687b, 0x3daf78b8, 0x3a3a3f87, 0x8f81378f,
197 	0xf876f887, 0x77fd8778, 0x737de8d6, 0xbbf8bfff,
198 	0xd8df87f7, 0xfd876f7b, 0x8bfff8bd, 0x8683387d,
199 	0xb873d87b, 0x3b8fd7f8, 0xf7338883, 0xbb8ee1f8,
200 	0xef837377, 0x3337b836, 0x817d11f8, 0x7378b878,
201 	0xd3368b7d, 0xed731b7d, 0x833731f3, 0xf22f3f23
202 };
203 
204 static uint patch_2e00[] __initdata = {
205 	0x27eeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
206 	0xee4bf4fb, 0xdbd259bb, 0x1979577f, 0xdfd2d573,
207 	0xb773f737, 0x4b4fbdbd, 0x25b9b177, 0xd2d17376,
208 	0x956bbfdd, 0x697bdd2f, 0xff9f79ff, 0xff9ff22f
209 };
210 #endif
211 
212 /*
213  *  USB SOF patch arrays.
214  */
215 
216 #ifdef CONFIG_USB_SOF_UCODE_PATCH
217 
218 static char patch_name[] __initdata = "USB SOF";
219 
220 static struct patch_params patch_params __initdata = {
221 	9,
222 };
223 
224 static uint patch_2000[] __initdata = {
225 	0x7fff0000, 0x7ffd0000, 0x7ffb0000, 0x49f7ba5b,
226 	0xba383ffb, 0xf9b8b46d, 0xe5ab4e07, 0xaf77bffe,
227 	0x3f7bbf79, 0xba5bba38, 0xe7676076, 0x60750000
228 };
229 
230 static uint patch_2f00[] __initdata = {
231 	0x3030304c, 0xcab9e441, 0xa1aaf220
232 };
233 
234 static uint patch_2e00[] __initdata = {};
235 #endif
236 
237 /*
238  * SMC relocation patch arrays.
239  */
240 
241 #ifdef CONFIG_SMC_UCODE_PATCH
242 
243 static char patch_name[] __initdata = "SMC";
244 
245 static struct patch_params patch_params __initdata = {
246 	2, 0x8080, 0x8088,
247 };
248 
249 static uint patch_2000[] __initdata = {
250 	0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
251 	0x5fefeff8, 0x5f91eff8, 0x3ff30000, 0x3ff10000,
252 	0x3a11e710, 0xedf0ccb9, 0xf318ed66, 0x7f0e5fe2,
253 	0x7fedbb38, 0x3afe7468, 0x7fedf4d8, 0x8ffbb92d,
254 	0xb83b77fd, 0xb0bb5eb9, 0xdfda7fed, 0x90bde74d,
255 	0x6f0dcbd3, 0xe7decfed, 0xcb50cfed, 0xcfeddf6d,
256 	0x914d4f74, 0x5eaedfcb, 0x9ee0e7df, 0xefbb6ffb,
257 	0xe7ef7f0e, 0x9ee57fed, 0xebb7effa, 0xeb30affb,
258 	0x7fea90b3, 0x7e0cf09f, 0xbffff318, 0x5fffdfff,
259 	0xac35efea, 0x7fce1fc1, 0xe2ff5fbd, 0xaffbe2ff,
260 	0x5fbfaffb, 0xf9a87d0f, 0xaef8770f, 0x7d0fb0a2,
261 	0xeffbbfff, 0xcfef5fba, 0x7d0fbfff, 0x5fba4cf8,
262 	0x7fddd09b, 0x49f847fd, 0x7efdf097, 0x7fedfffd,
263 	0x7dfdf093, 0xef7e7e1e, 0x5fba7f0e, 0x3a11e710,
264 	0xedf0cc87, 0xfb18ad0a, 0x1f85bbb8, 0x74283b7e,
265 	0x7375e4bb, 0x2ab64fb8, 0x5c7de4bb, 0x32fdffbf,
266 	0x5f0843f8, 0x7ce3e1bb, 0xe74f7ded, 0x6f0f4fe8,
267 	0xc7ba32be, 0x73f2efeb, 0x600b4f78, 0xe5bb760b,
268 	0x5388aef8, 0x4ef80b6a, 0xcfef9ee5, 0xabf8751f,
269 	0xefef5b88, 0x741f4fe8, 0x751e760d, 0x7fdb70dd,
270 	0x741cafce, 0xefcc7fce, 0x751e7088, 0x741ce7bb,
271 	0x334ecfed, 0xafdbefeb, 0xe5bb760b, 0x53ceaef8,
272 	0xafe8e7eb, 0x4bf8771e, 0x7e007fed, 0x4fcbe2cc,
273 	0x7fbc3085, 0x7b0f7a0f, 0x34b177fd, 0xb0e75e93,
274 	0xdf313e3b, 0xaf78741f, 0x741f30cc, 0xcfef5f08,
275 	0x741f3e88, 0xafb8771e, 0x5f437fed, 0x0bafe2cc,
276 	0x741ccfec, 0xe5ca53a9, 0x6fcb4f74, 0x5e89df27,
277 	0x2a923d14, 0x4b8fdf0c, 0x751f741c, 0x6c1eeffa,
278 	0xefea7fce, 0x6ffc309a, 0xefec3fca, 0x308fdf0a,
279 	0xadf85e7a, 0xaf7daefd, 0x5e7adf0a, 0x5e7aafdd,
280 	0x761f1088, 0x1e7c7efd, 0x3089fffe, 0x4908fb18,
281 	0x5fffdfff, 0xafbbf0f7, 0x4ef85f43, 0xadf81489,
282 	0x7a0f7089, 0xcfef5089, 0x7a0fdf0c, 0x5e7cafed,
283 	0xbc6e780f, 0xefef780f, 0xefef790f, 0xa7f85eeb,
284 	0xffef790f, 0xefef790f, 0x1489df0a, 0x5e7aadfd,
285 	0x5f09fffb, 0xe79aded9, 0xeff96079, 0x607ae79a,
286 	0xded8eff9, 0x60795edb, 0x607acfef, 0xefefefdf,
287 	0xefbfef7f, 0xeeffedff, 0xebffe7ff, 0xafefafdf,
288 	0xafbfaf7f, 0xaeffadff, 0xabffa7ff, 0x6fef6fdf,
289 	0x6fbf6f7f, 0x6eff6dff, 0x6bff67ff, 0x2fef2fdf,
290 	0x2fbf2f7f, 0x2eff2dff, 0x2bff27ff, 0x4e08fd1f,
291 	0xe5ff6e0f, 0xaff87eef, 0x7e0ffdef, 0xf11f6079,
292 	0xabf8f51e, 0x7e0af11c, 0x37cfae16, 0x7fec909a,
293 	0xadf8efdc, 0xcfeae52f, 0x7d0fe12b, 0xf11c6079,
294 	0x7e0a4df8, 0xcfea5ea0, 0x7d0befec, 0xcfea5ea2,
295 	0xe522efdc, 0x5ea2cfda, 0x4e08fd1f, 0x6e0faff8,
296 	0x7c1f761f, 0xfdeff91f, 0x6079abf8, 0x761cee00,
297 	0xf91f2bfb, 0xefefcfec, 0xf91f6079, 0x761c27fb,
298 	0xefdf5e83, 0xcfdc7fdd, 0x50f84bf8, 0x47fd7c1f,
299 	0x761ccfcf, 0x7eef7fed, 0x7dfd70ef, 0xef7e7f1e,
300 	0x771efb18, 0x6079e722, 0xe6bbe5bb, 0x2e66e5bb,
301 	0x600b2ee1, 0xe2bbe2bb, 0xe2bbe2bb, 0x2f5ee2bb,
302 	0xe2bb2ff9, 0x6079e2bb,
303 };
304 
305 static uint patch_2f00[] __initdata = {
306 	0x30303030, 0x3e3e3030, 0xaf79b9b3, 0xbaa3b979,
307 	0x9693369f, 0x79f79777, 0x97333fff, 0xfb3b9e9f,
308 	0x79b91d11, 0x9e13f3ff, 0x3f9b6bd9, 0xe173d136,
309 	0x695669d1, 0x697b3daf, 0x79b93a3a, 0x3f979f91,
310 	0x379ff976, 0xf99777fd, 0x9779737d, 0xe9d6bbf9,
311 	0xbfffd9df, 0x97f7fd97, 0x6f7b9bff, 0xf9bd9683,
312 	0x397db973, 0xd97b3b9f, 0xd7f9f733, 0x9993bb9e,
313 	0xe1f9ef93, 0x73773337, 0xb936917d, 0x11f87379,
314 	0xb979d336, 0x8b7ded73, 0x1b7d9337, 0x31f3f22f,
315 	0x3f2327ee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
316 	0xeeeeee4b, 0xf4fbdbd2, 0x58bb1878, 0x577fdfd2,
317 	0xd573b773, 0xf7374b4f, 0xbdbd25b8, 0xb177d2d1,
318 	0x7376856b, 0xbfdd687b, 0xdd2fff8f, 0x78ffff8f,
319 	0xf22f0000,
320 };
321 
322 static uint patch_2e00[] __initdata = {};
323 #endif
324 
325 static void __init cpm_write_patch(cpm8xx_t *cp, int offset, uint *patch, int len)
326 {
327 	if (!len)
328 		return;
329 	memcpy_toio(cp->cp_dpmem + offset, patch, len);
330 }
331 
332 void __init cpm_load_patch(cpm8xx_t *cp)
333 {
334 	out_be16(&cp->cp_rccr, 0);
335 
336 	cpm_write_patch(cp, 0, patch_2000, sizeof(patch_2000));
337 	cpm_write_patch(cp, 0xf00, patch_2f00, sizeof(patch_2f00));
338 	cpm_write_patch(cp, 0xe00, patch_2e00, sizeof(patch_2e00));
339 
340 	if (IS_ENABLED(CONFIG_I2C_SPI_UCODE_PATCH) ||
341 	    IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) {
342 		u16 rpbase = 0x500;
343 		iic_t *iip;
344 		struct spi_pram *spp;
345 
346 		iip = (iic_t *)&cp->cp_dparam[PROFF_IIC];
347 		out_be16(&iip->iic_rpbase, rpbase);
348 
349 		/* Put SPI above the IIC, also 32-byte aligned. */
350 		spp = (struct spi_pram *)&cp->cp_dparam[PROFF_SPI];
351 		out_be16(&spp->rpbase, (rpbase + sizeof(iic_t) + 31) & ~31);
352 
353 		if (IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) {
354 			smc_uart_t *smp;
355 
356 			smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1];
357 			out_be16(&smp->smc_rpbase, 0x1FC0);
358 		}
359 	}
360 
361 	if (IS_ENABLED(CONFIG_SMC_UCODE_PATCH)) {
362 		smc_uart_t *smp;
363 
364 		smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1];
365 		out_be16(&smp->smc_rpbase, 0x1ec0);
366 		smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC2];
367 		out_be16(&smp->smc_rpbase, 0x1fc0);
368 	}
369 
370 	out_be16(&cp->cp_cpmcr1, patch_params.cpmcr1);
371 	out_be16(&cp->cp_cpmcr2, patch_params.cpmcr2);
372 	out_be16(&cp->cp_cpmcr3, patch_params.cpmcr3);
373 	out_be16(&cp->cp_cpmcr4, patch_params.cpmcr4);
374 
375 	out_be16(&cp->cp_rccr, patch_params.rccr);
376 
377 	pr_info("%s microcode patch installed\n", patch_name);
378 }
379