Commit a166fbca20e40937bf37cc18c389f68e995c1821
Committed by
Wolfgang Denk
1 parent
e1208c2fe5
Exists in
master
and in
53 other branches
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>
Showing 11 changed files with 39 additions and 23 deletions Side-by-side Diff
- arch/powerpc/cpu/mpc8260/commproc.c
- arch/powerpc/cpu/mpc8260/cpu.c
- arch/powerpc/cpu/mpc8260/i2c.c
- arch/powerpc/cpu/mpc8260/serial_smc.c
- arch/powerpc/cpu/mpc8260/spi.c
- arch/powerpc/cpu/mpc8xx/cpu.c
- arch/powerpc/include/asm/8xx_immap.h
- arch/powerpc/include/asm/immap_8260.h
- common/cmd_immap.c
- examples/standalone/mem_to_mem_idma2intr.c
- include/commproc.h
arch/powerpc/cpu/mpc8260/commproc.c
arch/powerpc/cpu/mpc8260/cpu.c
arch/powerpc/cpu/mpc8260/i2c.c
... | ... | @@ -221,14 +221,14 @@ |
221 | 221 | i2c_init_board(); |
222 | 222 | #endif |
223 | 223 | |
224 | - dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE])); | |
224 | + dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)]; | |
225 | 225 | if (dpaddr == 0) { |
226 | 226 | /* need to allocate dual port ram */ |
227 | 227 | dpaddr = m8260_cpm_dpalloc(64 + |
228 | 228 | (NUM_RX_BDS * sizeof(I2C_BD)) + |
229 | 229 | (NUM_TX_BDS * sizeof(I2C_BD)) + |
230 | 230 | MAX_TX_SPACE, 64); |
231 | - *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])) = | |
231 | + immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)] = | |
232 | 232 | dpaddr; |
233 | 233 | } |
234 | 234 | |
... | ... | @@ -305,7 +305,7 @@ |
305 | 305 | |
306 | 306 | debug("[I2C] i2c_newio\n"); |
307 | 307 | |
308 | - dpaddr = *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])); | |
308 | + dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)]; | |
309 | 309 | iip = (iic_t *)&immap->im_dprambase[dpaddr]; |
310 | 310 | state->rx_idx = 0; |
311 | 311 | state->tx_idx = 0; |
... | ... | @@ -480,7 +480,7 @@ |
480 | 480 | return I2CERR_QUEUE_EMPTY; |
481 | 481 | } |
482 | 482 | |
483 | - dpaddr = *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])); | |
483 | + dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)]; | |
484 | 484 | iip = (iic_t *)&immap->im_dprambase[dpaddr]; |
485 | 485 | iip->iic_rbptr = iip->iic_rbase; |
486 | 486 | iip->iic_tbptr = iip->iic_tbase; |
arch/powerpc/cpu/mpc8260/serial_smc.c
... | ... | @@ -105,7 +105,7 @@ |
105 | 105 | /* initialize pointers to SMC */ |
106 | 106 | |
107 | 107 | sp = (smc_t *) &(im->im_smc[SMC_INDEX]); |
108 | - *(ushort *)(&im->im_dprambase[PROFF_SMC_BASE]) = PROFF_SMC; | |
108 | + im->im_dprambase16[PROFF_SMC_BASE / sizeof(u16)] = PROFF_SMC; | |
109 | 109 | up = (smc_uart_t *)&im->im_dprambase[PROFF_SMC]; |
110 | 110 | |
111 | 111 | /* Disable transmitter/receiver. */ |
... | ... | @@ -331,7 +331,7 @@ |
331 | 331 | /* initialize pointers to SMC */ |
332 | 332 | |
333 | 333 | sp = (smc_t *) &(im->im_smc[KGDB_SMC_INDEX]); |
334 | - *(ushort *)(&im->im_dprambase[KGDB_PROFF_SMC_BASE]) = KGDB_PROFF_SMC; | |
334 | + im->im_dprambase16[KGDB_PROFF_SMC_BASE / sizeof(u16)] = KGDB_PROFF_SMC; | |
335 | 335 | up = (smc_uart_t *)&im->im_dprambase[KGDB_PROFF_SMC]; |
336 | 336 | |
337 | 337 | /* Disable transmitter/receiver. */ |
arch/powerpc/cpu/mpc8260/spi.c
... | ... | @@ -146,7 +146,7 @@ |
146 | 146 | immr = (immap_t *) CONFIG_SYS_IMMR; |
147 | 147 | cp = (cpm8260_t *) &immr->im_cpm; |
148 | 148 | |
149 | - *(ushort *)(&immr->im_dprambase[PROFF_SPI_BASE]) = PROFF_SPI; | |
149 | + immr->im_dprambase16[PROFF_SPI_BASE / sizeof(u16)] = PROFF_SPI; | |
150 | 150 | spi = (spi_t *)&immr->im_dprambase[PROFF_SPI]; |
151 | 151 | |
152 | 152 | /* 1 */ |
arch/powerpc/cpu/mpc8xx/cpu.c
... | ... | @@ -78,7 +78,8 @@ |
78 | 78 | if ((pvr >> 16) != 0x0050) |
79 | 79 | return -1; |
80 | 80 | |
81 | - k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]); | |
81 | + k = (immr << 16) | | |
82 | + immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)]; | |
82 | 83 | m = 0; |
83 | 84 | suf = ""; |
84 | 85 | |
... | ... | @@ -194,7 +195,8 @@ |
194 | 195 | if ((pvr >> 16) != 0x0050) |
195 | 196 | return -1; |
196 | 197 | |
197 | - k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]); | |
198 | + k = (immr << 16) | | |
199 | + immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)]; | |
198 | 200 | m = 0; |
199 | 201 | |
200 | 202 | switch (k) { |
... | ... | @@ -253,7 +255,8 @@ |
253 | 255 | if ((pvr >> 16) != 0x0050) |
254 | 256 | return -1; |
255 | 257 | |
256 | - k = (immr << 16) | in_be16((ushort *)&immap->im_cpm.cp_dparam[0xB0]); | |
258 | + k = (immr << 16) | | |
259 | + in_be16(&immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)]); | |
257 | 260 | m = 0; |
258 | 261 | |
259 | 262 | switch (k) { |
... | ... | @@ -312,7 +315,8 @@ |
312 | 315 | if ((pvr >> 16) != 0x0050) |
313 | 316 | return -1; |
314 | 317 | |
315 | - k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]); | |
318 | + k = (immr << 16) | | |
319 | + immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)]; | |
316 | 320 | m = 0; |
317 | 321 | |
318 | 322 | switch (k) { |
arch/powerpc/include/asm/8xx_immap.h
... | ... | @@ -485,7 +485,12 @@ |
485 | 485 | * Some processors don't have all of it populated. |
486 | 486 | */ |
487 | 487 | u_char cp_dpmem[0x1C00]; /* BD / Data / ucode */ |
488 | - u_char cp_dparam[0x400]; /* Parameter RAM */ | |
488 | + | |
489 | + /* Parameter RAM */ | |
490 | + union { | |
491 | + u_char cp_dparam[0x400]; | |
492 | + u16 cp_dparam16[0x200]; | |
493 | + }; | |
489 | 494 | } cpm8xx_t; |
490 | 495 | |
491 | 496 | /* Internal memory map. |
arch/powerpc/include/asm/immap_8260.h
... | ... | @@ -526,13 +526,18 @@ |
526 | 526 | /* Some references are into the unique and known dpram spaces, |
527 | 527 | * others are from the generic base. |
528 | 528 | */ |
529 | -#define im_dprambase im_dpram1 | |
530 | - u_char im_dpram1[16*1024]; | |
531 | - char res1[16*1024]; | |
532 | - u_char im_dpram2[4*1024]; | |
533 | - char res2[8*1024]; | |
534 | - u_char im_dpram3[4*1024]; | |
535 | - char res3[16*1024]; | |
529 | + union { | |
530 | + struct { | |
531 | + u_char im_dpram1[16 * 1024]; | |
532 | + char res1[16 * 1024]; | |
533 | + u_char im_dpram2[4 * 1024]; | |
534 | + char res2[8 * 1024]; | |
535 | + u_char im_dpram3[4 * 1024]; | |
536 | + char res3[16 * 1024]; | |
537 | + }; | |
538 | + u8 im_dprambase[64 * 1024]; | |
539 | + u16 im_dprambase16[32 * 1024]; | |
540 | + }; | |
536 | 541 | |
537 | 542 | sysconf8260_t im_siu_conf; /* SIU Configuration */ |
538 | 543 | memctl8260_t im_memctl; /* Memory Controller */ |
common/cmd_immap.c
examples/standalone/mem_to_mem_idma2intr.c
... | ... | @@ -309,7 +309,8 @@ |
309 | 309 | |
310 | 310 | memaddr = dpalloc (sizeof (pram_idma_t), 64); |
311 | 311 | |
312 | - *(volatile ushort *) &immap->im_dprambase[PROFF_IDMA2_BASE] = memaddr; | |
312 | + *(volatile u16 *)&immap->im_dprambase16 | |
313 | + [PROFF_IDMA2_BASE / sizeof(u16)] = memaddr; | |
313 | 314 | piptr = (volatile pram_idma_t *) ((uint) (immap) + memaddr); |
314 | 315 | |
315 | 316 | piptr->pi_resv1 = 0; /* manual says: clear it */ |
include/commproc.h