Commit a166fbca20e40937bf37cc18c389f68e995c1821

Authored by Scott Wood
Committed by Wolfgang Denk
1 parent e1208c2fe5

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
... ... @@ -43,7 +43,7 @@
43 43 } while ((immr->im_cpm.cp_cpcr & CPM_CR_FLG) && ++count < 1000000);
44 44  
45 45 #ifdef CONFIG_HARD_I2C
46   - *((unsigned short*)(&immr->im_dprambase[PROFF_I2C_BASE])) = 0;
  46 + immr->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)] = 0;
47 47 #endif
48 48 }
49 49  
arch/powerpc/cpu/mpc8260/cpu.c
... ... @@ -106,7 +106,7 @@
106 106 * in the mask.
107 107 */
108 108 m = immr & (IMMR_PARTNUM_MSK | IMMR_MASKNUM_MSK);
109   - k = *((ushort *) & immap->im_dprambase[PROFF_REVNUM]);
  109 + k = immap->im_dprambase16[PROFF_REVNUM / sizeof(u16)];
110 110  
111 111 switch (m) {
112 112 case 0x0000:
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 */
... ... @@ -535,7 +535,7 @@
535 535 volatile iic_t *iip;
536 536 uint dpaddr;
537 537  
538   - dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE]));
  538 + dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
539 539 if (dpaddr == 0)
540 540 iip = NULL;
541 541 else
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 */
... ... @@ -127,6 +127,7 @@
127 127 */
128 128 #define PROFF_SCC1 ((uint)0x0000)
129 129 #define PROFF_IIC ((uint)0x0080)
  130 +#define PROFF_REVNUM ((uint)0x00b0)
130 131 #define PROFF_SCC2 ((uint)0x0100)
131 132 #define PROFF_SPI ((uint)0x0180)
132 133 #define PROFF_SCC3 ((uint)0x0200)