coresight: cti: Add function to register cti associate ops
Add static cti_assoc_ops to coresight core driver. Let cti driver register the add_assoc and remove_assoc call back. Avoid coresight core driver to depend on cti driver. Tested-by: Mike Leach <mike.leach@linaro.org> Signed-off-by: Tingwei Zhang <tingwei@codeaurora.org> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Link: https://lore.kernel.org/r/20200928163513.70169-17-mathieu.poirier@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ac87926632
commit
7b0fc5d281
|
@ -539,7 +539,7 @@ cti_match_fixup_csdev(struct cti_device *ctidev, const char *node_name,
|
|||
* This will set the association if CTI declared before the CS device.
|
||||
* (called from coresight_register() with coresight_mutex locked).
|
||||
*/
|
||||
void cti_add_assoc_to_csdev(struct coresight_device *csdev)
|
||||
static void cti_add_assoc_to_csdev(struct coresight_device *csdev)
|
||||
{
|
||||
struct cti_drvdata *ect_item;
|
||||
struct cti_device *ctidev;
|
||||
|
@ -572,13 +572,12 @@ void cti_add_assoc_to_csdev(struct coresight_device *csdev)
|
|||
cti_add_done:
|
||||
mutex_unlock(&ect_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cti_add_assoc_to_csdev);
|
||||
|
||||
/*
|
||||
* Removing the associated devices is easier.
|
||||
* A CTI will not have a value for csdev->ect_dev.
|
||||
*/
|
||||
void cti_remove_assoc_from_csdev(struct coresight_device *csdev)
|
||||
static void cti_remove_assoc_from_csdev(struct coresight_device *csdev)
|
||||
{
|
||||
struct cti_drvdata *ctidrv;
|
||||
struct cti_trig_con *tc;
|
||||
|
@ -599,7 +598,15 @@ void cti_remove_assoc_from_csdev(struct coresight_device *csdev)
|
|||
}
|
||||
mutex_unlock(&ect_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cti_remove_assoc_from_csdev);
|
||||
|
||||
/*
|
||||
* Operations to add and remove associated CTI.
|
||||
* Register to coresight core driver as call back function.
|
||||
*/
|
||||
static struct cti_assoc_op cti_assoc_ops = {
|
||||
.add = cti_add_assoc_to_csdev,
|
||||
.remove = cti_remove_assoc_from_csdev
|
||||
};
|
||||
|
||||
/*
|
||||
* Update the cross references where the associated device was found
|
||||
|
@ -956,4 +963,23 @@ static struct amba_driver cti_driver = {
|
|||
.probe = cti_probe,
|
||||
.id_table = cti_ids,
|
||||
};
|
||||
builtin_amba_driver(cti_driver);
|
||||
|
||||
static int __init cti_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = amba_driver_register(&cti_driver);
|
||||
if (ret)
|
||||
pr_info("Error registering cti driver\n");
|
||||
coresight_set_cti_ops(&cti_assoc_ops);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit cti_exit(void)
|
||||
{
|
||||
coresight_remove_cti_ops();
|
||||
amba_driver_unregister(&cti_driver);
|
||||
}
|
||||
|
||||
module_init(cti_init);
|
||||
module_exit(cti_exit);
|
||||
|
|
|
@ -173,15 +173,13 @@ static inline int etm_readl_cp14(u32 off, unsigned int *val) { return 0; }
|
|||
static inline int etm_writel_cp14(u32 off, u32 val) { return 0; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CORESIGHT_CTI
|
||||
extern void cti_add_assoc_to_csdev(struct coresight_device *csdev);
|
||||
extern void cti_remove_assoc_from_csdev(struct coresight_device *csdev);
|
||||
struct cti_assoc_op {
|
||||
void (*add)(struct coresight_device *csdev);
|
||||
void (*remove)(struct coresight_device *csdev);
|
||||
};
|
||||
|
||||
#else
|
||||
static inline void cti_add_assoc_to_csdev(struct coresight_device *csdev) {}
|
||||
static inline void
|
||||
cti_remove_assoc_from_csdev(struct coresight_device *csdev) {}
|
||||
#endif
|
||||
extern void coresight_set_cti_ops(const struct cti_assoc_op *cti_op);
|
||||
extern void coresight_remove_cti_ops(void);
|
||||
|
||||
/*
|
||||
* Macros and inline functions to handle CoreSight UCI data and driver
|
||||
|
|
|
@ -56,6 +56,20 @@ static struct list_head *stm_path;
|
|||
const u32 coresight_barrier_pkt[4] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
|
||||
EXPORT_SYMBOL_GPL(coresight_barrier_pkt);
|
||||
|
||||
static const struct cti_assoc_op *cti_assoc_ops;
|
||||
|
||||
void coresight_set_cti_ops(const struct cti_assoc_op *cti_op)
|
||||
{
|
||||
cti_assoc_ops = cti_op;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(coresight_set_cti_ops);
|
||||
|
||||
void coresight_remove_cti_ops(void)
|
||||
{
|
||||
cti_assoc_ops = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(coresight_remove_cti_ops);
|
||||
|
||||
static int coresight_id_match(struct device *dev, void *data)
|
||||
{
|
||||
int trace_id, i_trace_id;
|
||||
|
@ -1232,7 +1246,8 @@ static void coresight_device_release(struct device *dev)
|
|||
{
|
||||
struct coresight_device *csdev = to_coresight_device(dev);
|
||||
|
||||
cti_remove_assoc_from_csdev(csdev);
|
||||
if (cti_assoc_ops && cti_assoc_ops->remove)
|
||||
cti_assoc_ops->remove(csdev);
|
||||
fwnode_handle_put(csdev->dev.fwnode);
|
||||
kfree(csdev->refcnt);
|
||||
kfree(csdev);
|
||||
|
@ -1543,8 +1558,8 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
|
|||
ret = coresight_fixup_device_conns(csdev);
|
||||
if (!ret)
|
||||
ret = coresight_fixup_orphan_conns(csdev);
|
||||
if (!ret)
|
||||
cti_add_assoc_to_csdev(csdev);
|
||||
if (!ret && cti_assoc_ops && cti_assoc_ops->add)
|
||||
cti_assoc_ops->add(csdev);
|
||||
|
||||
mutex_unlock(&coresight_mutex);
|
||||
if (ret) {
|
||||
|
|
Loading…
Reference in New Issue