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,
        .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);
 
 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,