Message ID | 20200731064012.8076-24-tingwei@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | coresight: allow to build coresight as modules | expand |
On Fri, 31 Jul 2020 at 07:42, Tingwei Zhang <tingwei@codeaurora.org> wrote: > > From: Mian Yousaf Kaukab <ykaukab@suse.de> > > Make etr_catu_buf_ops static. Instead of directly accessing it in > etr_buf_ops[], add a function to let catu driver register the ops at > runtime. Break circular dependency between tmc-etr and catu drivers. > > Signed-off-by: Mian Yousaf Kaukab <ykaukab@suse.de> > Signed-off-by: Tingwei Zhang <tingwei@codeaurora.org> > --- > drivers/hwtracing/coresight/coresight-catu.c | 22 +++++++++++++++++-- > drivers/hwtracing/coresight/coresight-catu.h | 2 -- > .../hwtracing/coresight/coresight-tmc-etr.c | 15 +++++++++++-- > drivers/hwtracing/coresight/coresight-tmc.h | 3 +++ > 4 files changed, 36 insertions(+), 6 deletions(-) > > diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c > index 1801804a7762..47696a7d24a7 100644 > --- a/drivers/hwtracing/coresight/coresight-catu.c > +++ b/drivers/hwtracing/coresight/coresight-catu.c > @@ -358,7 +358,7 @@ static int catu_alloc_etr_buf(struct tmc_drvdata *tmc_drvdata, > return 0; > } > > -const struct etr_buf_operations etr_catu_buf_ops = { > +static const struct etr_buf_operations etr_catu_buf_ops = { > .alloc = catu_alloc_etr_buf, > .free = catu_free_etr_buf, > .sync = catu_sync_etr_buf, > @@ -582,4 +582,22 @@ static struct amba_driver catu_driver = { > .id_table = catu_ids, > }; > > -builtin_amba_driver(catu_driver); > +static int __init catu_init(void) > +{ > + int ret; > + > + ret = amba_driver_register(&catu_driver); > + if (ret) > + pr_info("Error registering catu driver\n"); > + tmc_etr_set_catu_ops(&etr_catu_buf_ops); > + return ret; > +} > + > +static void __exit catu_exit(void) > +{ > + tmc_etr_remove_catu_ops(); > + amba_driver_unregister(&catu_driver); > +} > + > +module_init(catu_init); > +module_exit(catu_exit); > diff --git a/drivers/hwtracing/coresight/coresight-catu.h b/drivers/hwtracing/coresight/coresight-catu.h > index 80ceee3c739c..6160c2d75a56 100644 > --- a/drivers/hwtracing/coresight/coresight-catu.h > +++ b/drivers/hwtracing/coresight/coresight-catu.h > @@ -108,6 +108,4 @@ static inline bool coresight_is_catu_device(struct coresight_device *csdev) > return true; > } > > -extern const struct etr_buf_operations etr_catu_buf_ops; > - > #endif > diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c > index ad991a37e2d2..714f9e867e5f 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c > +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c > @@ -794,10 +794,21 @@ static inline void tmc_etr_disable_catu(struct tmc_drvdata *drvdata) > static const struct etr_buf_operations *etr_buf_ops[] = { > [ETR_MODE_FLAT] = &etr_flat_buf_ops, > [ETR_MODE_ETR_SG] = &etr_sg_buf_ops, > - [ETR_MODE_CATU] = IS_ENABLED(CONFIG_CORESIGHT_CATU) > - ? &etr_catu_buf_ops : NULL, > + [ETR_MODE_CATU] = NULL, > }; > > +void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu) > +{ > + etr_buf_ops[ETR_MODE_CATU] = catu; > +} > +EXPORT_SYMBOL_GPL(tmc_etr_set_catu_ops); > + > +void tmc_etr_remove_catu_ops(void) > +{ > + etr_buf_ops[ETR_MODE_CATU] = NULL; > +} > +EXPORT_SYMBOL_GPL(tmc_etr_remove_catu_ops); > + > static inline int tmc_etr_mode_alloc_buf(int mode, > struct tmc_drvdata *drvdata, > struct etr_buf *etr_buf, int node, > diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h > index 6e8d2dc33d17..b91ec7dde7bc 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc.h > +++ b/drivers/hwtracing/coresight/coresight-tmc.h > @@ -326,4 +326,7 @@ tmc_sg_table_buf_size(struct tmc_sg_table *sg_table) > > struct coresight_device *tmc_etr_get_catu_device(struct tmc_drvdata *drvdata); > > +void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu); > +void tmc_etr_remove_catu_ops(void); > + > #endif > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > Reviewed by: Mike Leach <mike.leach@linaro.org> -- Mike Leach Principal Engineer, ARM Ltd. Manchester Design Centre. UK
diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c index 1801804a7762..47696a7d24a7 100644 --- a/drivers/hwtracing/coresight/coresight-catu.c +++ b/drivers/hwtracing/coresight/coresight-catu.c @@ -358,7 +358,7 @@ static int catu_alloc_etr_buf(struct tmc_drvdata *tmc_drvdata, return 0; } -const struct etr_buf_operations etr_catu_buf_ops = { +static const struct etr_buf_operations etr_catu_buf_ops = { .alloc = catu_alloc_etr_buf, .free = catu_free_etr_buf, .sync = catu_sync_etr_buf, @@ -582,4 +582,22 @@ static struct amba_driver catu_driver = { .id_table = catu_ids, }; -builtin_amba_driver(catu_driver); +static int __init catu_init(void) +{ + int ret; + + ret = amba_driver_register(&catu_driver); + if (ret) + pr_info("Error registering catu driver\n"); + tmc_etr_set_catu_ops(&etr_catu_buf_ops); + return ret; +} + +static void __exit catu_exit(void) +{ + tmc_etr_remove_catu_ops(); + amba_driver_unregister(&catu_driver); +} + +module_init(catu_init); +module_exit(catu_exit); diff --git a/drivers/hwtracing/coresight/coresight-catu.h b/drivers/hwtracing/coresight/coresight-catu.h index 80ceee3c739c..6160c2d75a56 100644 --- a/drivers/hwtracing/coresight/coresight-catu.h +++ b/drivers/hwtracing/coresight/coresight-catu.h @@ -108,6 +108,4 @@ static inline bool coresight_is_catu_device(struct coresight_device *csdev) return true; } -extern const struct etr_buf_operations etr_catu_buf_ops; - #endif diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index ad991a37e2d2..714f9e867e5f 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -794,10 +794,21 @@ static inline void tmc_etr_disable_catu(struct tmc_drvdata *drvdata) static const struct etr_buf_operations *etr_buf_ops[] = { [ETR_MODE_FLAT] = &etr_flat_buf_ops, [ETR_MODE_ETR_SG] = &etr_sg_buf_ops, - [ETR_MODE_CATU] = IS_ENABLED(CONFIG_CORESIGHT_CATU) - ? &etr_catu_buf_ops : NULL, + [ETR_MODE_CATU] = NULL, }; +void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu) +{ + etr_buf_ops[ETR_MODE_CATU] = catu; +} +EXPORT_SYMBOL_GPL(tmc_etr_set_catu_ops); + +void tmc_etr_remove_catu_ops(void) +{ + etr_buf_ops[ETR_MODE_CATU] = NULL; +} +EXPORT_SYMBOL_GPL(tmc_etr_remove_catu_ops); + static inline int tmc_etr_mode_alloc_buf(int mode, struct tmc_drvdata *drvdata, struct etr_buf *etr_buf, int node, diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h index 6e8d2dc33d17..b91ec7dde7bc 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.h +++ b/drivers/hwtracing/coresight/coresight-tmc.h @@ -326,4 +326,7 @@ tmc_sg_table_buf_size(struct tmc_sg_table *sg_table) struct coresight_device *tmc_etr_get_catu_device(struct tmc_drvdata *drvdata); +void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu); +void tmc_etr_remove_catu_ops(void); + #endif