openocd: src/target: replace the GPL-2.0-or-later license tag
[fw/openocd] / src / target / arm_cti.c
index 96927bf9459cf75c37a7f1dd91cf9782faf6e6c9..4ebdd234d1062ede8ad6039dbf94791071c77e15 100644 (file)
@@ -1,20 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
 /***************************************************************************
  *   Copyright (C) 2016 by Matthias Welwarsky                              *
  *                                                                         *
- *   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.,                                       *
- *                                                                         *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -34,6 +22,7 @@ struct arm_cti {
        struct list_head lh;
        char *name;
        struct adiv5_mem_ap_spot spot;
+       struct adiv5_ap *ap;
 };
 
 static LIST_HEAD(all_cti);
@@ -65,7 +54,7 @@ struct arm_cti *cti_instance_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
 
 static int arm_cti_mod_reg_bits(struct arm_cti *self, unsigned int reg, uint32_t mask, uint32_t value)
 {
-       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
+       struct adiv5_ap *ap = self->ap;
        uint32_t tmp;
 
        /* Read register */
@@ -84,15 +73,14 @@ static int arm_cti_mod_reg_bits(struct arm_cti *self, unsigned int reg, uint32_t
 
 int arm_cti_enable(struct arm_cti *self, bool enable)
 {
-       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
        uint32_t val = enable ? 1 : 0;
 
-       return mem_ap_write_atomic_u32(ap, self->spot.base + CTI_CTR, val);
+       return mem_ap_write_atomic_u32(self->ap, self->spot.base + CTI_CTR, val);
 }
 
 int arm_cti_ack_events(struct arm_cti *self, uint32_t event)
 {
-       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
+       struct adiv5_ap *ap = self->ap;
        int retval;
        uint32_t tmp;
 
@@ -134,19 +122,15 @@ int arm_cti_ungate_channel(struct arm_cti *self, uint32_t channel)
 
 int arm_cti_write_reg(struct arm_cti *self, unsigned int reg, uint32_t value)
 {
-       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
-
-       return mem_ap_write_atomic_u32(ap, self->spot.base + reg, value);
+       return mem_ap_write_atomic_u32(self->ap, self->spot.base + reg, value);
 }
 
 int arm_cti_read_reg(struct arm_cti *self, unsigned int reg, uint32_t *p_value)
 {
-       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
-
        if (!p_value)
                return ERROR_COMMAND_ARGUMENT_INVALID;
 
-       return mem_ap_read_atomic_u32(ap, self->spot.base + reg, p_value);
+       return mem_ap_read_atomic_u32(self->ap, self->spot.base + reg, p_value);
 }
 
 int arm_cti_pulse_channel(struct arm_cti *self, uint32_t channel)
@@ -228,6 +212,8 @@ int arm_cti_cleanup_all(void)
        struct arm_cti *obj, *tmp;
 
        list_for_each_entry_safe(obj, tmp, &all_cti, lh) {
+               if (obj->ap)
+                       dap_put_ap(obj->ap);
                free(obj->name);
                free(obj);
        }
@@ -238,7 +224,7 @@ int arm_cti_cleanup_all(void)
 COMMAND_HANDLER(handle_cti_dump)
 {
        struct arm_cti *cti = CMD_DATA;
-       struct adiv5_ap *ap = dap_ap(cti->spot.dap, cti->spot.ap_num);
+       struct adiv5_ap *ap = cti->ap;
        int retval = ERROR_OK;
 
        for (int i = 0; (retval == ERROR_OK) && (i < (int)ARRAY_SIZE(cti_names)); i++)
@@ -518,6 +504,12 @@ static int cti_create(struct jim_getopt_info *goi)
 
        list_add_tail(&cti->lh, &all_cti);
 
+       cti->ap = dap_get_ap(cti->spot.dap, cti->spot.ap_num);
+       if (!cti->ap) {
+               Jim_SetResultString(goi->interp, "Cannot get AP", -1);
+               return JIM_ERR;
+       }
+
        return JIM_OK;
 }