cfi: fix type-punning warnings in cfi_spansion_write_block
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>
Mon, 13 Aug 2012 22:12:07 +0000 (00:12 +0200)
committerFreddie Chopin <freddie.chopin@gmail.com>
Fri, 24 Aug 2012 16:52:27 +0000 (16:52 +0000)
Retest the condition when needed, instead of abusing the common_magic
field as a flag. There are only two options here. Either it's an armv7m or
it's another arm. is_arm(...) will return true even for armv7m, so it's
imperative to check in the right order.

Change-Id: Ic227f19f7babf1b0b0fe075f9a3abc4eabc7d5f1
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/779
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
src/flash/nor/cfi.c

index ec90d7a..6303a31 100644 (file)
@@ -1634,7 +1634,7 @@ static int cfi_spansion_write_block(struct flash_bank *bank, uint8_t *buffer,
        struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
        struct target *target = bank->target;
        struct reg_param reg_params[10];
-       struct arm_algorithm *arm_algo;
+       void *arm_algo;
        struct arm_algorithm armv4_5_algo;
        struct armv7m_algorithm armv7m_algo;
        struct working_area *source;
@@ -1818,7 +1818,7 @@ static int cfi_spansion_write_block(struct flash_bank *bank, uint8_t *buffer,
        if (is_armv7m(target_to_armv7m(target))) {      /* Cortex-M3 target */
                armv7m_algo.common_magic = ARMV7M_COMMON_MAGIC;
                armv7m_algo.core_mode = ARMV7M_MODE_HANDLER;
-               arm_algo = (struct arm_algorithm *)&armv7m_algo;
+               arm_algo = &armv7m_algo;
        } else if (is_arm(target_to_arm(target))) {
                /* All other ARM CPUs have 32 bit instructions */
                armv4_5_algo.common_magic = ARM_COMMON_MAGIC;
@@ -1835,7 +1835,7 @@ static int cfi_spansion_write_block(struct flash_bank *bank, uint8_t *buffer,
 
        switch (bank->bus_width) {
                case 1:
-                       if (arm_algo->common_magic != ARM_COMMON_MAGIC) {
+                       if (is_armv7m(target_to_armv7m(target))) {
                                LOG_ERROR("Unknown ARM architecture");
                                return ERROR_FAIL;
                        }
@@ -1845,19 +1845,19 @@ static int cfi_spansion_write_block(struct flash_bank *bank, uint8_t *buffer,
                case 2:
                        /* Check for DQ5 support */
                        if (cfi_info->status_poll_mask & (1 << 5)) {
-                               if (arm_algo->common_magic == ARM_COMMON_MAGIC) {/* armv4_5 target */
-                                       target_code_src = armv4_5_word_16_code;
-                                       target_code_size = sizeof(armv4_5_word_16_code);
-                               } else if (arm_algo->common_magic == ARMV7M_COMMON_MAGIC) {     /*
+                               if (is_armv7m(target_to_armv7m(target))) {      /*
                                                                                                 *cortex-m3
                                                                                                 *target
                                                                                                 **/
                                        target_code_src = armv7m_word_16_code;
                                        target_code_size = sizeof(armv7m_word_16_code);
+                               } else { /* armv4_5 target */
+                                       target_code_src = armv4_5_word_16_code;
+                                       target_code_size = sizeof(armv4_5_word_16_code);
                                }
                        } else {
                                /* No DQ5 support. Use DQ7 DATA# polling only. */
-                               if (arm_algo->common_magic != ARM_COMMON_MAGIC) {
+                               if (is_armv7m(target_to_armv7m(target))) {
                                        LOG_ERROR("Unknown ARM architecture");
                                        return ERROR_FAIL;
                                }
@@ -1866,7 +1866,7 @@ static int cfi_spansion_write_block(struct flash_bank *bank, uint8_t *buffer,
                        }
                        break;
                case 4:
-                       if (arm_algo->common_magic != ARM_COMMON_MAGIC) {
+                       if (is_armv7m(target_to_armv7m(target))) {
                                LOG_ERROR("Unknown ARM architecture");
                                return ERROR_FAIL;
                        }