From nobody Mon Feb 9 03:58:26 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 529FE34D38E for ; Wed, 4 Feb 2026 10:46:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770201993; cv=none; b=a7ZuHXL9xhY4NMzfm6H0f/1/lI0JIOylaw6/1gl5AMEXoFZdneSIyq+tyqsrDUF596pZFaNOpRyJ8al8cBh+5lU/HkB69LKMk4SR+xGmuGzDj19N23l19K7YrgpuWVJ28UtxvwW3/OcPJn1KE4QPV5s+RiY+46jRMWYZ1How/GY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770201993; c=relaxed/simple; bh=mR6BSrW+zsMLOgB3nmVKaVeyLCCni/ENpyrJWNEK1fY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W2Bddi4Gn6I6wA1ub8vXIHfw0J4YQCg7+QlcY8slf6P/03W4mNnn6BPV4NiEvDVpnRQarOYu04SZjto4thdnpZUZcO1mkAGpDosKnWo1A7X7ZH+ZQxbCQN+ku73pdPzPn2UFyXCdLPxu46HO/c00t8YB9vC6JNbi7BE5i0Mxirc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=gMNNtMcJ; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="gMNNtMcJ" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-432d28870ddso378490f8f.3 for ; Wed, 04 Feb 2026 02:46:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1770201991; x=1770806791; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=XEZbxkJY9ZU1Tc423Ie+q0rVVq/sIXdy5gBvyplyZ7M=; b=gMNNtMcJIYZIZu7eQU++J1PzGHETutljiHFxtYl5FTl8Dgncs2qPVB1WiCE30USPLP ttROWMBC1qPwxWge6HL7WnA56DM3loseUO/L8hb4Jzh7YGLiEBzfYvSDphb4yyzFubGX yVcuJDZnSJOKAVJhFJxo3V7paqFboZ/ldf8+hYwJJh5z7aT3SUIGqhz6xIbnPd4rm4wP g2tyon9HQDrrVL0AP6liAtcp/i+WB+MzIGZlPpcVgB4/kq5AfVaH1mOWzvfyfJSuhLkG 6KLwH8yxtrEAYkHzDwhS1TNvZKFtX+lfsEpliPhenUNbntxusHO5gByFom/dFgTgJnSw L7aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770201991; x=1770806791; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=XEZbxkJY9ZU1Tc423Ie+q0rVVq/sIXdy5gBvyplyZ7M=; b=KIzJkOBjzawvCQHfIeP2F5pNWnzKA3e6hTUro5rZfzs0HqdWvaC+oQC8JDyALAfZ0s lxtEO2YsM4TI+TzPv27ExUaDT7DgjM2dD222Q7PqwpXGFvy79Nj7EC0i/bJLi01GwoqU AzIj9QheX+wRkmE89Gd3RHO5/81JunfKuJThvh4V9SiUvASbHFxRckNFJYPe2loXoPW7 xPw4aQ5WM6m76dHbt3HqyWwjInSKMf/Eonir9cyJcl3s7NfbPlAkDPH7CaYm6eyt4kGw QcJJEl3LdnAWdhrsQ9h1W74XGfBFxf4nDYL5Uu2GN7/mbc+JqrD3urgCAsVxXjLiVjS7 3VQg== X-Forwarded-Encrypted: i=1; AJvYcCV9aZfbCCgzx4UxtVcHU6AHstHGe3Ymc35ZyJCkVcA5jRK4ULTkdvjOBjLPEVtRyOf4MpyZuPOXb2K/zDI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxj2xoWf1/T4d0PZwHjJ5eZGWu7gkvuuMDE8LFCixBls131np70 QemK4dqIRG6+Uc8zu9FkrTK59WU5pIkRI4QL0J7hkTrW1DJfm/64PoeGzvQGfZaRIIw= X-Gm-Gg: AZuq6aLGSdE3LZ8UOzNd5MIb84j7v4sbR/E5ob0L+l7t+8jbx/WMX00iz4HChfeKHac hU53gnfE9buzWkwjklBokRWJSnY3lbANbsL0uBIiEhp2+Ds9k1P12XDsU4PEy2gjhdG6dJbFgHA g/An6A+D5xqlv5CefzinnwCvGKEY3dFVWi/AGAseohut+Cb0+21QF/I06bNVAgbBqUHG3tRHYx9 TrYSM9jNBJ1K8LrYmP44wT+Y0phojItEpyn7BxUCxeYUVlV0IG9D5XjVU70q83V4buSRWUku67V 8tDfNlQFXQ2+w1Rvt1hhBBxMO9y1//RtzmIqswTcDb9Ej1gk3G1+32F6WnwW+eqNLs/44aQ/Crk EDYdGNUfxjD99y7SYjxFcFiGsCbRlrru0Vq2H/iwa5J6fnSaa0J2GivE+eSbyrjrG59wM3kl6QA SnX6SbRV9V X-Received: by 2002:a05:6000:420e:b0:430:96bd:411b with SMTP id ffacd0b85a97d-4361806159amr3394066f8f.58.1770201990723; Wed, 04 Feb 2026 02:46:30 -0800 (PST) Received: from localhost ([2001:4090:a244:872b:a354:65f3:92a0:8de7]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-436180659b8sm5097742f8f.43.2026.02.04.02.46.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Feb 2026 02:46:30 -0800 (PST) From: "Markus Schneider-Pargmann (TI.com)" Date: Wed, 04 Feb 2026 11:45:48 +0100 Subject: [PATCH v3 1/3] clocksource/drivers/timer-ti-dm: Fix property name in comment Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260204-topic-ti-dm-clkevt-v6-16-v3-1-83e65d01f4ae@baylibre.com> References: <20260204-topic-ti-dm-clkevt-v6-16-v3-0-83e65d01f4ae@baylibre.com> In-Reply-To: <20260204-topic-ti-dm-clkevt-v6-16-v3-0-83e65d01f4ae@baylibre.com> To: Daniel Lezcano , Thomas Gleixner Cc: Vishal Mahaveer , Kevin Hilman , Dhruva Gole , Sebin Francis , Kendall Willis , Akashdeep Kaur , linux-kernel@vger.kernel.org, "Markus Schneider-Pargmann (TI.com)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1234; i=msp@baylibre.com; h=from:subject:message-id; bh=mR6BSrW+zsMLOgB3nmVKaVeyLCCni/ENpyrJWNEK1fY=; b=owGbwMvMwCXWejAsc4KoVzDjabUkhsxm5dIjTH8YPxhobwlZsDBnudXt+c2lJY7buldql0lfZ VEW0pzdUcrCIMbFICumyNKZGJr2X37nseRFyzbDzGFlAhnCwMUpABOZ+JeRYf21OzsNd8l8Xy/X 3XtExlSs/SFbugHvUuHeyg8far/tTWT4w+Ho57Tfipd7+eaWFV8V0/cFbGp+I/WXd4rClkCejXv dOAA= X-Developer-Key: i=msp@baylibre.com; a=openpgp; fpr=BADD88DB889FDC3E8A3D5FE612FA6A01E0A45B41 ti,always-on property doesn't exist. ti,timer-alwon is meant here. Fix this minor bug in the comment. Signed-off-by: Markus Schneider-Pargmann (TI.com) --- drivers/clocksource/timer-ti-dm-systimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clocksource/timer-ti-dm-systimer.c b/drivers/clocksour= ce/timer-ti-dm-systimer.c index 985a6d08512b42f499b3e243eb69cc9674bc8e53..fb0a3cc23b5a35e2906a253d36c= cef2baccca50a 100644 --- a/drivers/clocksource/timer-ti-dm-systimer.c +++ b/drivers/clocksource/timer-ti-dm-systimer.c @@ -226,7 +226,7 @@ static bool __init dmtimer_is_preferred(struct device_n= ode *np) * Some omap3 boards with unreliable oscillator must not use the counter_3= 2k * or dmtimer1 with 32 KiHz source. Additionally, the boards with unreliab= le * oscillator should really set counter_32k as disabled, and delete dmtime= r1 - * ti,always-on property, but let's not count on it. For these quirky case= s, + * ti,timer-alwon property, but let's not count on it. For these quirky ca= ses, * we prefer using the always-on secure dmtimer12 with the internal 32 KiHz * clock as the clocksource, and any available dmtimer as clockevent. * --=20 2.51.0 From nobody Mon Feb 9 03:58:26 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DEBF3B8BC8 for ; Wed, 4 Feb 2026 10:46:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770201994; cv=none; b=YUMHshL00B7rKkaUwQC8rHFF8XrYZho+Ln1MS/O8c2yPjaTnxEnznxi6FoolGmL7ojbtFQZY9T9BGBnYMQ3zoqL9jPZZRj6FifBtmKly9IAMKpIMWSxoaMnG5RJjFPJSapDA0tK5EjvF+Gl7fQ9IvdNumLw5WjF5PDBt44A8fCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770201994; c=relaxed/simple; bh=hpHbTPPVE8C6Ps+8cGeMo+DVuRmwITWvK35+UamG6as=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S4Z978ujimpkQkEpYveasMmjgJL366+rG5L8ZOrdM7q4EFfX0Veo4of3VmTWuWaO+2I4ypx1//qYVAqYMq2pSv9Df3Gl5VbyznMHsxgFGOEL7U9GIbfy0Qn3EdK9qv8T6DNsu+BYtxNWxQi7Gwzz002gJgzOZ7bA9rWwTk43zpI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=ZcQ2Zbf8; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="ZcQ2Zbf8" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-482f454be5bso6195745e9.0 for ; Wed, 04 Feb 2026 02:46:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1770201992; x=1770806792; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=IPuW6YZyhCu6SpjrbuRbonH50VFDuevJC4xYp0LKfJ0=; b=ZcQ2Zbf8Oj9uzM7aytsRS+g77Ka9Ih2zz4cmc3WLWNP8iLhZEx+z6opZkwL3kClmi0 Tc455tzoKIL3OU5Ss4tU2wRAIFE5cFqvT+6WEcoaDlD7hblHIZ6KuBARQExgOI8+Qmuk 7g7DR0Gw342PNrCJKBlk/qM057Rlv8YoeL0didm0lB5PNvzcre/NUtKlSWowkc5erOrF 9n/aMkldFUy4fVZ0OCQQHgrxF3PYlfN4D2QnlsbBx+7gWEF44qh2usJOd10F2Z8cKWgq 7BSWUxc6uEf0o1R1x4dmweG39Pxx5P09NJY2v794aoDuRaX6cRcU9uOQCm0WmwokWI2Z j6EQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770201992; x=1770806792; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=IPuW6YZyhCu6SpjrbuRbonH50VFDuevJC4xYp0LKfJ0=; b=S+I79aKLdmTA2dobirfnpTiTrkKY7e2nfQAv42BkgERuXTqr5C8bclJm1+jBMKd86W WZmwfESYYih72CVnRzN7dnTxszA4n4MaiJfwGInVVn2+KB53pEnm9bsxj929NhLwnRlb YHB1ZshYqk21i3h5gFM0tl6pmKHghAdNuDZvd2u4QC/G+hMX53CyKuxwzXkgdUHmkXix qT8o58GRyNlH+RUpFniOjdmmukS2xfqfCp3oudohOA/LNQ39hFTXAk+OB7kQSbQzJuaz bvfgLhKFCLQc1cGMuKBXbveBeBiWotRI2y53j9u86viUAoOLw7QkcRGoyiciIuXAqmaU Wj1Q== X-Forwarded-Encrypted: i=1; AJvYcCU1C/Y7OcUbyjvD8CobLqXQVG0udTihbDF58loNz3SX0XAgTbw2T6LYO4fNcbM0zRKg7COs08MdxuwW4IQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yymiac+QU/kCa2ZD6yhh/uil0qYEMF3Xa6Qez6gr1S3PP+UeQka peiJ0LeA0HS8iSc1y3qdd6wxVAzvbjVFWtK3aqQl6tQGwDgU+g1CpdN33bTpIECpcDI= X-Gm-Gg: AZuq6aKRvqkUUQaB2ZYJldrRnIk7t67Hqk6Az75UEQjjVroRX+VtucFUwYUFeff9vL/ 248dqCv6FJANlT5Qdm4kZX5PV15Z/xjotBi5lS0R7jn+b3X4FJu402BjQH1uulCe1MdoMshxHAv Glk3oWmISg9VXhRJFuCSif+n4ElaGzliFbeNIu5GL6SkH+iWWkQygzHfmP9hf8/uBBW0weOKmEN xmP3UcT6OTPUo3W4nHa0XOAKCSebPlNdqAtAEITP9oiCiSKLgoS9oPNmqLm0nrSAUCly/YYKTv3 OkYnm2DjWf1dl4A55jBz+jDahdl0OJ2etOs8sR7a+FmnrJ7o9vYb4AHAFB0aZRTrH5gAjAmdT8+ nZs3Bnr9fhBIBQg6/nefUfvdqw+6Ot6fACx8ayDtEBQRu2F1OPCk+UNIZ5Gx7CLlnwAzBGh4140 aG/DR8Y+3J X-Received: by 2002:a05:600c:6209:b0:479:13e9:3d64 with SMTP id 5b1f17b1804b1-4830eb6540dmr30504235e9.15.1770201992495; Wed, 04 Feb 2026 02:46:32 -0800 (PST) Received: from localhost ([2001:4090:a244:872b:a354:65f3:92a0:8de7]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4830ec10011sm26516805e9.0.2026.02.04.02.46.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Feb 2026 02:46:31 -0800 (PST) From: "Markus Schneider-Pargmann (TI.com)" Date: Wed, 04 Feb 2026 11:45:49 +0100 Subject: [PATCH v3 2/3] clocksource/drivers/timer-ti-dm: Add clocksource support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260204-topic-ti-dm-clkevt-v6-16-v3-2-83e65d01f4ae@baylibre.com> References: <20260204-topic-ti-dm-clkevt-v6-16-v3-0-83e65d01f4ae@baylibre.com> In-Reply-To: <20260204-topic-ti-dm-clkevt-v6-16-v3-0-83e65d01f4ae@baylibre.com> To: Daniel Lezcano , Thomas Gleixner Cc: Vishal Mahaveer , Kevin Hilman , Dhruva Gole , Sebin Francis , Kendall Willis , Akashdeep Kaur , linux-kernel@vger.kernel.org, "Markus Schneider-Pargmann (TI.com)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6133; i=msp@baylibre.com; h=from:subject:message-id; bh=hpHbTPPVE8C6Ps+8cGeMo+DVuRmwITWvK35+UamG6as=; b=owGbwMvMwCXWejAsc4KoVzDjabUkhsxm5SpHrqkdu9TuTTomHfbtb5VB08yHgVNvC3wKtW303 2DRXfKmo5SFQYyLQVZMkaUzMTTtv/zOY8mLlm2GmcPKBDKEgYtTACbyVYeR4Wk1q/+LIm7f37Nr Hna0VPW4TFY9xdMa7XyeuTj2q+vfY4wM83pdm49e6WvnTxUO3M91TTG1yEBrJp8jq+Fp45SSQ/w MAA== X-Developer-Key: i=msp@baylibre.com; a=openpgp; fpr=BADD88DB889FDC3E8A3D5FE612FA6A01E0A45B41 Add support for using the TI Dual-Mode Timer as a clocksource. The driver automatically picks the first timer that is marked as always-on on with the "ti,timer-alwon" property to be the clocksource. The timer can then be used for CPU independent time keeping. Signed-off-by: Markus Schneider-Pargmann (TI.com) --- drivers/clocksource/timer-ti-dm.c | 137 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 137 insertions(+) diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-= ti-dm.c index 793e7cdcb1b16b58db3a81668e3c8144efc7baaf..75f38394e2598d76c41dd2b250c= 0c42f9f48bbe0 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -20,6 +20,7 @@ =20 #include #include +#include #include #include #include @@ -27,8 +28,10 @@ #include #include #include +#include #include #include +#include =20 #include #include @@ -148,6 +151,15 @@ static u32 omap_reserved_systimers; static LIST_HEAD(omap_timer_list); static DEFINE_SPINLOCK(dm_timer_lock); =20 +struct dmtimer_clocksource { + struct clocksource dev; + struct dmtimer *timer; + unsigned int loadval; +}; + +static resource_size_t omap_dm_timer_clocksource_base; +static void __iomem *omap_dm_timer_sched_clock_counter; + enum { REQUEST_ANY =3D 0, REQUEST_BY_ID, @@ -1185,6 +1197,117 @@ static const struct dev_pm_ops omap_dm_timer_pm_ops= =3D { =20 static const struct of_device_id omap_timer_match[]; =20 +static void omap_dm_timer_find_alwon(void) +{ + struct device_node *np; + + for_each_matching_node(np, omap_timer_match) { + struct resource res; + + if (!of_device_is_available(np)) + continue; + + if (!of_property_read_bool(np, "ti,timer-alwon")) + continue; + + if (of_address_to_resource(np, 0, &res)) + continue; + + omap_dm_timer_clocksource_base =3D res.start; + + of_node_put(np); + return; + } + + omap_dm_timer_clocksource_base =3D RESOURCE_SIZE_MAX; +} + +static struct dmtimer_clocksource *omap_dm_timer_to_clocksource(struct clo= cksource *cs) +{ + return container_of(cs, struct dmtimer_clocksource, dev); +} + +static u64 omap_dm_timer_read_cycles(struct clocksource *cs) +{ + struct dmtimer_clocksource *clksrc =3D omap_dm_timer_to_clocksource(cs); + struct dmtimer *timer =3D clksrc->timer; + + return (u64)__omap_dm_timer_read_counter(timer); +} + +static u64 notrace omap_dm_timer_read_sched_clock(void) +{ + /* Posted mode is not active here, so we can read directly */ + return readl_relaxed(omap_dm_timer_sched_clock_counter); +} + +static void omap_dm_timer_clocksource_suspend(struct clocksource *cs) +{ + struct dmtimer_clocksource *clksrc =3D omap_dm_timer_to_clocksource(cs); + struct dmtimer *timer =3D clksrc->timer; + + clksrc->loadval =3D __omap_dm_timer_read_counter(timer); + __omap_dm_timer_stop(timer); +} + +static void omap_dm_timer_clocksource_resume(struct clocksource *cs) +{ + struct dmtimer_clocksource *clksrc =3D omap_dm_timer_to_clocksource(cs); + struct dmtimer *timer =3D clksrc->timer; + + dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, clksrc->loadval); + dmtimer_write(timer, OMAP_TIMER_CTRL_REG, OMAP_TIMER_CTRL_ST | OMAP_TIMER= _CTRL_AR); +} + +static void omap_dm_timer_clocksource_unregister(void *data) +{ + struct clocksource *cs =3D data; + + clocksource_unregister(cs); +} + +static int omap_dm_timer_setup_clocksource(struct dmtimer *timer) +{ + struct device *dev =3D &timer->pdev->dev; + struct dmtimer_clocksource *clksrc; + int err; + + __omap_dm_timer_init_regs(timer); + + timer->reserved =3D 1; + + clksrc =3D devm_kzalloc(dev, sizeof(*clksrc), GFP_KERNEL); + if (!clksrc) + return -ENOMEM; + + clksrc->timer =3D timer; + + clksrc->dev.name =3D "omap_dm_timer"; + clksrc->dev.rating =3D 300; + clksrc->dev.read =3D omap_dm_timer_read_cycles; + clksrc->dev.mask =3D CLOCKSOURCE_MASK(32); + clksrc->dev.flags =3D CLOCK_SOURCE_IS_CONTINUOUS; + clksrc->dev.suspend =3D omap_dm_timer_clocksource_suspend; + clksrc->dev.resume =3D omap_dm_timer_clocksource_resume; + + dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, 0); + dmtimer_write(timer, OMAP_TIMER_LOAD_REG, 0); + dmtimer_write(timer, OMAP_TIMER_CTRL_REG, OMAP_TIMER_CTRL_ST | OMAP_TIMER= _CTRL_AR); + + omap_dm_timer_sched_clock_counter =3D timer->func_base + _OMAP_TIMER_COUN= TER_OFFSET; + sched_clock_register(omap_dm_timer_read_sched_clock, 32, timer->fclk_rate= ); + + err =3D clocksource_register_hz(&clksrc->dev, timer->fclk_rate); + if (err) + return dev_err_probe(dev, err, "Could not register as clocksource\n"); + + err =3D devm_add_action_or_reset(dev, omap_dm_timer_clocksource_unregiste= r, &clksrc->dev); + if (err) + return dev_err_probe(dev, err, "Could not register clocksource_unregiste= r action\n"); + + return 0; +} + /** * omap_dm_timer_probe - probe function called for every registered device * @pdev: pointer to current timer platform device @@ -1198,8 +1321,12 @@ static int omap_dm_timer_probe(struct platform_devic= e *pdev) struct dmtimer *timer; struct device *dev =3D &pdev->dev; const struct dmtimer_platform_data *pdata; + struct resource *res; int ret; =20 + if (!omap_dm_timer_clocksource_base) + omap_dm_timer_find_alwon(); + pdata =3D of_device_get_match_data(dev); if (!pdata) pdata =3D dev_get_platdata(dev); @@ -1272,6 +1399,16 @@ static int omap_dm_timer_probe(struct platform_devic= e *pdev) =20 timer->pdev =3D pdev; =20 + res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); + + if (omap_dm_timer_clocksource_base && res && + res->start =3D=3D omap_dm_timer_clocksource_base && + !IS_ERR_OR_NULL(timer->fclk)) { + ret =3D omap_dm_timer_setup_clocksource(timer); + if (ret) + return ret; + } + pm_runtime_enable(dev); =20 if (!timer->reserved) { --=20 2.51.0 From nobody Mon Feb 9 03:58:26 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EEBE3E8C67 for ; Wed, 4 Feb 2026 10:46:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770201995; cv=none; b=igpF/mnCvF8j4oJ87mfyud8iPycclWtaQgUSsNzHcI7Yk6qAKvYLmXAbTz/OQyMnY8lEXElitHenPlr7BHtEOKqJs3uubQUwdQgPTXu8lnNaItROiPwiG+ttZ3izjPg+3ekvMUcBTgrgdQoA0pYfkEfcIX7D+82oH1IDZ5Tnscg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770201995; c=relaxed/simple; bh=AwrZ7YchVUGyPsayvgx8rDE/q1Muq6y6xR4ixvM0rbw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=luMeSCy2VaRe4ENhvYETBuQhier4w375mq/Xn9ReTDGNqOCArwWhuT2yBVW/cjrKPEBVMB+2CPAL1WDx8OJw+jgpfPICXksS2mlh2CMIfRsElLpRGOTSB6lPoJPUpdEBU6T+GKLaRF+MZsWmMQ1mqd3rSdSM5f45hpNAx5C2ekQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=uJUA4iBW; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="uJUA4iBW" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-47f5c2283b6so53618765e9.1 for ; Wed, 04 Feb 2026 02:46:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1770201994; x=1770806794; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=dHH1SSZ1LxnwJw8U4uy1VexmZu4MZlyD0SY5kYnp17U=; b=uJUA4iBWHNDDFmTcIDIVPLsNS3rLcLtKmXmOdG1zesJ39vbKPGsLYE5RVcVNwiBskV P2PnnitcZzqagrkJUatYqIsoAf46G2yDO1c7YWUME12nUYBsryitPOR1SVuVrX7DUp6w m5BU8hoQjxrOP0ateWRZq8JbpLmlwsG9O7xRB9jD0I5Fl+3gx6hVDC+KtsgFeZTFoUw9 Vvv6W912nO2tFwwOkrbT3GP+AMcFKjh7xUNogUlFespw5GA/jCE10t42tCkwerFMmVhr Lk2BSq+/Cwz52or8hKVK4UAqaz3bqFygblIvy+H2NeAKFGaT5bt0ocOg1yBx7KGTxCg2 dyNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770201994; x=1770806794; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=dHH1SSZ1LxnwJw8U4uy1VexmZu4MZlyD0SY5kYnp17U=; b=mGZwCfe9PyBo+Q7SQBUyCaYkl+12aUTOwcLo/Exj/4GAovUqyeSdxheAWqrLhv1z9j MLcWUSWDtm1/NVd2Bu36GKyKqZMeSmvQcOvRKuoRVhO+nIs0w5OL+iLHHBhP95ElT0IL OHb7RDm+8MyMO9a7Ev6fZg2jOy6iSfHwSA8a/do5NLERONhd1CvfY/V6E2RbG4KRtx5g uEUlZ6KOILjQ3PAuDclS8uLGgNugOaoH1oCkljD3hoRY4v1uqtPG7DvCQ14WajpdiP8h Yn9stD7ED1twIzhPM/NpcpkuyO+BdizhV66VuVY3jC1MXRRQimf6lG59obW8fmbxJf6a DPIw== X-Forwarded-Encrypted: i=1; AJvYcCXHd8fZDklL2pigipm3dEZHmX0z7Lg9ZbWp3WJVlRnA6AWLqLgyPf74IYVHYTapmq+eo5Mod0CjFctaj/w=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+FytGSsrjAOxoNUfqzesg0+qISApn2E7tINUnQ32EX1wyZY/P gKgYEaPlBeayGouHdvj3EZnGWTkFXk6Jso50FQURTneofRwzwLmI7VkUq9ZpDlquJEg= X-Gm-Gg: AZuq6aJZNZ1qZpHOqVPljC1ywkylrIrpPEqYB83WxV8wLJvv3ZIDmZPN422QqTaljft AROewVrUNKYt6k7+vICBpg2gxe0sJS3JBU4zKX1XLvK1sAtpFFSZcDHLDxmZUX5uF2/3ax0I/w4 7FPfPu4yxVSuGhoBre4SGEgbqzeHbOAC2X+cM99tW/gBeGME9rZ3J2ivUU/dn7UCvmG6bIPSOAw zT69a8I0qHGqeiBgP8ulD2hLUxPp+lu1nyYLcNv3CeLfLaCSp02Z/iz11+RJsaPD8KxIakD1x8i wEIGIUtUhQJK77pKVkV/GJIANFsoTafeHdHPxuoqaUvg0WcF68TgDvpfjX7e8Q9i+qIh0U9eXB6 vLvhlGCFs/ajTtovzcH6op5kdOPjqFfxf25d45Zt1kkkHU+Qc5D7V1lZgPH9HYXNcfOS0UzCHFk te/jNLXyuw62szM4BFvQQ= X-Received: by 2002:a05:600c:5250:b0:480:3bba:1ca9 with SMTP id 5b1f17b1804b1-4830e922965mr30772945e9.4.1770201993681; Wed, 04 Feb 2026 02:46:33 -0800 (PST) Received: from localhost ([2001:4090:a244:872b:a354:65f3:92a0:8de7]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4830fe86a7bsm15115265e9.8.2026.02.04.02.46.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Feb 2026 02:46:33 -0800 (PST) From: "Markus Schneider-Pargmann (TI.com)" Date: Wed, 04 Feb 2026 11:45:50 +0100 Subject: [PATCH v3 3/3] clocksource/drivers/timer-ti-dm: Add clockevent support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260204-topic-ti-dm-clkevt-v6-16-v3-3-83e65d01f4ae@baylibre.com> References: <20260204-topic-ti-dm-clkevt-v6-16-v3-0-83e65d01f4ae@baylibre.com> In-Reply-To: <20260204-topic-ti-dm-clkevt-v6-16-v3-0-83e65d01f4ae@baylibre.com> To: Daniel Lezcano , Thomas Gleixner Cc: Vishal Mahaveer , Kevin Hilman , Dhruva Gole , Sebin Francis , Kendall Willis , Akashdeep Kaur , linux-kernel@vger.kernel.org, "Markus Schneider-Pargmann (TI.com)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6712; i=msp@baylibre.com; h=from:subject:message-id; bh=AwrZ7YchVUGyPsayvgx8rDE/q1Muq6y6xR4ixvM0rbw=; b=owGbwMvMwCXWejAsc4KoVzDjabUkhsxm5frz+szvZFf8ujs5uuha2cdAqcm/5uWm89xTcC+YH bXp78+sjlIWBjEuBlkxRZbOxNC0//I7jyUvWrYZZg4rE8gQBi5OAZjIMVFGht0NMaolUYuqMqcv PN7srRiZp2q5KmxP5q6AMhuOprt7rzL8r3jbJC3XzKvff/eGSvfPne/MNqk5y3M8n8ttMLf7a/A VVgA= X-Developer-Key: i=msp@baylibre.com; a=openpgp; fpr=BADD88DB889FDC3E8A3D5FE612FA6A01E0A45B41 Add support for using the TI Dual-Mode Timer for clockevents. The second always on device with the "ti,timer-alwon" property is selected to be used for clockevents. The first one is used as clocksource. This allows clockevents to be setup independently of the CPU. Signed-off-by: Markus Schneider-Pargmann (TI.com) --- drivers/clocksource/timer-ti-dm.c | 138 ++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 133 insertions(+), 5 deletions(-) diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-= ti-dm.c index 75f38394e2598d76c41dd2b250c0c42f9f48bbe0..cefed71ac243e86e951405e5080= 1239e35abe290 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -21,8 +21,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -157,7 +159,14 @@ struct dmtimer_clocksource { unsigned int loadval; }; =20 +struct omap_dm_timer_clockevent { + struct clock_event_device dev; + struct dmtimer *timer; + u32 period; +}; + static resource_size_t omap_dm_timer_clocksource_base; +static resource_size_t omap_dm_timer_clockevent_base; static void __iomem *omap_dm_timer_sched_clock_counter; =20 enum { @@ -1201,6 +1210,9 @@ static void omap_dm_timer_find_alwon(void) { struct device_node *np; =20 + if (omap_dm_timer_clocksource_base && omap_dm_timer_clockevent_base) + return; + for_each_matching_node(np, omap_timer_match) { struct resource res; =20 @@ -1213,13 +1225,22 @@ static void omap_dm_timer_find_alwon(void) if (of_address_to_resource(np, 0, &res)) continue; =20 - omap_dm_timer_clocksource_base =3D res.start; + if (!omap_dm_timer_clocksource_base) { + omap_dm_timer_clocksource_base =3D res.start; + continue; + } =20 - of_node_put(np); - return; + if (res.start !=3D omap_dm_timer_clocksource_base) { + omap_dm_timer_clockevent_base =3D res.start; + + of_node_put(np); + return; + } } =20 - omap_dm_timer_clocksource_base =3D RESOURCE_SIZE_MAX; + if (!omap_dm_timer_clocksource_base) + omap_dm_timer_clocksource_base =3D RESOURCE_SIZE_MAX; + omap_dm_timer_clockevent_base =3D RESOURCE_SIZE_MAX; } =20 static struct dmtimer_clocksource *omap_dm_timer_to_clocksource(struct clo= cksource *cs) @@ -1308,6 +1329,105 @@ static int omap_dm_timer_setup_clocksource(struct d= mtimer *timer) return 0; } =20 +static struct omap_dm_timer_clockevent *to_dm_timer_clockevent(struct cloc= k_event_device *evt) +{ + return container_of(evt, struct omap_dm_timer_clockevent, dev); +} + +static int omap_dm_timer_evt_set_next_event(unsigned long cycles, + struct clock_event_device *evt) +{ + struct omap_dm_timer_clockevent *clkevt =3D to_dm_timer_clockevent(evt); + struct dmtimer *timer =3D clkevt->timer; + + dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, 0xffffffff - cycles); + dmtimer_write(timer, OMAP_TIMER_CTRL_REG, OMAP_TIMER_CTRL_ST); + + return 0; +} + +static int omap_dm_timer_evt_shutdown(struct clock_event_device *evt) +{ + struct omap_dm_timer_clockevent *clkevt =3D to_dm_timer_clockevent(evt); + struct dmtimer *timer =3D clkevt->timer; + + __omap_dm_timer_stop(timer); + + return 0; +} + +static int omap_dm_timer_evt_set_periodic(struct clock_event_device *evt) +{ + struct omap_dm_timer_clockevent *clkevt =3D to_dm_timer_clockevent(evt); + struct dmtimer *timer =3D clkevt->timer; + + omap_dm_timer_evt_shutdown(evt); + + omap_dm_timer_set_load(&timer->cookie, clkevt->period); + dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, clkevt->period); + dmtimer_write(timer, OMAP_TIMER_CTRL_REG, + OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST); + + return 0; +} + +static irqreturn_t omap_dm_timer_evt_interrupt(int irq, void *dev_id) +{ + struct omap_dm_timer_clockevent *clkevt =3D dev_id; + struct dmtimer *timer =3D clkevt->timer; + + __omap_dm_timer_write_status(timer, OMAP_TIMER_INT_OVERFLOW); + + clkevt->dev.event_handler(&clkevt->dev); + + return IRQ_HANDLED; +} + +static int omap_dm_timer_setup_clockevent(struct dmtimer *timer) +{ + struct device *dev =3D &timer->pdev->dev; + struct omap_dm_timer_clockevent *clkevt; + int ret; + + clkevt =3D devm_kzalloc(dev, sizeof(*clkevt), GFP_KERNEL); + if (!clkevt) + return -ENOMEM; + + timer->reserved =3D 1; + clkevt->timer =3D timer; + + clkevt->dev.name =3D "omap_dm_timer"; + clkevt->dev.features =3D CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; + clkevt->dev.rating =3D 300; + clkevt->dev.set_next_event =3D omap_dm_timer_evt_set_next_event; + clkevt->dev.set_state_shutdown =3D omap_dm_timer_evt_shutdown; + clkevt->dev.set_state_periodic =3D omap_dm_timer_evt_set_periodic; + clkevt->dev.set_state_oneshot =3D omap_dm_timer_evt_shutdown; + clkevt->dev.set_state_oneshot_stopped =3D omap_dm_timer_evt_shutdown; + clkevt->dev.tick_resume =3D omap_dm_timer_evt_shutdown; + clkevt->dev.cpumask =3D cpu_possible_mask; + clkevt->period =3D 0xffffffff - DIV_ROUND_CLOSEST(timer->fclk_rate, HZ); + + __omap_dm_timer_init_regs(timer); + __omap_dm_timer_stop(timer); + __omap_dm_timer_enable_posted(timer); + + ret =3D devm_request_irq(dev, timer->irq, omap_dm_timer_evt_interrupt, + IRQF_TIMER, "omap_dm_timer_clockevent", clkevt); + if (ret) { + dev_err(dev, "Failed to request interrupt: %d\n", ret); + return ret; + } + + __omap_dm_timer_int_enable(timer, OMAP_TIMER_INT_OVERFLOW); + + clockevents_config_and_register(&clkevt->dev, timer->fclk_rate, + 3, + 0xffffffff); + + return 0; +} + /** * omap_dm_timer_probe - probe function called for every registered device * @pdev: pointer to current timer platform device @@ -1324,7 +1444,7 @@ static int omap_dm_timer_probe(struct platform_device= *pdev) struct resource *res; int ret; =20 - if (!omap_dm_timer_clocksource_base) + if (!omap_dm_timer_clocksource_base || !omap_dm_timer_clockevent_base) omap_dm_timer_find_alwon(); =20 pdata =3D of_device_get_match_data(dev); @@ -1401,6 +1521,14 @@ static int omap_dm_timer_probe(struct platform_devic= e *pdev) =20 res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); =20 + if (omap_dm_timer_clockevent_base && res && + res->start =3D=3D omap_dm_timer_clockevent_base && + !IS_ERR_OR_NULL(timer->fclk)) { + ret =3D omap_dm_timer_setup_clockevent(timer); + if (ret) + return ret; + } + if (omap_dm_timer_clocksource_base && res && res->start =3D=3D omap_dm_timer_clocksource_base && !IS_ERR_OR_NULL(timer->fclk)) { --=20 2.51.0