powerpc: fix 8xx and 82xx type-punning warnings with GCC 4.7
authorScott Wood <scottwood@freescale.com>
Sat, 18 May 2013 01:01:54 +0000 (20:01 -0500)
committerWolfgang Denk <wd@denx.de>
Tue, 11 Jun 2013 20:01:45 +0000 (22:01 +0200)
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>
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

index 22cef3e9839e96101b9bba3212e7068bb6d93acc..484bd177451c3a36b1ba5c7c30152fe3c8275b0f 100644 (file)
@@ -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
 }
 
index f8bc5a9834b861b54e25f9391ddea6d08cd8949c..22e1a23a2adcedae47df34f5a1a67f4bec8dae40 100644 (file)
@@ -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:
index b720b1fb882b1b4261939a18479a08e2b2243a2d..e2341e9c39c46cff86594d7f4e5ad15f8846d84a 100644 (file)
@@ -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;
index feba1f63d260b3a1465e6a2f742b7db23df94a8e..9410e4c3b2bf7bf2ce57598deec529b87419b48d 100644 (file)
@@ -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. */
index dc98ea73f2673d64c2f36050e18282f889378306..01b492e8e48a1d8c9dfe1f929aa88dfee16fd021 100644 (file)
@@ -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 */
index b6b733d77fd356b6231c958f2da326c3468c3855..dc33eb3d108fbffca80a63760c128ff78178000a 100644 (file)
@@ -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) {
index 40679cb2b068e6f228fa8f7ecd47cfddcb952784..01129ed4f0e745aeea3bd56808abaf0b787ddbc7 100644 (file)
@@ -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.
index 4974ae56fcbb418acaa43bd37a0d377b9a8e2f79..c7021a7095b7e224ba60fede5c969717c7ca5e87 100644 (file)
@@ -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 */
index fdf9489b2e99270921240cf265c558b6afc81895..bb15795e22ef567970f7600ba25e3f7ee3d9d26b 100644 (file)
@@ -535,7 +535,7 @@ do_i2cinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        volatile iic_t *iip;
        uint dpaddr;
 
-       dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE]));
+       dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
        if (dpaddr == 0)
                iip = NULL;
        else
index e466c904a7866235dae68f5e5c780085501b4e15..215dc220336add24fd14a4cfc7106c81da58a720 100644 (file)
@@ -309,7 +309,8 @@ int idma_init (void)
 
        memaddr = dpalloc (sizeof (pram_idma_t), 64);
 
-       *(volatile ushort *) &immap->im_dprambase[PROFF_IDMA2_BASE] = memaddr;
+       *(volatile u16 *)&immap->im_dprambase16
+               [PROFF_IDMA2_BASE / sizeof(u16)] = memaddr;
        piptr = (volatile pram_idma_t *) ((uint) (immap) + memaddr);
 
        piptr->pi_resv1 = 0;            /* manual says: clear it */
index 7ca28c83694ebf23a6c8b5e735e5031c2340d7c6..6959905efe8f1665561f699b6cd71b925577ab58 100644 (file)
@@ -127,6 +127,7 @@ typedef struct cpm_buf_desc {
 */
 #define PROFF_SCC1     ((uint)0x0000)
 #define PROFF_IIC      ((uint)0x0080)
+#define PROFF_REVNUM   ((uint)0x00b0)
 #define PROFF_SCC2     ((uint)0x0100)
 #define PROFF_SPI      ((uint)0x0180)
 #define PROFF_SCC3     ((uint)0x0200)