nrf5: add free_driver_priv
[fw/openocd] / src / flash / nor / nrf5.c
index a7ae6f3b79707d1997d01ed923aed4cd7ca6490f..16459c7f8b1f278de3c0e0bc666a0040f1e788e2 100644 (file)
@@ -108,6 +108,7 @@ enum nrf5_nvmc_config_bits {
 
 struct nrf5_info {
        uint32_t code_page_size;
+       uint32_t refcount;
 
        struct {
                bool probed;
@@ -204,6 +205,7 @@ static const struct nrf5_device_spec nrf5_known_devices_table[] = {
 
        /* nRF52832 Devices */
        NRF5_DEVICE_DEF(0x00C7, "52832", "QFAA", "B0",    512),
+       NRF5_DEVICE_DEF(0x0139, "52832", "QFAA", "E0",    512),
 };
 
 static int nrf5_bank_is_probed(struct flash_bank *bank)
@@ -868,6 +870,18 @@ static int nrf5_write(struct flash_bank *bank, const uint8_t *buffer,
        return chip->bank[bank->bank_number].write(bank, chip, buffer, offset, count);
 }
 
+static void nrf5_free_driver_priv(struct flash_bank *bank)
+{
+       struct nrf5_info *chip = bank->driver_priv;
+       if (chip == NULL)
+               return;
+
+       chip->refcount--;
+       if (chip->refcount == 0) {
+               free(chip);
+               bank->driver_priv = NULL;
+       }
+}
 
 FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
 {
@@ -903,6 +917,7 @@ FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
                break;
        }
 
+       chip->refcount++;
        chip->bank[bank->bank_number].probed = false;
        bank->driver_priv = chip;
 
@@ -1127,6 +1142,7 @@ struct flash_driver nrf5_flash = {
        .auto_probe             = nrf5_auto_probe,
        .erase_check            = default_flash_blank_check,
        .protect_check          = nrf5_protect_check,
+       .free_driver_priv       = nrf5_free_driver_priv,
 };
 
 /* We need to retain the flash-driver name as well as the commands
@@ -1144,4 +1160,5 @@ struct flash_driver nrf51_flash = {
        .auto_probe             = nrf5_auto_probe,
        .erase_check            = default_flash_blank_check,
        .protect_check          = nrf5_protect_check,
+       .free_driver_priv       = nrf5_free_driver_priv,
 };