diff options
| author | Scott Wood <scottwood@freescale.com> | 2013-05-17 20:01:54 -0500 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2013-06-11 22:01:45 +0200 | 
| commit | a166fbca20e40937bf37cc18c389f68e995c1821 (patch) | |
| tree | ca90c9999014f7172aefabf257c9c0d2533aecf4 /arch | |
| parent | e1208c2fe5e07f9a248cfbf9bbb212aa34ad2806 (diff) | |
| download | olio-uboot-2014.01-a166fbca20e40937bf37cc18c389f68e995c1821.tar.xz olio-uboot-2014.01-a166fbca20e40937bf37cc18c389f68e995c1821.zip | |
powerpc: fix 8xx and 82xx type-punning warnings with GCC 4.7
C99's strict aliasing rules are insane to use in low-level code such as a
bootloader, but as Wolfgang has rejected -fno-strict-aliasing in the
past, add a union so that 16-bit accesses can be performed.
Compile-tested only.
Signed-off-by: Scott Wood <scottwood@freescale.com>
Acked-by: Wolfgang Denk <wd@denx.de>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/powerpc/cpu/mpc8260/commproc.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8260/cpu.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8260/i2c.c | 8 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8260/serial_smc.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8260/spi.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xx/cpu.c | 12 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/8xx_immap.h | 7 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/immap_8260.h | 19 | 
8 files changed, 35 insertions, 21 deletions
| diff --git a/arch/powerpc/cpu/mpc8260/commproc.c b/arch/powerpc/cpu/mpc8260/commproc.c index 22cef3e98..484bd1774 100644 --- a/arch/powerpc/cpu/mpc8260/commproc.c +++ b/arch/powerpc/cpu/mpc8260/commproc.c @@ -43,7 +43,7 @@ m8260_cpm_reset(void)  	} while ((immr->im_cpm.cp_cpcr & CPM_CR_FLG) && ++count < 1000000);  #ifdef CONFIG_HARD_I2C -	*((unsigned short*)(&immr->im_dprambase[PROFF_I2C_BASE])) = 0; +	immr->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)] = 0;  #endif  } diff --git a/arch/powerpc/cpu/mpc8260/cpu.c b/arch/powerpc/cpu/mpc8260/cpu.c index f8bc5a983..22e1a23a2 100644 --- a/arch/powerpc/cpu/mpc8260/cpu.c +++ b/arch/powerpc/cpu/mpc8260/cpu.c @@ -106,7 +106,7 @@ int checkcpu (void)  	 * in the mask.  	 */  	m = immr & (IMMR_PARTNUM_MSK | IMMR_MASKNUM_MSK); -	k = *((ushort *) & immap->im_dprambase[PROFF_REVNUM]); +	k = immap->im_dprambase16[PROFF_REVNUM / sizeof(u16)];  	switch (m) {  	case 0x0000: diff --git a/arch/powerpc/cpu/mpc8260/i2c.c b/arch/powerpc/cpu/mpc8260/i2c.c index b720b1fb8..e2341e9c3 100644 --- a/arch/powerpc/cpu/mpc8260/i2c.c +++ b/arch/powerpc/cpu/mpc8260/i2c.c @@ -221,14 +221,14 @@ void i2c_init(int speed, int slaveadd)  	i2c_init_board();  #endif -	dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE])); +	dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];  	if (dpaddr == 0) {  		/* need to allocate dual port ram */  		dpaddr = m8260_cpm_dpalloc(64 +  					(NUM_RX_BDS * sizeof(I2C_BD)) +  					(NUM_TX_BDS * sizeof(I2C_BD)) +  					MAX_TX_SPACE, 64); -		*((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])) = +		immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)] =  			dpaddr;  	} @@ -305,7 +305,7 @@ void i2c_newio(i2c_state_t *state)  	debug("[I2C] i2c_newio\n"); -	dpaddr = *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])); +	dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];  	iip = (iic_t *)&immap->im_dprambase[dpaddr];  	state->rx_idx = 0;  	state->tx_idx = 0; @@ -480,7 +480,7 @@ int i2c_doio(i2c_state_t *state)  		return I2CERR_QUEUE_EMPTY;  	} -	dpaddr = *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])); +	dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];  	iip = (iic_t *)&immap->im_dprambase[dpaddr];  	iip->iic_rbptr = iip->iic_rbase;  	iip->iic_tbptr = iip->iic_tbase; diff --git a/arch/powerpc/cpu/mpc8260/serial_smc.c b/arch/powerpc/cpu/mpc8260/serial_smc.c index feba1f63d..9410e4c3b 100644 --- a/arch/powerpc/cpu/mpc8260/serial_smc.c +++ b/arch/powerpc/cpu/mpc8260/serial_smc.c @@ -105,7 +105,7 @@ static int mpc8260_smc_serial_init(void)  	/* initialize pointers to SMC */  	sp = (smc_t *) &(im->im_smc[SMC_INDEX]); -	*(ushort *)(&im->im_dprambase[PROFF_SMC_BASE]) = PROFF_SMC; +	im->im_dprambase16[PROFF_SMC_BASE / sizeof(u16)] = PROFF_SMC;  	up = (smc_uart_t *)&im->im_dprambase[PROFF_SMC];  	/* Disable transmitter/receiver. */ @@ -331,7 +331,7 @@ kgdb_serial_init (void)  	/* initialize pointers to SMC */  	sp = (smc_t *) &(im->im_smc[KGDB_SMC_INDEX]); -	*(ushort *)(&im->im_dprambase[KGDB_PROFF_SMC_BASE]) = KGDB_PROFF_SMC; +	im->im_dprambase16[KGDB_PROFF_SMC_BASE / sizeof(u16)] = KGDB_PROFF_SMC;  	up = (smc_uart_t *)&im->im_dprambase[KGDB_PROFF_SMC];  	/* Disable transmitter/receiver. */ diff --git a/arch/powerpc/cpu/mpc8260/spi.c b/arch/powerpc/cpu/mpc8260/spi.c index dc98ea73f..01b492e8e 100644 --- a/arch/powerpc/cpu/mpc8260/spi.c +++ b/arch/powerpc/cpu/mpc8260/spi.c @@ -146,7 +146,7 @@ void spi_init_f (void)  	immr = (immap_t *)  CONFIG_SYS_IMMR;  	cp   = (cpm8260_t *) &immr->im_cpm; -	*(ushort *)(&immr->im_dprambase[PROFF_SPI_BASE]) = PROFF_SPI; +	immr->im_dprambase16[PROFF_SPI_BASE / sizeof(u16)] = PROFF_SPI;  	spi  = (spi_t *)&immr->im_dprambase[PROFF_SPI];  /* 1 */ diff --git a/arch/powerpc/cpu/mpc8xx/cpu.c b/arch/powerpc/cpu/mpc8xx/cpu.c index b6b733d77..dc33eb3d1 100644 --- a/arch/powerpc/cpu/mpc8xx/cpu.c +++ b/arch/powerpc/cpu/mpc8xx/cpu.c @@ -78,7 +78,8 @@ static int check_CPU (long clock, uint pvr, uint immr)  	if ((pvr >> 16) != 0x0050)  		return -1; -	k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]); +	k = (immr << 16) | +		immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)];  	m = 0;  	suf = ""; @@ -194,7 +195,8 @@ static int check_CPU (long clock, uint pvr, uint immr)  	if ((pvr >> 16) != 0x0050)  		return -1; -	k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]); +	k = (immr << 16) | +		immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)];  	m = 0;  	switch (k) { @@ -253,7 +255,8 @@ static int check_CPU (long clock, uint pvr, uint immr)  	if ((pvr >> 16) != 0x0050)  		return -1; -	k = (immr << 16) | in_be16((ushort *)&immap->im_cpm.cp_dparam[0xB0]); +	k = (immr << 16) | +		in_be16(&immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)]);  	m = 0;  	switch (k) { @@ -312,7 +315,8 @@ static int check_CPU (long clock, uint pvr, uint immr)  	if ((pvr >> 16) != 0x0050)  		return -1; -	k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]); +	k = (immr << 16) | +		immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)];  	m = 0;  	switch (k) { diff --git a/arch/powerpc/include/asm/8xx_immap.h b/arch/powerpc/include/asm/8xx_immap.h index 40679cb2b..01129ed4f 100644 --- a/arch/powerpc/include/asm/8xx_immap.h +++ b/arch/powerpc/include/asm/8xx_immap.h @@ -485,7 +485,12 @@ typedef struct comm_proc {  	 * Some processors don't have all of it populated.  	 */  	u_char	cp_dpmem[0x1C00];	/* BD / Data / ucode */ -	u_char	cp_dparam[0x400];	/* Parameter RAM */ + +	/* Parameter RAM */ +	union { +		u_char	cp_dparam[0x400]; +		u16	cp_dparam16[0x200]; +	};  } cpm8xx_t;  /* Internal memory map. diff --git a/arch/powerpc/include/asm/immap_8260.h b/arch/powerpc/include/asm/immap_8260.h index 4974ae56f..c7021a709 100644 --- a/arch/powerpc/include/asm/immap_8260.h +++ b/arch/powerpc/include/asm/immap_8260.h @@ -526,13 +526,18 @@ typedef struct immap {  	/* Some references are into the unique and known dpram spaces,  	 * others are from the generic base.  	 */ -#define im_dprambase	im_dpram1 -	u_char		im_dpram1[16*1024]; -	char		res1[16*1024]; -	u_char		im_dpram2[4*1024]; -	char		res2[8*1024]; -	u_char		im_dpram3[4*1024]; -	char		res3[16*1024]; +	union { +		struct { +			u_char		im_dpram1[16 * 1024]; +			char		res1[16 * 1024]; +			u_char		im_dpram2[4 * 1024]; +			char		res2[8 * 1024]; +			u_char		im_dpram3[4 * 1024]; +			char		res3[16 * 1024]; +		}; +		u8	im_dprambase[64 * 1024]; +		u16	im_dprambase16[32 * 1024]; +	};  	sysconf8260_t	im_siu_conf;	/* SIU Configuration */  	memctl8260_t	im_memctl;	/* Memory Controller */ |