aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2019-01-23 20:36:46 +0100
committerTomas Vanek <vanekt@fbl.cz>2019-11-26 07:20:53 +0000
commit21bc29d1d66d3860e1343248864b9fa9f4b87280 (patch)
tree7b71d3aee3be6a669212a82927e35a4a83ce2284
parentd8288a22c14ac5cc00d4255c3225cdfd4ad38fbb (diff)
flash/nor/nrf5: fix allocation of driver_priv and sector array
Drop static pointer to allocated struct nrf5_info, iterate over the flash bank list to find previously allocated nrf5 instances. nrf5 is swd only device, so static allocation makes no harm, but we should avoid copying the wrong code to other flash drivers. Free sector array before allocating it to avoid memory leak on re-probing device. Change-Id: I781d8f4418a91c043f2393e5ecc5278fc6df3566 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/4910 Tested-by: jenkins
-rw-r--r--src/flash/nor/nrf5.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/flash/nor/nrf5.c b/src/flash/nor/nrf5.c
index dac08bd4..c1fd257e 100644
--- a/src/flash/nor/nrf5.c
+++ b/src/flash/nor/nrf5.c
@@ -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)
@@ -1063,9 +1067,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 +1103,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));