flash/nor/stm32f2x: Support value line chips with trimmed flash
[fw/openocd] / src / flash / nor / nrf5.c
index dac08bd4aa0b635d4061940ebf6f0d90ea82c5c2..d923468fd7459e6184e229d463a2edbfe6ace68b 100644 (file)
@@ -283,6 +283,8 @@ static const struct nrf5_device_package nrf5_packages_table[] = {
        { 0x2005, "CK" },
 };
 
+const struct flash_driver nrf5_flash, nrf51_flash;
+
 static int nrf5_bank_is_probed(struct flash_bank *bank)
 {
        struct nrf5_bank *nbank = bank->driver_priv;
@@ -794,6 +796,8 @@ static int nrf5_probe(struct flash_bank *bank)
                }
        }
 
+       free(bank->sectors);
+
        if (bank->base == NRF5_FLASH_BASE) {
                /* Sanity check */
                if (chip->spec && chip->flash_size_kb != chip->spec->flash_size_kb)
@@ -855,10 +859,6 @@ static int nrf5_erase_page(struct flash_bank *bank,
        int res;
 
        LOG_DEBUG("Erasing page at 0x%"PRIx32, sector->offset);
-       if (sector->is_protected) {
-               LOG_ERROR("Cannot erase protected sector at 0x%" PRIx32, sector->offset);
-               return ERROR_FAIL;
-       }
 
        if (bank->base == NRF5_UICR_BASE) {
                if (chip->features & NRF5_FEATURE_SERIES_51) {
@@ -1063,9 +1063,31 @@ static void nrf5_free_driver_priv(struct flash_bank *bank)
        }
 }
 
+static struct nrf5_info *nrf5_get_chip(struct target *target)
+{
+       struct flash_bank *bank_iter;
+
+       /* iterate over nrf5 banks of same target */
+       for (bank_iter = flash_bank_list(); bank_iter; bank_iter = bank_iter->next) {
+               if (bank_iter->driver != &nrf5_flash && bank_iter->driver != &nrf51_flash)
+                       continue;
+
+               if (bank_iter->target != target)
+                       continue;
+
+               struct nrf5_bank *nbank = bank_iter->driver_priv;
+               if (!nbank)
+                       continue;
+
+               if (nbank->chip)
+                       return nbank->chip;
+       }
+       return NULL;
+}
+
 FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
 {
-       static struct nrf5_info *chip;
+       struct nrf5_info *chip;
        struct nrf5_bank *nbank = NULL;
 
        switch (bank->base) {
@@ -1077,6 +1099,7 @@ FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
                return ERROR_FAIL;
        }
 
+       chip = nrf5_get_chip(bank->target);
        if (!chip) {
                /* Create a new chip */
                chip = calloc(1, sizeof(*chip));