flash: avoid checking for non NULL pointer to free it
[fw/openocd] / src / flash / nor / kinetis_ke.c
index 593443cfa4ece7c856804dea16087d2d8c8cc8ce..349b2564d37778c7907ce1c17488a7da3f84f529 100644 (file)
@@ -28,6 +28,9 @@
  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -475,14 +478,13 @@ int kinetis_ke_stop_watchdog(struct target *target)
                        watchdog_algorithm->address, 0, 100000, &armv7m_info);
        if (retval != ERROR_OK) {
                LOG_ERROR("Error executing Kinetis KE watchdog algorithm");
-               retval = ERROR_FAIL;
        } else {
                LOG_INFO("Watchdog stopped");
        }
 
        target_free_working_area(target, watchdog_algorithm);
 
-       return ERROR_OK;
+       return retval;
 }
 
 COMMAND_HANDLER(kinetis_ke_disable_wdog_handler)
@@ -762,7 +764,8 @@ static int kinetis_ke_write_words(struct flash_bank *bank, const uint8_t *buffer
        return retval;
 }
 
-static int kinetis_ke_protect(struct flash_bank *bank, int set, int first, int last)
+static int kinetis_ke_protect(struct flash_bank *bank, int set,
+               unsigned int first, unsigned int last)
 {
        LOG_WARNING("kinetis_ke_protect not supported yet");
        /* FIXME: TODO */
@@ -807,12 +810,12 @@ static int kinetis_ke_protect_check(struct flash_bank *bank)
        if (fpopen && fpldis && fphdis) {
                LOG_WARNING("No flash protection found.");
 
-               for (uint32_t i = 0; i < (uint32_t) bank->num_sectors; i++)
+               for (unsigned int i = 0; i < bank->num_sectors; i++)
                        bank->sectors[i].is_protected = 0;
 
                kinfo->protection_size = 0;
        } else {
-               LOG_WARNING("Flash protected. FPOPEN=%i FPLDIS=%i FPHDIS=%i FPLS=%i FPHS=%i", \
+               LOG_WARNING("Flash protected. FPOPEN=%i FPLDIS=%i FPHDIS=%i FPLS=%i FPHS=%i",
                                        fpopen ? 1 : 0, fpldis ? 1 : 0, fphdis ? 1 : 0, fpls, fphs);
 
                /* Retrieve which region is protected and how much */
@@ -838,7 +841,7 @@ static int kinetis_ke_protect_check(struct flash_bank *bank)
                /* hprot_from indicates from where the upper region is protected */
                hprot_from = (0x8000 - hprot_size) / kinfo->sector_size;
 
-               for (uint32_t i = 0; i < (uint32_t) bank->num_sectors; i++) {
+               for (unsigned int i = 0; i < bank->num_sectors; i++) {
 
                        /* Check if the sector is in the lower region */
                        if (bank->sectors[i].offset < 0x4000) {
@@ -962,9 +965,10 @@ COMMAND_HANDLER(kinetis_ke_securing_test)
        return kinetis_ke_ftmrx_command(bank, 2, FCCOBIX, FCCOBHI, FCCOBLO, &fstat);
 }
 
-static int kinetis_ke_erase(struct flash_bank *bank, int first, int last)
+static int kinetis_ke_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
-       int result, i;
+       int result;
        uint8_t FCCOBIX[2], FCCOBHI[2], FCCOBLO[2], fstat;
        bool fcf_erased = false;
 
@@ -980,7 +984,7 @@ static int kinetis_ke_erase(struct flash_bank *bank, int first, int last)
        if (result != ERROR_OK)
                return result;
 
-       for (i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
                FCCOBIX[0] = 0;
                FCCOBHI[0] = FTMRX_CMD_ERASESECTOR;
                FCCOBLO[0] = (bank->base + bank->sectors[i].offset) >> 16;
@@ -992,7 +996,7 @@ static int kinetis_ke_erase(struct flash_bank *bank, int first, int last)
                result = kinetis_ke_ftmrx_command(bank, 2, FCCOBIX, FCCOBHI, FCCOBLO, &fstat);
 
                if (result != ERROR_OK) {
-                       LOG_WARNING("erase sector %d failed", i);
+                       LOG_WARNING("erase sector %u failed", i);
                        return ERROR_FLASH_OPERATION_FAILED;
                }
 
@@ -1064,7 +1068,7 @@ static int kinetis_ke_write(struct flash_bank *bank, const uint8_t *buffer,
 
 static int kinetis_ke_probe(struct flash_bank *bank)
 {
-       int result, i;
+       int result;
        uint32_t offset = 0;
        struct target *target = bank->target;
        struct kinetis_ke_flash_bank *kinfo = bank->driver_priv;
@@ -1141,15 +1145,12 @@ static int kinetis_ke_probe(struct flash_bank *bank)
                        break;
        }
 
-       if (bank->sectors) {
-               free(bank->sectors);
-               bank->sectors = NULL;
-       }
+       free(bank->sectors);
 
        assert(bank->num_sectors > 0);
        bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
 
-       for (i = 0; i < bank->num_sectors; i++) {
+       for (unsigned int i = 0; i < bank->num_sectors; i++) {
                bank->sectors[i].offset = offset;
                bank->sectors[i].size = kinfo->sector_size;
                offset += kinfo->sector_size;
@@ -1173,7 +1174,7 @@ static int kinetis_ke_auto_probe(struct flash_bank *bank)
 static int kinetis_ke_info(struct flash_bank *bank, char *buf, int buf_size)
 {
        (void) snprintf(buf, buf_size,
-                       "%s driver for flash bank %s at 0x%8.8" PRIx32 "",
+                       "%s driver for flash bank %s at " TARGET_ADDR_FMT,
                        bank->driver->name,     bank->name, bank->base);
 
        return ERROR_OK;
@@ -1205,9 +1206,7 @@ static int kinetis_ke_blank_check(struct flash_bank *bank)
 
        if (fstat & (FTMRX_FSTAT_MGSTAT0_MASK | FTMRX_FSTAT_MGSTAT1_MASK)) {
                /* the whole bank is not erased, check sector-by-sector */
-               int i;
-
-               for (i = 0; i < bank->num_sectors; i++) {
+               for (unsigned int i = 0; i < bank->num_sectors; i++) {
                        FCCOBIX[0] = 0;
                        FCCOBHI[0] = FTMRX_CMD_SECTIONERASED;
                        FCCOBLO[0] = (bank->base + bank->sectors[i].offset) >> 16;
@@ -1227,14 +1226,13 @@ static int kinetis_ke_blank_check(struct flash_bank *bank)
                        if (result == ERROR_OK) {
                                bank->sectors[i].is_erased = !(fstat & (FTMRX_FSTAT_MGSTAT0_MASK | FTMRX_FSTAT_MGSTAT1_MASK));
                        } else {
-                               LOG_DEBUG("Ignoring errored PFlash sector blank-check");
+                               LOG_DEBUG("Ignoring error on PFlash sector blank-check");
                                bank->sectors[i].is_erased = -1;
                        }
                }
        } else {
                /* the whole bank is erased, update all sectors */
-               int i;
-               for (i = 0; i < bank->num_sectors; i++)
+               for (unsigned int i = 0; i < bank->num_sectors; i++)
                        bank->sectors[i].is_erased = 1;
        }
 
@@ -1295,7 +1293,7 @@ static const struct command_registration kinetis_ke_command_handler[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver kinetis_ke_flash = {
+const struct flash_driver kinetis_ke_flash = {
        .name = "kinetis_ke",
        .commands = kinetis_ke_command_handler,
        .flash_bank_command = kinetis_ke_flash_bank_command,
@@ -1308,4 +1306,5 @@ struct flash_driver kinetis_ke_flash = {
        .erase_check = kinetis_ke_blank_check,
        .protect_check = kinetis_ke_protect_check,
        .info = kinetis_ke_info,
+       .free_driver_priv = default_flash_free_driver_priv,
 };