diff options
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/cmd_errata.c | 5 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/config_mpc85xx.h | 16 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/fsl_i2c.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/processor.h | 5 | ||||
| -rw-r--r-- | drivers/i2c/fsl_i2c.c | 14 | 
5 files changed, 34 insertions, 7 deletions
| diff --git a/arch/powerpc/cpu/mpc85xx/cmd_errata.c b/arch/powerpc/cpu/mpc85xx/cmd_errata.c index cbb443fd2..05436f994 100644 --- a/arch/powerpc/cpu/mpc85xx/cmd_errata.c +++ b/arch/powerpc/cpu/mpc85xx/cmd_errata.c @@ -248,6 +248,11 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  #ifdef CONFIG_SYS_FSL_ERRATUM_A005812  	puts("Work-around for Erratum A-005812 enabled\n");  #endif +#ifdef CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +	if ((SVR_SOC_VER(svr) == SVR_8548 && IS_SVR_REV(svr, 3, 1)) || +	    (SVR_REV(svr) <= CONFIG_SYS_FSL_A004447_SVR_REV)) +		puts("Work-around for Erratum I2C-A004447 enabled\n"); +#endif  	return 0;  } diff --git a/arch/powerpc/include/asm/config_mpc85xx.h b/arch/powerpc/include/asm/config_mpc85xx.h index e1fc0f72c..cf1bb0279 100644 --- a/arch/powerpc/include/asm/config_mpc85xx.h +++ b/arch/powerpc/include/asm/config_mpc85xx.h @@ -67,6 +67,8 @@  #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM	5  #define CONFIG_SYS_FSL_RMU  #define CONFIG_SYS_FSL_SRIO_MSG_UNIT_NUM	2 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x00  #elif defined(CONFIG_MPC8555)  #define CONFIG_MAX_CPUS			1 @@ -132,6 +134,8 @@  #define CONFIG_SYS_FSL_ERRATUM_IFC_A002769  #define CONFIG_SYS_FSL_ERRATUM_P1010_A003549  #define CONFIG_SYS_FSL_ERRATUM_IFC_A003399 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x10  /* P1011 is single core version of P1020 */  #elif defined(CONFIG_P1011) @@ -249,6 +253,8 @@  #define CONFIG_SYS_FM_MURAM_SIZE	0x10000  #define CONFIG_SYS_FSL_PCIE_COMPAT	"fsl,qoriq-pcie-v2.2"  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xff600000 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x11  /* P1024 is lower end variant of P1020 */  #elif defined(CONFIG_P1024) @@ -334,6 +340,8 @@  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034  #define CONFIG_SYS_FSL_ERRATUM_A004849 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x11  #elif defined(CONFIG_PPC_P3041)  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 @@ -369,6 +377,8 @@  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034  #define CONFIG_SYS_FSL_ERRATUM_A004849  #define CONFIG_SYS_FSL_ERRATUM_A005812 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x20  #elif defined(CONFIG_PPC_P4080) /* also supports P4040 */  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 @@ -415,6 +425,8 @@  #define CONFIG_SYS_FSL_ERRATUM_A004580  #define CONFIG_SYS_P4080_ERRATUM_PCIE_A003  #define CONFIG_SYS_FSL_ERRATUM_A005812 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x20  #elif defined(CONFIG_PPC_P5020) /* also supports P5010 */  #define CONFIG_SYS_PPC64		/* 64-bit core */ @@ -446,6 +458,8 @@  #define CONFIG_SYS_FSL_ERRATUM_A004510_SVR_REV	0x10  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xc0000000  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034 +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x20  #elif defined(CONFIG_PPC_P5040)  #define CONFIG_SYS_PPC64 @@ -510,6 +524,8 @@  #define CONFIG_SYS_FSL_ERRATUM_ESDHC111  #define CONFIG_SYS_FSL_ESDHC_P1010_BROKEN_SDCLK  #define CONFIG_SYS_FSL_PCIE_COMPAT	"fsl,qoriq-pcie-v2.2" +#define CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +#define CONFIG_SYS_FSL_A004447_SVR_REV	0x11  #elif defined(CONFIG_PPC_T4240) || defined(CONFIG_PPC_T4160)  #define CONFIG_E6500 diff --git a/arch/powerpc/include/asm/fsl_i2c.h b/arch/powerpc/include/asm/fsl_i2c.h index 4f7134132..d6537fd63 100644 --- a/arch/powerpc/include/asm/fsl_i2c.h +++ b/arch/powerpc/include/asm/fsl_i2c.h @@ -54,6 +54,7 @@ typedef struct fsl_i2c {  #define I2C_CR_MTX	0x10  #define I2C_CR_TXAK	0x08  #define I2C_CR_RSTA	0x04 +#define I2C_CR_BIT6	0x02	/* required for workaround A004447 */  #define I2C_CR_BCST	0x01  	u8 sr;		/* I2C status register */ diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 64a6f9c54..bcf6cfb09 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h @@ -847,7 +847,7 @@  /* System-On-Chip Version Register (SVR) field extraction */  #define SVR_VER(svr)	(((svr) >> 16) & 0xFFFF) /* Version field */ -#define SVR_REV(svr)	(((svr) >>  0) & 0xFFFF) /* Revision field */ +#define SVR_REV(svr)	(((svr) >>  0) & 0xFF)	 /* Revision field */  #define SVR_CID(svr)	(((svr) >> 28) & 0x0F)	 /* Company or manufacturer ID */  #define SVR_SOCOP(svr)	(((svr) >> 22) & 0x3F)	 /* SOC integration options */ @@ -1043,9 +1043,6 @@  /* System Version Register (SVR) field extraction */ -#define SVR_VER(svr)	(((svr) >>  16) & 0xFFFF)	/* Version field */ -#define SVR_REV(svr)	(((svr) >>   0) & 0xFFFF)	/* Revison field */ -  #define SVR_SUBVER(svr)	(((svr) >>  8) & 0xFF)	/* Process/MFG sub-version */  #define SVR_FAM(svr)	(((svr) >> 20) & 0xFFF)	/* Family field */ diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c index 44b08f767..291ad946d 100644 --- a/drivers/i2c/fsl_i2c.c +++ b/drivers/i2c/fsl_i2c.c @@ -211,6 +211,14 @@ static int fsl_i2c_fixup(const struct fsl_i2c *dev)  	const unsigned long long timeout = usec2ticks(CONFIG_I2C_MBB_TIMEOUT);  	unsigned long long timeval = 0;  	int ret = -1; +	unsigned int flags = 0; + +#ifdef CONFIG_SYS_FSL_ERRATUM_I2C_A004447 +	unsigned int svr = get_svr(); +	if ((SVR_SOC_VER(svr) == SVR_8548 && IS_SVR_REV(svr, 3, 1)) || +	    (SVR_REV(svr) <= CONFIG_SYS_FSL_A004447_SVR_REV)) +		flags = I2C_CR_BIT6; +#endif  	writeb(I2C_CR_MEN | I2C_CR_MSTA, &dev->cr); @@ -224,8 +232,8 @@ static int fsl_i2c_fixup(const struct fsl_i2c *dev)  		/* SDA is stuck low */  		writeb(0, &dev->cr);  		udelay(100); -		writeb(I2C_CR_MSTA, &dev->cr); -		writeb(I2C_CR_MEN | I2C_CR_MSTA, &dev->cr); +		writeb(I2C_CR_MSTA | flags, &dev->cr); +		writeb(I2C_CR_MEN | I2C_CR_MSTA | flags, &dev->cr);  	}  	readb(&dev->dr); @@ -238,7 +246,7 @@ static int fsl_i2c_fixup(const struct fsl_i2c *dev)  	ret = 0;  err: -	writeb(I2C_CR_MEN, &dev->cr); +	writeb(I2C_CR_MEN | flags, &dev->cr);  	writeb(0, &dev->sr);  	udelay(100); |