From nobody Sat May 10 10:17:21 2025 Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02on2050.outbound.protection.outlook.com [40.107.249.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A7BF347A2; Thu, 3 Apr 2025 10:34:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.249.50 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743676443; cv=fail; b=CbZm+fzoXtGj4SS09F8fB0AvmPo3d2dyuAsv/IkO9nKAyRhBn6nOVv0p0LA4v4ItpkERMRghTjGhj8JrWzk8w4krs2w70IwU63Jfg5IzRSCVdI70BUSOjdmFnS4ATqFiqNq7JRtseo6TLKvzT4tPgX93CVMPGupDpojsXc5HY+o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743676443; c=relaxed/simple; bh=OelRowMual/JKhfgpEdwCiXB1AOp7/F5HAylD5m0kuE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=p9+eh6FTo0IzwbBUP+AvdSwmZyYjtBCmWdRxg7O2n4gvC8+63t1sgius7lGrzMFd9iD29HRj1Y2nuKuDznBrYwG16ELG0WRvjOWpN2iNbSCwH3ZpNRGeVdz/T/7c1SSZbChhr7Ep/cIm+4dEix+zNCGxaGtV/oluF1q9wdvX3+k= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=Gm8NLtDI; arc=fail smtp.client-ip=40.107.249.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="Gm8NLtDI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oDuy+pwD5Z23R++tslgpqEZHvNfIA7FeIelpnsaL0Sde4JYm1ofgQxg9DiwIWmCZqJYfzrB66aYjnfKGDLipQEKznZs5cKomDxn/nGLMkrmxAyimW+H1Z2nN+Ye9ctxLFG+D/RPHDN1Z70UNMFDtjxMlefnX+25rzUnU6WaqE0wosemnVJftcT37B69BLU23UpbKfOBBKWouUm1on3jk5chsHlGdZCZdnQECN+ph0S3Q8JFiH9vdtWjEttslluB7h30u6omDGYCIFYas9Fb4t4/2qoqFGC7IzAK6F+jRvBDzXg9fthO7E68NXelqb5YtBF4/k7Spgu6Xl+H7qOIOHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=UvKplru0XYC4azUPl/dSWB9rmpGtBlHZRXHnW2ITD9o=; b=y/AL4vNETTBBMB9R7VN+hvybFL3SgKZK/wj56/bqk4XRkGiraB6UTVSJwuY9cYjq9h0XdRcIHEetQdVNlLBI+tTj19a4G6n/3zhO29SS4HPy4BSFLoo6rMjmFD/8GUjQBe0aBurtz2l6L485XiX1AHFPkfSSR/d7uXtZSuI2D6OF9DNt5f1EBrs68RiwLOkhMrjGKoWm3R6nVw/k0tNRw86pz/dsn/lrN0AYPn5nYVhrdwiQmMxvRYxlvlpoTzN9o/qdSCmVGFX/OkrIE5ZGwR981lZlc7PXNWboF+sRkBNHlcaFg83ywnoxFsW6MbfnoVIFiOqrQ2/PSNXbCYUeVQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UvKplru0XYC4azUPl/dSWB9rmpGtBlHZRXHnW2ITD9o=; b=Gm8NLtDIOCa9DiwSknZ1zR57VsI/X18HJN8rs9APUkXcv1q5mudm16NXyBm3EGfxO7bpNjtMTMF0nPP967x5bnDA8ieqMTgmEsevn2FLkTmpePJPlrqvk3B2y+8H8tmB+XQhiBK7fuKUuHQv6lgt3pYULKwpwYQ3KgxCPp7OEBAuYqNKwilGxCQ15s01nmOerx0g24zJuvuFdGufI5bHbaKO2ALshInf5hej6doTcronwjehZ9uLFfdyvDuWfLQNQiWRLu/7sYJWjU/iuWsSB8W8596GpPH+G9tK9e0ubzplNZWrADRlLMuFWoOPBhgannZ1yMXy/W6VVyqlRvGPNw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from DU0PR04MB9251.eurprd04.prod.outlook.com (2603:10a6:10:352::15) by VE1PR04MB7216.eurprd04.prod.outlook.com (2603:10a6:800:1b0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.54; Thu, 3 Apr 2025 10:33:57 +0000 Received: from DU0PR04MB9251.eurprd04.prod.outlook.com ([fe80::708f:69ee:15df:6ebd]) by DU0PR04MB9251.eurprd04.prod.outlook.com ([fe80::708f:69ee:15df:6ebd%4]) with mapi id 15.20.8534.043; Thu, 3 Apr 2025 10:33:57 +0000 From: Ciprian Costea <ciprianmarian.costea@oss.nxp.com> To: Alexandre Belloni <alexandre.belloni@bootlin.com>, Rob Herring <robh@kernel.org>, Krzysztof Kozlowski <krzk+dt@kernel.org>, Conor Dooley <conor+dt@kernel.org>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org> Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP S32 Linux <s32@nxp.com>, imx@lists.linux.dev, Christophe Lizzi <clizzi@redhat.com>, Alberto Ruiz <aruizrui@redhat.com>, Enric Balletbo <eballetb@redhat.com>, Eric Chanudet <echanude@redhat.com>, Ciprian Marian Costea <ciprianmarian.costea@oss.nxp.com>, Bogdan Hamciuc <bogdan.hamciuc@nxp.com>, Ghennadi Procopciuc <Ghennadi.Procopciuc@nxp.com>, Frank Li <Frank.Li@nxp.com> Subject: [PATCH v9 2/4] rtc: s32g: add NXP S32G2/S32G3 SoC support Date: Thu, 3 Apr 2025 13:33:44 +0300 Message-ID: <20250403103346.3064895-3-ciprianmarian.costea@oss.nxp.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250403103346.3064895-1-ciprianmarian.costea@oss.nxp.com> References: <20250403103346.3064895-1-ciprianmarian.costea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0013.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::23) To DU0PR04MB9251.eurprd04.prod.outlook.com (2603:10a6:10:352::15) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR04MB9251:EE_|VE1PR04MB7216:EE_ X-MS-Office365-Filtering-Correlation-Id: 16226cdb-0c61-4707-7456-08dd729b08d9 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?utf-8?B?OTkyZzlHRVRkaFBBZGd2TkdwWnUweHNMQkpQRHJPeGcrbTZtK0kwRWx6cnFj?= =?utf-8?B?d1cyczI5UnozVzFjNDYvTXJjUm4ySEVVcytrSkM3M2c5RkI2TEU5SFhkOUcr?= =?utf-8?B?K01OeHF4Ynh6ek10ZmlWc2wvamtLaTlYdUZyOGMveHpTZmRtcUJ4WExSMW5J?= =?utf-8?B?bkJ0aGowd2lBUFBuNW9QT3hQRGJoMTBUMGR0djcyUGRETnljSmVRSTRNNGlL?= =?utf-8?B?TlphTUw5eGFtTG1SSEVtS1dpV1g1ZmNTVjZ6S1BkVVkzbHFnSDVmazM2UmlZ?= =?utf-8?B?M0FpTmkyOXJkajdSM3hIUis5VjA1QklZOVlvTjQ5L0lxbTh5SHQwN3BUNmdj?= =?utf-8?B?ajdLenFpbCtBeUlSZHVUZDlXbW9LU0JRYkZrRFhQU0FyZWxmZ2dWNEJsZFBM?= =?utf-8?B?OFQrUGFPT216bkNaZkVodFJMT2RWK0tKUW51Y3plZUZUVjJjK2p4NDZObFFq?= =?utf-8?B?STkrRnhJMmVtYWcxWEQ5bTlnNEN5NjNYR25uTUVOckVpVnprcHMvM0Mvc3VF?= =?utf-8?B?ZWFadUNXeEh5alFyQmJYclZtTEFpTDR2RkpEaWp1OUM5N3M3cVFmUGszdjFn?= =?utf-8?B?ZzEyUEc3VHpVaHh1YnBOSjkwRVpQcEllUG5aQ1FndklQTVE5bEUyZDB6QmVO?= =?utf-8?B?b0FTeUJvWFUrVVJtbjFkME8yUmFGaVNseUkyUEMvRmV2STh2eTg3QktFdlJy?= =?utf-8?B?NmtSdU0waXFucnAvZnd1MmtCRGQyUGcwenJ5WWlDKzl1UlRxcThaWlJMR2lV?= =?utf-8?B?S2J5SDVRWVUxNDdkak9BSE01cGx4c2RNVjUwSDdVUVRmd2FsRDQ0WkZEOGZh?= =?utf-8?B?ZzJBT292bjRlaTl1dlR3cGxoQ1ZCMXI1bGZoQnpnYXBJZFpUcmpOODNRZmFB?= =?utf-8?B?V21FZ0pvdXZJdTE0V2YwQ3dLanh4VVZtMXVHeDcrQzU5STY0czJrUU9ZcVpY?= =?utf-8?B?SEh4aENCMEdXeVk3RlViN2xPZUo0Qk9oTU9KVko5MzhPbGJKZmcyMy9RUWpi?= =?utf-8?B?TlVUcDg1YU1LUDF3YUlDSmNLMFZOS0JTdDJRbWFWTk5VdnF2eFQ4UGdYaTNo?= =?utf-8?B?MUE3R2lIb2haZnVhVTFFdUNraFlqRDc2RkpoQXdGWGxvK2dQc0xROUhKZ0lH?= =?utf-8?B?Vzg3bTUvWHhOR3p3UjlWVGpyR29JZnZNcHRmTnZlTmtYUkpkaGRBeUJDRGY4?= =?utf-8?B?S3VyWFMrQXpUekJpN25zQUM4clVuZjFWckVTYWs5MTBzRjVEMkkzY1dhRnRJ?= =?utf-8?B?YVBtSFZOc2FBM3UzdVVlS2xhYTY4UXJMb3RKNFBWNUMzMGsvSFVEa3BqYURG?= =?utf-8?B?VTdaSDZUSlkrT3NXSWs2MXpBZzUxcXNQMlJkLzRyNWlkNUM4N1p6MW9TLysw?= =?utf-8?B?am85RTErUzZUWEdMU3M1eW5YWTN6OEY4SllSMlJMR3VyUlJWTTQrMExzL3Zk?= =?utf-8?B?MTU2dkpySUFDRVJlTHVVRnk5N1lJNFpGVk9USFdzcUpmdnlGSU8xbjZVR1Fa?= =?utf-8?B?TnZZZldobkNzTk5mZTBEQnZnWTJKOGVCeEZSRGY3L2NZcU1oa2NZQ29tRGQ5?= =?utf-8?B?eXBKUGFWY1Z3OFZYenI1N0lSUTVCMWlsT1pkdS9CWEcySno2ZitqM1g4TG9m?= =?utf-8?B?OEE5UEFzUDlPMjgxMzREU0Q3VnpHKzZDYWJXVUgxK2Z2QzIzSklVcG9ESmYr?= =?utf-8?B?RFovWU44QzMvUUFzbFV6bHRaWnBIWWhmMG81dHdXeW1uU2dvVlZSczJDZFBE?= =?utf-8?B?bzJLWFNFZjNxMEI5Rkx5M1M2MlZLSDRDZXRrdUFDZXNib3VYWXRRUDR4UEh0?= =?utf-8?B?UGN5cENhTjRQSkw0UFdiTllMc0x2clFaaEdCWGc0ZFp6MzcvVDRmOE1BL3Y5?= =?utf-8?B?SU1meThTaTN3ZFZDZVE1Q3p2UlFIZ0FPUlVHWXdPUXFXS1lualRlM0FlZHBk?= =?utf-8?Q?U/jL6sCZ3JU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR04MB9251.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MzFUeW5rbWpNeU5sOHcxZGxzMWk2ZXRUR2E0ZVc1UVhhWTlUcy9Od0RBOXVR?= =?utf-8?B?NmVERjltZWdObVJ6d3QvVzViSFRiSlpyeGU5eUlNZnFLOTJodU5tRm5XQTVl?= =?utf-8?B?ckZkalRXb1hOa0dETnIyeUNPdXU2Y3o4akdMcHQzcHJ1L20zY2FxZDJYM0FC?= =?utf-8?B?ekRYdStoM25ZdWl1cDA5Y0hxa0FDRm1Va1g0aXhqaDdXWXp0SWMydjdSYWNS?= =?utf-8?B?aGZRbDdDSnE5bC9pQ3pjYWg3dW9tMHRySnN6NTBEMHkwQWIxemRXUVVSdFBU?= =?utf-8?B?dFF0SlRpeGxFRnJHZXUvaTlpc0J0RDltMGlyQnFtcVZPSC9nczgyVi9aZ1Uz?= =?utf-8?B?YkdqNDNRaE1RanJQcDFHeHBOS0VHQzNQOTBCczRVWkRGRC9KM0RWVFZsYzEz?= =?utf-8?B?c0ZJUzhDK0dERXNpS1JtSWhhaVVSZ2RSVS9mUjYrNk9qN3NmTHpmTy93UitJ?= =?utf-8?B?L2JFblBwMjEzVGMrSUc0TjBJcG1GNlVZS1EvQmIvVlcyd29wZ2FzL2pxMmts?= =?utf-8?B?eXZUUGx1Qk1yZXJONjVVT2tKYXN3SU1mejVmTGlLQU9lYU04SlNNdlluYWRM?= =?utf-8?B?ZkZUTTVUK0VFWGF2WThEellYcy9ucE9TbGFvWS85ZStFcHBERStxYnJQUUVM?= =?utf-8?B?Q3IxQ2czejJBb0w5NmpjZXBxMVNjRy80a2JDclNHTmdMR2N5cW9FejAvZHpJ?= =?utf-8?B?VG5VN1pOckpoMUJ4ckptaUtuM2JhLzdOWjV0TW16dWlXc2ZhRE9CK2NqS2Vw?= =?utf-8?B?SXlJa0VtdzlEUThtb1pmc3I1TkF5eGdjWkUvLzJnRTBCZHpnOUJOMWkxMWlN?= =?utf-8?B?RkhSVnlmU2RHYk4wd1ZUSTBRbVgxb056cThNakVVLzBEOW1maS9JSHlMV08w?= =?utf-8?B?dTB6TE0zWUZtdklCV2UvYXQ0c1VkV3BmODhGb3VnR2J2Q3A2TnluS3pzdzF3?= =?utf-8?B?Vmk5ajFqbVEzbzl5SUNoeHpWOTdnVDYwcDI5ZzRMSlFQTDRqczNGTzdOY3p1?= =?utf-8?B?Unpod0VJOCswSWN1M1hHbnJ2Nlc5b1hYL2YvL0t3Y096aG1qTDFwL0NUMzlR?= =?utf-8?B?a1phREdOekk5VU5hYll3bi9JK0J1S29SdjdBVVppb2VheFJWVmtzOEZOUUpx?= =?utf-8?B?eEVxWkhPMXdDNFFWZ01DK0ZsWFRXRG9SMnVsWk9IcmhVSGEwdXpxZkpvbDVE?= =?utf-8?B?ZVUvTWxQT1NSdkJjMVExbVNna3kyK250WFEzdXV2ek92L2MwdTdVK1M4ZStQ?= =?utf-8?B?WW1Fb1RGeENnUEpSd2ppejVWb1pYZTFJYWNiV2FvV2h0OGY5UCtVeXM5OUY5?= =?utf-8?B?UUVHOU8xeDlvT0pVWkNFallIUnozS09hYXFxdmcyeDlRZmFYaXRpN3FTemZl?= =?utf-8?B?dmJQQWdYL0lhWTgwemI5dVVWWWRyNnJFYkFJMHRzNFN4aUxPYkpmUkJoZU5K?= =?utf-8?B?Tk9MVkpOZGZVMWcxZHZZOU9DclNKTnRham13cUdyT1l1OFl2T3hqVTJPNjAx?= =?utf-8?B?cTZETTkyNnBzcVVJbFp4NUVQRml5bFY2aWczTWZhdVIreG5sZXQrOThHYkNS?= =?utf-8?B?UUUyOFdNOGFkQWVBMk84cDh4ZzNkRE5EV044V2k4c3E2VVVOSE9VT3ZwYkRF?= =?utf-8?B?bUNHLzVzbjFVREFhSHVvK2NpT0JmSjhkTmErTlJmZm9xUDk2ZkFucnh0ekd4?= =?utf-8?B?VkY0SFUyU2FyWS96L2RXWGJJV1dWejN3SXhHUnBKRE12RXdOcDQ5UlVmTVYz?= =?utf-8?B?WXRVKzN0eVErMXNzUzNTZDNhcjhlYVdENjJ3Tkg2TDdvdm1aQldFQWxtYUZC?= =?utf-8?B?OGNSMG5qV1o4cGtQWTMzT2xJaWNlcDNmeEhlM0pVOStIdDFSVSs1V1dPbHNG?= =?utf-8?B?NTNqV3dNakYyNVN5djFueVQxWnhTL3lpRzQwTFVJZGY3UDVQa2h4OFR4Q0VJ?= =?utf-8?B?TTZUWXRTc0ZBMEhpZWpqYWpzNHZpQTdpM1ozbW9nSEJsR0I4ZGp2UmFkL3JV?= =?utf-8?B?dzRISWoyZ0ttRnhVWXhTQmU3U296WUtka2M5V2w1V2l3SVR3Vk9SQzBROUR5?= =?utf-8?B?cUJsQitMSmhKZW5Qei9WdFF4M1hJSVFjZ3Y3MFRhN2tESlpXNzZCQW9lOFpC?= =?utf-8?B?OHNmMVAzV2ZSWEYvTG5wVWVWSGJDcURTTDhIMnpkUmhuSEVLWmxaZTM0eFFD?= =?utf-8?B?NlE9PQ==?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 16226cdb-0c61-4707-7456-08dd729b08d9 X-MS-Exchange-CrossTenant-AuthSource: DU0PR04MB9251.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Apr 2025 10:33:55.1656 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: gI7aMn3gwIqAQbyhG2Awtq8jm6eY07vLLl1wb0IJ1C8xFO1jOnbUbbAgA9AO5NahLpysq523cpeylJ0jlaY35n/5rB6mJq57D4JEenMGF/A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB7216 Content-Type: text/plain; charset="utf-8" From: Ciprian Marian Costea <ciprianmarian.costea@oss.nxp.com> Add a RTC driver for NXP S32G2/S32G3 SoCs. RTC tracks clock time during system suspend. It can be a wakeup source for the S32G2/S32G3 SoC based boards. The RTC module from S32G2/S32G3 is not battery-powered and it is not kept alive during system reset. Co-developed-by: Bogdan Hamciuc <bogdan.hamciuc@nxp.com> Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@nxp.com> Co-developed-by: Ghennadi Procopciuc <Ghennadi.Procopciuc@nxp.com> Signed-off-by: Ghennadi Procopciuc <Ghennadi.Procopciuc@nxp.com> Signed-off-by: Ciprian Marian Costea <ciprianmarian.costea@oss.nxp.com> Reviewed-by: Frank Li <Frank.Li@nxp.com> Tested-by: Enric Balletbo i Serra <eballetbo@kernel.org> --- drivers/rtc/Kconfig | 11 ++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-s32g.c | 385 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 397 insertions(+) create mode 100644 drivers/rtc/rtc-s32g.c diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 0bbbf778ecfa..510dc2db745d 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -2103,4 +2103,15 @@ config RTC_DRV_AMLOGIC_A4 This driver can also be built as a module. If so, the module will be called "rtc-amlogic-a4". =20 +config RTC_DRV_S32G + tristate "RTC driver for S32G2/S32G3 SoCs" + depends on ARCH_S32 || COMPILE_TEST + depends on COMMON_CLK + help + Say yes to enable RTC driver for platforms based on the + S32G2/S32G3 SoC family. + + This RTC module can be used as a wakeup source. + Please note that it is not battery-powered. + endif # RTC_CLASS diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 489b4ab07068..e4b616ecd5ce 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -161,6 +161,7 @@ obj-$(CONFIG_RTC_DRV_RX8111) +=3D rtc-rx8111.o obj-$(CONFIG_RTC_DRV_RX8581) +=3D rtc-rx8581.o obj-$(CONFIG_RTC_DRV_RZN1) +=3D rtc-rzn1.o obj-$(CONFIG_RTC_DRV_RENESAS_RTCA3) +=3D rtc-renesas-rtca3.o +obj-$(CONFIG_RTC_DRV_S32G) +=3D rtc-s32g.o obj-$(CONFIG_RTC_DRV_S35390A) +=3D rtc-s35390a.o obj-$(CONFIG_RTC_DRV_S3C) +=3D rtc-s3c.o obj-$(CONFIG_RTC_DRV_S5M) +=3D rtc-s5m.o diff --git a/drivers/rtc/rtc-s32g.c b/drivers/rtc/rtc-s32g.c new file mode 100644 index 000000000000..3a0818e972eb --- /dev/null +++ b/drivers/rtc/rtc-s32g.c @@ -0,0 +1,385 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright 2025 NXP + */ + +#include <linux/bitfield.h> +#include <linux/clk.h> +#include <linux/iopoll.h> +#include <linux/of_irq.h> +#include <linux/platform_device.h> +#include <linux/rtc.h> + +#define RTCC_OFFSET 0x4ul +#define RTCS_OFFSET 0x8ul +#define APIVAL_OFFSET 0x10ul + +/* RTCC fields */ +#define RTCC_CNTEN BIT(31) +#define RTCC_APIEN BIT(15) +#define RTCC_APIIE BIT(14) +#define RTCC_CLKSEL_MASK GENMASK(13, 12) +#define RTCC_DIV512EN BIT(11) +#define RTCC_DIV32EN BIT(10) + +/* RTCS fields */ +#define RTCS_INV_API BIT(17) +#define RTCS_APIF BIT(13) + +#define APIVAL_MAX_VAL GENMASK(31, 0) +#define RTC_SYNCH_TIMEOUT (100 * USEC_PER_MSEC) + +/* + * S32G2 and S32G3 SoCs have RTC clock source1 reserved and + * should not be used. + */ +#define RTC_CLK_SRC1_RESERVED BIT(1) + +/* + * S32G RTC module has a 512 value and a 32 value hardware frequency + * divisors (DIV512 and DIV32) which could be used to achieve higher + * counter ranges by lowering the RTC frequency. + */ +enum { + DIV1 =3D 1, + DIV32 =3D 32, + DIV512 =3D 512, + DIV512_32 =3D 16384 +}; + +static const char *const rtc_clk_src[] =3D { + "source0", + "source1", + "source2", + "source3" +}; + +struct rtc_priv { + struct rtc_device *rdev; + void __iomem *rtc_base; + struct clk *ipg; + struct clk *clk_src; + const struct rtc_soc_data *rtc_data; + u64 rtc_hz; + time64_t sleep_sec; + int irq; + u32 clk_src_idx; +}; + +struct rtc_soc_data { + u32 clk_div; + u32 reserved_clk_mask; +}; + +static const struct rtc_soc_data rtc_s32g2_data =3D { + .clk_div =3D DIV512_32, + .reserved_clk_mask =3D RTC_CLK_SRC1_RESERVED, +}; + +static irqreturn_t s32g_rtc_handler(int irq, void *dev) +{ + struct rtc_priv *priv =3D platform_get_drvdata(dev); + u32 status; + + status =3D readl(priv->rtc_base + RTCS_OFFSET); + + if (status & RTCS_APIF) { + writel(0x0, priv->rtc_base + APIVAL_OFFSET); + writel(status | RTCS_APIF, priv->rtc_base + RTCS_OFFSET); + } + + rtc_update_irq(priv->rdev, 1, RTC_IRQF | RTC_AF); + + return IRQ_HANDLED; +} + +/* + * The function is not really getting time from the RTC since the S32G RTC + * has several limitations. Thus, to setup alarm use system time. + */ +static int s32g_rtc_read_time(struct device *dev, + struct rtc_time *tm) +{ + struct rtc_priv *priv =3D dev_get_drvdata(dev); + time64_t sec; + + if (check_add_overflow(ktime_get_real_seconds(), + priv->sleep_sec, &sec)) + return -ERANGE; + + rtc_time64_to_tm(sec, tm); + + return 0; +} + +static int s32g_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) +{ + struct rtc_priv *priv =3D dev_get_drvdata(dev); + u32 rtcc, rtcs; + + rtcc =3D readl(priv->rtc_base + RTCC_OFFSET); + rtcs =3D readl(priv->rtc_base + RTCS_OFFSET); + + alrm->enabled =3D rtcc & RTCC_APIIE; + if (alrm->enabled) + alrm->pending =3D !(rtcs & RTCS_APIF); + + return 0; +} + +static int s32g_rtc_alarm_irq_enable(struct device *dev, unsigned int enab= led) +{ + struct rtc_priv *priv =3D dev_get_drvdata(dev); + u32 rtcc; + + /* RTC API functionality is used both for triggering interrupts + * and as a wakeup event. Hence it should always be enabled. + */ + rtcc =3D readl(priv->rtc_base + RTCC_OFFSET); + rtcc |=3D RTCC_APIEN | RTCC_APIIE; + writel(rtcc, priv->rtc_base + RTCC_OFFSET); + + return 0; +} + +static int s32g_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) +{ + struct rtc_priv *priv =3D dev_get_drvdata(dev); + unsigned long long cycles; + long long t_offset; + time64_t alrm_time; + u32 rtcs; + int ret; + + alrm_time =3D rtc_tm_to_time64(&alrm->time); + t_offset =3D alrm_time - ktime_get_real_seconds() - priv->sleep_sec; + if (t_offset < 0) + return -ERANGE; + + cycles =3D t_offset * priv->rtc_hz; + if (cycles > APIVAL_MAX_VAL) + return -ERANGE; + + /* APIVAL could have been reset from the IRQ handler. + * Hence, we wait in case there is a synchronization process. + */ + ret =3D read_poll_timeout(readl, rtcs, !(rtcs & RTCS_INV_API), + 0, RTC_SYNCH_TIMEOUT, false, priv->rtc_base + RTCS_OFFSET); + if (ret) + return ret; + + writel(cycles, priv->rtc_base + APIVAL_OFFSET); + + return read_poll_timeout(readl, rtcs, !(rtcs & RTCS_INV_API), + 0, RTC_SYNCH_TIMEOUT, false, priv->rtc_base + RTCS_OFFSET); +} + +/* + * Disable the 32-bit free running counter. + * This allows Clock Source and Divisors selection + * to be performed without causing synchronization issues. + */ +static void s32g_rtc_disable(struct rtc_priv *priv) +{ + u32 rtcc =3D readl(priv->rtc_base + RTCC_OFFSET); + + rtcc &=3D ~RTCC_CNTEN; + writel(rtcc, priv->rtc_base + RTCC_OFFSET); +} + +static void s32g_rtc_enable(struct rtc_priv *priv) +{ + u32 rtcc =3D readl(priv->rtc_base + RTCC_OFFSET); + + rtcc |=3D RTCC_CNTEN; + writel(rtcc, priv->rtc_base + RTCC_OFFSET); +} + +static int rtc_clk_src_setup(struct rtc_priv *priv) +{ + u32 rtcc; + + rtcc =3D FIELD_PREP(RTCC_CLKSEL_MASK, priv->clk_src_idx); + + switch (priv->rtc_data->clk_div) { + case DIV512_32: + rtcc |=3D RTCC_DIV512EN; + rtcc |=3D RTCC_DIV32EN; + break; + case DIV512: + rtcc |=3D RTCC_DIV512EN; + break; + case DIV32: + rtcc |=3D RTCC_DIV32EN; + break; + case DIV1: + break; + default: + return -EINVAL; + } + + rtcc |=3D RTCC_APIEN | RTCC_APIIE; + /* + * Make sure the CNTEN is 0 before we configure + * the clock source and dividers. + */ + s32g_rtc_disable(priv); + writel(rtcc, priv->rtc_base + RTCC_OFFSET); + s32g_rtc_enable(priv); + + return 0; +} + +static const struct rtc_class_ops rtc_ops =3D { + .read_time =3D s32g_rtc_read_time, + .read_alarm =3D s32g_rtc_read_alarm, + .set_alarm =3D s32g_rtc_set_alarm, + .alarm_irq_enable =3D s32g_rtc_alarm_irq_enable, +}; + +static int rtc_clk_dts_setup(struct rtc_priv *priv, + struct device *dev) +{ + u32 i; + + priv->ipg =3D devm_clk_get_enabled(dev, "ipg"); + if (IS_ERR(priv->ipg)) + return dev_err_probe(dev, PTR_ERR(priv->ipg), + "Failed to get 'ipg' clock\n"); + + for (i =3D 0; i < ARRAY_SIZE(rtc_clk_src); i++) { + if (priv->rtc_data->reserved_clk_mask & BIT(i)) + return -EOPNOTSUPP; + + priv->clk_src =3D devm_clk_get_enabled(dev, rtc_clk_src[i]); + if (!IS_ERR(priv->clk_src)) { + priv->clk_src_idx =3D i; + break; + } + } + + if (IS_ERR(priv->clk_src)) + return dev_err_probe(dev, PTR_ERR(priv->clk_src), + "Failed to get rtc module clock source\n"); + + return 0; +} + +static int s32g_rtc_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct rtc_priv *priv; + unsigned long rtc_hz; + int ret; + + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->rtc_data =3D of_device_get_match_data(dev); + if (!priv->rtc_data) + return -ENODEV; + + priv->rtc_base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->rtc_base)) + return PTR_ERR(priv->rtc_base); + + device_init_wakeup(dev, true); + + ret =3D rtc_clk_dts_setup(priv, dev); + if (ret) + return ret; + + priv->rdev =3D devm_rtc_allocate_device(dev); + if (IS_ERR(priv->rdev)) + return PTR_ERR(priv->rdev); + + ret =3D rtc_clk_src_setup(priv); + if (ret) + return ret; + + priv->irq =3D platform_get_irq(pdev, 0); + if (priv->irq < 0) { + ret =3D priv->irq; + goto disable_rtc; + } + + rtc_hz =3D clk_get_rate(priv->clk_src); + if (!rtc_hz) { + dev_err(dev, "Failed to get RTC frequency\n"); + ret =3D -EINVAL; + goto disable_rtc; + } + + priv->rtc_hz =3D DIV_ROUND_UP(rtc_hz, priv->rtc_data->clk_div); + + platform_set_drvdata(pdev, priv); + priv->rdev->ops =3D &rtc_ops; + + ret =3D devm_request_irq(dev, priv->irq, + s32g_rtc_handler, 0, dev_name(dev), pdev); + if (ret) { + dev_err(dev, "Request interrupt %d failed, error: %d\n", + priv->irq, ret); + goto disable_rtc; + } + + ret =3D devm_rtc_register_device(priv->rdev); + if (ret) + goto disable_rtc; + + return 0; + +disable_rtc: + s32g_rtc_disable(priv); + return ret; +} + +static int s32g_rtc_suspend(struct device *dev) +{ + struct rtc_priv *priv =3D dev_get_drvdata(dev); + u32 apival =3D readl(priv->rtc_base + APIVAL_OFFSET); + + if (check_add_overflow(priv->sleep_sec, div64_u64(apival, priv->rtc_hz), + &priv->sleep_sec)) { + dev_warn(dev, "Overflow on sleep cycles occurred. Resetting to 0.\n"); + priv->sleep_sec =3D 0; + } + + return 0; +} + +static int s32g_rtc_resume(struct device *dev) +{ + struct rtc_priv *priv =3D dev_get_drvdata(dev); + + /* The transition from resume to run is a reset event. + * This leads to the RTC registers being reset after resume from + * suspend. It is uncommon, but this behaviour has been observed + * on S32G RTC after issuing a Suspend to RAM operation. + * Thus, reconfigure RTC registers on the resume path. + */ + return rtc_clk_src_setup(priv); +} + +static const struct of_device_id rtc_dt_ids[] =3D { + { .compatible =3D "nxp,s32g2-rtc", .data =3D &rtc_s32g2_data }, + { /* sentinel */ }, +}; + +static DEFINE_SIMPLE_DEV_PM_OPS(s32g_rtc_pm_ops, + s32g_rtc_suspend, s32g_rtc_resume); + +static struct platform_driver s32g_rtc_driver =3D { + .driver =3D { + .name =3D "s32g-rtc", + .pm =3D pm_sleep_ptr(&s32g_rtc_pm_ops), + .of_match_table =3D rtc_dt_ids, + }, + .probe =3D s32g_rtc_probe, +}; +module_platform_driver(s32g_rtc_driver); + +MODULE_AUTHOR("NXP"); +MODULE_DESCRIPTION("NXP RTC driver for S32G2/S32G3"); +MODULE_LICENSE("GPL"); --=20 2.45.2