From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CC5A2C43458 for ; Wed, 1 Jul 2026 05:56:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ZF33Hb636Zl3naXgxTQ5BQlQ0x23s56+TgTiHwtOpM8=; b=zbiNMRS+RhXdMABGYlqxYsOSuA f00Mek5MqDtIwW+kM768zWzHr5jp28sodzMW7CkUEvyAIRdC3+Ayf1YVvhCHNWaCeLxW+Np7JjZ8G cuJiA6/+lCStbHXSmsOFvUAI4nh/e+JxbVKzOvTZ4lvib/jw31prFTthjwkXVimeqoqFfTdMGPHtD xM/c3oWlvjY3t/XDCL7sW9mowE368Swa9+MIO5RMx23GLZLkXXwvAPKzZXl658UkFBRNYaeQH2Nkg pmBwG5f+X4W1mbyO/Y3Nv8NWDADtknqchOrqVAUCbS+ncysVwdVbler8OCvyueynwaioqWXS4p2Kn 0ZB5DtVg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wenvi-00000000kF0-3x6e; Wed, 01 Jul 2026 05:56:14 +0000 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wenvb-00000000kBJ-2aXh for linux-arm-kernel@lists.infradead.org; Wed, 01 Jul 2026 05:56:09 +0000 Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6615m4Fq126597 for ; Wed, 1 Jul 2026 05:56:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=ZF33Hb636Zl 3naXgxTQ5BQlQ0x23s56+TgTiHwtOpM8=; b=h74zCW4sFFTP69snC3btBmlpR5B psTJV43NgBT8Wf+g+zQvszDnW+/aFmWFmBQXDWyngZXSQJl65MI+sWSbio/GOTzK /dHXphIiynF5sz05OlgPQPJgdzLk4RPgATV0kfzidrXC+FRrkY4ezmtc5H/UwQ2G 8ndvWa+gjUdy/wN+G8iQeOal3Wva94FjedbjPTNp/Rrul48xuQ4h0hNQcFxjomW3 3cjkxmg6/R8hdxwOUS/nOadt9SZPhpxE0o8mxUEkfdd1gHSjJ003xRfHmIBNHXK0 EchQhUejuHjstBO5y6eftOMIYr83ZscQoa+tcvg8mWB7w2lTCCSAQ6tfm+g== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4f4fc0bk32-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 01 Jul 2026 05:56:06 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2c804e38c65so6312935ad.2 for ; Tue, 30 Jun 2026 22:56:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1782885365; x=1783490165; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZF33Hb636Zl3naXgxTQ5BQlQ0x23s56+TgTiHwtOpM8=; b=g9QybyKWPJNSR1YgDfWmnOawwiZSqGi7sQmJUZzoKOnFkIf79RSKYIzjrKNRnPgqgB UcFmadgbnxbOntzB0k8e8cA9hN7UK+LHA0srGK9xFhUP+0wlQspjfWSKWhOaYwVCdj6D qUkgoblSk9sxJS/2b1HnvTysx2rMVWMCl9jWL0Dr3V8fW3SsKkjtC0F8xQqUIAwEyUEJ YzOsuAM2HAV3ZYRqkkF7oHIm6D0fnHY+9XSlJpmNhrSarf3sHQ+wQUA8vsodjzMoliHU al53EXg9wsbQzSElaRfU3BW2lpyeOmjD24bHWdzuKIy+i7A1QW3J3PYsFcJ5TPJ5i3MH YrLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782885365; x=1783490165; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZF33Hb636Zl3naXgxTQ5BQlQ0x23s56+TgTiHwtOpM8=; b=iy/bM+ux7DKrf0UZQIvI/j6Zz7sbwk5R5RjVWRBwdAXs60/dLyaEYUkLK1BR8Lg29Z +/DNoRWOy6Rs+yEMaBslTjffPITPabI/VQXTSa689sAq5Oq7x0bCoc2ZPk3pR4QjjJkM QkpyJuUVtGFDbWgdLghZ+EfEqW1oe4Qj4rGjjRVv4D284cIPQsA/2w0PjHyI5l/EWGjh Js6V2ZEqBbWLpe4DtuEaO6KpeLB9o1gdk2xlETTAtms/JrljVcXwrBh8Up35IH8zk5t4 vqyTLC9Pv2Zet48hXCR7+75BYKtWWbnto+IOycNWBMBJwEXkTYriLcYgGWuKhAncYzTl /2rw== X-Forwarded-Encrypted: i=1; AHgh+RpzZA9bdVohDq/i4IN2N+sT6HzmWRf67UCO2kn989IFOZr7b1WpKucy2HK//AND9JatNnrYW2SL305ZU6mrN99x@lists.infradead.org X-Gm-Message-State: AOJu0Yx9IoEaXxtOH/321zIEqccBmVsYQfrGmzySOLPt31nX8WSqGAy8 X+QGK8n1PMf9Mhvc8EWgKBJJx3gdigL1WKqlo+YKBVjrH8dDUEKeaYd3+8fqBwQRCWrPPnkczyS w3bYpiW2WSfjyxNiTx826fztZLPyG7ZFcRl6IXJ71ihpqE+GK/EyBDrBP/dkDHT3az0xNnpD7sZ keHA== X-Gm-Gg: AfdE7cmb4Oyjs+lCdlEjj0Ry6+YdiXrHuIMF/racPItb36YwjtBiU3TdClRN/LuOhuo 4a5boAsWGyxpMHaLLB3TbVCSeLTByKScZrpZgMkoJdu9gdxumRa+Izejz0QBpLcjlm8L1dKWqBE CV7yfztfCF0lwOVNlciuJs++qzeySc0c5xjN+cBzkS8Z1neSwOdxC215GA5yIUBgVS3FKSeDpF0 OLH/KFF6BlR10tZKRnBZBlWjWg9wkza0/BObg2sM03ruovPB59gq2w8yqS/Nshnh9ZhpgNJsBtQ UJxmeCFAbG7PC13uX8dvj42PnKB2if7P8wUNOIwtEBJSMDcrzpd1HcmyB/QRjV/eFx/z913F02j SyyWrc5dM7YqVByCi1feRm7hBpiiE9TERJIRJXXZWSHPNENjl/yeTzVojcLtYAnj1aA== X-Received: by 2002:a17:903:1245:b0:2ca:f4d:eff0 with SMTP id d9443c01a7336-2ca7e675bbbmr4065095ad.7.1782885365471; Tue, 30 Jun 2026 22:56:05 -0700 (PDT) X-Received: by 2002:a17:903:1245:b0:2ca:f4d:eff0 with SMTP id d9443c01a7336-2ca7e675bbbmr4064905ad.7.1782885364929; Tue, 30 Jun 2026 22:56:04 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca382b5175sm25451645ad.63.2026.06.30.22.56.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 22:56:04 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org, Jie Gan Subject: [PATCH v15 2/7] qcom-tgu: Add TGU driver Date: Tue, 30 Jun 2026 22:55:24 -0700 Message-Id: <20260701055529.445819-3-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260701055529.445819-1-songwei.chai@oss.qualcomm.com> References: <20260701055529.445819-1-songwei.chai@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzAxMDA1OCBTYWx0ZWRfX5PSnN7dIBsIO TZO8oAUsOFsfCX12SE5850ZwMVHaxLoqqaa2DbRHZLZ1GIDN0+l0IC2GAEyGFFTLHmupjCSQFVB KANb0vMNsacglcIubE/LcB5t97lb2MgfsGxtcJtSQddrndbqkLhFi7RO4vDkrkU5MJly2zfjVdW lPz7kb5BNEpmxV6OC15Ul5GRPCmJeyFb6qexPtvJdizrG8kJc9mnzubiciO/CcN65uv/Ev2QyB+ nFkkmSXji8yJPK+gV4IyUoUO+a9qAGPRgYmtHjLuG2CRYMrCKTlsfxauHnOabeRyl8PgecP4sBX 334AG4ILN47+TI/xEGmJFK3E/ds5KlEvHw16tA9Ro9o5P7oJxEKjvgEHrUL2To9lySfBgi+QSrM TilyJ21D1RWHedun42WP9yRWTahbDKTxfO/dxu+IpjP5dQvee03gQ+h/7r6cATtGQ+qxwgADIRp V97tgY6bqdLW9jJ9swA== X-Proofpoint-GUID: bDId1h933vQopI5w-Wwr7F9USz01zNfj X-Proofpoint-ORIG-GUID: bDId1h933vQopI5w-Wwr7F9USz01zNfj X-Authority-Analysis: v=2.4 cv=Ivkutr/g c=1 sm=1 tr=0 ts=6a44abf6 cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=7CQSdrXTAAAA:8 a=VwQbUJbxAAAA:8 a=dBtDmtHw2wm7H2knD7gA:9 a=1OuFwYUASf3TG4hYMiVC:22 a=a-qgeE7W1pNrGK8U0ZQC:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzAxMDA1OCBTYWx0ZWRfX1lP/6XQxQabG bbsa/IIX/jNaL+aYizcdID9D9nlQY0ojlIwazRCt4bxLhUR0x/fcKgrkE+FpA5/d64M7yeta0FS g+G0xq5qBy6NJRVG+Z1kUjqs6bzSR24= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-07-01_01,2026-06-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 impostorscore=0 clxscore=1015 malwarescore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607010058 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260630_225607_896682_0824E337 X-CRM114-Status: GOOD ( 29.67 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add driver to support device TGU (Trigger Generation Unit). TGU is a Data Engine which can be utilized to sense a plurality of signals and create a trigger into the CTI or generate interrupts to processors. Add probe/enable/disable functions for tgu. Signed-off-by: Songwei Chai Acked-by: Konrad Dybcio Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 9 + MAINTAINERS | 11 + drivers/Makefile | 1 + drivers/hwtracing/Kconfig | 2 + drivers/hwtracing/qcom/Kconfig | 20 ++ drivers/hwtracing/qcom/Makefile | 3 + drivers/hwtracing/qcom/tgu.c | 193 ++++++++++++++++++ drivers/hwtracing/qcom/tgu.h | 51 +++++ 8 files changed, 290 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-bus-amba-devices-tgu create mode 100644 drivers/hwtracing/qcom/Kconfig create mode 100644 drivers/hwtracing/qcom/Makefile create mode 100644 drivers/hwtracing/qcom/tgu.c create mode 100644 drivers/hwtracing/qcom/tgu.h diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu new file mode 100644 index 000000000000..8eddcf3bb5fe --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -0,0 +1,9 @@ +What: /sys/bus/amba/devices//enable_tgu +Date: July 2026 +KernelVersion: 7.2 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the enable/disable status of TGU + Accepts only one of the 2 values - 0 or 1. + 0 : disable TGU. + 1 : enable TGU. diff --git a/MAINTAINERS b/MAINTAINERS index 15011f5752a9..d627c27d0592 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22358,6 +22358,17 @@ S: Maintained F: Documentation/tee/qtee.rst F: drivers/tee/qcomtee/ +QUALCOMM HARDWARETRACING DRIVER +M: Songwei Chai +M: Jie Gan +M: Suzuki K Poulose +L: linux-arm-msm@vger.kernel.org +S: Maintained +T: git git://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git +F: Documentation/ABI/testing/sysfs-bus-amba-devices-tgu +F: Documentation/devicetree/bindings/arm/qcom,tgu.yaml +F: drivers/hwtracing/qcom/ + QUALCOMM TRUST ZONE MEMORY ALLOCATOR M: Bartosz Golaszewski L: linux-arm-msm@vger.kernel.org diff --git a/drivers/Makefile b/drivers/Makefile index 0841ea851847..6a2cbe5b340f 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -176,6 +176,7 @@ obj-$(CONFIG_RAS) += ras/ obj-$(CONFIG_USB4) += thunderbolt/ obj-$(CONFIG_CORESIGHT) += hwtracing/coresight/ obj-y += hwtracing/intel_th/ +obj-y += hwtracing/qcom/ obj-$(CONFIG_STM) += hwtracing/stm/ obj-$(CONFIG_HISI_PTT) += hwtracing/ptt/ obj-y += android/ diff --git a/drivers/hwtracing/Kconfig b/drivers/hwtracing/Kconfig index 911ee977103c..8a640218eed8 100644 --- a/drivers/hwtracing/Kconfig +++ b/drivers/hwtracing/Kconfig @@ -7,4 +7,6 @@ source "drivers/hwtracing/intel_th/Kconfig" source "drivers/hwtracing/ptt/Kconfig" +source "drivers/hwtracing/qcom/Kconfig" + endmenu diff --git a/drivers/hwtracing/qcom/Kconfig b/drivers/hwtracing/qcom/Kconfig new file mode 100644 index 000000000000..5c94c75ffa39 --- /dev/null +++ b/drivers/hwtracing/qcom/Kconfig @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# QCOM specific hwtracing drivers +# +menu "Qualcomm specific hwtracing drivers" + +config QCOM_TGU + tristate "QCOM Trigger Generation Unit driver" + depends on ARCH_QCOM || COMPILE_TEST + depends on ARM_AMBA + help + This driver provides support for Trigger Generation Unit that is + used to detect patterns or sequences on a given set of signals. + TGU is used to monitor a particular bus within a given region to + detect illegal transaction sequences or slave responses. It is also + used to monitor a data stream to detect protocol violations and to + provide a trigger point for centering data around a specific event + within the trace data buffer. + +endmenu diff --git a/drivers/hwtracing/qcom/Makefile b/drivers/hwtracing/qcom/Makefile new file mode 100644 index 000000000000..5a0a868c1ea0 --- /dev/null +++ b/drivers/hwtracing/qcom/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_QCOM_TGU) += tgu.o diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c new file mode 100644 index 000000000000..49c8f710b931 --- /dev/null +++ b/drivers/hwtracing/qcom/tgu.c @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tgu.h" + +static void tgu_write_all_hw_regs(struct tgu_drvdata *drvdata) +{ + TGU_UNLOCK(drvdata->base); + /* Enable TGU to program the triggers */ + writel(1, drvdata->base + TGU_CONTROL); + TGU_LOCK(drvdata->base); +} + +static int tgu_enable(struct device *dev) +{ + struct tgu_drvdata *drvdata = dev_get_drvdata(dev); + + guard(spinlock)(&drvdata->lock); + drvdata->enabled = true; + + tgu_write_all_hw_regs(drvdata); + + return 0; +} + +static void tgu_do_disable(struct tgu_drvdata *drvdata) +{ + TGU_UNLOCK(drvdata->base); + writel(0, drvdata->base + TGU_CONTROL); + TGU_LOCK(drvdata->base); + + drvdata->enabled = false; +} + +static void tgu_disable(struct device *dev) +{ + struct tgu_drvdata *drvdata = dev_get_drvdata(dev); + + guard(spinlock)(&drvdata->lock); + if (!drvdata->enabled) + return; + + tgu_do_disable(drvdata); +} + +static ssize_t enable_tgu_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tgu_drvdata *drvdata = dev_get_drvdata(dev); + bool enabled; + + guard(spinlock)(&drvdata->lock); + enabled = drvdata->enabled; + + return sysfs_emit(buf, "%d\n", !!enabled); +} + +/* enable_tgu_store - Configure Trace and Gating Unit (TGU) triggers. */ +static ssize_t enable_tgu_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tgu_drvdata *drvdata = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret || val > 1) + return -EINVAL; + + if (val) { + scoped_guard(spinlock, &drvdata->lock) { + if (drvdata->enabled) + return -EBUSY; + } + + ret = pm_runtime_resume_and_get(dev); + if (ret) + return ret; + + ret = tgu_enable(dev); + if (ret) { + pm_runtime_put(dev); + return ret; + } + } else { + scoped_guard(spinlock, &drvdata->lock) { + if (!drvdata->enabled) + return -EINVAL; + } + + tgu_disable(dev); + pm_runtime_put(dev); + } + + return size; +} +static DEVICE_ATTR_RW(enable_tgu); + +static struct attribute *tgu_common_attrs[] = { + &dev_attr_enable_tgu.attr, + NULL, +}; + +static const struct attribute_group tgu_common_grp = { + .attrs = tgu_common_attrs, + NULL, +}; + +static const struct attribute_group *tgu_attr_groups[] = { + &tgu_common_grp, + NULL, +}; + +static int tgu_probe(struct amba_device *adev, const struct amba_id *id) +{ + struct device *dev = &adev->dev; + struct tgu_drvdata *drvdata; + int ret; + + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; + + drvdata->dev = &adev->dev; + dev_set_drvdata(dev, drvdata); + + drvdata->base = devm_ioremap_resource(dev, &adev->res); + if (IS_ERR(drvdata->base)) + return PTR_ERR(drvdata->base); + + spin_lock_init(&drvdata->lock); + + ret = sysfs_create_groups(&dev->kobj, tgu_attr_groups); + if (ret) { + dev_err(dev, "failed to create sysfs groups: %d\n", ret); + return ret; + } + + drvdata->enabled = false; + + pm_runtime_put(&adev->dev); + + return 0; +} + +static void tgu_remove(struct amba_device *adev) +{ + struct device *dev = &adev->dev; + + sysfs_remove_groups(&dev->kobj, tgu_attr_groups); + + tgu_disable(dev); +} + +static const struct amba_id tgu_ids[] = { + { + .id = 0x000f0e00, + .mask = 0x000fffff, + }, + { 0, 0, NULL }, +}; + +MODULE_DEVICE_TABLE(amba, tgu_ids); + +static struct amba_driver tgu_driver = { + .drv = { + .name = "qcom-tgu", + .suppress_bind_attrs = true, + }, + .probe = tgu_probe, + .remove = tgu_remove, + .id_table = tgu_ids, +}; + +module_amba_driver(tgu_driver); + +MODULE_AUTHOR("Songwei Chai "); +MODULE_AUTHOR("Jinlong Mao "); +MODULE_DESCRIPTION("Qualcomm Trigger Generation Unit driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/hwtracing/qcom/tgu.h b/drivers/hwtracing/qcom/tgu.h new file mode 100644 index 000000000000..dd7533b9d735 --- /dev/null +++ b/drivers/hwtracing/qcom/tgu.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#ifndef _QCOM_TGU_H +#define _QCOM_TGU_H + +/* Register addresses */ +#define TGU_CONTROL 0x0000 +#define TGU_LAR 0xfb0 +#define TGU_UNLOCK_OFFSET 0xc5acce55 + +static inline void TGU_LOCK(void __iomem *addr) +{ + do { + /* Wait for things to settle */ + mb(); + writel_relaxed(0x0, addr + TGU_LAR); + } while (0); +} + +static inline void TGU_UNLOCK(void __iomem *addr) +{ + do { + writel_relaxed(TGU_UNLOCK_OFFSET, addr + TGU_LAR); + /* Make sure everyone has seen this */ + mb(); + } while (0); +} + +/** + * struct tgu_drvdata - Data structure for a TGU (Trigger Generator Unit) + * @base: Memory-mapped base address of the TGU device + * @dev: Pointer to the associated device structure + * @lock: Spinlock for handling concurrent access to private data + * @enabled: Flag indicating whether the TGU device is enabled + * + * This structure defines the data associated with a TGU device, + * including its base address, device pointers, clock, spinlock for + * synchronization, trigger data pointers, maximum limits for various + * trigger-related parameters, and enable status. + */ +struct tgu_drvdata { + void __iomem *base; + struct device *dev; + spinlock_t lock; + bool enabled; +}; + +#endif -- 2.34.1