From cd5a2ae2079b281d754a3225477a6a29116b6c46 Mon Sep 17 00:00:00 2001 From: Raghavendra Kakarla Date: Mon, 18 Mar 2019 23:12:41 +0530 Subject: [PATCH] drivers: coresight: Add interrupt service routine for apss tgu Add the interrupt service routine for apss tgu to handle tgu interrupt. Change-Id: Ic0128e41ed7a8e837ebab12a28c744af85109bda Signed-off-by: Raghavendra Kakarla --- drivers/hwtracing/coresight/Makefile | 2 +- drivers/hwtracing/coresight/apss_tgu.c | 77 +++++++++++++++++++++ drivers/hwtracing/coresight/apss_tgu.h | 10 +++ drivers/hwtracing/coresight/coresight-tgu.c | 12 +++- include/soc/qcom/tgu.h | 15 ++++ include/trace/events/tgu.h | 33 +++++++++ 6 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 drivers/hwtracing/coresight/apss_tgu.c create mode 100644 drivers/hwtracing/coresight/apss_tgu.h create mode 100644 include/soc/qcom/tgu.h create mode 100644 include/trace/events/tgu.h diff --git a/drivers/hwtracing/coresight/Makefile b/drivers/hwtracing/coresight/Makefile index 086ac2cfc9a4..057ad4ffe43e 100644 --- a/drivers/hwtracing/coresight/Makefile +++ b/drivers/hwtracing/coresight/Makefile @@ -25,5 +25,5 @@ obj-$(CONFIG_CORESIGHT_HWEVENT) += coresight-hwevent.o obj-$(CONFIG_CORESIGHT_DUMMY) += coresight-dummy.o obj-$(CONFIG_CORESIGHT_REMOTE_ETM) += coresight-remote-etm.o obj-$(CONFIG_CORESIGHT_CSR) += coresight-csr.o -obj-$(CONFIG_CORESIGHT_TGU) += coresight-tgu.o +obj-$(CONFIG_CORESIGHT_TGU) += coresight-tgu.o apss_tgu.o obj-$(CONFIG_CORESIGHT_OST) += coresight-ost.o diff --git a/drivers/hwtracing/coresight/apss_tgu.c b/drivers/hwtracing/coresight/apss_tgu.c new file mode 100644 index 000000000000..66488d82a737 --- /dev/null +++ b/drivers/hwtracing/coresight/apss_tgu.c @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#define CREATE_TRACE_POINTS +#include "trace/events/tgu.h" +#include "apss_tgu.h" + +static struct tgu_test_notifier tgu_notify; +int register_tgu_notifier(struct tgu_test_notifier *tgu_test) +{ + tgu_notify.cb = tgu_test->cb; + return 0; +} +EXPORT_SYMBOL(register_tgu_notifier); + +int unregister_tgu_notifier(struct tgu_test_notifier *tgu_test) +{ + if (tgu_test->cb == tgu_notify.cb) + tgu_notify.cb = NULL; + return 0; +} +EXPORT_SYMBOL(unregister_tgu_notifier); + +static irqreturn_t tgu_irq_thread_handler(int irq, void *dev_id) +{ + if (tgu_notify.cb) + tgu_notify.cb(); + return IRQ_HANDLED; +} + +static irqreturn_t tgu_irq_handler(int irq, void *data) +{ + trace_tgu_interrupt(irq); + return IRQ_WAKE_THREAD; +} + +int register_interrupt_handler(struct device_node *node) +{ + int irq, ret, i, n; + + n = of_irq_count(node); + pr_debug("number of irqs == %d\n", n); + + for (i = 0; i < n; i++) { + irq = of_irq_get(node, i); + if (irq < 0) { + pr_err("Invalid IRQ for error fatal %u\n", irq); + return irq; + } + + ret = request_threaded_irq(irq, tgu_irq_handler, + tgu_irq_thread_handler, + IRQF_TRIGGER_RISING, "apps-tgu", NULL); + if (ret < 0) { + pr_err("Unable to register IRQ handler %d\n", irq); + return ret; + } + + ret = irq_set_irq_wake(irq, true); + if (ret < 0) { + pr_err("Unable to set as wakeup irq %d\n", irq); + return ret; + } + } + + return 0; +} diff --git a/drivers/hwtracing/coresight/apss_tgu.h b/drivers/hwtracing/coresight/apss_tgu.h new file mode 100644 index 000000000000..793840ea8354 --- /dev/null +++ b/drivers/hwtracing/coresight/apss_tgu.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + */ + +#ifndef __QCOM_APSS_TGU_H__ +#define __QCOM_APSS_TGU_H__ + +int register_interrupt_handler(struct device_node *node); +#endif /* __QCOM_APSS_TGU_H__ */ diff --git a/drivers/hwtracing/coresight/coresight-tgu.c b/drivers/hwtracing/coresight/coresight-tgu.c index bbd039e6439c..e1969b1d7fd7 100644 --- a/drivers/hwtracing/coresight/coresight-tgu.c +++ b/drivers/hwtracing/coresight/coresight-tgu.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017, 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017, 2019-2020 The Linux Foundation. All rights reserved. */ #include @@ -15,9 +15,11 @@ #include #include #include +#include #include #include "coresight-priv.h" +#include "apss_tgu.h" #define tgu_writel(drvdata, val, off) __raw_writel((val), drvdata->base + off) #define tgu_readl(drvdata, off) __raw_readl(drvdata->base + off) @@ -409,6 +411,7 @@ static int tgu_probe(struct amba_device *adev, const struct amba_id *id) struct coresight_platform_data *pdata; struct tgu_drvdata *drvdata; struct coresight_desc desc = { 0 }; + const char *name; desc.name = coresight_alloc_device_name(&tgu_devs, dev); if (!desc.name) @@ -496,6 +499,13 @@ static int tgu_probe(struct amba_device *adev, const struct amba_id *id) goto err; } + of_property_read_string(adev->dev.of_node, "coresight-name", &name); + if (!strcmp(name, "coresight-tgu-apss")) { + ret = register_interrupt_handler(adev->dev.of_node); + if (ret) + return ret; + } + pm_runtime_put(&adev->dev); dev_dbg(dev, "TGU initialized\n"); return 0; diff --git a/include/soc/qcom/tgu.h b/include/soc/qcom/tgu.h new file mode 100644 index 000000000000..200774d35d38 --- /dev/null +++ b/include/soc/qcom/tgu.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + */ + +#ifndef __QCOM_TGU_H__ +#define __QCOM_TGU_H__ + +struct tgu_test_notifier { + void (*cb)(void); +}; + +extern int register_tgu_notifier(struct tgu_test_notifier *tgu_test); +extern int unregister_tgu_notifier(struct tgu_test_notifier *tgu_test); +#endif /* __QCOM_MPM_H__ */ diff --git a/include/trace/events/tgu.h b/include/trace/events/tgu.h new file mode 100644 index 000000000000..0d965b881a61 --- /dev/null +++ b/include/trace/events/tgu.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM tgu + +#if !defined(_TRACE_TGU_) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_TGU_H_ + +#include + +TRACE_EVENT(tgu_interrupt, + + TP_PROTO(uint32_t irqs), + + TP_ARGS(irqs), + + TP_STRUCT__entry( + __field(uint32_t, irqs) + ), + + TP_fast_assign( + __entry->irqs = irqs; + ), + + TP_printk("irq:%u ", __entry->irqs) +); + +#endif +#define TRACE_INCLUDE_FILE tgu +#include