mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 05:50:17 +00:00 
			
		
		
		
	This workaround is for the erratum I2C A004447. Device reference manual provides a scheme that allows the I2C master controller to generate nine SCL pulses, which enable an I2C slave device that held SDA low to release SDA. However, due to this erratum, this scheme no longer works. In addition, when I2C is used as a source of the PBL, the state machine is not able to recover. At the same time, delete the reduplicative definition of SVR_VER and SVR_REV. The SVR_REV is the low 8 bits rather than the low 16 bits of svr. And we use the CONFIG_SYS_FSL_A004447_SVR_REV macro instead of hard-code value 0x10, 0x11 and 0x20. The CONFIG_SYS_FSL_A004447_SVR_REV = 0x00 represents that one version of platform has this I2C errata. So enable this errata by IS_SVR_REV(svr, maj, min) function. Signed-off-by: Zhao Chenhui <chenhui.zhao@freescale.com> Signed-off-by: Chunhe Lan <Chunhe.Lan@freescale.com> Cc: Scott Wood <scottwood@freescale.com> Cc: Heiko Schocher <hs@denx.de>
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Freescale I2C Controller
 | 
						|
 *
 | 
						|
 * Copyright 2006 Freescale Semiconductor, Inc.
 | 
						|
 *
 | 
						|
 * Based on earlier versions by Gleb Natapov <gnatapov@mrv.com>,
 | 
						|
 * Xianghua Xiao <x.xiao@motorola.com>, Eran Liberty (liberty@freescale.com),
 | 
						|
 * and Jeff Brown.
 | 
						|
 * Some bits are taken from linux driver writen by adrian@humboldt.co.uk.
 | 
						|
 *
 | 
						|
 * This software may be used and distributed according to the
 | 
						|
 * terms of the GNU Public License, Version 2, incorporated
 | 
						|
 * herein by reference.
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or
 | 
						|
 * modify it under the terms of the GNU General Public License
 | 
						|
 * Version 2 as published by the Free Software Foundation.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with this program; if not, write to the Free Software
 | 
						|
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 | 
						|
 * MA 02111-1307 USA
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _ASM_FSL_I2C_H_
 | 
						|
#define _ASM_FSL_I2C_H_
 | 
						|
 | 
						|
#include <asm/types.h>
 | 
						|
 | 
						|
typedef struct fsl_i2c {
 | 
						|
 | 
						|
	u8 adr;		/* I2C slave address */
 | 
						|
	u8 res0[3];
 | 
						|
#define I2C_ADR		0xFE
 | 
						|
#define I2C_ADR_SHIFT	1
 | 
						|
#define I2C_ADR_RES	~(I2C_ADR)
 | 
						|
 | 
						|
	u8 fdr;		/* I2C frequency divider register */
 | 
						|
	u8 res1[3];
 | 
						|
#define IC2_FDR		0x3F
 | 
						|
#define IC2_FDR_SHIFT	0
 | 
						|
#define IC2_FDR_RES	~(IC2_FDR)
 | 
						|
 | 
						|
	u8 cr;		/* I2C control redister	*/
 | 
						|
	u8 res2[3];
 | 
						|
#define I2C_CR_MEN	0x80
 | 
						|
#define I2C_CR_MIEN	0x40
 | 
						|
#define I2C_CR_MSTA	0x20
 | 
						|
#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 */
 | 
						|
	u8 res3[3];
 | 
						|
#define I2C_SR_MCF	0x80
 | 
						|
#define I2C_SR_MAAS	0x40
 | 
						|
#define I2C_SR_MBB	0x20
 | 
						|
#define I2C_SR_MAL	0x10
 | 
						|
#define I2C_SR_BCSTM	0x08
 | 
						|
#define I2C_SR_SRW	0x04
 | 
						|
#define I2C_SR_MIF	0x02
 | 
						|
#define I2C_SR_RXAK	0x01
 | 
						|
 | 
						|
	u8 dr;		/* I2C data register */
 | 
						|
	u8 res4[3];
 | 
						|
#define I2C_DR		0xFF
 | 
						|
#define I2C_DR_SHIFT	0
 | 
						|
#define I2C_DR_RES	~(I2C_DR)
 | 
						|
 | 
						|
	u8 dfsrr;	/* I2C digital filter sampling rate register */
 | 
						|
	u8 res5[3];
 | 
						|
#define I2C_DFSRR	0x3F
 | 
						|
#define I2C_DFSRR_SHIFT	0
 | 
						|
#define I2C_DFSRR_RES	~(I2C_DR)
 | 
						|
 | 
						|
	/* Fill out the reserved block */
 | 
						|
	u8 res6[0xE8];
 | 
						|
} fsl_i2c_t;
 | 
						|
 | 
						|
#endif	/* _ASM_I2C_H_ */
 |