Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6
[linux-2.6.git] / arch / powerpc / sysdev / micropatch.c
1
2 /* Microcode patches for the CPM as supplied by Motorola.
3  * This is the one for IIC/SPI.  There is a newer one that
4  * also relocates SMC2, but this would require additional changes
5  * to uart.c, so I am holding off on that for a moment.
6  */
7 #include <linux/init.h>
8 #include <linux/errno.h>
9 #include <linux/sched.h>
10 #include <linux/kernel.h>
11 #include <linux/param.h>
12 #include <linux/string.h>
13 #include <linux/mm.h>
14 #include <linux/interrupt.h>
15 #include <asm/irq.h>
16 #include <asm/mpc8xx.h>
17 #include <asm/page.h>
18 #include <asm/pgtable.h>
19 #include <asm/8xx_immap.h>
20 #include <asm/cpm.h>
21 #include <asm/cpm1.h>
22
23 /*
24  * I2C/SPI relocation patch arrays.
25  */
26
27 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
28
29 static uint patch_2000[] __initdata = {
30         0x7FFFEFD9,
31         0x3FFD0000,
32         0x7FFB49F7,
33         0x7FF90000,
34         0x5FEFADF7,
35         0x5F89ADF7,
36         0x5FEFAFF7,
37         0x5F89AFF7,
38         0x3A9CFBC8,
39         0xE7C0EDF0,
40         0x77C1E1BB,
41         0xF4DC7F1D,
42         0xABAD932F,
43         0x4E08FDCF,
44         0x6E0FAFF8,
45         0x7CCF76CF,
46         0xFD1FF9CF,
47         0xABF88DC6,
48         0xAB5679F7,
49         0xB0937383,
50         0xDFCE79F7,
51         0xB091E6BB,
52         0xE5BBE74F,
53         0xB3FA6F0F,
54         0x6FFB76CE,
55         0xEE0DF9CF,
56         0x2BFBEFEF,
57         0xCFEEF9CF,
58         0x76CEAD24,
59         0x90B2DF9A,
60         0x7FDDD0BF,
61         0x4BF847FD,
62         0x7CCF76CE,
63         0xCFEF7E1F,
64         0x7F1D7DFD,
65         0xF0B6EF71,
66         0x7FC177C1,
67         0xFBC86079,
68         0xE722FBC8,
69         0x5FFFDFFF,
70         0x5FB2FFFB,
71         0xFBC8F3C8,
72         0x94A67F01,
73         0x7F1D5F39,
74         0xAFE85F5E,
75         0xFFDFDF96,
76         0xCB9FAF7D,
77         0x5FC1AFED,
78         0x8C1C5FC1,
79         0xAFDD5FC3,
80         0xDF9A7EFD,
81         0xB0B25FB2,
82         0xFFFEABAD,
83         0x5FB2FFFE,
84         0x5FCE600B,
85         0xE6BB600B,
86         0x5FCEDFC6,
87         0x27FBEFDF,
88         0x5FC8CFDE,
89         0x3A9CE7C0,
90         0xEDF0F3C8,
91         0x7F0154CD,
92         0x7F1D2D3D,
93         0x363A7570,
94         0x7E0AF1CE,
95         0x37EF2E68,
96         0x7FEE10EC,
97         0xADF8EFDE,
98         0xCFEAE52F,
99         0x7D0FE12B,
100         0xF1CE5F65,
101         0x7E0A4DF8,
102         0xCFEA5F72,
103         0x7D0BEFEE,
104         0xCFEA5F74,
105         0xE522EFDE,
106         0x5F74CFDA,
107         0x0B627385,
108         0xDF627E0A,
109         0x30D8145B,
110         0xBFFFF3C8,
111         0x5FFFDFFF,
112         0xA7F85F5E,
113         0xBFFE7F7D,
114         0x10D31450,
115         0x5F36BFFF,
116         0xAF785F5E,
117         0xBFFDA7F8,
118         0x5F36BFFE,
119         0x77FD30C0,
120         0x4E08FDCF,
121         0xE5FF6E0F,
122         0xAFF87E1F,
123         0x7E0FFD1F,
124         0xF1CF5F1B,
125         0xABF80D5E,
126         0x5F5EFFEF,
127         0x79F730A2,
128         0xAFDD5F34,
129         0x47F85F34,
130         0xAFED7FDD,
131         0x50B24978,
132         0x47FD7F1D,
133         0x7DFD70AD,
134         0xEF717EC1,
135         0x6BA47F01,
136         0x2D267EFD,
137         0x30DE5F5E,
138         0xFFFD5F5E,
139         0xFFEF5F5E,
140         0xFFDF0CA0,
141         0xAFED0A9E,
142         0xAFDD0C3A,
143         0x5F3AAFBD,
144         0x7FBDB082,
145         0x5F8247F8
146 };
147
148 static uint patch_2f00[] __initdata = {
149         0x3E303430,
150         0x34343737,
151         0xABF7BF9B,
152         0x994B4FBD,
153         0xBD599493,
154         0x349FFF37,
155         0xFB9B177D,
156         0xD9936956,
157         0xBBFDD697,
158         0xBDD2FD11,
159         0x31DB9BB3,
160         0x63139637,
161         0x93733693,
162         0x193137F7,
163         0x331737AF,
164         0x7BB9B999,
165         0xBB197957,
166         0x7FDFD3D5,
167         0x73B773F7,
168         0x37933B99,
169         0x1D115316,
170         0x99315315,
171         0x31694BF4,
172         0xFBDBD359,
173         0x31497353,
174         0x76956D69,
175         0x7B9D9693,
176         0x13131979,
177         0x79376935
178 };
179 #endif
180
181 /*
182  * I2C/SPI/SMC1 relocation patch arrays.
183  */
184
185 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
186
187 static uint patch_2000[] __initdata = {
188         0x3fff0000,
189         0x3ffd0000,
190         0x3ffb0000,
191         0x3ff90000,
192         0x5f13eff8,
193         0x5eb5eff8,
194         0x5f88adf7,
195         0x5fefadf7,
196         0x3a9cfbc8,
197         0x77cae1bb,
198         0xf4de7fad,
199         0xabae9330,
200         0x4e08fdcf,
201         0x6e0faff8,
202         0x7ccf76cf,
203         0xfdaff9cf,
204         0xabf88dc8,
205         0xab5879f7,
206         0xb0925d8d,
207         0xdfd079f7,
208         0xb090e6bb,
209         0xe5bbe74f,
210         0x9e046f0f,
211         0x6ffb76ce,
212         0xee0cf9cf,
213         0x2bfbefef,
214         0xcfeef9cf,
215         0x76cead23,
216         0x90b3df99,
217         0x7fddd0c1,
218         0x4bf847fd,
219         0x7ccf76ce,
220         0xcfef77ca,
221         0x7eaf7fad,
222         0x7dfdf0b7,
223         0xef7a7fca,
224         0x77cafbc8,
225         0x6079e722,
226         0xfbc85fff,
227         0xdfff5fb3,
228         0xfffbfbc8,
229         0xf3c894a5,
230         0xe7c9edf9,
231         0x7f9a7fad,
232         0x5f36afe8,
233         0x5f5bffdf,
234         0xdf95cb9e,
235         0xaf7d5fc3,
236         0xafed8c1b,
237         0x5fc3afdd,
238         0x5fc5df99,
239         0x7efdb0b3,
240         0x5fb3fffe,
241         0xabae5fb3,
242         0xfffe5fd0,
243         0x600be6bb,
244         0x600b5fd0,
245         0xdfc827fb,
246         0xefdf5fca,
247         0xcfde3a9c,
248         0xe7c9edf9,
249         0xf3c87f9e,
250         0x54ca7fed,
251         0x2d3a3637,
252         0x756f7e9a,
253         0xf1ce37ef,
254         0x2e677fee,
255         0x10ebadf8,
256         0xefdecfea,
257         0xe52f7d9f,
258         0xe12bf1ce,
259         0x5f647e9a,
260         0x4df8cfea,
261         0x5f717d9b,
262         0xefeecfea,
263         0x5f73e522,
264         0xefde5f73,
265         0xcfda0b61,
266         0x5d8fdf61,
267         0xe7c9edf9,
268         0x7e9a30d5,
269         0x1458bfff,
270         0xf3c85fff,
271         0xdfffa7f8,
272         0x5f5bbffe,
273         0x7f7d10d0,
274         0x144d5f33,
275         0xbfffaf78,
276         0x5f5bbffd,
277         0xa7f85f33,
278         0xbffe77fd,
279         0x30bd4e08,
280         0xfdcfe5ff,
281         0x6e0faff8,
282         0x7eef7e9f,
283         0xfdeff1cf,
284         0x5f17abf8,
285         0x0d5b5f5b,
286         0xffef79f7,
287         0x309eafdd,
288         0x5f3147f8,
289         0x5f31afed,
290         0x7fdd50af,
291         0x497847fd,
292         0x7f9e7fed,
293         0x7dfd70a9,
294         0xef7e7ece,
295         0x6ba07f9e,
296         0x2d227efd,
297         0x30db5f5b,
298         0xfffd5f5b,
299         0xffef5f5b,
300         0xffdf0c9c,
301         0xafed0a9a,
302         0xafdd0c37,
303         0x5f37afbd,
304         0x7fbdb081,
305         0x5f8147f8,
306         0x3a11e710,
307         0xedf0ccdd,
308         0xf3186d0a,
309         0x7f0e5f06,
310         0x7fedbb38,
311         0x3afe7468,
312         0x7fedf4fc,
313         0x8ffbb951,
314         0xb85f77fd,
315         0xb0df5ddd,
316         0xdefe7fed,
317         0x90e1e74d,
318         0x6f0dcbf7,
319         0xe7decfed,
320         0xcb74cfed,
321         0xcfeddf6d,
322         0x91714f74,
323         0x5dd2deef,
324         0x9e04e7df,
325         0xefbb6ffb,
326         0xe7ef7f0e,
327         0x9e097fed,
328         0xebdbeffa,
329         0xeb54affb,
330         0x7fea90d7,
331         0x7e0cf0c3,
332         0xbffff318,
333         0x5fffdfff,
334         0xac59efea,
335         0x7fce1ee5,
336         0xe2ff5ee1,
337         0xaffbe2ff,
338         0x5ee3affb,
339         0xf9cc7d0f,
340         0xaef8770f,
341         0x7d0fb0c6,
342         0xeffbbfff,
343         0xcfef5ede,
344         0x7d0fbfff,
345         0x5ede4cf8,
346         0x7fddd0bf,
347         0x49f847fd,
348         0x7efdf0bb,
349         0x7fedfffd,
350         0x7dfdf0b7,
351         0xef7e7e1e,
352         0x5ede7f0e,
353         0x3a11e710,
354         0xedf0ccab,
355         0xfb18ad2e,
356         0x1ea9bbb8,
357         0x74283b7e,
358         0x73c2e4bb,
359         0x2ada4fb8,
360         0xdc21e4bb,
361         0xb2a1ffbf,
362         0x5e2c43f8,
363         0xfc87e1bb,
364         0xe74ffd91,
365         0x6f0f4fe8,
366         0xc7ba32e2,
367         0xf396efeb,
368         0x600b4f78,
369         0xe5bb760b,
370         0x53acaef8,
371         0x4ef88b0e,
372         0xcfef9e09,
373         0xabf8751f,
374         0xefef5bac,
375         0x741f4fe8,
376         0x751e760d,
377         0x7fdbf081,
378         0x741cafce,
379         0xefcc7fce,
380         0x751e70ac,
381         0x741ce7bb,
382         0x3372cfed,
383         0xafdbefeb,
384         0xe5bb760b,
385         0x53f2aef8,
386         0xafe8e7eb,
387         0x4bf8771e,
388         0x7e247fed,
389         0x4fcbe2cc,
390         0x7fbc30a9,
391         0x7b0f7a0f,
392         0x34d577fd,
393         0x308b5db7,
394         0xde553e5f,
395         0xaf78741f,
396         0x741f30f0,
397         0xcfef5e2c,
398         0x741f3eac,
399         0xafb8771e,
400         0x5e677fed,
401         0x0bd3e2cc,
402         0x741ccfec,
403         0xe5ca53cd,
404         0x6fcb4f74,
405         0x5dadde4b,
406         0x2ab63d38,
407         0x4bb3de30,
408         0x751f741c,
409         0x6c42effa,
410         0xefea7fce,
411         0x6ffc30be,
412         0xefec3fca,
413         0x30b3de2e,
414         0xadf85d9e,
415         0xaf7daefd,
416         0x5d9ede2e,
417         0x5d9eafdd,
418         0x761f10ac,
419         0x1da07efd,
420         0x30adfffe,
421         0x4908fb18,
422         0x5fffdfff,
423         0xafbb709b,
424         0x4ef85e67,
425         0xadf814ad,
426         0x7a0f70ad,
427         0xcfef50ad,
428         0x7a0fde30,
429         0x5da0afed,
430         0x3c12780f,
431         0xefef780f,
432         0xefef790f,
433         0xa7f85e0f,
434         0xffef790f,
435         0xefef790f,
436         0x14adde2e,
437         0x5d9eadfd,
438         0x5e2dfffb,
439         0xe79addfd,
440         0xeff96079,
441         0x607ae79a,
442         0xddfceff9,
443         0x60795dff,
444         0x607acfef,
445         0xefefefdf,
446         0xefbfef7f,
447         0xeeffedff,
448         0xebffe7ff,
449         0xafefafdf,
450         0xafbfaf7f,
451         0xaeffadff,
452         0xabffa7ff,
453         0x6fef6fdf,
454         0x6fbf6f7f,
455         0x6eff6dff,
456         0x6bff67ff,
457         0x2fef2fdf,
458         0x2fbf2f7f,
459         0x2eff2dff,
460         0x2bff27ff,
461         0x4e08fd1f,
462         0xe5ff6e0f,
463         0xaff87eef,
464         0x7e0ffdef,
465         0xf11f6079,
466         0xabf8f542,
467         0x7e0af11c,
468         0x37cfae3a,
469         0x7fec90be,
470         0xadf8efdc,
471         0xcfeae52f,
472         0x7d0fe12b,
473         0xf11c6079,
474         0x7e0a4df8,
475         0xcfea5dc4,
476         0x7d0befec,
477         0xcfea5dc6,
478         0xe522efdc,
479         0x5dc6cfda,
480         0x4e08fd1f,
481         0x6e0faff8,
482         0x7c1f761f,
483         0xfdeff91f,
484         0x6079abf8,
485         0x761cee24,
486         0xf91f2bfb,
487         0xefefcfec,
488         0xf91f6079,
489         0x761c27fb,
490         0xefdf5da7,
491         0xcfdc7fdd,
492         0xd09c4bf8,
493         0x47fd7c1f,
494         0x761ccfcf,
495         0x7eef7fed,
496         0x7dfdf093,
497         0xef7e7f1e,
498         0x771efb18,
499         0x6079e722,
500         0xe6bbe5bb,
501         0xae0ae5bb,
502         0x600bae85,
503         0xe2bbe2bb,
504         0xe2bbe2bb,
505         0xaf02e2bb,
506         0xe2bb2ff9,
507         0x6079e2bb
508 };
509
510 static uint patch_2f00[] __initdata = {
511         0x30303030,
512         0x3e3e3434,
513         0xabbf9b99,
514         0x4b4fbdbd,
515         0x59949334,
516         0x9fff37fb,
517         0x9b177dd9,
518         0x936956bb,
519         0xfbdd697b,
520         0xdd2fd113,
521         0x1db9f7bb,
522         0x36313963,
523         0x79373369,
524         0x3193137f,
525         0x7331737a,
526         0xf7bb9b99,
527         0x9bb19795,
528         0x77fdfd3d,
529         0x573b773f,
530         0x737933f7,
531         0xb991d115,
532         0x31699315,
533         0x31531694,
534         0xbf4fbdbd,
535         0x35931497,
536         0x35376956,
537         0xbd697b9d,
538         0x96931313,
539         0x19797937,
540         0x6935af78,
541         0xb9b3baa3,
542         0xb8788683,
543         0x368f78f7,
544         0x87778733,
545         0x3ffffb3b,
546         0x8e8f78b8,
547         0x1d118e13,
548         0xf3ff3f8b,
549         0x6bd8e173,
550         0xd1366856,
551         0x68d1687b,
552         0x3daf78b8,
553         0x3a3a3f87,
554         0x8f81378f,
555         0xf876f887,
556         0x77fd8778,
557         0x737de8d6,
558         0xbbf8bfff,
559         0xd8df87f7,
560         0xfd876f7b,
561         0x8bfff8bd,
562         0x8683387d,
563         0xb873d87b,
564         0x3b8fd7f8,
565         0xf7338883,
566         0xbb8ee1f8,
567         0xef837377,
568         0x3337b836,
569         0x817d11f8,
570         0x7378b878,
571         0xd3368b7d,
572         0xed731b7d,
573         0x833731f3,
574         0xf22f3f23
575 };
576
577 static uint patch_2e00[] __initdata = {
578         0x27eeeeee,
579         0xeeeeeeee,
580         0xeeeeeeee,
581         0xeeeeeeee,
582         0xee4bf4fb,
583         0xdbd259bb,
584         0x1979577f,
585         0xdfd2d573,
586         0xb773f737,
587         0x4b4fbdbd,
588         0x25b9b177,
589         0xd2d17376,
590         0x956bbfdd,
591         0x697bdd2f,
592         0xff9f79ff,
593         0xff9ff22f
594 };
595 #endif
596
597 /*
598  *  USB SOF patch arrays.
599  */
600
601 #ifdef CONFIG_USB_SOF_UCODE_PATCH
602
603 static uint patch_2000[] __initdata = {
604         0x7fff0000,
605         0x7ffd0000,
606         0x7ffb0000,
607         0x49f7ba5b,
608         0xba383ffb,
609         0xf9b8b46d,
610         0xe5ab4e07,
611         0xaf77bffe,
612         0x3f7bbf79,
613         0xba5bba38,
614         0xe7676076,
615         0x60750000
616 };
617
618 static uint patch_2f00[] __initdata = {
619         0x3030304c,
620         0xcab9e441,
621         0xa1aaf220
622 };
623 #endif
624
625 void __init cpm_load_patch(cpm8xx_t *cp)
626 {
627         volatile uint           *dp;            /* Dual-ported RAM. */
628         volatile cpm8xx_t       *commproc;
629 #if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
630     defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
631         volatile iic_t          *iip;
632         volatile struct spi_pram *spp;
633 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
634         volatile smc_uart_t     *smp;
635 #endif
636 #endif
637         int     i;
638
639         commproc = cp;
640
641 #ifdef CONFIG_USB_SOF_UCODE_PATCH
642         commproc->cp_rccr = 0;
643
644         dp = (uint *)(commproc->cp_dpmem);
645         for (i=0; i<(sizeof(patch_2000)/4); i++)
646                 *dp++ = patch_2000[i];
647
648         dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
649         for (i=0; i<(sizeof(patch_2f00)/4); i++)
650                 *dp++ = patch_2f00[i];
651
652         commproc->cp_rccr = 0x0009;
653
654         printk("USB SOF microcode patch installed\n");
655 #endif /* CONFIG_USB_SOF_UCODE_PATCH */
656
657 #if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
658     defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
659
660         commproc->cp_rccr = 0;
661
662         dp = (uint *)(commproc->cp_dpmem);
663         for (i=0; i<(sizeof(patch_2000)/4); i++)
664                 *dp++ = patch_2000[i];
665
666         dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
667         for (i=0; i<(sizeof(patch_2f00)/4); i++)
668                 *dp++ = patch_2f00[i];
669
670         iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
671 # define RPBASE 0x0500
672         iip->iic_rpbase = RPBASE;
673
674         /* Put SPI above the IIC, also 32-byte aligned.
675         */
676         i = (RPBASE + sizeof(iic_t) + 31) & ~31;
677         spp = (struct spi_pram *)&commproc->cp_dparam[PROFF_SPI];
678         spp->rpbase = i;
679
680 # if defined(CONFIG_I2C_SPI_UCODE_PATCH)
681         commproc->cp_cpmcr1 = 0x802a;
682         commproc->cp_cpmcr2 = 0x8028;
683         commproc->cp_cpmcr3 = 0x802e;
684         commproc->cp_cpmcr4 = 0x802c;
685         commproc->cp_rccr = 1;
686
687         printk("I2C/SPI microcode patch installed.\n");
688 # endif /* CONFIG_I2C_SPI_UCODE_PATCH */
689
690 # if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
691
692         dp = (uint *)&(commproc->cp_dpmem[0x0e00]);
693         for (i=0; i<(sizeof(patch_2e00)/4); i++)
694                 *dp++ = patch_2e00[i];
695
696         commproc->cp_cpmcr1 = 0x8080;
697         commproc->cp_cpmcr2 = 0x808a;
698         commproc->cp_cpmcr3 = 0x8028;
699         commproc->cp_cpmcr4 = 0x802a;
700         commproc->cp_rccr = 3;
701
702         smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
703         smp->smc_rpbase = 0x1FC0;
704
705         printk("I2C/SPI/SMC1 microcode patch installed.\n");
706 # endif /* CONFIG_I2C_SPI_SMC1_UCODE_PATCH) */
707
708 #endif /* some variation of the I2C/SPI patch was selected */
709 }
710
711 /*
712  *  Take this entire routine out, since no one calls it and its
713  * logic is suspect.
714  */
715
716 #if 0
717 void
718 verify_patch(volatile immap_t *immr)
719 {
720         volatile uint           *dp;
721         volatile cpm8xx_t       *commproc;
722         int i;
723
724         commproc = (cpm8xx_t *)&immr->im_cpm;
725
726         printk("cp_rccr %x\n", commproc->cp_rccr);
727         commproc->cp_rccr = 0;
728
729         dp = (uint *)(commproc->cp_dpmem);
730         for (i=0; i<(sizeof(patch_2000)/4); i++)
731                 if (*dp++ != patch_2000[i]) {
732                         printk("patch_2000 bad at %d\n", i);
733                         dp--;
734                         printk("found 0x%X, wanted 0x%X\n", *dp, patch_2000[i]);
735                         break;
736                 }
737
738         dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
739         for (i=0; i<(sizeof(patch_2f00)/4); i++)
740                 if (*dp++ != patch_2f00[i]) {
741                         printk("patch_2f00 bad at %d\n", i);
742                         dp--;
743                         printk("found 0x%X, wanted 0x%X\n", *dp, patch_2f00[i]);
744                         break;
745                 }
746
747         commproc->cp_rccr = 0x0009;
748 }
749 #endif