lpc2000: Add LPC407x/8x flash size auto detection
[fw/openocd] / src / flash / nor / at91sam7.c
index e46122ad8a2ae3265a99d82e0008755895631271..c7334ca53dbaacf9d49fe687a0b1958b0463e5fc 100644 (file)
@@ -17,7 +17,7 @@
  *   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.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
 ****************************************************************************/
 
 /***************************************************************************
@@ -98,7 +98,7 @@
 #define FLASH_SIZE_2048KB       14
 
 static int at91sam7_protect_check(struct flash_bank *bank);
-static int at91sam7_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
+static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset,
                uint32_t count);
 
 static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number);
@@ -106,11 +106,11 @@ static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode);
 static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout);
 static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen);
 
-static uint32_t MC_FMR[4] = { 0xFFFFFF60, 0xFFFFFF70, 0xFFFFFF80, 0xFFFFFF90 };
-static uint32_t MC_FCR[4] = { 0xFFFFFF64, 0xFFFFFF74, 0xFFFFFF84, 0xFFFFFF94 };
-static uint32_t MC_FSR[4] = { 0xFFFFFF68, 0xFFFFFF78, 0xFFFFFF88, 0xFFFFFF98 };
+static const uint32_t MC_FMR[4] = { 0xFFFFFF60, 0xFFFFFF70, 0xFFFFFF80, 0xFFFFFF90 };
+static const uint32_t MC_FCR[4] = { 0xFFFFFF64, 0xFFFFFF74, 0xFFFFFF84, 0xFFFFFF94 };
+static const uint32_t MC_FSR[4] = { 0xFFFFFF68, 0xFFFFFF78, 0xFFFFFF88, 0xFFFFFF98 };
 
-static char *EPROC[8] = {
+static const char *EPROC[8] = {
        "Unknown", "ARM946-E", "ARM7TDMI", "Unknown", "ARM920T", "ARM926EJ-S", "Unknown", "Unknown"
 };
 
@@ -353,9 +353,8 @@ static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t
 /* Read device id register, main clock frequency register and fill in driver info structure */
 static int at91sam7_read_part_info(struct flash_bank *bank)
 {
-       struct flash_bank *t_bank = bank;
        struct at91sam7_flash_bank *at91sam7_info;
-       struct target *target = t_bank->target;
+       struct target *target = bank->target;
 
        uint16_t bnk, sec;
        uint16_t arch;
@@ -370,12 +369,12 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
        uint32_t base_address = 0;
        char *target_name_t = "Unknown";
 
-       at91sam7_info = t_bank->driver_priv;
+       at91sam7_info = bank->driver_priv;
 
        if (at91sam7_info->cidr != 0) {
                /* flash already configured, update clock and check for protected sectors */
                struct flash_bank *fb = bank;
-               t_bank = fb;
+               struct flash_bank *t_bank = bank;
 
                while (t_bank) {
                        /* re-calculate master clock frequency */
@@ -404,7 +403,7 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
        if (at91sam7_info->flash_autodetection == 0) {
                /* banks and sectors are already created, based on data from input file */
                struct flash_bank *fb = bank;
-               t_bank = fb;
+               struct flash_bank *t_bank = bank;
                while (t_bank) {
                        at91sam7_info = t_bank->driver_priv;
 
@@ -576,6 +575,7 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
        bank_size = sectors_num * pages_per_sector * page_size;
 
        for (bnk = 0; bnk < banks_num; bnk++) {
+               struct flash_bank *t_bank = bank;
                if (bnk > 0) {
                        if (!t_bank->next) {
                                /* create a new flash bank element */
@@ -897,8 +897,10 @@ static int at91sam7_erase(struct flash_bank *bank, int first, int last)
                for (pos = 0; pos < nbytes; pos++)
                        buffer[pos] = 0xFF;
 
-               if (at91sam7_write(bank, buffer, bank->sectors[first].offset, nbytes) != ERROR_OK)
+               if (at91sam7_write(bank, buffer, bank->sectors[first].offset, nbytes) != ERROR_OK) {
+                       free(buffer);
                        return ERROR_FLASH_OPERATION_FAILED;
+               }
 
                free(buffer);
        }
@@ -952,7 +954,7 @@ static int at91sam7_protect(struct flash_bank *bank, int set, int first, int las
        return ERROR_OK;
 }
 
-static int at91sam7_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
+static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 {
        int retval;
        struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;