openocd: fix SPDX tag format for files .c
[fw/openocd] / src / flash / nor / ocl.c
index 9a295eb039a9708972b432331d52be1201b1092a..e00c365edd30834ad67e0340fe532b291f7d4cbd 100644 (file)
@@ -1,22 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2007 by Pavel Chromy                                    *
  *   chromy@asix.cz                                                        *
- *                                                                         *
- *   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 "ocl.h"
 #include <target/embeddedice.h>
 
-
-struct ocl_priv
-{
+struct ocl_priv {
        struct arm_jtag *jtag_info;
        unsigned int buflen;
        unsigned int bufalign;
 };
 
-static int ocl_erase_check(struct flash_bank *bank)
-{
-       return ERROR_OK;
-}
-
-static int ocl_protect_check(struct flash_bank *bank)
-{
-       return ERROR_OK;
-}
-
 /* flash_bank ocl 0 0 0 0 <target#> */
 FLASH_BANK_COMMAND_HANDLER(ocl_flash_bank_command)
 {
@@ -50,10 +26,7 @@ FLASH_BANK_COMMAND_HANDLER(ocl_flash_bank_command)
        struct ocl_priv *ocl;
 
        if (CMD_ARGC < 6)
-       {
-               LOG_WARNING("incomplete flash_bank ocl configuration");
-               return ERROR_FLASH_BANK_INVALID;
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        arm7_9 = target_to_arm7_9(bank->target);
        if (!is_arm7_9(arm7_9))
@@ -67,7 +40,8 @@ FLASH_BANK_COMMAND_HANDLER(ocl_flash_bank_command)
        return ERROR_OK;
 }
 
-static int ocl_erase(struct flash_bank *bank, int first, int last)
+static int ocl_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct ocl_priv *ocl = bank->driver_priv;
        int retval;
@@ -77,41 +51,36 @@ static int ocl_erase(struct flash_bank *bank, int first, int last)
        if (bank->num_sectors == 0)
                return ERROR_FLASH_BANK_NOT_PROBED;
 
-       if (bank->target->state != TARGET_RUNNING)
-       {
+       if (bank->target->state != TARGET_RUNNING) {
                LOG_ERROR("target has to be running to communicate with the loader");
                return ERROR_TARGET_NOT_RUNNING;
        }
 
-       if ((first == 0) && (last == bank->num_sectors - 1))
-       {
+       if ((first == 0) && (last == bank->num_sectors - 1)) {
                dcc_buffer[0] = OCL_ERASE_ALL;
-               if ((retval = embeddedice_send(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+               retval = embeddedice_send(ocl->jtag_info, dcc_buffer, 1);
+               if (retval != ERROR_OK)
                        return retval;
-       }
-       else
-       {
+       } else {
                dcc_buffer[0] = OCL_ERASE_BLOCK;
                dcc_buffer[1] = first;
                dcc_buffer[2] = last;
-               if ((retval = embeddedice_send(ocl->jtag_info, dcc_buffer, 3) != ERROR_OK))
+               retval = embeddedice_send(ocl->jtag_info, dcc_buffer, 3);
+               if (retval != ERROR_OK)
                        return retval;
        }
 
        /* wait for response, fixed timeout of 1 s */
-       if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 1000) != ERROR_OK))
-       {
-               if (retval == ERROR_TARGET_TIMEOUT)
-                       LOG_ERROR("loader not responding");
+       retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 1000);
+       if (retval != ERROR_OK)
                return retval;
-       }
 
        /* receive response */
-       if ((retval = embeddedice_receive(ocl->jtag_info, dcc_buffer + 1, 1) != ERROR_OK))
+       retval = embeddedice_receive(ocl->jtag_info, dcc_buffer + 1, 1);
+       if (retval != ERROR_OK)
                return retval;
 
-       if (dcc_buffer[1] != OCL_CMD_DONE)
-       {
+       if (dcc_buffer[1] != OCL_CMD_DONE) {
                if (dcc_buffer[0] == OCL_ERASE_ALL)
                        LOG_ERROR("loader response to OCL_ERASE_ALL 0x%08" PRIx32 "", dcc_buffer[1]);
                else
@@ -122,12 +91,7 @@ static int ocl_erase(struct flash_bank *bank, int first, int last)
        return ERROR_OK;
 }
 
-static int ocl_protect(struct flash_bank *bank, int set, int first, int last)
-{
-       return ERROR_OK;
-}
-
-static int ocl_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
+static int ocl_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 {
        struct ocl_priv *ocl = bank->driver_priv;
        int retval;
@@ -143,8 +107,7 @@ static int ocl_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
        if (ocl->buflen == 0 || ocl->bufalign == 0)
                return ERROR_FLASH_BANK_NOT_PROBED;
 
-       if (bank->target->state != TARGET_RUNNING)
-       {
+       if (bank->target->state != TARGET_RUNNING) {
                LOG_ERROR("target has to be running to communicate with the loader");
                return ERROR_TARGET_NOT_RUNNING;
        }
@@ -152,8 +115,7 @@ static int ocl_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
        /* allocate buffer for max. ocl buffer + overhead */
        dcc_buffer = malloc(sizeof(uint32_t)*(ocl->buflen/4 + 3));
 
-       while (count)
-       {
+       while (count) {
                if (count + (offset % ocl->bufalign) > ocl->buflen)
                        runlen = ocl->buflen - (offset % ocl->bufalign);
                else
@@ -168,10 +130,8 @@ static int ocl_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
                chksum = OCL_CHKS_INIT;
 
                /* copy data to DCC buffer in proper byte order and properly aligned */
-               for (i = 0; i < runlen; i++)
-               {
-                       switch (byteofs++)
-                       {
+               for (i = 0; i < runlen; i++) {
+                       switch (byteofs++) {
                                case 0:
                                        *dcc_bufptr &= *(buffer++) | 0xffffff00;
                                        break;
@@ -197,30 +157,27 @@ static int ocl_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
                *(dcc_bufptr++) = chksum;
 
                /* send the data */
-               if ((retval = embeddedice_send(ocl->jtag_info, dcc_buffer, dcc_bufptr-dcc_buffer)) != ERROR_OK)
-               {
+               retval = embeddedice_send(ocl->jtag_info, dcc_buffer, dcc_bufptr-dcc_buffer);
+               if (retval != ERROR_OK) {
                        free(dcc_buffer);
                  return retval;
                }
 
                /* wait for response, fixed timeout of 1 s */
-               if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 1000) != ERROR_OK))
-               {
-                       if (retval == ERROR_TARGET_TIMEOUT)
-                               LOG_ERROR("loader not responding");
+               retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 1000);
+               if (retval != ERROR_OK) {
                        free(dcc_buffer);
                        return retval;
                }
 
                /* receive response */
-               if ((retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
-               {
+               retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
+               if (retval != ERROR_OK) {
                        free(dcc_buffer);
                        return retval;
                }
 
-               if (dcc_buffer[0] != OCL_CMD_DONE)
-               {
+               if (dcc_buffer[0] != OCL_CMD_DONE) {
                        LOG_ERROR("loader response to OCL_FLASH_BLOCK 0x%08" PRIx32 "", dcc_buffer[0]);
                        free(dcc_buffer);
                        return ERROR_FLASH_OPERATION_FAILED;
@@ -240,58 +197,66 @@ static int ocl_probe(struct flash_bank *bank)
        int retval;
        uint32_t dcc_buffer[1];
        int sectsize;
-       int i;
 
        /* purge pending data in DCC */
        embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
 
        dcc_buffer[0] = OCL_PROBE;
-       if ((retval = embeddedice_send(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+       retval = embeddedice_send(ocl->jtag_info, dcc_buffer, 1);
+       if (retval != ERROR_OK)
                return retval;
 
        /* wait for response, fixed timeout of 1 s */
-       if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 1000) != ERROR_OK))
-       {
-               if (retval == ERROR_TARGET_TIMEOUT)
-                       LOG_ERROR("loader not responding");
+       retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 1000);
+       if (retval != ERROR_OK)
                return retval;
-       }
 
        /* receive response */
-       if ((retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+       retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
+       if (retval != ERROR_OK)
                return retval;
 
-       if (dcc_buffer[0] != OCL_CMD_DONE)
-       {
+       if (dcc_buffer[0] != OCL_CMD_DONE) {
                LOG_ERROR("loader response to OCL_PROBE 0x%08" PRIx32 "", dcc_buffer[0]);
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
        /* receive and fill in parameters, detection of loader is important, receive it one by one */
-       if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0) != ERROR_OK)
-               || (retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+       retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0);
+       if (retval != ERROR_OK)
+               return retval;
+       retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
+       if (retval != ERROR_OK)
                return retval;
        bank->base = dcc_buffer[0];
 
-       if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0) != ERROR_OK)
-               || (retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+       retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0);
+       if (retval != ERROR_OK)
+               return retval;
+       retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
+       if (retval != ERROR_OK)
                return retval;
        bank->size = dcc_buffer[0];
 
-       if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0) != ERROR_OK)
-               || (retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+       retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0);
+       if (retval != ERROR_OK)
+               return retval;
+       retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
+       if (retval != ERROR_OK)
                return retval;
        bank->num_sectors = dcc_buffer[0];
 
-       if ((retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0) != ERROR_OK)
-               || (retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1) != ERROR_OK))
+       retval = embeddedice_handshake(ocl->jtag_info, EICE_COMM_CTRL_WBIT, 0);
+       if (retval != ERROR_OK)
+               return retval;
+       retval = embeddedice_receive(ocl->jtag_info, dcc_buffer, 1);
+       if (retval != ERROR_OK)
                return retval;
        ocl->buflen = dcc_buffer[0] & 0xffff;
        ocl->bufalign = dcc_buffer[0] >> 16;
 
        bank->sectors = realloc(bank->sectors, sizeof(struct flash_sector)*bank->num_sectors);
-       if (bank->num_sectors == 0)
-       {
+       if (bank->num_sectors == 0) {
                LOG_ERROR("number of sectors shall be non zero value");
                return ERROR_FLASH_BANK_INVALID;
        }
@@ -300,8 +265,7 @@ static int ocl_probe(struct flash_bank *bank)
                return ERROR_FLASH_BANK_INVALID;
        }
        sectsize = bank->size / 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 = i * sectsize;
                bank->sectors[i].size = sectsize;
                bank->sectors[i].is_erased = -1;
@@ -311,20 +275,17 @@ static int ocl_probe(struct flash_bank *bank)
        if (ocl->bufalign == 0)
                ocl->bufalign = 1;
 
-       if (ocl->buflen == 0)
-       {
+       if (ocl->buflen == 0) {
                LOG_ERROR("buflen shall be non zero value");
                return ERROR_FLASH_BANK_INVALID;
        }
 
-       if ((ocl->bufalign > ocl->buflen) || (ocl->buflen % ocl->bufalign))
-       {
+       if ((ocl->bufalign > ocl->buflen) || (ocl->buflen % ocl->bufalign)) {
                LOG_ERROR("buflen is not multiple of bufalign");
                return ERROR_FLASH_BANK_INVALID;
        }
 
-       if (ocl->buflen % 4)
-       {
+       if (ocl->buflen % 4) {
                LOG_ERROR("buflen shall be divisible by 4");
                return ERROR_FLASH_BANK_INVALID;
        }
@@ -332,11 +293,6 @@ static int ocl_probe(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int ocl_info(struct flash_bank *bank, char *buf, int buf_size)
-{
-       return ERROR_OK;
-}
-
 static int ocl_auto_probe(struct flash_bank *bank)
 {
        struct ocl_priv *ocl = bank->driver_priv;
@@ -347,16 +303,14 @@ static int ocl_auto_probe(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-struct flash_driver ocl_flash = {
+const struct flash_driver ocl_flash = {
        .name = "ocl",
        .flash_bank_command = ocl_flash_bank_command,
        .erase = ocl_erase,
-       .protect = ocl_protect,
        .write = ocl_write,
        .read = default_flash_read,
        .probe = ocl_probe,
-       .erase_check = ocl_erase_check,
-       .protect_check = ocl_protect_check,
-       .info = ocl_info,
+       .erase_check = default_flash_blank_check,
        .auto_probe = ocl_auto_probe,
+       .free_driver_priv = default_flash_free_driver_priv,
 };