openocd: fix SPDX tag format for files .c
[fw/openocd] / src / flash / nor / msp432.c
index e9e4be33a4d6e3f46d5a1e75f2c323fb9040bded..d9b9695dfef41a4e992fab292b3207a15d09d21e 100644 (file)
@@ -1,18 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2018 by Texas Instruments, Inc.                         *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   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
@@ -49,12 +38,28 @@ struct msp432_bank {
        int family_type;
        int device_type;
        uint32_t sector_length;
-       bool probed[2];
+       bool probed_main;
+       bool probed_info;
        bool unlock_bsl;
        struct working_area *working_area;
        struct armv7m_algorithm armv7m_info;
 };
 
+/* Flash helper algorithm for MSP432P401x targets */
+static const uint8_t msp432p401x_algo[] = {
+#include "../../../contrib/loaders/flash/msp432/msp432p401x_algo.inc"
+};
+
+/* Flash helper algorithm for MSP432P411x targets */
+static const uint8_t msp432p411x_algo[] = {
+#include "../../../contrib/loaders/flash/msp432/msp432p411x_algo.inc"
+};
+
+/* Flash helper algorithm for MSP432E4x targets */
+static const uint8_t msp432e4x_algo[] = {
+#include "../../../contrib/loaders/flash/msp432/msp432e4x_algo.inc"
+};
+
 static int msp432_auto_probe(struct flash_bank *bank);
 
 static int msp432_device_type(uint32_t family_type, uint32_t device_id,
@@ -62,7 +67,7 @@ static int msp432_device_type(uint32_t family_type, uint32_t device_id,
 {
        int device_type = MSP432_NO_TYPE;
 
-       if (MSP432E4 == family_type) {
+       if (family_type == MSP432E4) {
                /* MSP432E4 device family */
 
                if (device_id == 0x180C0002) {
@@ -190,12 +195,11 @@ static int msp432_exec_cmd(struct target *target, struct msp432_algo_params
        /* Write out parameters to target memory */
        retval = target_write_buffer(target, ALGO_PARAMS_BASE_ADDR,
                                sizeof(struct msp432_algo_params), (uint8_t *)algo_params);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Write out command to target memory */
-       retval = target_write_buffer(target, ALGO_FLASH_COMMAND_ADDR,
-                               sizeof(command), (uint8_t *)&command);
+       retval = target_write_u32(target, ALGO_FLASH_COMMAND_ADDR, command);
 
        return retval;
 }
@@ -209,10 +213,9 @@ static int msp432_wait_return_code(struct target *target)
        int retval = ERROR_OK;
 
        start_ms = timeval_ms();
-       while ((0 == return_code) || (FLASH_BUSY == return_code)) {
-               retval = target_read_buffer(target, ALGO_RETURN_CODE_ADDR,
-                                       sizeof(return_code), (uint8_t *)&return_code);
-               if (ERROR_OK != retval)
+       while ((return_code == 0) || (return_code == FLASH_BUSY)) {
+               retval = target_read_u32(target, ALGO_RETURN_CODE_ADDR, &return_code);
+               if (retval != ERROR_OK)
                        return retval;
 
                elapsed_ms = timeval_ms() - start_ms;
@@ -222,7 +225,7 @@ static int msp432_wait_return_code(struct target *target)
                        break;
        };
 
-       if (FLASH_SUCCESS != return_code) {
+       if (return_code != FLASH_SUCCESS) {
                LOG_ERROR("msp432: Flash operation failed: %s",
                        msp432_return_text(return_code));
                return ERROR_FAIL;
@@ -252,10 +255,9 @@ static int msp432_wait_inactive(struct target *target, uint32_t buffer)
        }
 
        start_ms = timeval_ms();
-       while (BUFFER_INACTIVE != status_code) {
-               retval = target_read_buffer(target, status_addr, sizeof(status_code),
-                                       (uint8_t *)&status_code);
-               if (ERROR_OK != retval)
+       while (status_code != BUFFER_INACTIVE) {
+               retval = target_read_u32(target, status_addr, &status_code);
+               if (retval != ERROR_OK)
                        return retval;
 
                elapsed_ms = timeval_ms() - start_ms;
@@ -265,7 +267,7 @@ static int msp432_wait_inactive(struct target *target, uint32_t buffer)
                        break;
        };
 
-       if (BUFFER_INACTIVE != status_code) {
+       if (status_code != BUFFER_INACTIVE) {
                LOG_ERROR(
                        "msp432: Flash operation failed: buffer not written to flash");
                return ERROR_FAIL;
@@ -288,7 +290,7 @@ static int msp432_init(struct flash_bank *bank)
 
        /* Make sure we've probed the flash to get the device and size */
        retval = msp432_auto_probe(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Choose appropriate flash helper algorithm */
@@ -317,41 +319,42 @@ static int msp432_init(struct flash_bank *bank)
        }
 
        /* Issue warnings if this is a device we may not be able to flash */
-       if (MSP432P401X_GUESS == msp432_bank->device_type ||
-               MSP432P411X_GUESS == msp432_bank->device_type) {
+       if (msp432_bank->device_type == MSP432P401X_GUESS ||
+               msp432_bank->device_type == MSP432P411X_GUESS) {
                /* Explicit device type check failed. Report this. */
                LOG_WARNING(
                        "msp432: Unrecognized MSP432P4 Device ID and Hardware "
-                       "Rev (%04X, %02X)", msp432_bank->device_id,
+                       "Rev (%04" PRIX32 ", %02" PRIX32 ")", msp432_bank->device_id,
                        msp432_bank->hardware_rev);
-       } else if (MSP432P401X_DEPR == msp432_bank->device_type) {
+       } else if (msp432_bank->device_type == MSP432P401X_DEPR) {
                LOG_WARNING(
                        "msp432: MSP432P401x pre-production device (deprecated "
                        "silicon)\n" SUPPORT_MESSAGE);
-       } else if (MSP432E4X_GUESS == msp432_bank->device_type) {
+       } else if (msp432_bank->device_type == MSP432E4X_GUESS) {
                /* Explicit device type check failed. Report this. */
                LOG_WARNING(
                        "msp432: Unrecognized MSP432E4 DID0 and DID1 values "
-                       "(%08X, %08X)", msp432_bank->device_id,
+                       "(%08" PRIX32 ", %08" PRIX32 ")", msp432_bank->device_id,
                        msp432_bank->hardware_rev);
        }
 
        /* Check for working area to use for flash helper algorithm */
-       if (NULL != msp432_bank->working_area)
-               target_free_working_area(target, msp432_bank->working_area);
+       target_free_working_area(target, msp432_bank->working_area);
+       msp432_bank->working_area = NULL;
+
        retval = target_alloc_working_area(target, ALGO_WORKING_SIZE,
                                &msp432_bank->working_area);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Confirm the defined working address is the area we need to use */
-       if (ALGO_BASE_ADDR != msp432_bank->working_area->address)
+       if (msp432_bank->working_area->address != ALGO_BASE_ADDR)
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
 
        /* Write flash helper algorithm into target memory */
        retval = target_write_buffer(target, ALGO_BASE_ADDR, loader_size,
                                loader_code);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize the ARMv7 specific info to run the algorithm */
@@ -364,7 +367,7 @@ static int msp432_init(struct flash_bank *bank)
        /* Write out parameters to target memory */
        retval = target_write_buffer(target, ALGO_PARAMS_BASE_ADDR,
                                sizeof(algo_params), (uint8_t *)&algo_params);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize stack pointer for flash helper algorithm */
@@ -375,7 +378,7 @@ static int msp432_init(struct flash_bank *bank)
        retval = target_start_algorithm(target, 0, 0, 1, reg_params,
                                algo_entry_addr, 0, &msp432_bank->armv7m_info);
        destroy_reg_param(&reg_params[0]);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                LOG_ERROR("msp432: Failed to start flash helper algorithm");
                return retval;
        }
@@ -387,7 +390,7 @@ static int msp432_init(struct flash_bank *bank)
 
        /* Issue the init command to the flash helper algorithm */
        retval = msp432_exec_cmd(target, &algo_params, FLASH_INIT);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        retval = msp432_wait_return_code(target);
@@ -408,7 +411,7 @@ static int msp432_quit(struct flash_bank *bank)
 
        /* Issue the exit command to the flash helper algorithm */
        retval = msp432_exec_cmd(target, &algo_params, FLASH_EXIT);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        (void)msp432_wait_return_code(target);
@@ -434,13 +437,13 @@ static int msp432_mass_erase(struct flash_bank *bank, bool all)
 
        int retval;
 
-       if (TARGET_HALTED != target->state) {
+       if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
        retval = msp432_init(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize algorithm parameters to default values */
@@ -454,19 +457,19 @@ static int msp432_mass_erase(struct flash_bank *bank, bool all)
 
        /* Issue the mass erase command to the flash helper algorithm */
        retval = msp432_exec_cmd(target, &algo_params, FLASH_MASS_ERASE);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                (void)msp432_quit(bank);
                return retval;
        }
 
        retval = msp432_wait_return_code(target);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                (void)msp432_quit(bank);
                return retval;
        }
 
        retval = msp432_quit(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        return retval;
@@ -477,15 +480,23 @@ COMMAND_HANDLER(msp432_mass_erase_command)
        struct flash_bank *bank;
        struct msp432_bank *msp432_bank;
        bool all;
+
        int retval;
 
-       if (0 == CMD_ARGC) {
+       if (1 > CMD_ARGC)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (1 == CMD_ARGC) {
                all = false;
-       } else if (1 == CMD_ARGC) {
+       } else if (2 == CMD_ARGC) {
                /* Check argument for how much to erase */
-               if (0 == strcmp(CMD_ARGV[0], "main"))
+               if (strcmp(CMD_ARGV[1], "main") == 0)
                        all = false;
-               else if (0 == strcmp(CMD_ARGV[0], "all"))
+               else if (strcmp(CMD_ARGV[1], "all") == 0)
                        all = true;
                else
                        return ERROR_COMMAND_SYNTAX_ERROR;
@@ -493,27 +504,23 @@ COMMAND_HANDLER(msp432_mass_erase_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       retval = get_flash_bank_by_num(0, &bank);
-       if (ERROR_OK != retval)
-               return retval;
-
        msp432_bank = bank->driver_priv;
 
-       if (MSP432E4 == msp432_bank->family_type) {
+       if (msp432_bank->family_type == MSP432E4) {
                /* MSP432E4 does not have main vs info regions, ignore "all" */
                all = false;
        }
 
        retval = msp432_mass_erase(bank, all);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
-       if (MSP432E4 == msp432_bank->family_type) {
+       if (msp432_bank->family_type == MSP432E4) {
                /* MSP432E4 does not have main vs info regions */
                LOG_INFO("msp432: Mass erase of flash is complete");
        } else {
                LOG_INFO("msp432: Mass erase of %s is complete",
-                       all ? "main + info flash" : "main flash");
+                       all ? "main + information flash" : "main flash");
        }
 
        return ERROR_OK;
@@ -523,29 +530,33 @@ COMMAND_HANDLER(msp432_bsl_command)
 {
        struct flash_bank *bank;
        struct msp432_bank *msp432_bank;
+
        int retval;
 
-       if (1 < CMD_ARGC)
+       if (1 > CMD_ARGC)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       retval = get_flash_bank_by_num(0, &bank);
-       if (ERROR_OK != retval)
+       retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (retval != ERROR_OK)
                return retval;
 
        msp432_bank = bank->driver_priv;
 
-       if (MSP432E4 == msp432_bank->family_type) {
+       if (msp432_bank->family_type == MSP432E4) {
                LOG_WARNING("msp432: MSP432E4 does not have a BSL region");
                return ERROR_OK;
        }
 
-       if (1 == CMD_ARGC) {
-               if (0 == strcmp(CMD_ARGV[0], "lock"))
+       if (2 == CMD_ARGC) {
+               if (strcmp(CMD_ARGV[1], "lock") == 0)
                        msp432_bank->unlock_bsl = false;
-               else if (0 == strcmp(CMD_ARGV[0], "unlock"))
+               else if (strcmp(CMD_ARGV[1], "unlock") == 0)
                        msp432_bank->unlock_bsl = true;
                else
                        return ERROR_COMMAND_SYNTAX_ERROR;
+       } else if (1 != CMD_ARGC) {
+               /* Extra, unknown argument passed in */
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        LOG_INFO("msp432: BSL flash region is currently %slocked",
@@ -561,8 +572,9 @@ FLASH_BANK_COMMAND_HANDLER(msp432_flash_bank_command)
        if (CMD_ARGC < 6)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
+       /* Create shared private struct for flash banks */
        msp432_bank = malloc(sizeof(struct msp432_bank));
-       if (NULL == msp432_bank)
+       if (!msp432_bank)
                return ERROR_FAIL;
 
        /* Initialize private flash information */
@@ -571,47 +583,50 @@ FLASH_BANK_COMMAND_HANDLER(msp432_flash_bank_command)
        msp432_bank->family_type = MSP432_NO_FAMILY;
        msp432_bank->device_type = MSP432_NO_TYPE;
        msp432_bank->sector_length = 0x1000;
-       msp432_bank->probed[0] = false;
-       msp432_bank->probed[1] = false;
+       msp432_bank->probed_main = false;
+       msp432_bank->probed_info = false;
        msp432_bank->unlock_bsl = false;
        msp432_bank->working_area = NULL;
 
-       /* Finish initialization of bank 0 (main flash) */
+       /* Finish up initial settings here */
        bank->driver_priv = msp432_bank;
-       bank->next = NULL;
+       bank->base = FLASH_BASE;
 
        return ERROR_OK;
 }
 
-static int msp432_erase(struct flash_bank *bank, int first, int last)
+static int msp432_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct target *target = bank->target;
        struct msp432_bank *msp432_bank = bank->driver_priv;
        struct msp432_algo_params algo_params;
 
+       bool is_main = bank->base == FLASH_BASE;
+       bool is_info = bank->base == P4_FLASH_INFO_BASE;
+
        int retval;
 
-       if (TARGET_HALTED != target->state) {
+       if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
        /* Do a mass erase if user requested all sectors of main flash */
-       if ((0 == bank->bank_number) && (first == 0) &&
-               (last == (bank->num_sectors - 1))) {
+       if (is_main && (first == 0) && (last == (bank->num_sectors - 1))) {
                /* Request mass erase of main flash */
                return msp432_mass_erase(bank, false);
        }
 
        retval = msp432_init(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize algorithm parameters to default values */
        msp432_init_params(&algo_params);
 
        /* Adjust params if this is the info bank */
-       if (1 == bank->bank_number) {
+       if (is_info) {
                buf_set_u32(algo_params.erase_param, 0, 32, FLASH_ERASE_INFO);
                /* And flag if BSL is unlocked */
                if (msp432_bank->unlock_bsl)
@@ -619,14 +634,14 @@ static int msp432_erase(struct flash_bank *bank, int first, int last)
        }
 
        /* Erase requested sectors one by one */
-       for (int i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
 
                /* Skip TVL (read-only) sector of the info bank */
-               if (1 == bank->bank_number && 1 == i)
+               if (is_info && 1 == i)
                        continue;
 
                /* Skip BSL sectors of info bank if locked */
-               if (1 == bank->bank_number && (2 == i || 3 == i) &&
+               if (is_info && (2 == i || 3 == i) &&
                        !msp432_bank->unlock_bsl)
                        continue;
 
@@ -636,20 +651,20 @@ static int msp432_erase(struct flash_bank *bank, int first, int last)
 
                /* Issue the sector erase command to the flash helper algorithm */
                retval = msp432_exec_cmd(target, &algo_params, FLASH_SECTOR_ERASE);
-               if (ERROR_OK != retval) {
+               if (retval != ERROR_OK) {
                        (void)msp432_quit(bank);
                        return retval;
                }
 
                retval = msp432_wait_return_code(target);
-               if (ERROR_OK != retval) {
+               if (retval != ERROR_OK) {
                        (void)msp432_quit(bank);
                        return retval;
                }
        }
 
        retval = msp432_quit(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        return retval;
@@ -666,9 +681,11 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
        long long start_ms;
        long long elapsed_ms;
 
+       bool is_info = bank->base == P4_FLASH_INFO_BASE;
+
        int retval;
 
-       if (TARGET_HALTED != target->state) {
+       if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
@@ -679,7 +696,7 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
         * The BSL region in sectors 2 and 3 of the info flash may be unlocked
         * The helper algorithm will hang on attempts to write to TVL
         */
-       if (1 == bank->bank_number) {
+       if (is_info) {
                /* Set read-only start to TVL sector */
                uint32_t start = 0x1000;
                /* Set read-only end after BSL region if locked */
@@ -693,7 +710,7 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
                        if (offset < start) {
                                uint32_t start_count = MIN(start - offset, count);
                                retval = msp432_write(bank, buffer, offset, start_count);
-                               if (ERROR_OK != retval)
+                               if (retval != ERROR_OK)
                                        return retval;
                        }
                        /* Send a request for anything after read-only sectors */
@@ -711,7 +728,7 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
        }
 
        retval = msp432_init(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize algorithm parameters to default values */
@@ -722,7 +739,7 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
        buf_set_u32(algo_params.length, 0, 32, count);
 
        /* Check if this is the info bank */
-       if (1 == bank->bank_number) {
+       if (is_info) {
                /* And flag if BSL is unlocked */
                if (msp432_bank->unlock_bsl)
                        buf_set_u32(algo_params.unlock_bsl, 0, 32, FLASH_UNLOCK_BSL);
@@ -730,7 +747,7 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
 
        /* Set up flash helper algorithm to continuous flash mode */
        retval = msp432_exec_cmd(target, &algo_params, FLASH_CONTINUOUS);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                (void)msp432_quit(bank);
                return retval;
        }
@@ -746,22 +763,22 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
 
                /* Put next block of data to flash into buffer */
                retval = target_write_buffer(target, ALGO_BUFFER1_ADDR, size, buffer);
-               if (ERROR_OK != retval) {
+               if (retval != ERROR_OK) {
                        LOG_ERROR("Unable to write data to target memory");
                        (void)msp432_quit(bank);
                        return ERROR_FLASH_OPERATION_FAILED;
                }
 
                /* Signal the flash helper algorithm that data is ready to flash */
-               retval = target_write_buffer(target, ALGO_BUFFER1_STATUS_ADDR,
-                                       sizeof(data_ready), (uint8_t *)&data_ready);
-               if (ERROR_OK != retval) {
+               retval = target_write_u32(target, ALGO_BUFFER1_STATUS_ADDR,
+                                       data_ready);
+               if (retval != ERROR_OK) {
                        (void)msp432_quit(bank);
                        return ERROR_FLASH_OPERATION_FAILED;
                }
 
                retval = msp432_wait_inactive(target, 1);
-               if (ERROR_OK != retval) {
+               if (retval != ERROR_OK) {
                        (void)msp432_quit(bank);
                        return retval;
                }
@@ -776,13 +793,13 @@ static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
 
        /* Confirm that the flash helper algorithm is finished */
        retval = msp432_wait_return_code(target);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                (void)msp432_quit(bank);
                return retval;
        }
 
        retval = msp432_quit(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        return retval;
@@ -793,39 +810,42 @@ static int msp432_probe(struct flash_bank *bank)
        struct target *target = bank->target;
        struct msp432_bank *msp432_bank = bank->driver_priv;
 
-       char *name;
-
        uint32_t device_id;
        uint32_t hardware_rev;
 
-       uint32_t base;
        uint32_t sector_length;
        uint32_t size;
-       int num_sectors;
-       int bank_id;
+       unsigned int num_sectors;
+
+       bool is_main = bank->base == FLASH_BASE;
+       bool is_info = bank->base == P4_FLASH_INFO_BASE;
 
        int retval;
 
-       bank_id = bank->bank_number;
+       /* Check if this bank has already been successfully probed */
+       if (is_main && msp432_bank->probed_main)
+               return ERROR_OK;
+       if (is_info && msp432_bank->probed_info)
+               return ERROR_OK;
 
        /* Read the flash size register to determine this is a P4 or not */
        /* MSP432P4s will return the size of flash.  MSP432E4s will return zero */
        retval = target_read_u32(target, P4_FLASH_MAIN_SIZE_REG, &size);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
-       if (0 == size) {
+       if (size == 0) {
                /* This is likely an MSP432E4 */
                msp432_bank->family_type = MSP432E4;
 
                retval = target_read_u32(target, E4_DID0_REG, &device_id);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        return retval;
 
                msp432_bank->device_id = device_id;
 
                retval = target_read_u32(target, E4_DID1_REG, &hardware_rev);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        return retval;
 
                msp432_bank->hardware_rev = hardware_rev;
@@ -834,13 +854,13 @@ static int msp432_probe(struct flash_bank *bank)
                msp432_bank->family_type = MSP432P4;
 
                retval = target_read_u32(target, P4_DEVICE_ID_REG, &device_id);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        return retval;
 
                msp432_bank->device_id = device_id & 0xFFFF;
 
                retval = target_read_u32(target, P4_HARDWARE_REV_REG, &hardware_rev);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        return retval;
 
                msp432_bank->hardware_rev = hardware_rev & 0xFF;
@@ -849,105 +869,60 @@ static int msp432_probe(struct flash_bank *bank)
        msp432_bank->device_type = msp432_device_type(msp432_bank->family_type,
                msp432_bank->device_id, msp432_bank->hardware_rev);
 
-       /* If not already allocated, create the info bank for MSP432P4 */
-       /* We could not determine it was needed until device was probed */
-       if (MSP432P4 == msp432_bank->family_type) {
-               /* If we've been given bank 1, then this was already done */
-               if (0 == bank_id) {
-                       /* And only allocate it if it doesn't exist yet */
-                       if (NULL == bank->next) {
-                               struct flash_bank *info_bank;
-                               info_bank = malloc(sizeof(struct flash_bank));
-                               if (NULL == info_bank)
-                                       return ERROR_FAIL;
-
-                               name = malloc(strlen(bank->name)+1);
-                               if (NULL == name) {
-                                       free(info_bank);
-                                       return ERROR_FAIL;
-                               }
-                               strcpy(name, bank->name);
-
-                               /* Initialize bank 1 (info region) */
-                               info_bank->name = name;
-                               info_bank->target = bank->target;
-                               info_bank->driver = bank->driver;
-                               info_bank->driver_priv = bank->driver_priv;
-                               info_bank->bank_number = 1;
-                               info_bank->base = 0x00200000;
-                               info_bank->size = 0;
-                               info_bank->chip_width = 0;
-                               info_bank->bus_width = 0;
-                               info_bank->erased_value = 0xff;
-                               info_bank->default_padded_value = 0xff;
-                               info_bank->write_start_alignment = 0;
-                               info_bank->write_end_alignment = 0;
-                               info_bank->minimal_write_gap = FLASH_WRITE_GAP_SECTOR;
-                               info_bank->num_sectors = 0;
-                               info_bank->sectors = NULL;
-                               info_bank->num_prot_blocks = 0;
-                               info_bank->prot_blocks = NULL;
-                               info_bank->next = NULL;
-
-                               /* Enable the new bank */
-                               bank->next = info_bank;
-                       }
-               }
-       }
-
-       if (MSP432P4 == msp432_bank->family_type) {
+       if (msp432_bank->family_type == MSP432P4) {
                /* Set up MSP432P4 specific flash parameters */
-               if (0 == bank_id) {
+               if (is_main) {
                        retval = target_read_u32(target, P4_FLASH_MAIN_SIZE_REG, &size);
-                       if (ERROR_OK != retval)
+                       if (retval != ERROR_OK)
                                return retval;
 
-                       base = P4_FLASH_MAIN_BASE;
                        sector_length = P4_SECTOR_LENGTH;
                        num_sectors = size / sector_length;
-               } else if (1 == bank_id) {
+               } else if (is_info) {
                        if (msp432_bank->device_type == MSP432P411X ||
                                msp432_bank->device_type == MSP432P411X_GUESS) {
                                /* MSP432P411x has an info size register, use that for size */
                                retval = target_read_u32(target, P4_FLASH_INFO_SIZE_REG, &size);
-                               if (ERROR_OK != retval)
+                               if (retval != ERROR_OK)
                                        return retval;
                        } else {
                                /* All other MSP432P401x devices have fixed info region size */
                                size = 0x4000; /* 16 KB info region */
                        }
-                       base = P4_FLASH_INFO_BASE;
                        sector_length = P4_SECTOR_LENGTH;
                        num_sectors = size / sector_length;
                } else {
-                       /* Invalid bank number somehow */
+                       /* Invalid bank somehow */
                        return ERROR_FAIL;
                }
        } else {
                /* Set up MSP432E4 specific flash parameters */
-               base = E4_FLASH_BASE;
-               size = E4_FLASH_SIZE;
-               sector_length = E4_SECTOR_LENGTH;
-               num_sectors = size / sector_length;
+               if (is_main) {
+                       size = E4_FLASH_SIZE;
+                       sector_length = E4_SECTOR_LENGTH;
+                       num_sectors = size / sector_length;
+               } else {
+                       /* Invalid bank somehow */
+                       return ERROR_FAIL;
+               }
        }
 
-       if (NULL != bank->sectors) {
-               free(bank->sectors);
-               bank->sectors = NULL;
-       }
+       free(bank->sectors);
+       bank->sectors = NULL;
 
-       bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
-       if (NULL == bank->sectors)
-               return ERROR_FAIL;
+       if (num_sectors > 0) {
+               bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
+               if (!bank->sectors)
+                       return ERROR_FAIL;
+       }
 
-       bank->base = base;
        bank->size = size;
        bank->write_start_alignment = 0;
        bank->write_end_alignment = 0;
        bank->num_sectors = num_sectors;
        msp432_bank->sector_length = sector_length;
 
-       for (int i = 0; i < num_sectors; i++) {
+       for (unsigned int i = 0; i < num_sectors; i++) {
                bank->sectors[i].offset = i * sector_length;
                bank->sectors[i].size = sector_length;
                bank->sectors[i].is_erased = -1;
@@ -955,7 +930,31 @@ static int msp432_probe(struct flash_bank *bank)
        }
 
        /* We've successfully determined the stats on this flash bank */
-       msp432_bank->probed[bank_id] = true;
+       if (is_main)
+               msp432_bank->probed_main = true;
+       if (is_info)
+               msp432_bank->probed_info = true;
+
+       if (is_main && MSP432P4 == msp432_bank->family_type) {
+               /* Create the info flash bank needed by MSP432P4 variants */
+               struct flash_bank *info = calloc(sizeof(struct flash_bank), 1);
+               if (!info)
+                       return ERROR_FAIL;
+
+               /* Create a name for the info bank, append "_1" to main name */
+               char *name = malloc(strlen(bank->name) + 3);
+               strcpy(name, bank->name);
+               strcat(name, "_1");
+
+               /* Initialize info bank */
+               info->name = name;
+               info->target = bank->target;
+               info->driver = bank->driver;
+               info->driver_priv = msp432_bank;
+               info->base = P4_FLASH_INFO_BASE;
+
+               flash_bank_add(info);
+       }
 
        /* If we fall through to here, then all went well */
 
@@ -966,82 +965,83 @@ static int msp432_auto_probe(struct flash_bank *bank)
 {
        struct msp432_bank *msp432_bank = bank->driver_priv;
 
-       int retval = ERROR_OK;
+       bool is_main = bank->base == FLASH_BASE;
+       bool is_info = bank->base == P4_FLASH_INFO_BASE;
 
-       if (bank->bank_number < 0 || bank->bank_number > 1) {
-               /* Invalid bank number somehow */
-               return ERROR_FAIL;
-       }
+       int retval = ERROR_OK;
 
-       if (!msp432_bank->probed[bank->bank_number])
-               retval = msp432_probe(bank);
+       if (is_main)
+               if (!msp432_bank->probed_main)
+                       retval = msp432_probe(bank);
+       if (is_info)
+               if (!msp432_bank->probed_info)
+                       retval = msp432_probe(bank);
 
        return retval;
 }
 
-static int msp432_info(struct flash_bank *bank, char *buf, int buf_size)
+static int msp432_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct msp432_bank *msp432_bank = bank->driver_priv;
-       int printed = 0;
 
        switch (msp432_bank->device_type) {
                case MSP432P401X_DEPR:
-                       if (0xFFFF == msp432_bank->device_id) {
+                       if (msp432_bank->device_id == 0xFFFF) {
                                /* Very early pre-production silicon currently deprecated */
-                               printed = snprintf(buf, buf_size,
-                                       "MSP432P401x pre-production device (deprecated silicon)\n"
+                               command_print_sameline(cmd, "MSP432P401x pre-production device (deprecated silicon)\n"
                                        SUPPORT_MESSAGE);
                        } else {
                                /* Revision A or B silicon, also deprecated */
-                               printed = snprintf(buf, buf_size,
-                                       "MSP432P401x Device Rev %c (deprecated silicon)\n"
+                               command_print_sameline(cmd, "MSP432P401x Device Rev %c (deprecated silicon)\n"
                                        SUPPORT_MESSAGE, (char)msp432_bank->hardware_rev);
                        }
                        break;
                case MSP432P401X:
-                       printed = snprintf(buf, buf_size,
-                               "MSP432P401x Device Rev %c\n",
+                       command_print_sameline(cmd, "MSP432P401x Device Rev %c\n",
                                (char)msp432_bank->hardware_rev);
                        break;
                case MSP432P411X:
-                       printed = snprintf(buf, buf_size,
-                               "MSP432P411x Device Rev %c\n",
+                       command_print_sameline(cmd, "MSP432P411x Device Rev %c\n",
                                (char)msp432_bank->hardware_rev);
                        break;
                case MSP432E401Y:
-                       printed = snprintf(buf, buf_size, "MSP432E401Y Device\n");
+                       command_print_sameline(cmd, "MSP432E401Y Device\n");
                        break;
                case MSP432E411Y:
-                       printed = snprintf(buf, buf_size, "MSP432E411Y Device\n");
+                       command_print_sameline(cmd, "MSP432E411Y Device\n");
                        break;
                case MSP432E4X_GUESS:
-                       printed = snprintf(buf, buf_size,
-                               "Unrecognized MSP432E4 DID0 and DID1 IDs (%08X, %08X)",
+                       command_print_sameline(cmd,
+                               "Unrecognized MSP432E4 DID0 and DID1 IDs (%08" PRIX32 ", %08" PRIX32 ")",
                                msp432_bank->device_id, msp432_bank->hardware_rev);
                        break;
                case MSP432P401X_GUESS:
                case MSP432P411X_GUESS:
                default:
-                       printed = snprintf(buf, buf_size,
-                               "Unrecognized MSP432P4 Device ID and Hardware Rev (%04X, %02X)",
+                       command_print_sameline(cmd,
+                               "Unrecognized MSP432P4 Device ID and Hardware Rev (%04" PRIX32 ", %02" PRIX32 ")",
                                msp432_bank->device_id, msp432_bank->hardware_rev);
                        break;
        }
 
-       buf_size -= printed;
-
-       if (0 > buf_size)
-               return ERROR_BUF_TOO_SMALL;
+       return ERROR_OK;
+}
 
+static int msp432_protect_check(struct flash_bank *bank)
+{
+       /* Added to suppress warning, not needed for MSP432 flash */
        return ERROR_OK;
 }
 
 static void msp432_flash_free_driver_priv(struct flash_bank *bank)
 {
+       bool is_main = bank->base == FLASH_BASE;
+
        /* A single private struct is shared between main and info banks */
-       /* Only free it on the call for main bank (#0) */
-       if ((0 == bank->bank_number) && (NULL != bank->driver_priv))
+       /* Only free it on the call for main bank */
+       if (is_main)
                free(bank->driver_priv);
+
        /* Forget about the private struct on both main and info banks */
        bank->driver_priv = NULL;
 }
@@ -1052,14 +1052,14 @@ static const struct command_registration msp432_exec_command_handlers[] = {
                .handler = msp432_mass_erase_command,
                .mode = COMMAND_EXEC,
                .help = "Erase entire flash memory on device.",
-               .usage = "['main' | 'all']",
+               .usage = "bank_id ['main' | 'all']",
        },
        {
                .name = "bsl",
                .handler = msp432_bsl_command,
                .mode = COMMAND_EXEC,
                .help = "Allow BSL to be erased or written by flash commands.",
-               .usage = "['unlock' | 'lock']",
+               .usage = "bank_id ['unlock' | 'lock']",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -1085,6 +1085,7 @@ const struct flash_driver msp432_flash = {
        .probe = msp432_probe,
        .auto_probe = msp432_auto_probe,
        .erase_check = default_flash_blank_check,
+       .protect_check = msp432_protect_check,
        .info = msp432_info,
        .free_driver_priv = msp432_flash_free_driver_priv,
 };