summaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorChristophe Leroy <christophe.leroy@c-s.fr>2019-06-14 06:41:44 +0000
committerMichael Ellerman <mpe@ellerman.id.au>2019-07-05 02:06:37 +1000
commitf5348c080e07bc7ce8f6a6c110bd2672f915c6b1 (patch)
tree08b4a0984602df394a373f0a5f78b323ed82ef5d /arch/powerpc
parent5cfd5d8943fc9eb48030a7904e82c6e7d2056027 (diff)
downloadlinux-f5348c080e07bc7ce8f6a6c110bd2672f915c6b1.tar.gz
linux-f5348c080e07bc7ce8f6a6c110bd2672f915c6b1.tar.bz2
linux-f5348c080e07bc7ce8f6a6c110bd2672f915c6b1.zip
powerpc/8xx: refactor programming of microcode CPM params.
The CPM registers RCCR and CPMCR1..4 registers has to be set in accordance with the microcode patch beeing programmed. Lets define them as part of the patch set and refactor their programming from that definition. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/platforms/8xx/micropatch.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/arch/powerpc/platforms/8xx/micropatch.c b/arch/powerpc/platforms/8xx/micropatch.c
index 9378f778af13..2fdd8f935501 100644
--- a/arch/powerpc/platforms/8xx/micropatch.c
+++ b/arch/powerpc/platforms/8xx/micropatch.c
@@ -21,6 +21,14 @@
#include <asm/cpm.h>
#include <asm/cpm1.h>
+struct patch_params {
+ ushort rccr;
+ ushort cpmcr1;
+ ushort cpmcr2;
+ ushort cpmcr3;
+ ushort cpmcr4;
+};
+
/*
* I2C/SPI relocation patch arrays.
*/
@@ -29,6 +37,10 @@
static char patch_name[] __initdata = "I2C/SPI";
+static struct patch_params patch_params __initdata = {
+ 1, 0x802a, 0x8028, 0x802e, 0x802c,
+};
+
static uint patch_2000[] __initdata = {
0x7FFFEFD9, 0x3FFD0000, 0x7FFB49F7, 0x7FF90000,
0x5FEFADF7, 0x5F89ADF7, 0x5FEFAFF7, 0x5F89AFF7,
@@ -83,6 +95,10 @@ static uint patch_2e00[] __initdata = {};
static char patch_name[] __initdata = "I2C/SPI/SMC1";
+static struct patch_params patch_params __initdata = {
+ 3, 0x8080, 0x808a, 0x8028, 0x802a,
+};
+
static uint patch_2000[] __initdata = {
0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
0x5f13eff8, 0x5eb5eff8, 0x5f88adf7, 0x5fefadf7,
@@ -201,6 +217,10 @@ static uint patch_2e00[] __initdata = {
static char patch_name[] __initdata = "USB SOF";
+static struct patch_params patch_params __initdata = {
+ 9,
+};
+
static uint patch_2000[] __initdata = {
0x7fff0000, 0x7ffd0000, 0x7ffb0000, 0x49f7ba5b,
0xba383ffb, 0xf9b8b46d, 0xe5ab4e07, 0xaf77bffe,
@@ -240,10 +260,6 @@ void __init cpm_load_patch(cpm8xx_t *cp)
cpm_write_patch(cp, 0xf00, patch_2f00, sizeof(patch_2f00));
cpm_write_patch(cp, 0xe00, patch_2e00, sizeof(patch_2e00));
-#ifdef CONFIG_USB_SOF_UCODE_PATCH
- commproc->cp_rccr = 0x0009;
-#endif /* CONFIG_USB_SOF_UCODE_PATCH */
-
#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
@@ -256,26 +272,19 @@ void __init cpm_load_patch(cpm8xx_t *cp)
spp = (struct spi_pram *)&commproc->cp_dparam[PROFF_SPI];
spp->rpbase = (RPBASE + sizeof(iic_t) + 31) & ~31;
-# if defined(CONFIG_I2C_SPI_UCODE_PATCH)
- commproc->cp_cpmcr1 = 0x802a;
- commproc->cp_cpmcr2 = 0x8028;
- commproc->cp_cpmcr3 = 0x802e;
- commproc->cp_cpmcr4 = 0x802c;
- commproc->cp_rccr = 1;
-# endif /* CONFIG_I2C_SPI_UCODE_PATCH */
-
# if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
- commproc->cp_cpmcr1 = 0x8080;
- commproc->cp_cpmcr2 = 0x808a;
- commproc->cp_cpmcr3 = 0x8028;
- commproc->cp_cpmcr4 = 0x802a;
- commproc->cp_rccr = 3;
-
smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
smp->smc_rpbase = 0x1FC0;
# endif /* CONFIG_I2C_SPI_SMC1_UCODE_PATCH) */
#endif /* some variation of the I2C/SPI patch was selected */
+ commproc->cp_cpmcr1 = patch_params.cpmcr1;
+ commproc->cp_cpmcr2 = patch_params.cpmcr2;
+ commproc->cp_cpmcr3 = patch_params.cpmcr3;
+ commproc->cp_cpmcr4 = patch_params.cpmcr4;
+
+ commproc->cp_rccr = patch_params.rccr;
+
pr_info("%s microcode patch installed\n", patch_name);
}