8 #include <linux/errno.h>
9 #include <linux/sched.h>
10 #include <linux/kernel.h>
12 #include <linux/string.h>
18 #include <asm/pgtable.h>
27 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
185 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
601 #ifdef CONFIG_USB_SOF_UCODE_PATCH
628 volatile cpm8xx_t *commproc;
629 #if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
630 defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
633 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
641 #ifdef CONFIG_USB_SOF_UCODE_PATCH
642 commproc->cp_rccr = 0;
644 dp = (
uint *)(commproc->cp_dpmem);
645 for (i=0; i<(
sizeof(patch_2000)/4); i++)
646 *dp++ = patch_2000[i];
648 dp = (
uint *)&(commproc->cp_dpmem[0x0f00]);
649 for (i=0; i<(
sizeof(patch_2f00)/4); i++)
650 *dp++ = patch_2f00[i];
652 commproc->cp_rccr = 0x0009;
654 printk(
"USB SOF microcode patch installed\n");
657 #if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
658 defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
660 commproc->cp_rccr = 0;
662 dp = (
uint *)(commproc->cp_dpmem);
663 for (i=0; i<(
sizeof(patch_2000)/4); i++)
664 *dp++ = patch_2000[i];
666 dp = (
uint *)&(commproc->cp_dpmem[0x0f00]);
667 for (i=0; i<(
sizeof(patch_2f00)/4); i++)
668 *dp++ = patch_2f00[i];
671 # define RPBASE 0x0500
676 i = (RPBASE +
sizeof(
iic_t) + 31) & ~31;
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;
687 printk(
"I2C/SPI microcode patch installed.\n");
690 # if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
692 dp = (
uint *)&(commproc->cp_dpmem[0x0e00]);
693 for (i=0; i<(
sizeof(patch_2e00)/4); i++)
694 *dp++ = patch_2e00[i];
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;
705 printk(
"I2C/SPI/SMC1 microcode patch installed.\n");
718 verify_patch(
volatile immap_t *immr)
721 volatile cpm8xx_t *commproc;
724 commproc = (cpm8xx_t *)&immr->im_cpm;
726 printk(
"cp_rccr %x\n", commproc->cp_rccr);
727 commproc->cp_rccr = 0;
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);
734 printk(
"found 0x%X, wanted 0x%X\n", *dp, patch_2000[i]);
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);
743 printk(
"found 0x%X, wanted 0x%X\n", *dp, patch_2f00[i]);
747 commproc->cp_rccr = 0x0009;