Merge "coresight: support etm tracing on remote processors"
diff --git a/Documentation/devicetree/bindings/coresight/coresight.txt b/Documentation/devicetree/bindings/coresight/coresight.txt
index 17ff3f0..737e262 100644
--- a/Documentation/devicetree/bindings/coresight/coresight.txt
+++ b/Documentation/devicetree/bindings/coresight/coresight.txt
@@ -22,10 +22,24 @@
"arm,coresight-cti" for coresight cti devices,
"qcom,coresight-hwevent" for coresight hardware event devices
"arm,coresight-fuse" for coresight fuse device,
-- reg : physical base address and length of the register set(s) of the component
-- reg-names : names corresponding to each reg property value. The reg-names that
- need to be used with corresponding compatible string for a coresight device
- are:
+ "qcom,coresight-audio-etm" for coresight audio etm trace device,
+ "qcom,coresight-modem-etm" for coresight modem etm trace device,
+ "qcom,coresight-wcn-etm" for coresight wireless etm trace device,
+ "qcom,coresight-rpm-etm" for coresight rpm etm trace device
+- reg : physical base address and length of the register set(s) of the component.
+ Not required for the following compatible strings:
+ - "qcom,coresight-audio-etm",
+ - "qcom,coresight-modem-etm",
+ - "qcom,coresight-wcn-etm",
+ - "qcom,coresight-rpm-etm"
+- reg-names : names corresponding to each reg property value.
+ Not required for the following compatible strings:
+ - "qcom,coresight-audio-etm",
+ - "qcom,coresight-modem-etm",
+ - "qcom,coresight-wcn-etm",
+ - "qcom,coresight-rpm-etm"
+ The reg-names that need to be used with corresponding compatible string
+ for a coresight device are:
- for coresight tmc-etr or tmc-etf device:
compatible : should be "arm,coresight-tmc"
reg-names : should be:
diff --git a/drivers/coresight/Kconfig b/drivers/coresight/Kconfig
index 5e2acfb..fc6df7b 100644
--- a/drivers/coresight/Kconfig
+++ b/drivers/coresight/Kconfig
@@ -151,6 +151,38 @@
If unsure, say 'N' here to avoid potential power penalty.
+config CORESIGHT_AUDIO_ETM
+ bool "Audio processor ETM trace support"
+ help
+ Enables support for ETM trace collection on audio processor using
+ CoreSight framework. Enabling this will allow turning on ETM tracing
+ on audio processor via sysfs by configuring the required CoreSight
+ components.
+
+config CORESIGHT_MODEM_ETM
+ bool "Modem processor ETM trace support"
+ help
+ Enables support for ETM trace collection on modem processor using
+ CoreSight framework. Enabling this will allow turning on ETM tracing
+ on modem processor via sysfs by configuring the required CoreSight
+ components.
+
+config CORESIGHT_WCN_ETM
+ bool "Wireless subsystem processor ETM trace support"
+ help
+ Enables support for ETM trace collection on wireless subsystem
+ processor using CoreSight framework. Enabling this will allow
+ turning on ETM tracing on wireless subsystem via sysfs by configuring
+ the required CoreSight components.
+
+config CORESIGHT_RPM_ETM
+ bool "RPM processor ETM trace support"
+ help
+ Enables support for ETM trace collection on RPM processor using
+ CoreSight framework. Enabling this will allow turning on ETM
+ tracing on RPM processor via sysfs by configuring the required
+ CoreSight components.
+
endif
config CORESIGHT_EVENT
diff --git a/drivers/coresight/Makefile b/drivers/coresight/Makefile
index 23352a7..9d93a6c 100644
--- a/drivers/coresight/Makefile
+++ b/drivers/coresight/Makefile
@@ -13,4 +13,8 @@
obj-$(CONFIG_CORESIGHT_STM) += coresight-stm.o
obj-$(CONFIG_CORESIGHT_HWEVENT) += coresight-hwevent.o
obj-$(CONFIG_CORESIGHT_ETM) += coresight-etm.o coresight-etm-cp14.o
+obj-$(CONFIG_CORESIGHT_AUDIO_ETM) += coresight-audio-etm.o
+obj-$(CONFIG_CORESIGHT_MODEM_ETM) += coresight-modem-etm.o
+obj-$(CONFIG_CORESIGHT_WCN_ETM) += coresight-wcn-etm.o
+obj-$(CONFIG_CORESIGHT_RPM_ETM) += coresight-rpm-etm.o
obj-$(CONFIG_CORESIGHT_EVENT) += coresight-event.o
diff --git a/drivers/coresight/coresight-audio-etm.c b/drivers/coresight/coresight-audio-etm.c
new file mode 100644
index 0000000..cdf44bf
--- /dev/null
+++ b/drivers/coresight/coresight-audio-etm.c
@@ -0,0 +1,132 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/sysfs.h>
+#include <linux/of_coresight.h>
+#include <linux/coresight.h>
+
+struct audio_etm_drvdata {
+ struct device *dev;
+ struct coresight_device *csdev;
+};
+
+static int audio_etm_enable(struct coresight_device *csdev)
+{
+ struct audio_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "Audio ETM tracing enabled\n");
+ return 0;
+}
+
+
+static void audio_etm_disable(struct coresight_device *csdev)
+{
+ struct audio_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "Audio ETM tracing disabled\n");
+}
+
+static const struct coresight_ops_source audio_etm_source_ops = {
+ .enable = audio_etm_enable,
+ .disable = audio_etm_disable,
+};
+
+static const struct coresight_ops audio_cs_ops = {
+ .source_ops = &audio_etm_source_ops,
+};
+
+static int audio_etm_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct coresight_platform_data *pdata;
+ struct audio_etm_drvdata *drvdata;
+ struct coresight_desc *desc;
+
+ if (pdev->dev.of_node) {
+ pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
+ if (IS_ERR(pdata))
+ return PTR_ERR(pdata);
+ pdev->dev.platform_data = pdata;
+ }
+
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+
+ drvdata->dev = &pdev->dev;
+ platform_set_drvdata(pdev, drvdata);
+
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+
+ desc->type = CORESIGHT_DEV_TYPE_SOURCE;
+ desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
+ desc->ops = &audio_cs_ops;
+ desc->pdata = pdev->dev.platform_data;
+ desc->dev = &pdev->dev;
+ desc->owner = THIS_MODULE;
+ drvdata->csdev = coresight_register(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
+
+ dev_info(dev, "Audio ETM initialized\n");
+ return 0;
+}
+
+static int audio_etm_remove(struct platform_device *pdev)
+{
+ struct audio_etm_drvdata *drvdata = platform_get_drvdata(pdev);
+
+ coresight_unregister(drvdata->csdev);
+ return 0;
+}
+
+static struct of_device_id audio_etm_match[] = {
+ {.compatible = "qcom,coresight-audio-etm"},
+ {}
+};
+
+static struct platform_driver audio_etm_driver = {
+ .probe = audio_etm_probe,
+ .remove = audio_etm_remove,
+ .driver = {
+ .name = "coresight-audio-etm",
+ .owner = THIS_MODULE,
+ .of_match_table = audio_etm_match,
+ },
+};
+
+int __init audio_etm_init(void)
+{
+ return platform_driver_register(&audio_etm_driver);
+}
+module_init(audio_etm_init);
+
+void __exit audio_etm_exit(void)
+{
+ platform_driver_unregister(&audio_etm_driver);
+}
+module_exit(audio_etm_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("CoreSight Audio ETM driver");
diff --git a/drivers/coresight/coresight-modem-etm.c b/drivers/coresight/coresight-modem-etm.c
new file mode 100644
index 0000000..4c8075c
--- /dev/null
+++ b/drivers/coresight/coresight-modem-etm.c
@@ -0,0 +1,132 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/sysfs.h>
+#include <linux/of_coresight.h>
+#include <linux/coresight.h>
+
+struct modem_etm_drvdata {
+ struct device *dev;
+ struct coresight_device *csdev;
+};
+
+static int modem_etm_enable(struct coresight_device *csdev)
+{
+ struct modem_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "Modem ETM tracing enabled\n");
+ return 0;
+}
+
+
+static void modem_etm_disable(struct coresight_device *csdev)
+{
+ struct modem_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "Modem ETM tracing disabled\n");
+}
+
+static const struct coresight_ops_source modem_etm_source_ops = {
+ .enable = modem_etm_enable,
+ .disable = modem_etm_disable,
+};
+
+static const struct coresight_ops modem_cs_ops = {
+ .source_ops = &modem_etm_source_ops,
+};
+
+static int modem_etm_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct coresight_platform_data *pdata;
+ struct modem_etm_drvdata *drvdata;
+ struct coresight_desc *desc;
+
+ if (pdev->dev.of_node) {
+ pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
+ if (IS_ERR(pdata))
+ return PTR_ERR(pdata);
+ pdev->dev.platform_data = pdata;
+ }
+
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+
+ drvdata->dev = &pdev->dev;
+ platform_set_drvdata(pdev, drvdata);
+
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+
+ desc->type = CORESIGHT_DEV_TYPE_SOURCE;
+ desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
+ desc->ops = &modem_cs_ops;
+ desc->pdata = pdev->dev.platform_data;
+ desc->dev = &pdev->dev;
+ desc->owner = THIS_MODULE;
+ drvdata->csdev = coresight_register(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
+
+ dev_info(dev, "Modem ETM initialized\n");
+ return 0;
+}
+
+static int modem_etm_remove(struct platform_device *pdev)
+{
+ struct modem_etm_drvdata *drvdata = platform_get_drvdata(pdev);
+
+ coresight_unregister(drvdata->csdev);
+ return 0;
+}
+
+static struct of_device_id modem_etm_match[] = {
+ {.compatible = "qcom,coresight-modem-etm"},
+ {}
+};
+
+static struct platform_driver modem_etm_driver = {
+ .probe = modem_etm_probe,
+ .remove = modem_etm_remove,
+ .driver = {
+ .name = "coresight-modem-etm",
+ .owner = THIS_MODULE,
+ .of_match_table = modem_etm_match,
+ },
+};
+
+int __init modem_etm_init(void)
+{
+ return platform_driver_register(&modem_etm_driver);
+}
+module_init(modem_etm_init);
+
+void __exit modem_etm_exit(void)
+{
+ platform_driver_unregister(&modem_etm_driver);
+}
+module_exit(modem_etm_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("CoreSight Modem ETM driver");
diff --git a/drivers/coresight/coresight-rpm-etm.c b/drivers/coresight/coresight-rpm-etm.c
new file mode 100644
index 0000000..e752e4f
--- /dev/null
+++ b/drivers/coresight/coresight-rpm-etm.c
@@ -0,0 +1,132 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/sysfs.h>
+#include <linux/of_coresight.h>
+#include <linux/coresight.h>
+
+struct rpm_etm_drvdata {
+ struct device *dev;
+ struct coresight_device *csdev;
+};
+
+static int rpm_etm_enable(struct coresight_device *csdev)
+{
+ struct rpm_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "RPM ETM tracing enabled\n");
+ return 0;
+}
+
+
+static void rpm_etm_disable(struct coresight_device *csdev)
+{
+ struct rpm_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "RPM ETM tracing disabled\n");
+}
+
+static const struct coresight_ops_source rpm_etm_source_ops = {
+ .enable = rpm_etm_enable,
+ .disable = rpm_etm_disable,
+};
+
+static const struct coresight_ops rpm_cs_ops = {
+ .source_ops = &rpm_etm_source_ops,
+};
+
+static int rpm_etm_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct coresight_platform_data *pdata;
+ struct rpm_etm_drvdata *drvdata;
+ struct coresight_desc *desc;
+
+ if (pdev->dev.of_node) {
+ pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
+ if (IS_ERR(pdata))
+ return PTR_ERR(pdata);
+ pdev->dev.platform_data = pdata;
+ }
+
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+
+ drvdata->dev = &pdev->dev;
+ platform_set_drvdata(pdev, drvdata);
+
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+
+ desc->type = CORESIGHT_DEV_TYPE_SOURCE;
+ desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
+ desc->ops = &rpm_cs_ops;
+ desc->pdata = pdev->dev.platform_data;
+ desc->dev = &pdev->dev;
+ desc->owner = THIS_MODULE;
+ drvdata->csdev = coresight_register(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
+
+ dev_info(dev, "RPM ETM initialized\n");
+ return 0;
+}
+
+static int rpm_etm_remove(struct platform_device *pdev)
+{
+ struct rpm_etm_drvdata *drvdata = platform_get_drvdata(pdev);
+
+ coresight_unregister(drvdata->csdev);
+ return 0;
+}
+
+static struct of_device_id rpm_etm_match[] = {
+ {.compatible = "qcom,coresight-rpm-etm"},
+ {}
+};
+
+static struct platform_driver rpm_etm_driver = {
+ .probe = rpm_etm_probe,
+ .remove = rpm_etm_remove,
+ .driver = {
+ .name = "coresight-rpm-etm",
+ .owner = THIS_MODULE,
+ .of_match_table = rpm_etm_match,
+ },
+};
+
+int __init rpm_etm_init(void)
+{
+ return platform_driver_register(&rpm_etm_driver);
+}
+module_init(rpm_etm_init);
+
+void __exit rpm_etm_exit(void)
+{
+ platform_driver_unregister(&rpm_etm_driver);
+}
+module_exit(rpm_etm_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("CoreSight RPM ETM driver");
diff --git a/drivers/coresight/coresight-wcn-etm.c b/drivers/coresight/coresight-wcn-etm.c
new file mode 100644
index 0000000..44852fb
--- /dev/null
+++ b/drivers/coresight/coresight-wcn-etm.c
@@ -0,0 +1,132 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/sysfs.h>
+#include <linux/of_coresight.h>
+#include <linux/coresight.h>
+
+struct wcn_etm_drvdata {
+ struct device *dev;
+ struct coresight_device *csdev;
+};
+
+static int wcn_etm_enable(struct coresight_device *csdev)
+{
+ struct wcn_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "Wireless ETM tracing enabled\n");
+ return 0;
+}
+
+
+static void wcn_etm_disable(struct coresight_device *csdev)
+{
+ struct wcn_etm_drvdata *drvdata =
+ dev_get_drvdata(csdev->dev.parent);
+
+ dev_info(drvdata->dev, "Wireless ETM tracing disabled\n");
+}
+
+static const struct coresight_ops_source wcn_etm_source_ops = {
+ .enable = wcn_etm_enable,
+ .disable = wcn_etm_disable,
+};
+
+static const struct coresight_ops wcn_cs_ops = {
+ .source_ops = &wcn_etm_source_ops,
+};
+
+static int wcn_etm_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct coresight_platform_data *pdata;
+ struct wcn_etm_drvdata *drvdata;
+ struct coresight_desc *desc;
+
+ if (pdev->dev.of_node) {
+ pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
+ if (IS_ERR(pdata))
+ return PTR_ERR(pdata);
+ pdev->dev.platform_data = pdata;
+ }
+
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+
+ drvdata->dev = &pdev->dev;
+ platform_set_drvdata(pdev, drvdata);
+
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+
+ desc->type = CORESIGHT_DEV_TYPE_SOURCE;
+ desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
+ desc->ops = &wcn_cs_ops;
+ desc->pdata = pdev->dev.platform_data;
+ desc->dev = &pdev->dev;
+ desc->owner = THIS_MODULE;
+ drvdata->csdev = coresight_register(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
+
+ dev_info(dev, "Wireless ETM initialized\n");
+ return 0;
+}
+
+static int wcn_etm_remove(struct platform_device *pdev)
+{
+ struct wcn_etm_drvdata *drvdata = platform_get_drvdata(pdev);
+
+ coresight_unregister(drvdata->csdev);
+ return 0;
+}
+
+static struct of_device_id wcn_etm_match[] = {
+ {.compatible = "qcom,coresight-wcn-etm"},
+ {}
+};
+
+static struct platform_driver wcn_etm_driver = {
+ .probe = wcn_etm_probe,
+ .remove = wcn_etm_remove,
+ .driver = {
+ .name = "coresight-wcn-etm",
+ .owner = THIS_MODULE,
+ .of_match_table = wcn_etm_match,
+ },
+};
+
+int __init wcn_etm_init(void)
+{
+ return platform_driver_register(&wcn_etm_driver);
+}
+module_init(wcn_etm_init);
+
+void __exit wcn_etm_exit(void)
+{
+ platform_driver_unregister(&wcn_etm_driver);
+}
+module_exit(wcn_etm_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("CoreSight Wireless ETM driver");