openocd: fix SPDX tag format for files .c
[fw/openocd] / src / flash / nor / str9xpec.c
index 073dfe10fa31750abf3d7e1ef1e3157a7672791b..c39eb3aa84da81ab8964bb01d31c4138a4722592 100644 (file)
@@ -1,50 +1,83 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   spen@spen-soft.co.uk                                                  *
- *                                                                         *
- *   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, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include "imp.h"
-#include "str9xpec.h"
 #include <target/arm7_9_common.h>
 
+/* ISC commands */
+
+#define ISC_IDCODE                             0xFE
+#define ISC_MFG_READ                   0x4C
+#define ISC_CONFIGURATION              0x07
+#define ISC_ENABLE                             0x0C
+#define ISC_DISABLE                            0x0F
+#define ISC_NOOP                               0x10
+#define ISC_ADDRESS_SHIFT              0x11
+#define ISC_CLR_STATUS                 0x13
+#define ISC_PROGRAM                            0x20
+#define ISC_PROGRAM_SECURITY   0x22
+#define ISC_PROGRAM_UC                 0x23
+#define ISC_ERASE                              0x30
+#define ISC_READ                               0x50
+#define ISC_BLANK_CHECK                        0x60
+
+/* ISC_DEFAULT bit definitions */
+
+#define ISC_STATUS_SECURITY            0x40
+#define ISC_STATUS_INT_ERROR   0x30
+#define ISC_STATUS_MODE                        0x08
+#define ISC_STATUS_BUSY                        0x04
+#define ISC_STATUS_ERROR               0x03
+
+/* Option bytes definitions */
+
+#define STR9XPEC_OPT_CSMAPBIT          48
+#define STR9XPEC_OPT_LVDTHRESBIT       49
+#define STR9XPEC_OPT_LVDSELBIT         50
+#define STR9XPEC_OPT_LVDWARNBIT                51
+#define STR9XPEC_OPT_OTPBIT                    63
+
+enum str9xpec_status_codes {
+       STR9XPEC_INVALID_COMMAND = 1,
+       STR9XPEC_ISC_SUCCESS = 2,
+       STR9XPEC_ISC_DISABLED = 3,
+       STR9XPEC_ISC_INTFAIL = 32,
+};
+
+struct str9xpec_flash_controller {
+       struct jtag_tap *tap;
+       uint32_t *sector_bits;
+       int chain_pos;
+       int isc_enable;
+       uint8_t options[8];
+};
 
-static int str9xpec_erase_area(struct flash_bank *bank, int first, int last);
+static int str9xpec_erase_area(struct flash_bank *bank, unsigned int first,
+               unsigned int last);
 static int str9xpec_set_address(struct flash_bank *bank, uint8_t sector);
 static int str9xpec_write_options(struct flash_bank *bank);
 
 static int str9xpec_set_instr(struct jtag_tap *tap, uint32_t new_instr, tap_state_t end_state)
 {
-       if (tap == NULL) {
+       if (!tap)
                return ERROR_TARGET_INVALID;
-       }
 
-       if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr)
-       {
+       if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr) {
                struct scan_field field;
 
                field.num_bits = tap->ir_length;
-               void * t = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
+               void *t = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
                field.out_value = t;
                buf_set_u32(t, 0, field.num_bits, new_instr);
                field.in_value = NULL;
@@ -98,8 +131,7 @@ static int str9xpec_isc_enable(struct flash_bank *bank)
 
        /* check ISC status */
        status = str9xpec_isc_status(tap);
-       if (status & ISC_STATUS_MODE)
-       {
+       if (status & ISC_STATUS_MODE) {
                /* we have entered isc mode */
                str9xpec_info->isc_enable = 1;
                LOG_DEBUG("ISC_MODE Enabled");
@@ -127,8 +159,7 @@ static int str9xpec_isc_disable(struct flash_bank *bank)
 
        /* check ISC status */
        status = str9xpec_isc_status(tap);
-       if (!(status & ISC_STATUS_MODE))
-       {
+       if (!(status & ISC_STATUS_MODE)) {
                /* we have left isc mode */
                str9xpec_info->isc_enable = 0;
                LOG_DEBUG("ISC_MODE Disabled");
@@ -156,7 +187,6 @@ static int str9xpec_read_config(struct flash_bank *bank)
        field.out_value = NULL;
        field.in_value = str9xpec_info->options;
 
-
        jtag_add_dr_scan(tap, 1, &field, TAP_IDLE);
        jtag_execute_queue();
 
@@ -170,13 +200,12 @@ static int str9xpec_build_block_list(struct flash_bank *bank)
        struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        int i;
-       int num_sectors;
+       unsigned int num_sectors;
        int b0_sectors = 0, b1_sectors = 0;
        uint32_t offset = 0;
        int b1_size = 0x2000;
 
-       switch (bank->size)
-       {
+       switch (bank->size) {
                case (256 * 1024):
                        b0_sectors = 4;
                        break;
@@ -209,8 +238,7 @@ static int str9xpec_build_block_list(struct flash_bank *bank)
 
        num_sectors = 0;
 
-       for (i = 0; i < b0_sectors; i++)
-       {
+       for (i = 0; i < b0_sectors; i++) {
                bank->sectors[num_sectors].offset = offset;
                bank->sectors[num_sectors].size = 0x10000;
                offset += bank->sectors[i].size;
@@ -219,8 +247,7 @@ static int str9xpec_build_block_list(struct flash_bank *bank)
                str9xpec_info->sector_bits[num_sectors++] = i;
        }
 
-       for (i = 0; i < b1_sectors; i++)
-       {
+       for (i = 0; i < b1_sectors; i++) {
                bank->sectors[num_sectors].offset = offset;
                bank->sectors[num_sectors].size = b1_size;
                offset += bank->sectors[i].size;
@@ -237,15 +264,12 @@ static int str9xpec_build_block_list(struct flash_bank *bank)
 FLASH_BANK_COMMAND_HANDLER(str9xpec_flash_bank_command)
 {
        struct str9xpec_flash_controller *str9xpec_info;
-       struct arm *armv4_5 = NULL;
+       struct arm *arm = NULL;
        struct arm7_9_common *arm7_9 = NULL;
        struct arm_jtag *jtag_info = NULL;
 
        if (CMD_ARGC < 6)
-       {
-               LOG_WARNING("incomplete flash_bank str9x configuration");
-               return ERROR_FLASH_BANK_INVALID;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        str9xpec_info = malloc(sizeof(struct str9xpec_flash_controller));
        bank->driver_priv = str9xpec_info;
@@ -253,11 +277,12 @@ FLASH_BANK_COMMAND_HANDLER(str9xpec_flash_bank_command)
        /* REVISIT verify that the jtag position of flash controller is
         * right after *THIS* core, which must be a STR9xx core ...
         */
-       armv4_5 = bank->target->arch_info;
-       arm7_9 = armv4_5->arch_info;
+       arm = bank->target->arch_info;
+       arm7_9 = arm->arch_info;
        jtag_info = &arm7_9->jtag_info;
 
-       str9xpec_info->tap = bank->target->tap;
+       /* The core is the next tap after the flash controller in the chain */
+       str9xpec_info->tap = jtag_tap_by_position(jtag_info->tap->abs_chain_position - 1);
        str9xpec_info->isc_enable = 0;
 
        str9xpec_build_block_list(bank);
@@ -268,33 +293,30 @@ FLASH_BANK_COMMAND_HANDLER(str9xpec_flash_bank_command)
        return ERROR_OK;
 }
 
-static int str9xpec_blank_check(struct flash_bank *bank, int first, int last)
+static int str9xpec_blank_check(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct scan_field field;
        uint8_t status;
        struct jtag_tap *tap;
-       int i;
        uint8_t *buffer = NULL;
 
        struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                str9xpec_isc_enable(bank);
-       }
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                return ERROR_FLASH_OPERATION_FAILED;
-       }
 
        buffer = calloc(DIV_ROUND_UP(64, 8), 1);
 
-       LOG_DEBUG("blank check: first_bank: %i, last_bank: %i", first, last);
+       LOG_DEBUG("blank check: first_bank: %u, last_bank: %u", first, last);
 
-       for (i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++)
                buf_set_u32(buffer, str9xpec_info->sector_bits[i], 1, 1);
-       }
 
        /* execute ISC_BLANK_CHECK command */
        str9xpec_set_instr(tap, ISC_BLANK_CHECK, TAP_IRPAUSE);
@@ -316,8 +338,7 @@ static int str9xpec_blank_check(struct flash_bank *bank, int first, int last)
 
        status = str9xpec_isc_status(tap);
 
-       for (i = first; i <= last; i++)
-       {
+       for (unsigned int i = first; i <= last; i++) {
                if (buf_get_u32(buffer, str9xpec_info->sector_bits[i], 1))
                        bank->sectors[i].is_erased = 0;
                else
@@ -336,14 +357,12 @@ static int str9xpec_blank_check(struct flash_bank *bank, int first, int last)
 static int str9xpec_protect_check(struct flash_bank *bank)
 {
        uint8_t status;
-       int i;
 
        struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        status = str9xpec_read_config(bank);
 
-       for (i = 0; i < bank->num_sectors; i++)
-       {
+       for (unsigned int i = 0; i < bank->num_sectors; i++) {
                if (buf_get_u32(str9xpec_info->options, str9xpec_info->sector_bits[i], 1))
                        bank->sectors[i].is_protected = 1;
                else
@@ -355,47 +374,38 @@ static int str9xpec_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int str9xpec_erase_area(struct flash_bank *bank, int first, int last)
+static int str9xpec_erase_area(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct scan_field field;
        uint8_t status;
        struct jtag_tap *tap;
-       int i;
        uint8_t *buffer = NULL;
 
        struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                str9xpec_isc_enable(bank);
-       }
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                return ISC_STATUS_ERROR;
-       }
 
        buffer = calloc(DIV_ROUND_UP(64, 8), 1);
 
-       LOG_DEBUG("erase: first_bank: %i, last_bank: %i", first, last);
+       LOG_DEBUG("erase: first_bank: %u, last_bank: %u", first, last);
 
        /* last bank: 0xFF signals a full erase (unlock complete device) */
        /* last bank: 0xFE signals a option byte erase */
-       if (last == 0xFF)
-       {
-               for (i = 0; i < 64; i++) {
+       if (last == 0xFF) {
+               for (unsigned int i = 0; i < 64; i++)
                        buf_set_u32(buffer, i, 1, 1);
-               }
-       }
-       else if (last == 0xFE)
-       {
+       } else if (last == 0xFE)
                buf_set_u32(buffer, 49, 1, 1);
-       }
-       else
-       {
-               for (i = first; i <= last; i++) {
+       else {
+               for (unsigned int i = first; i <= last; i++)
                        buf_set_u32(buffer, str9xpec_info->sector_bits[i], 1, 1);
-               }
        }
 
        LOG_DEBUG("ISC_ERASE");
@@ -413,9 +423,8 @@ static int str9xpec_erase_area(struct flash_bank *bank, int first, int last)
        jtag_add_sleep(10);
 
        /* wait for erase completion */
-       while (!((status = str9xpec_isc_status(tap)) & ISC_STATUS_BUSY)) {
+       while (!((status = str9xpec_isc_status(tap)) & ISC_STATUS_BUSY))
                alive_sleep(1);
-       }
 
        free(buffer);
 
@@ -424,7 +433,8 @@ static int str9xpec_erase_area(struct flash_bank *bank, int first, int last)
        return status;
 }
 
-static int str9xpec_erase(struct flash_bank *bank, int first, int last)
+static int str9xpec_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        int status;
 
@@ -446,13 +456,11 @@ static int str9xpec_lock_device(struct flash_bank *bank)
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                str9xpec_isc_enable(bank);
-       }
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                return ISC_STATUS_ERROR;
-       }
 
        /* set security address */
        str9xpec_set_address(bank, 0x80);
@@ -486,10 +494,10 @@ static int str9xpec_unlock_device(struct flash_bank *bank)
        return status;
 }
 
-static int str9xpec_protect(struct flash_bank *bank, int set, int first, int last)
+static int str9xpec_protect(struct flash_bank *bank, int set,
+               unsigned int first, unsigned int last)
 {
        uint8_t status;
-       int i;
 
        struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
@@ -498,25 +506,18 @@ static int str9xpec_protect(struct flash_bank *bank, int set, int first, int las
        if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS)
                return ERROR_FLASH_OPERATION_FAILED;
 
-       LOG_DEBUG("protect: first_bank: %i, last_bank: %i", first, last);
+       LOG_DEBUG("protect: first_bank: %u, last_bank: %u", first, last);
 
        /* last bank: 0xFF signals a full device protect */
-       if (last == 0xFF)
-       {
+       if (last == 0xFF) {
                if (set)
-               {
                        status = str9xpec_lock_device(bank);
-               }
-               else
-               {
+               else {
                        /* perform full erase to unlock device */
                        status = str9xpec_unlock_device(bank);
                }
-       }
-       else
-       {
-               for (i = first; i <= last; i++)
-               {
+       } else {
+               for (unsigned int i = first; i <= last; i++) {
                        if (set)
                                buf_set_u32(str9xpec_info->options, str9xpec_info->sector_bits[i], 1, 1);
                        else
@@ -552,7 +553,7 @@ static int str9xpec_set_address(struct flash_bank *bank, uint8_t sector)
        return ERROR_OK;
 }
 
-static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer,
+static int str9xpec_write(struct flash_bank *bank, const uint8_t *buffer,
                uint32_t offset, uint32_t count)
 {
        struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
@@ -564,34 +565,28 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer,
        struct jtag_tap *tap;
        struct scan_field field;
        uint8_t *scanbuf;
-       int i;
-       int first_sector = 0;
-       int last_sector = 0;
+       unsigned int first_sector = 0;
+       unsigned int last_sector = 0;
 
        tap = str9xpec_info->tap;
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                str9xpec_isc_enable(bank);
-       }
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                return ERROR_FLASH_OPERATION_FAILED;
-       }
 
-       if (offset & 0x7)
-       {
+       if (offset & 0x7) {
                LOG_WARNING("offset 0x%" PRIx32 " breaks required 8-byte alignment", offset);
                return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
        }
 
-       for (i = 0; i < bank->num_sectors; i++)
-       {
+       for (unsigned int i = 0; i < bank->num_sectors; i++) {
                uint32_t sec_start = bank->sectors[i].offset;
                uint32_t sec_end = sec_start + bank->sectors[i].size;
 
                /* check if destination falls within the current sector */
-               if ((check_address >= sec_start) && (check_address < sec_end))
-               {
+               if ((check_address >= sec_start) && (check_address < sec_end)) {
                        /* check if destination ends in the current sector */
                        if (offset + count < sec_end)
                                check_address = offset + count;
@@ -599,13 +594,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer,
                                check_address = sec_end;
                }
 
-               if ((offset >= sec_start) && (offset < sec_end)) {
+               if ((offset >= sec_start) && (offset < sec_end))
                        first_sector = i;
-               }
 
-               if ((offset + count >= sec_start) && (offset + count < sec_end)) {
+               if ((offset + count >= sec_start) && (offset + count < sec_end))
                        last_sector = i;
-               }
        }
 
        if (check_address != offset + count)
@@ -617,15 +610,13 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer,
 
        LOG_DEBUG("ISC_PROGRAM");
 
-       for (i = first_sector; i <= last_sector; i++)
-       {
+       for (unsigned int i = first_sector; i <= last_sector; i++) {
                str9xpec_set_address(bank, str9xpec_info->sector_bits[i]);
 
                dwords_remaining = dwords_remaining < (bank->sectors[i].size/8)
                                ? dwords_remaining : (bank->sectors[i].size/8);
 
-               while (dwords_remaining > 0)
-               {
+               while (dwords_remaining > 0) {
                        str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE);
 
                        field.num_bits = 64;
@@ -662,17 +653,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer,
                }
        }
 
-       if (bytes_remaining)
-       {
+       if (bytes_remaining) {
                uint8_t last_dword[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-               int i = 0;
 
-               while (bytes_remaining > 0)
-               {
-                       last_dword[i++] = *(buffer + bytes_written);
-                       bytes_remaining--;
-                       bytes_written++;
-               }
+               /* copy the last remaining bytes into the write buffer */
+               memcpy(last_dword, buffer+bytes_written, bytes_remaining);
 
                str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE);
 
@@ -731,7 +716,7 @@ COMMAND_HANDLER(str9xpec_handle_part_id_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
@@ -750,7 +735,7 @@ COMMAND_HANDLER(str9xpec_handle_part_id_command)
 
        idcode = buf_get_u32(buffer, 0, 32);
 
-       command_print(CMD_CTX, "str9xpec part id: 0x%8.8" PRIx32 "", idcode);
+       command_print(CMD, "str9xpec part id: 0x%8.8" PRIx32 "", idcode);
 
        free(buffer);
 
@@ -762,26 +747,17 @@ static int str9xpec_erase_check(struct flash_bank *bank)
        return str9xpec_blank_check(bank, 0, bank->num_sectors - 1);
 }
 
-static int str9xpec_info(struct flash_bank *bank, char *buf, int buf_size)
-{
-       snprintf(buf, buf_size, "str9xpec flash driver info");
-       return ERROR_OK;
-}
-
 COMMAND_HANDLER(str9xpec_handle_flash_options_read_command)
 {
        uint8_t status;
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 1)
-       {
-               command_print(CMD_CTX, "str9xpec options_read <bank>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
@@ -793,33 +769,33 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_read_command)
 
        /* boot bank */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1))
-               command_print(CMD_CTX, "CS Map: bank1");
+               command_print(CMD, "CS Map: bank1");
        else
-               command_print(CMD_CTX, "CS Map: bank0");
+               command_print(CMD, "CS Map: bank0");
 
        /* OTP lock */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_OTPBIT, 1))
-               command_print(CMD_CTX, "OTP Lock: OTP Locked");
+               command_print(CMD, "OTP Lock: OTP Locked");
        else
-               command_print(CMD_CTX, "OTP Lock: OTP Unlocked");
+               command_print(CMD, "OTP Lock: OTP Unlocked");
 
        /* LVD Threshold */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1))
-               command_print(CMD_CTX, "LVD Threshold: 2.7v");
+               command_print(CMD, "LVD Threshold: 2.7v");
        else
-               command_print(CMD_CTX, "LVD Threshold: 2.4v");
+               command_print(CMD, "LVD Threshold: 2.4v");
 
        /* LVD reset warning */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1))
-               command_print(CMD_CTX, "LVD Reset Warning: VDD or VDDQ Inputs");
+               command_print(CMD, "LVD Reset Warning: VDD or VDDQ Inputs");
        else
-               command_print(CMD_CTX, "LVD Reset Warning: VDD Input Only");
+               command_print(CMD, "LVD Reset Warning: VDD Input Only");
 
        /* LVD reset select */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1))
-               command_print(CMD_CTX, "LVD Reset Selection: VDD or VDDQ Inputs");
+               command_print(CMD, "LVD Reset Selection: VDD or VDDQ Inputs");
        else
-               command_print(CMD_CTX, "LVD Reset Selection: VDD Input Only");
+               command_print(CMD, "LVD Reset Selection: VDD Input Only");
 
        return ERROR_OK;
 }
@@ -840,13 +816,11 @@ static int str9xpec_write_options(struct flash_bank *bank)
        if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS)
                return status;
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                str9xpec_isc_enable(bank);
-       }
 
-       if (!str9xpec_info->isc_enable) {
+       if (!str9xpec_info->isc_enable)
                return ISC_STATUS_ERROR;
-       }
 
        /* according to data 64th bit has to be set */
        buf_set_u32(str9xpec_info->options, 63, 1, 1);
@@ -888,14 +862,11 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_write_command)
        uint8_t status;
 
        if (CMD_ARGC < 1)
-       {
-               command_print(CMD_CTX, "str9xpec options_write <bank>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        status = str9xpec_write_options(bank);
@@ -903,7 +874,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_write_command)
        if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS)
                return ERROR_FLASH_OPERATION_FAILED;
 
-       command_print(CMD_CTX, "str9xpec write options complete.\n"
+       command_print(CMD, "str9xpec write options complete.\n"
                        "INFO: a reset or power cycle is required "
                        "for the new settings to take effect.");
 
@@ -915,26 +886,19 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_cmap_command)
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 2)
-       {
-               command_print(CMD_CTX, "str9xpec options_cmap <bank> <bank0 | bank1>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
 
        if (strcmp(CMD_ARGV[1], "bank1") == 0)
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1, 1);
-       }
        else
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1, 0);
-       }
 
        return ERROR_OK;
 }
@@ -944,26 +908,19 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdthd_command)
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 2)
-       {
-               command_print(CMD_CTX, "str9xpec options_lvdthd <bank> <2.4v | 2.7v>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
 
        if (strcmp(CMD_ARGV[1], "2.7v") == 0)
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1, 1);
-       }
        else
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1, 0);
-       }
 
        return ERROR_OK;
 }
@@ -973,26 +930,19 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdsel_command)
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 2)
-       {
-               command_print(CMD_CTX, "str9xpec options_lvdsel <bank> <vdd | vdd_vddq>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
 
        if (strcmp(CMD_ARGV[1], "vdd_vddq") == 0)
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1, 1);
-       }
        else
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1, 0);
-       }
 
        return ERROR_OK;
 }
@@ -1002,26 +952,19 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdwarn_command)
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 2)
-       {
-               command_print(CMD_CTX, "str9xpec options_lvdwarn <bank> <vdd | vdd_vddq>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
 
        if (strcmp(CMD_ARGV[1], "vdd_vddq") == 0)
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1, 1);
-       }
        else
-       {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1, 0);
-       }
 
        return ERROR_OK;
 }
@@ -1031,14 +974,11 @@ COMMAND_HANDLER(str9xpec_handle_flash_lock_command)
        uint8_t status;
 
        if (CMD_ARGC < 1)
-       {
-               command_print(CMD_CTX, "str9xpec lock <bank>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        status = str9xpec_lock_device(bank);
@@ -1054,14 +994,11 @@ COMMAND_HANDLER(str9xpec_handle_flash_unlock_command)
        uint8_t status;
 
        if (CMD_ARGC < 1)
-       {
-               command_print(CMD_CTX, "str9xpec unlock <bank>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        status = str9xpec_unlock_device(bank);
@@ -1069,7 +1006,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_unlock_command)
        if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS)
                return ERROR_FLASH_OPERATION_FAILED;
 
-       command_print(CMD_CTX, "str9xpec unlocked.\n"
+       command_print(CMD, "str9xpec unlocked.\n"
                        "INFO: a reset or power cycle is required "
                        "for the new settings to take effect.");
 
@@ -1084,39 +1021,39 @@ COMMAND_HANDLER(str9xpec_handle_flash_enable_turbo_command)
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 1)
-       {
-               command_print(CMD_CTX, "str9xpec enable_turbo <bank>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
 
-       tap0 = str9xpec_info->tap;
-
        /* remove arm core from chain - enter turbo mode */
+       tap0 = str9xpec_info->tap;
+       if (!tap0) {
+               /* things are *WRONG* */
+               command_print(CMD, "**STR9FLASH** (tap0) invalid chain?");
+               return ERROR_FAIL;
+       }
        tap1 = tap0->next_tap;
-       if (tap1 == NULL)
-       {
+       if (!tap1) {
                /* things are *WRONG* */
-               command_print(CMD_CTX,"**STR9FLASH** (tap1) invalid chain?");
-               return ERROR_OK;
+               command_print(CMD"**STR9FLASH** (tap1) invalid chain?");
+               return ERROR_FAIL;
        }
        tap2 = tap1->next_tap;
-       if (tap2 == NULL)
-       {
+       if (!tap2) {
                /* things are *WRONG* */
-               command_print(CMD_CTX,"**STR9FLASH** (tap2) invalid chain?");
-               return ERROR_OK;
+               command_print(CMD"**STR9FLASH** (tap2) invalid chain?");
+               return ERROR_FAIL;
        }
 
        /* enable turbo mode - TURBO-PROG-ENABLE */
        str9xpec_set_instr(tap2, 0xD, TAP_IDLE);
-       if ((retval = jtag_execute_queue()) != ERROR_OK)
+       retval = jtag_execute_queue();
+       if (retval != ERROR_OK)
                return retval;
 
        /* modify scan chain - str9 core has been removed */
@@ -1131,20 +1068,17 @@ COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command)
        struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (CMD_ARGC < 1)
-       {
-               command_print(CMD_CTX, "str9xpec disable_turbo <bank>");
-               return ERROR_OK;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
 
-       if (tap == NULL)
+       if (!tap)
                return ERROR_FAIL;
 
        /* exit turbo mode via RESET */
@@ -1153,9 +1087,8 @@ COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command)
        jtag_execute_queue();
 
        /* restore previous scan chain */
-       if (tap->next_tap) {
+       if (tap->next_tap)
                tap->next_tap->enabled = 1;
-       }
 
        return ERROR_OK;
 }
@@ -1163,69 +1096,80 @@ COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command)
 static const struct command_registration str9xpec_config_command_handlers[] = {
        {
                .name = "enable_turbo",
+               .usage = "<bank>",
                .handler = str9xpec_handle_flash_enable_turbo_command,
                .mode = COMMAND_EXEC,
                .help = "enable str9xpec turbo mode",
        },
        {
                .name = "disable_turbo",
+               .usage = "<bank>",
                .handler = str9xpec_handle_flash_disable_turbo_command,
                .mode = COMMAND_EXEC,
                .help = "disable str9xpec turbo mode",
        },
        {
                .name = "options_cmap",
+               .usage = "<bank> <bank0 | bank1>",
                .handler = str9xpec_handle_flash_options_cmap_command,
                .mode = COMMAND_EXEC,
                .help = "configure str9xpec boot sector",
        },
        {
                .name = "options_lvdthd",
+               .usage = "<bank> <2.4v | 2.7v>",
                .handler = str9xpec_handle_flash_options_lvdthd_command,
                .mode = COMMAND_EXEC,
                .help = "configure str9xpec lvd threshold",
        },
        {
                .name = "options_lvdsel",
+               .usage = "<bank> <vdd | vdd_vddq>",
                .handler = str9xpec_handle_flash_options_lvdsel_command,
                .mode = COMMAND_EXEC,
                .help = "configure str9xpec lvd selection",
        },
        {
                .name = "options_lvdwarn",
+               .usage = "<bank> <vdd | vdd_vddq>",
                .handler = str9xpec_handle_flash_options_lvdwarn_command,
                .mode = COMMAND_EXEC,
                .help = "configure str9xpec lvd warning",
        },
        {
                .name = "options_read",
+               .usage = "<bank>",
                .handler = str9xpec_handle_flash_options_read_command,
                .mode = COMMAND_EXEC,
                .help = "read str9xpec options",
        },
        {
                .name = "options_write",
+               .usage = "<bank>",
                .handler = str9xpec_handle_flash_options_write_command,
                .mode = COMMAND_EXEC,
                .help = "write str9xpec options",
        },
        {
                .name = "lock",
+               .usage = "<bank>",
                .handler = str9xpec_handle_flash_lock_command,
                .mode = COMMAND_EXEC,
                .help = "lock str9xpec device",
        },
        {
                .name = "unlock",
+               .usage = "<bank>",
                .handler = str9xpec_handle_flash_unlock_command,
                .mode = COMMAND_EXEC,
                .help = "unlock str9xpec device",
        },
        {
                .name = "part_id",
+               .usage = "<bank>",
                .handler = str9xpec_handle_part_id_command,
                .mode = COMMAND_EXEC,
-               .help = "print part id of str9xpec flash bank <num>",
+               .help = "print part id of str9xpec flash bank",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -1235,12 +1179,13 @@ static const struct command_registration str9xpec_command_handlers[] = {
                .name = "str9xpec",
                .mode = COMMAND_ANY,
                .help = "str9xpec flash command group",
+               .usage = "",
                .chain = str9xpec_config_command_handlers,
        },
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver str9xpec_flash = {
+const struct flash_driver str9xpec_flash = {
        .name = "str9xpec",
        .commands = str9xpec_command_handlers,
        .flash_bank_command = str9xpec_flash_bank_command,
@@ -1252,5 +1197,5 @@ struct flash_driver str9xpec_flash = {
        .auto_probe = str9xpec_probe,
        .erase_check = str9xpec_erase_check,
        .protect_check = str9xpec_protect_check,
-       .info = str9xpec_info,
+       .free_driver_priv = default_flash_free_driver_priv,
 };