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 56B25D3ABFA for ; Mon, 11 Nov 2024 22:07:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=MxTLQ/Oiz/TUzObKhPNd2y+kjqYqeUnTWQ8C9SyueBw=; b=EnKvA+nppbbSkE FcHskkpwAClOEfx5uaSSYZz674sjHcRiM9zAx5yI3Is9o5tk0e83l1gT5hGEbn7ckMWZzHQz1ja6s 9PBU4646nPO0AqYieoYKl8S1eDMhK6O4u5TNHERT7mTbv4eSr03trS384p90WhS7qvy6FYuhRPz8h AK/hRDdh2lKMSswavd3363/Ruh414LmwYBxVuqh7ILUaIgIQHKOOMJv+h6WVvkbDh2TlHcgV33IeP ZgW8T2vgN1dDrZPY61/7cnGoBJG8YvZCXfIB4TIVuriNoUVkb5kPB2PjEfpKkIVRm/2cNBMrXwq8G iwW7ND9wtomC7CVqdxyw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tAcZJ-00000001SHo-2Nhg; Mon, 11 Nov 2024 22:07:33 +0000 Received: from relay5-d.mail.gandi.net ([2001:4b98:dc4:8::225]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tAcZG-00000001SH0-1qIM for linux-amlogic@lists.infradead.org; Mon, 11 Nov 2024 22:07:32 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 0BC641C0002; Mon, 11 Nov 2024 22:07:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1731362846; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nvLBpIbXRymgph7QAAvU55QOaoId7HTwuv+sfMNt8G4=; b=ntkkyCgjQYaK73FYXJqWzOXfNXxT51oEVfa94QheQndXN4q3pgTot68IEr0ofUi0Ud6aDw 6fb+pvwfewtJ/eJi+H+5bet77fU+FN9uRlfMozMp8AtuQKEOYEAqiaq3ZV0z1XFJJCbYgp prz4MZbxcfT6v1UrPKTc2IiXebg+Zw1hbLfXi951fsnEe/Fylbv5yJkTSxB3nsF5sx3XWu SSjEVYeyrMctLefS7EDvD/aOMbPck5XRL9YFCXMD+L1PY9LxU71eMpY/dqJJQph/Q6Bj+d +iJykkRgN74cf1wDuSsxYPjrn6nDdIfV3giY934sBiZJbLkD7ENOlcu8410EkA== Date: Mon, 11 Nov 2024 23:07:23 +0100 From: Alexandre Belloni To: xianwei.zhao@amlogic.com Cc: Yiting Deng , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-amlogic@lists.infradead.org, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 2/3] rtc: support for the Amlogic on-chip RTC Message-ID: <202411112207234c96cc30@mail.local> References: <20241108-rtc-v5-0-0194727c778b@amlogic.com> <20241108-rtc-v5-2-0194727c778b@amlogic.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20241108-rtc-v5-2-0194727c778b@amlogic.com> X-GND-Sasl: alexandre.belloni@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241111_140730_817758_654887E9 X-CRM114-Status: GOOD ( 21.03 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org T24gMDgvMTEvMjAyNCAxMzo1NDo0MiswODAwLCBYaWFud2VpIFpoYW8gdmlhIEI0IFJlbGF5IHdy b3RlOgo+ICtzdGF0aWMgaW50IGFtbF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwg c3RydWN0IHJ0Y190aW1lICp0bSkKPiArewo+ICsJc3RydWN0IGFtbF9ydGNfZGF0YSAqcnRjID0g ZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwl1MzIgdGltZV9zZWM7Cj4gKwo+ICsJLyogaWYgUlRD IGRpc2FibGVkLCByZWFkIHRpbWUgZmFpbGVkICovCj4gKwlpZiAoIXJ0Yy0+cnRjX2VuYWJsZWQp IHsKPiArCQlkZXZfZXJyKGRldiwgIlJUQyBkaXNhYmxlZCwgcmVhZCB0aW1lIGZhaWxlZFxuIik7 CgpUaGVzZSBtZXNzYWdlcyBzaG91bGQgYmUgZHJvcHBlZCwgdGhleSBwcm9iYWJseSB3b24ndCBi ZSBzZWVuIGJ5IGFueQp1c2VyLgoKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwly ZWdtYXBfcmVhZChydGMtPm1hcCwgUlRDX1JFQUxfVElNRSwgJnRpbWVfc2VjKTsKPiArCWlmIChy dGMtPmNvbmZpZy0+Z3JheV9zdG9yZWQpCj4gKwkJdGltZV9zZWMgPSBncmF5X3RvX2JpbmFyeSh0 aW1lX3NlYyk7Cj4gKwlydGNfdGltZTY0X3RvX3RtKHRpbWVfc2VjLCB0bSk7Cj4gKwlkZXZfZGJn KGRldiwgIiVzOiByZWFkIHRpbWUgPSAldXNcbiIsIF9fZnVuY19fLCB0aW1lX3NlYyk7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYW1sX3J0Y19zZXRfdGltZShzdHJ1 Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCj4gK3sKPiArCXN0cnVjdCBhbWxf cnRjX2RhdGEgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJdTMyIHRpbWVfc2VjOwo+ ICsKPiArCS8qIGlmIFJUQyBkaXNhYmxlZCwgZmlyc3QgZW5hYmxlIGl0ICovCj4gKwlpZiAoIXJ0 Yy0+cnRjX2VuYWJsZWQpIHsKPiArCQlyZWdtYXBfd3JpdGVfYml0cyhydGMtPm1hcCwgUlRDX0NU UkwsIFJUQ19FTkFCTEUsIFJUQ19FTkFCTEUpOwo+ICsJCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7 Cj4gKwkJcnRjLT5ydGNfZW5hYmxlZCA9IHJlZ21hcF90ZXN0X2JpdHMocnRjLT5tYXAsIFJUQ19D VFJMLCBSVENfRU5BQkxFKTsKPiArCQlpZiAoIXJ0Yy0+cnRjX2VuYWJsZWQpIHsKPiArCQkJZGV2 X2VycihkZXYsICJSVEMgZW5hYmxlIGZhaWxlZFxuIik7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ ICsJCX0KPiArCX0KPiArCj4gKwl0aW1lX3NlYyA9IHJ0Y190bV90b190aW1lNjQodG0pOwo+ICsJ aWYgKHJ0Yy0+Y29uZmlnLT5ncmF5X3N0b3JlZCkKPiArCQl0aW1lX3NlYyA9IGJpbmFyeV90b19n cmF5KHRpbWVfc2VjKTsKPiArCXJlZ21hcF93cml0ZShydGMtPm1hcCwgUlRDX0NPVU5URVJfUkVH LCB0aW1lX3NlYyk7Cj4gKwlkZXZfZGJnKGRldiwgIiVzOiBzZXQgdGltZSA9ICV1c1xuIiwgX19m dW5jX18sIHRpbWVfc2VjKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBhbWxfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJt ICphbGFybSkKPiArewo+ICsJc3RydWN0IGFtbF9ydGNfZGF0YSAqcnRjID0gZGV2X2dldF9kcnZk YXRhKGRldik7Cj4gKwl0aW1lNjRfdCBhbGFybV9zZWM7Cj4gKwo+ICsJLyogaWYgUlRDIGRpc2Fi bGVkLCBzZXQgYWxhcm0gZmFpbGVkICovCj4gKwlpZiAoIXJ0Yy0+cnRjX2VuYWJsZWQpIHsKPiAr CQlkZXZfZXJyKGRldiwgIlJUQyBkaXNhYmxlZCwgc2V0IGFsYXJtIGZhaWxlZFxuIik7Cj4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+bWFw LCBSVENfQ1RSTCwKPiArCQkJICAgUlRDX0FMUk0wX0VOLCBSVENfQUxSTTBfRU4pOwo+ICsJcmVn bWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+bWFwLCBSVENfSU5UX01BU0ssCj4gKwkJCSAgIFJUQ19BTFJN MF9JUlFfTVNLLCAwKTsKPiArCj4gKwlhbGFybV9zZWMgPSBydGNfdG1fdG9fdGltZTY0KCZhbGFy bS0+dGltZSk7Cj4gKwlpZiAocnRjLT5jb25maWctPmdyYXlfc3RvcmVkKQo+ICsJCWFsYXJtX3Nl YyA9IGJpbmFyeV90b19ncmF5KGFsYXJtX3NlYyk7Cj4gKwlyZWdtYXBfd3JpdGUocnRjLT5tYXAs IFJUQ19BTEFSTTBfUkVHLCBhbGFybV9zZWMpOwo+ICsKPiArCWRldl9kYmcoZGV2LCAiJXM6IGFs YXJtLT5lbmFibGVkPSVkIGFsYXJtX3NldD0lbGxkc1xuIiwgX19mdW5jX18sCj4gKwkJYWxhcm0t PmVuYWJsZWQsIGFsYXJtX3NlYyk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgYW1sX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193 a2Fscm0gKmFsYXJtKQo+ICt7Cj4gKwlzdHJ1Y3QgYW1sX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0 X2RydmRhdGEoZGV2KTsKPiArCXUzMiBhbGFybV9zZWM7Cj4gKwlpbnQgYWxhcm1fZW5hYmxlOwo+ ICsJaW50IGFsYXJtX21hc2s7Cj4gKwo+ICsJLyogaWYgUlRDIGRpc2FibGVkLCByZWFkIGFsYXJt IGZhaWxlZCAqLwo+ICsJaWYgKCFydGMtPnJ0Y19lbmFibGVkKSB7Cj4gKwkJZGV2X2VycihkZXYs ICJSVEMgZGlzYWJsZWQsIHJlYWQgYWxhcm0gZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZB TDsKPiArCX0KPiArCj4gKwlyZWdtYXBfcmVhZChydGMtPm1hcCwgUlRDX0FMQVJNMF9SRUcsICZh bGFybV9zZWMpOwo+ICsJaWYgKHJ0Yy0+Y29uZmlnLT5ncmF5X3N0b3JlZCkKPiArCQlhbGFybV9z ZWMgPSBncmF5X3RvX2JpbmFyeShhbGFybV9zZWMpOwo+ICsJcnRjX3RpbWU2NF90b190bShhbGFy bV9zZWMsICZhbGFybS0+dGltZSk7Cj4gKwo+ICsJYWxhcm1fZW5hYmxlID0gcmVnbWFwX3Rlc3Rf Yml0cyhydGMtPm1hcCwgUlRDX0NUUkwsIFJUQ19BTFJNMF9FTik7Cj4gKwlhbGFybV9tYXNrID0g cmVnbWFwX3Rlc3RfYml0cyhydGMtPm1hcCwgUlRDX0lOVF9NQVNLLCBSVENfQUxSTTBfSVJRX01T Syk7Cj4gKwlhbGFybS0+ZW5hYmxlZCA9IChhbGFybV9lbmFibGUgJiYgIWFsYXJtX21hc2spID8g MSA6IDA7Cj4gKwlkZXZfZGJnKGRldiwgIiVzOiBhbGFybS0+ZW5hYmxlZD0lZCBhbGFybT0ldXNc biIsIF9fZnVuY19fLAo+ICsJCWFsYXJtLT5lbmFibGVkLCBhbGFybV9zZWMpOwo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFtbF9ydGNfcmVhZF9vZmZzZXQoc3RydWN0 IGRldmljZSAqZGV2LCBsb25nICpvZmZzZXQpCj4gK3sKPiArCXN0cnVjdCBhbWxfcnRjX2RhdGEg KnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJdTMyIHJlZ192YWw7Cj4gKwlsb25nIHZh bDsKPiArCWludCBzaWduLCBtYXRjaF9jb3VudGVyLCBlbmFibGU7Cj4gKwo+ICsJLyogaWYgUlRD IGRpc2FibGVkLCByZWFkIG9mZnNldCBmYWlsZWQgKi8KPiArCWlmICghcnRjLT5ydGNfZW5hYmxl ZCkgewo+ICsJCWRldl9lcnIoZGV2LCAiUlRDIGRpc2FibGVkLCByZWFkIG9mZnNldCBmYWlsZWRc biIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJlZ21hcF9yZWFkKHJ0Yy0+ bWFwLCBSVENfU0VDX0FESlVTVF9SRUcsICZyZWdfdmFsKTsKPiArCWVuYWJsZSA9IEZJRUxEX0dF VChSVENfQURKX1ZBTElELCByZWdfdmFsKTsKPiArCWlmICghZW5hYmxlKSB7Cj4gKwkJdmFsID0g MDsKPiArCX0gZWxzZSB7Cj4gKwkJc2lnbiA9IEZJRUxEX0dFVChSVENfU0VDX0FESlVTVF9DVFJM LCByZWdfdmFsKTsKPiArCQltYXRjaF9jb3VudGVyID0gRklFTERfR0VUKFJUQ19NQVRDSF9DT1VO VEVSLCByZWdfdmFsKTsKPiArCQl2YWwgPSAxMDAwMDAwMDAwIC8gKG1hdGNoX2NvdW50ZXIgKyAx KTsKPiArCQlpZiAoc2lnbiA9PSBSVENfU1dBTExPV19TRUNPTkQpCj4gKwkJCXZhbCA9IC12YWw7 Cj4gKwl9Cj4gKwkqb2Zmc2V0ID0gdmFsOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGFtbF9ydGNfc2V0X29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGxvbmcgb2Zm c2V0KQo+ICt7Cj4gKwlzdHJ1Y3QgYW1sX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEo ZGV2KTsKPiArCWludCBzaWduID0gMDsKPiArCWludCBtYXRjaF9jb3VudGVyID0gMDsKPiArCWlu dCBlbmFibGUgPSAwOwo+ICsJdTMyIHJlZ192YWw7Cj4gKwo+ICsJLyogaWYgUlRDIGRpc2FibGVk LCBzZXQgb2Zmc2V0IGZhaWxlZCAqLwo+ICsJaWYgKCFydGMtPnJ0Y19lbmFibGVkKSB7Cj4gKwkJ ZGV2X2VycihkZXYsICJSVEMgZGlzYWJsZWQsIHNldCBvZmZzZXQgZmFpbGVkXG4iKTsKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlpZiAob2Zmc2V0KSB7Cj4gKwkJZW5hYmxlID0g MTsKPiArCQlzaWduID0gb2Zmc2V0IDwgMCA/IFJUQ19TV0FMTE9XX1NFQ09ORCA6IFJUQ19JTlNF UlRfU0VDT05EOwo+ICsJCW1hdGNoX2NvdW50ZXIgPSAxMDAwMDAwMDAwIC8gYWJzKG9mZnNldCkg LSAxOwo+ICsJCWlmIChtYXRjaF9jb3VudGVyIDwgMCB8fCBtYXRjaF9jb3VudGVyID4gUlRDX01B VENIX0NPVU5URVIpCj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJlZ192YWwg PSBGSUVMRF9QUkVQKFJUQ19BREpfVkFMSUQsIGVuYWJsZSkgfAo+ICsJCSAgRklFTERfUFJFUChS VENfU0VDX0FESlVTVF9DVFJMLCBzaWduKSB8Cj4gKwkJICBGSUVMRF9QUkVQKFJUQ19NQVRDSF9D T1VOVEVSLCBtYXRjaF9jb3VudGVyKTsKPiArCXJlZ21hcF93cml0ZShydGMtPm1hcCwgUlRDX1NF Q19BREpVU1RfUkVHLCByZWdfdmFsKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIGludCBhbWxfcnRjX2FsYXJtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVk IGludCBlbmFibGVkKQo+ICt7Cj4gKwlzdHJ1Y3QgYW1sX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0 X2RydmRhdGEoZGV2KTsKPiArCj4gKwlpZiAoZW5hYmxlZCkgewo+ICsJCXJlZ21hcF91cGRhdGVf Yml0cyhydGMtPm1hcCwgUlRDX0NUUkwsCj4gKwkJCQkgICBSVENfQUxSTTBfRU4sIFJUQ19BTFJN MF9FTik7Cj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0Yy0+bWFwLCBSVENfSU5UX01BU0ssCj4g KwkJCQkgICBSVENfQUxSTTBfSVJRX01TSywgMCk7Cj4gKwl9IGVsc2Ugewo+ICsJCXJlZ21hcF91 cGRhdGVfYml0cyhydGMtPm1hcCwgUlRDX0lOVF9NQVNLLAo+ICsJCQkJICAgUlRDX0FMUk0wX0lS UV9NU0ssIFJUQ19BTFJNMF9JUlFfTVNLKTsKPiArCQlyZWdtYXBfdXBkYXRlX2JpdHMocnRjLT5t YXAsIFJUQ19DVFJMLAo+ICsJCQkJICAgUlRDX0FMUk0wX0VOLCAwKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGFt bF9ydGNfb3BzID0gewo+ICsJLnJlYWRfdGltZSA9IGFtbF9ydGNfcmVhZF90aW1lLAo+ICsJLnNl dF90aW1lID0gYW1sX3J0Y19zZXRfdGltZSwKPiArCS5yZWFkX2FsYXJtID0gYW1sX3J0Y19yZWFk X2FsYXJtLAo+ICsJLnNldF9hbGFybSA9IGFtbF9ydGNfc2V0X2FsYXJtLAo+ICsJLmFsYXJtX2ly cV9lbmFibGUgPSBhbWxfcnRjX2FsYXJtX2VuYWJsZSwKPiArCS5yZWFkX29mZnNldCA9IGFtbF9y dGNfcmVhZF9vZmZzZXQsCj4gKwkuc2V0X29mZnNldCA9IGFtbF9ydGNfc2V0X29mZnNldCwKPiAr fTsKPiArCj4gK3N0YXRpYyBpcnFyZXR1cm5fdCBhbWxfcnRjX2hhbmRsZXIoaW50IGlycSwgdm9p ZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGFtbF9ydGNfZGF0YSAqcnRjID0gKHN0cnVjdCBhbWxf cnRjX2RhdGEgKilkYXRhOwo+ICsKPiArCXJlZ21hcF93cml0ZShydGMtPm1hcCwgUlRDX0FMQVJN MF9SRUcsIDApOwo+ICsJcmVnbWFwX3dyaXRlKHJ0Yy0+bWFwLCBSVENfSU5UX0NMUiwgUlRDX0FM Uk0wX0lSUV9TVEFUVVMpOwo+ICsKPiArCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjX2RldiwgMSwg UlRDX0FGIHwgUlRDX0lSUUYpOwo+ICsKPiArCXJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsK PiArc3RhdGljIHZvaWQgYW1sX3J0Y19pbml0KHN0cnVjdCBhbWxfcnRjX2RhdGEgKnJ0YykKPiAr ewo+ICsJdTMyIHJlZ192YWwgPSAwOwo+ICsKPiArCXJ0Yy0+cnRjX2VuYWJsZWQgPSByZWdtYXBf dGVzdF9iaXRzKHJ0Yy0+bWFwLCBSVENfQ1RSTCwgUlRDX0VOQUJMRSk7Cj4gKwlpZiAoIXJ0Yy0+ cnRjX2VuYWJsZWQpIHsKPiArCQlpZiAoY2xrX2dldF9yYXRlKHJ0Yy0+cnRjX2NsaykgPT0gT1ND XzI0TSkgewo+ICsJCQkvKiBzZWxlY3QgMjRNIG9zY2lsbGF0b3IgKi8KPiArCQkJcmVnbWFwX3dy aXRlX2JpdHMocnRjLT5tYXAsIFJUQ19DVFJMLCBSVENfT1NDX1NFTCwgUlRDX09TQ19TRUwpOwo+ ICsKPiArCQkJLyoKPiArCQkJICogU2V0IFJUQyBvc2NpbGxhdG9yIHRvIGZyZXFfb3V0IHRvIGZy ZXFfaW4vKChOMCpNMCtOMSpNMSkvKE0wK00xKSkKPiArCQkJICogRW5hYmxlIGNsb2NrX2luIGdh dGUgb2Ygb3NjaWxsYXRvciAyNE1Iego+ICsJCQkgKiBTZXQgTjAgdG8gNzMzLCBOMSB0byA3MzIK PiArCQkJICovCj4gKwkJCXJlZ192YWwgPSBGSUVMRF9QUkVQKFJUQ19PU0NJTl9JTl9FTiwgMSkK PiArCQkJCSAgfCBGSUVMRF9QUkVQKFJUQ19PU0NJTl9PVVRfQ0ZHLCAxKQo+ICsJCQkJICB8IEZJ RUxEX1BSRVAoUlRDX09TQ0lOX09VVF9OME0wLCBSVENfT1NDSU5fT1VUXzMyS19OMCkKPiArCQkJ CSAgfCBGSUVMRF9QUkVQKFJUQ19PU0NJTl9PVVRfTjFNMSwgUlRDX09TQ0lOX09VVF8zMktfTjEp Owo+ICsJCQlyZWdtYXBfd3JpdGVfYml0cyhydGMtPm1hcCwgUlRDX09TQ0lOX0NUUkwwLCBSVENf T1NDSU5fSU5fRU4KPiArCQkJCQkgIHwgUlRDX09TQ0lOX09VVF9DRkcgfCBSVENfT1NDSU5fT1VU X04wTTAKPiArCQkJCQkgIHwgUlRDX09TQ0lOX09VVF9OMU0xLCByZWdfdmFsKTsKPiArCj4gKwkJ CS8qIFNldCBNMCB0byAyLCBNMSB0byAzLCBzbyBmcmVxX291dCA9IDMyNzY4IEh6Ki8KPiArCQkJ cmVnX3ZhbCA9IEZJRUxEX1BSRVAoUlRDX09TQ0lOX09VVF9OME0wLCBSVENfT1NDSU5fT1VUXzMy S19NMCkKPiArCQkJCSAgfCBGSUVMRF9QUkVQKFJUQ19PU0NJTl9PVVRfTjFNMSwgUlRDX09TQ0lO X09VVF8zMktfTTEpOwo+ICsJCQlyZWdtYXBfd3JpdGVfYml0cyhydGMtPm1hcCwgUlRDX09TQ0lO X0NUUkwxLCBSVENfT1NDSU5fT1VUX04wTTAKPiArCQkJCQkgIHwgUlRDX09TQ0lOX09VVF9OMU0x LCByZWdfdmFsKTsKPiArCQl9IGVsc2Ugewo+ICsJCQkvKiBzZWxlY3QgMzJLIG9zY2lsbGF0b3Ig Ki8KPiArCQkJcmVnbWFwX3dyaXRlX2JpdHMocnRjLT5tYXAsIFJUQ19DVFJMLCBSVENfT1NDX1NF TCwgMCk7Cj4gKwkJfQo+ICsJfQo+ICsJcmVnbWFwX3dyaXRlX2JpdHMocnRjLT5tYXAsIFJUQ19J TlRfTUFTSywKPiArCQkJICBSVENfQUxSTTBfSVJRX01TSywgUlRDX0FMUk0wX0lSUV9NU0spOwo+ ICsJcmVnbWFwX3dyaXRlX2JpdHMocnRjLT5tYXAsIFJUQ19DVFJMLCBSVENfQUxSTTBfRU4sIDAp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFtbF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKPiAr CXN0cnVjdCBhbWxfcnRjX2RhdGEgKnJ0YzsKPiArCXZvaWQgX19pb21lbSAqYmFzZTsKPiArCWlu dCByZXQgPSAwOwo+ICsKPiArCXJ0YyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcnRjKSwg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXJ0YykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwly dGMtPmNvbmZpZyA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOwo+ICsJaWYgKCFydGMt PmNvbmZpZykKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwliYXNlID0gZGV2bV9wbGF0Zm9y bV9pb3JlbWFwX3Jlc291cmNlKHBkZXYsIDApOwo+ICsJaWYgKElTX0VSUihiYXNlKSkKPiArCQly ZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIoYmFzZSksICJyZXNvdXJjZSBpb3JlbWFw IGZhaWxlZFxuIik7Cj4gKwo+ICsJcnRjLT5tYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oZGV2 LCBiYXNlLCAmYW1sX3J0Y19yZWdtYXBfY29uZmlnKTsKPiArCWlmIChJU19FUlIocnRjLT5tYXAp KQo+ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VSUihydGMtPm1hcCksICJyZWdt YXAgaW5pdCBmYWlsZWRcbiIpOwo+ICsKPiArCXJ0Yy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShw ZGV2LCAwKTsKPiArCWlmIChydGMtPmlycSA8IDApCj4gKwkJcmV0dXJuIHJ0Yy0+aXJxOwo+ICsK PiArCXJ0Yy0+cnRjX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJvc2MiKTsKPiArCWlmIChJU19F UlIocnRjLT5ydGNfY2xrKSkKPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIo cnRjLT5ydGNfY2xrKSwKPiArCQkJCSAgICAgImZhaWxlZCB0byBmaW5kIHJ0YyBjbG9ja1xuIik7 Cj4gKwlpZiAoY2xrX2dldF9yYXRlKHJ0Yy0+cnRjX2NsaykgIT0gT1NDXzMySyAmJiBjbGtfZ2V0 X3JhdGUocnRjLT5ydGNfY2xrKSAhPSBPU0NfMjRNKQo+ICsJCXJldHVybiBkZXZfZXJyX3Byb2Jl KGRldiwgLUVJTlZBTCwgIkludmFsaWQgY2xvY2sgY29uZmlndXJhdGlvblxuIik7Cj4gKwo+ICsJ cnRjLT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0X2VuYWJsZWQoZGV2LCAic3lzIik7Cj4gKwlpZiAo SVNfRVJSKHJ0Yy0+c3lzX2NsaykpCj4gKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJf RVJSKHJ0Yy0+c3lzX2NsayksCj4gKwkJCQkgICAgICJmYWlsZWQgdG8gZ2V0X2VuYWJsZSBydGMg c3lzIGNsa1xuIik7Cj4gKwlhbWxfcnRjX2luaXQocnRjKTsKPiArCj4gKwlkZXZpY2VfaW5pdF93 YWtldXAoZGV2LCAxKTsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7Cj4gKwo+ ICsJcnRjLT5ydGNfZGV2ID0gZGV2bV9ydGNfYWxsb2NhdGVfZGV2aWNlKGRldik7Cj4gKwlpZiAo SVNfRVJSKHJ0Yy0+cnRjX2RldikpIHsKPiArCQlyZXQgPSBQVFJfRVJSKHJ0Yy0+cnRjX2Rldik7 Cj4gKwkJZ290byBlcnJfY2xrOwo+ICsJfQo+ICsKPiArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEo ZGV2LCBydGMtPmlycSwgYW1sX3J0Y19oYW5kbGVyLAo+ICsJCQkgICAgICAgSVJRRl9PTkVTSE9U LCAiYW1sLXJ0YyBhbGFybSIsIHJ0Yyk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2Vycl9wcm9i ZShkZXYsIHJldCwgIklSUSVkIHJlcXVlc3QgZmFpbGVkLCByZXQgPSAlZFxuIiwKPiArCQkJICAg ICAgcnRjLT5pcnEsIHJldCk7Cj4gKwkJZ290byBlcnJfY2xrOwo+ICsJfQo+ICsKPiArCXJ0Yy0+ cnRjX2Rldi0+b3BzID0gJmFtbF9ydGNfb3BzOwo+ICsJcnRjLT5ydGNfZGV2LT5yYW5nZV9taW4g PSAwOwo+ICsJcnRjLT5ydGNfZGV2LT5yYW5nZV9tYXggPSBVMzJfTUFYOwo+ICsKPiArCXJldCA9 IGRldm1fcnRjX3JlZ2lzdGVyX2RldmljZShydGMtPnJ0Y19kZXYpOwo+ICsJaWYgKHJldCkgewo+ ICsJCWRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJU QyBkZXZpY2U6ICVkXG4iLCByZXQpOwo+ICsJCWdvdG8gZXJyX2NsazsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArZXJyX2NsazoKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShydGMtPnN5c19j bGspOwo+ICsJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsK PiArfQo+ICsKPiArc3RhdGljIGludCBhbWxfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2 KQo+ICt7Cj4gKwlzdHJ1Y3QgYW1sX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2 KTsKPiArCj4gKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKPiArCQllbmFibGVfaXJxX3dh a2UocnRjLT5pcnEpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFt bF9ydGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IGFtbF9ydGNf ZGF0YSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwo+ICsJaWYgKGRldmljZV9tYXlf d2FrZXVwKGRldikpCj4gKwkJZGlzYWJsZV9pcnFfd2FrZShydGMtPmlycSk7Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gK30KCkJ1aWxkaW5nIHRoaXMsIGkgZ290OgoKZHJpdmVycy9ydGMvcnRjLWFtbG9n aWMtYTQuYzo0MDk6MTI6IGVycm9yOiDigJhhbWxfcnRjX3Jlc3VtZeKAmSBkZWZpbmVkIGJ1dCBu b3QgdXNlZCBbLVdlcnJvcj11bnVzZWQtZnVuY3Rpb25dCiAgNDA5IHwgc3RhdGljIGludCBhbWxf cnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAgICAgIHwgICAgICAgICAgICBefn5+fn5+ fn5+fn5+fgpkcml2ZXJzL3J0Yy9ydGMtYW1sb2dpYy1hNC5jOjM5OToxMjogZXJyb3I6IOKAmGFt bF9ydGNfc3VzcGVuZOKAmSBkZWZpbmVkIGJ1dCBub3QgdXNlZCBbLVdlcnJvcj11bnVzZWQtZnVu Y3Rpb25dCiAgMzk5IHwgc3RhdGljIGludCBhbWxfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAq ZGV2KQogICAgICB8ICAgICAgICAgICAgXn5+fn5+fn5+fn5+fn5+CgoKPiArCj4gK3N0YXRpYyBT SU1QTEVfREVWX1BNX09QUyhhbWxfcnRjX3BtX29wcywKPiArCQkJIGFtbF9ydGNfc3VzcGVuZCwg YW1sX3J0Y19yZXN1bWUpOwo+ICsKPiArc3RhdGljIHZvaWQgYW1sX3J0Y19yZW1vdmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGFtbF9ydGNfZGF0YSAqcnRj ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwo+ICsKPiArCS8qIGRpc2FibGUgUlRDICov Cj4gKwlyZWdtYXBfd3JpdGVfYml0cyhydGMtPm1hcCwgUlRDX0NUUkwsIFJUQ19FTkFCTEUsIDAp OwoKWW91IGNhbid0IGRvIHRoaXMsIHRoaXMgZGVmZWF0cyB0aGUgcHVycG9zZSBvZiB0aGUgUlRD LiBPbmNlIHN0YXJ0ZWQgYW4Kc2V0LCBpdCBtdXN0IG5vdCBiZSBzdG9wcGVkLgoKPiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShydGMtPnN5c19jbGspOwo+ICsJZGV2aWNlX2luaXRfd2FrZXVwKCZw ZGV2LT5kZXYsIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFtbF9ydGNfY29u ZmlnIGE1X3J0Y19jb25maWcgPSB7Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFt bF9ydGNfY29uZmlnIGE0X3J0Y19jb25maWcgPSB7Cj4gKwkuZ3JheV9zdG9yZWQgPSB0cnVlLAo+ ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYW1sX3J0Y19kZXZp Y2VfaWRbXSA9IHsKPiArCXsKPiArCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLGE0LXJ0YyIsCj4g KwkJLmRhdGEgPSAmYTRfcnRjX2NvbmZpZywKPiArCX0sCj4gKwl7Cj4gKwkJLmNvbXBhdGlibGUg PSAiYW1sb2dpYyxhNS1ydGMiLAo+ICsJCS5kYXRhID0gJmE1X3J0Y19jb25maWcsCj4gKwl9LAo+ ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhbWxfcnRjX2RldmljZV9pZCk7Cj4gKwo+ ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbWxfcnRjX2RyaXZlciA9IHsKPiArCS5w cm9iZSA9IGFtbF9ydGNfcHJvYmUsCj4gKwkucmVtb3ZlID0gYW1sX3J0Y19yZW1vdmUsCj4gKwku ZHJpdmVyID0gewo+ICsJCS5uYW1lID0gImFtbC1ydGMiLAo+ICsJCS5wbSA9ICZhbWxfcnRjX3Bt X29wcywKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBhbWxfcnRjX2RldmljZV9pZCwKPiArCX0sCj4g K307Cj4gKwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFtbF9ydGNfZHJpdmVyKTsKPiArTU9E VUxFX0RFU0NSSVBUSU9OKCJBbWxvZ2ljIFJUQyBkcml2ZXIiKTsKPiArTU9EVUxFX0FVVEhPUigi WWl0aW5nIERlbmcgPHlpdGluZy5kZW5nQGFtbG9naWMuY29tPiIpOwo+ICtNT0RVTEVfTElDRU5T RSgiR1BMIik7Cj4gCj4gLS0gCj4gMi4zNy4xCj4gCj4gCgotLSAKQWxleGFuZHJlIEJlbGxvbmks IGNvLW93bmVyIGFuZCBDT08sIEJvb3RsaW4KRW1iZWRkZWQgTGludXggYW5kIEtlcm5lbCBlbmdp bmVlcmluZwpodHRwczovL2Jvb3RsaW4uY29tCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsaW51eC1hbWxvZ2ljIG1haWxpbmcgbGlzdApsaW51eC1hbWxv Z2ljQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1hbWxvZ2ljCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) (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 DC21E7F477; Mon, 11 Nov 2024 22:07:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.197 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731362856; cv=none; b=bBbyK1uLVMWeSMp4lJXuVzDvCbzcW5EvLDyDwCLRxZ+z1+q7my7K8k4McapDeFZAnueIGrGH+iaSfokJ37HsgTOuvCLjteP5/W6IuqROXbwd77axxk0tLmDsz1Jbr0sk5+IKNcp00QZO6WXrhkALdXvErMbbh5nLf1O/wchy77c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731362856; c=relaxed/simple; bh=Ur6mJHOATKYegvM6PWg1gVJDzfNeMruksqIq0g4+c8E=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=tHbX95Qb+HR2kr00ctFGn3JyQNqCudYwV9tUYs6IZ76exrTJ0djfSQSqwERc54/m1Vt7Vha0PfDoL9web6CsbUGbdjuLN2P2jVFEFkgvV4dVf9tHIHFeWQNTuw1mV68bPZKnNjYGv9SHB1RJ08ae79mC+4m23J+U//DEkEq/d7k= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ntkkyCgj; arc=none smtp.client-ip=217.70.183.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ntkkyCgj" Received: by mail.gandi.net (Postfix) with ESMTPSA id 0BC641C0002; Mon, 11 Nov 2024 22:07:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1731362846; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nvLBpIbXRymgph7QAAvU55QOaoId7HTwuv+sfMNt8G4=; b=ntkkyCgjQYaK73FYXJqWzOXfNXxT51oEVfa94QheQndXN4q3pgTot68IEr0ofUi0Ud6aDw 6fb+pvwfewtJ/eJi+H+5bet77fU+FN9uRlfMozMp8AtuQKEOYEAqiaq3ZV0z1XFJJCbYgp prz4MZbxcfT6v1UrPKTc2IiXebg+Zw1hbLfXi951fsnEe/Fylbv5yJkTSxB3nsF5sx3XWu SSjEVYeyrMctLefS7EDvD/aOMbPck5XRL9YFCXMD+L1PY9LxU71eMpY/dqJJQph/Q6Bj+d +iJykkRgN74cf1wDuSsxYPjrn6nDdIfV3giY934sBiZJbLkD7ENOlcu8410EkA== Date: Mon, 11 Nov 2024 23:07:23 +0100 From: Alexandre Belloni To: xianwei.zhao@amlogic.com Cc: Yiting Deng , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-amlogic@lists.infradead.org, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 2/3] rtc: support for the Amlogic on-chip RTC Message-ID: <202411112207234c96cc30@mail.local> References: <20241108-rtc-v5-0-0194727c778b@amlogic.com> <20241108-rtc-v5-2-0194727c778b@amlogic.com> Precedence: bulk X-Mailing-List: linux-rtc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20241108-rtc-v5-2-0194727c778b@amlogic.com> X-GND-Sasl: alexandre.belloni@bootlin.com On 08/11/2024 13:54:42+0800, Xianwei Zhao via B4 Relay wrote: > +static int aml_rtc_read_time(struct device *dev, struct rtc_time *tm) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + u32 time_sec; > + > + /* if RTC disabled, read time failed */ > + if (!rtc->rtc_enabled) { > + dev_err(dev, "RTC disabled, read time failed\n"); These messages should be dropped, they probably won't be seen by any user. > + return -EINVAL; > + } > + > + regmap_read(rtc->map, RTC_REAL_TIME, &time_sec); > + if (rtc->config->gray_stored) > + time_sec = gray_to_binary(time_sec); > + rtc_time64_to_tm(time_sec, tm); > + dev_dbg(dev, "%s: read time = %us\n", __func__, time_sec); > + > + return 0; > +} > + > +static int aml_rtc_set_time(struct device *dev, struct rtc_time *tm) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + u32 time_sec; > + > + /* if RTC disabled, first enable it */ > + if (!rtc->rtc_enabled) { > + regmap_write_bits(rtc->map, RTC_CTRL, RTC_ENABLE, RTC_ENABLE); > + usleep_range(100, 200); > + rtc->rtc_enabled = regmap_test_bits(rtc->map, RTC_CTRL, RTC_ENABLE); > + if (!rtc->rtc_enabled) { > + dev_err(dev, "RTC enable failed\n"); > + return -EINVAL; > + } > + } > + > + time_sec = rtc_tm_to_time64(tm); > + if (rtc->config->gray_stored) > + time_sec = binary_to_gray(time_sec); > + regmap_write(rtc->map, RTC_COUNTER_REG, time_sec); > + dev_dbg(dev, "%s: set time = %us\n", __func__, time_sec); > + > + return 0; > +} > + > +static int aml_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + time64_t alarm_sec; > + > + /* if RTC disabled, set alarm failed */ > + if (!rtc->rtc_enabled) { > + dev_err(dev, "RTC disabled, set alarm failed\n"); > + return -EINVAL; > + } > + > + regmap_update_bits(rtc->map, RTC_CTRL, > + RTC_ALRM0_EN, RTC_ALRM0_EN); > + regmap_update_bits(rtc->map, RTC_INT_MASK, > + RTC_ALRM0_IRQ_MSK, 0); > + > + alarm_sec = rtc_tm_to_time64(&alarm->time); > + if (rtc->config->gray_stored) > + alarm_sec = binary_to_gray(alarm_sec); > + regmap_write(rtc->map, RTC_ALARM0_REG, alarm_sec); > + > + dev_dbg(dev, "%s: alarm->enabled=%d alarm_set=%llds\n", __func__, > + alarm->enabled, alarm_sec); > + > + return 0; > +} > + > +static int aml_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + u32 alarm_sec; > + int alarm_enable; > + int alarm_mask; > + > + /* if RTC disabled, read alarm failed */ > + if (!rtc->rtc_enabled) { > + dev_err(dev, "RTC disabled, read alarm failed\n"); > + return -EINVAL; > + } > + > + regmap_read(rtc->map, RTC_ALARM0_REG, &alarm_sec); > + if (rtc->config->gray_stored) > + alarm_sec = gray_to_binary(alarm_sec); > + rtc_time64_to_tm(alarm_sec, &alarm->time); > + > + alarm_enable = regmap_test_bits(rtc->map, RTC_CTRL, RTC_ALRM0_EN); > + alarm_mask = regmap_test_bits(rtc->map, RTC_INT_MASK, RTC_ALRM0_IRQ_MSK); > + alarm->enabled = (alarm_enable && !alarm_mask) ? 1 : 0; > + dev_dbg(dev, "%s: alarm->enabled=%d alarm=%us\n", __func__, > + alarm->enabled, alarm_sec); > + > + return 0; > +} > + > +static int aml_rtc_read_offset(struct device *dev, long *offset) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + u32 reg_val; > + long val; > + int sign, match_counter, enable; > + > + /* if RTC disabled, read offset failed */ > + if (!rtc->rtc_enabled) { > + dev_err(dev, "RTC disabled, read offset failed\n"); > + return -EINVAL; > + } > + > + regmap_read(rtc->map, RTC_SEC_ADJUST_REG, ®_val); > + enable = FIELD_GET(RTC_ADJ_VALID, reg_val); > + if (!enable) { > + val = 0; > + } else { > + sign = FIELD_GET(RTC_SEC_ADJUST_CTRL, reg_val); > + match_counter = FIELD_GET(RTC_MATCH_COUNTER, reg_val); > + val = 1000000000 / (match_counter + 1); > + if (sign == RTC_SWALLOW_SECOND) > + val = -val; > + } > + *offset = val; > + > + return 0; > +} > + > +static int aml_rtc_set_offset(struct device *dev, long offset) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + int sign = 0; > + int match_counter = 0; > + int enable = 0; > + u32 reg_val; > + > + /* if RTC disabled, set offset failed */ > + if (!rtc->rtc_enabled) { > + dev_err(dev, "RTC disabled, set offset failed\n"); > + return -EINVAL; > + } > + > + if (offset) { > + enable = 1; > + sign = offset < 0 ? RTC_SWALLOW_SECOND : RTC_INSERT_SECOND; > + match_counter = 1000000000 / abs(offset) - 1; > + if (match_counter < 0 || match_counter > RTC_MATCH_COUNTER) > + return -EINVAL; > + } > + > + reg_val = FIELD_PREP(RTC_ADJ_VALID, enable) | > + FIELD_PREP(RTC_SEC_ADJUST_CTRL, sign) | > + FIELD_PREP(RTC_MATCH_COUNTER, match_counter); > + regmap_write(rtc->map, RTC_SEC_ADJUST_REG, reg_val); > + > + return 0; > +} > + > +static int aml_rtc_alarm_enable(struct device *dev, unsigned int enabled) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + > + if (enabled) { > + regmap_update_bits(rtc->map, RTC_CTRL, > + RTC_ALRM0_EN, RTC_ALRM0_EN); > + regmap_update_bits(rtc->map, RTC_INT_MASK, > + RTC_ALRM0_IRQ_MSK, 0); > + } else { > + regmap_update_bits(rtc->map, RTC_INT_MASK, > + RTC_ALRM0_IRQ_MSK, RTC_ALRM0_IRQ_MSK); > + regmap_update_bits(rtc->map, RTC_CTRL, > + RTC_ALRM0_EN, 0); > + } > + > + return 0; > +} > + > +static const struct rtc_class_ops aml_rtc_ops = { > + .read_time = aml_rtc_read_time, > + .set_time = aml_rtc_set_time, > + .read_alarm = aml_rtc_read_alarm, > + .set_alarm = aml_rtc_set_alarm, > + .alarm_irq_enable = aml_rtc_alarm_enable, > + .read_offset = aml_rtc_read_offset, > + .set_offset = aml_rtc_set_offset, > +}; > + > +static irqreturn_t aml_rtc_handler(int irq, void *data) > +{ > + struct aml_rtc_data *rtc = (struct aml_rtc_data *)data; > + > + regmap_write(rtc->map, RTC_ALARM0_REG, 0); > + regmap_write(rtc->map, RTC_INT_CLR, RTC_ALRM0_IRQ_STATUS); > + > + rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF); > + > + return IRQ_HANDLED; > +} > + > +static void aml_rtc_init(struct aml_rtc_data *rtc) > +{ > + u32 reg_val = 0; > + > + rtc->rtc_enabled = regmap_test_bits(rtc->map, RTC_CTRL, RTC_ENABLE); > + if (!rtc->rtc_enabled) { > + if (clk_get_rate(rtc->rtc_clk) == OSC_24M) { > + /* select 24M oscillator */ > + regmap_write_bits(rtc->map, RTC_CTRL, RTC_OSC_SEL, RTC_OSC_SEL); > + > + /* > + * Set RTC oscillator to freq_out to freq_in/((N0*M0+N1*M1)/(M0+M1)) > + * Enable clock_in gate of oscillator 24MHz > + * Set N0 to 733, N1 to 732 > + */ > + reg_val = FIELD_PREP(RTC_OSCIN_IN_EN, 1) > + | FIELD_PREP(RTC_OSCIN_OUT_CFG, 1) > + | FIELD_PREP(RTC_OSCIN_OUT_N0M0, RTC_OSCIN_OUT_32K_N0) > + | FIELD_PREP(RTC_OSCIN_OUT_N1M1, RTC_OSCIN_OUT_32K_N1); > + regmap_write_bits(rtc->map, RTC_OSCIN_CTRL0, RTC_OSCIN_IN_EN > + | RTC_OSCIN_OUT_CFG | RTC_OSCIN_OUT_N0M0 > + | RTC_OSCIN_OUT_N1M1, reg_val); > + > + /* Set M0 to 2, M1 to 3, so freq_out = 32768 Hz*/ > + reg_val = FIELD_PREP(RTC_OSCIN_OUT_N0M0, RTC_OSCIN_OUT_32K_M0) > + | FIELD_PREP(RTC_OSCIN_OUT_N1M1, RTC_OSCIN_OUT_32K_M1); > + regmap_write_bits(rtc->map, RTC_OSCIN_CTRL1, RTC_OSCIN_OUT_N0M0 > + | RTC_OSCIN_OUT_N1M1, reg_val); > + } else { > + /* select 32K oscillator */ > + regmap_write_bits(rtc->map, RTC_CTRL, RTC_OSC_SEL, 0); > + } > + } > + regmap_write_bits(rtc->map, RTC_INT_MASK, > + RTC_ALRM0_IRQ_MSK, RTC_ALRM0_IRQ_MSK); > + regmap_write_bits(rtc->map, RTC_CTRL, RTC_ALRM0_EN, 0); > +} > + > +static int aml_rtc_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct aml_rtc_data *rtc; > + void __iomem *base; > + int ret = 0; > + > + rtc = devm_kzalloc(dev, sizeof(*rtc), GFP_KERNEL); > + if (!rtc) > + return -ENOMEM; > + > + rtc->config = of_device_get_match_data(dev); > + if (!rtc->config) > + return -ENODEV; > + > + base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(base)) > + return dev_err_probe(dev, PTR_ERR(base), "resource ioremap failed\n"); > + > + rtc->map = devm_regmap_init_mmio(dev, base, &aml_rtc_regmap_config); > + if (IS_ERR(rtc->map)) > + return dev_err_probe(dev, PTR_ERR(rtc->map), "regmap init failed\n"); > + > + rtc->irq = platform_get_irq(pdev, 0); > + if (rtc->irq < 0) > + return rtc->irq; > + > + rtc->rtc_clk = devm_clk_get(dev, "osc"); > + if (IS_ERR(rtc->rtc_clk)) > + return dev_err_probe(dev, PTR_ERR(rtc->rtc_clk), > + "failed to find rtc clock\n"); > + if (clk_get_rate(rtc->rtc_clk) != OSC_32K && clk_get_rate(rtc->rtc_clk) != OSC_24M) > + return dev_err_probe(dev, -EINVAL, "Invalid clock configuration\n"); > + > + rtc->sys_clk = devm_clk_get_enabled(dev, "sys"); > + if (IS_ERR(rtc->sys_clk)) > + return dev_err_probe(dev, PTR_ERR(rtc->sys_clk), > + "failed to get_enable rtc sys clk\n"); > + aml_rtc_init(rtc); > + > + device_init_wakeup(dev, 1); > + platform_set_drvdata(pdev, rtc); > + > + rtc->rtc_dev = devm_rtc_allocate_device(dev); > + if (IS_ERR(rtc->rtc_dev)) { > + ret = PTR_ERR(rtc->rtc_dev); > + goto err_clk; > + } > + > + ret = devm_request_irq(dev, rtc->irq, aml_rtc_handler, > + IRQF_ONESHOT, "aml-rtc alarm", rtc); > + if (ret) { > + dev_err_probe(dev, ret, "IRQ%d request failed, ret = %d\n", > + rtc->irq, ret); > + goto err_clk; > + } > + > + rtc->rtc_dev->ops = &aml_rtc_ops; > + rtc->rtc_dev->range_min = 0; > + rtc->rtc_dev->range_max = U32_MAX; > + > + ret = devm_rtc_register_device(rtc->rtc_dev); > + if (ret) { > + dev_err_probe(&pdev->dev, ret, "Failed to register RTC device: %d\n", ret); > + goto err_clk; > + } > + > + return 0; > +err_clk: > + clk_disable_unprepare(rtc->sys_clk); > + device_init_wakeup(dev, 0); > + > + return ret; > +} > + > +static int aml_rtc_suspend(struct device *dev) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + > + if (device_may_wakeup(dev)) > + enable_irq_wake(rtc->irq); > + > + return 0; > +} > + > +static int aml_rtc_resume(struct device *dev) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(dev); > + > + if (device_may_wakeup(dev)) > + disable_irq_wake(rtc->irq); > + > + return 0; > +} Building this, i got: drivers/rtc/rtc-amlogic-a4.c:409:12: error: ‘aml_rtc_resume’ defined but not used [-Werror=unused-function] 409 | static int aml_rtc_resume(struct device *dev) | ^~~~~~~~~~~~~~ drivers/rtc/rtc-amlogic-a4.c:399:12: error: ‘aml_rtc_suspend’ defined but not used [-Werror=unused-function] 399 | static int aml_rtc_suspend(struct device *dev) | ^~~~~~~~~~~~~~~ > + > +static SIMPLE_DEV_PM_OPS(aml_rtc_pm_ops, > + aml_rtc_suspend, aml_rtc_resume); > + > +static void aml_rtc_remove(struct platform_device *pdev) > +{ > + struct aml_rtc_data *rtc = dev_get_drvdata(&pdev->dev); > + > + /* disable RTC */ > + regmap_write_bits(rtc->map, RTC_CTRL, RTC_ENABLE, 0); You can't do this, this defeats the purpose of the RTC. Once started an set, it must not be stopped. > + clk_disable_unprepare(rtc->sys_clk); > + device_init_wakeup(&pdev->dev, 0); > +} > + > +static const struct aml_rtc_config a5_rtc_config = { > +}; > + > +static const struct aml_rtc_config a4_rtc_config = { > + .gray_stored = true, > +}; > + > +static const struct of_device_id aml_rtc_device_id[] = { > + { > + .compatible = "amlogic,a4-rtc", > + .data = &a4_rtc_config, > + }, > + { > + .compatible = "amlogic,a5-rtc", > + .data = &a5_rtc_config, > + }, > +}; > +MODULE_DEVICE_TABLE(of, aml_rtc_device_id); > + > +static struct platform_driver aml_rtc_driver = { > + .probe = aml_rtc_probe, > + .remove = aml_rtc_remove, > + .driver = { > + .name = "aml-rtc", > + .pm = &aml_rtc_pm_ops, > + .of_match_table = aml_rtc_device_id, > + }, > +}; > + > +module_platform_driver(aml_rtc_driver); > +MODULE_DESCRIPTION("Amlogic RTC driver"); > +MODULE_AUTHOR("Yiting Deng "); > +MODULE_LICENSE("GPL"); > > -- > 2.37.1 > > -- Alexandre Belloni, co-owner and COO, Bootlin Embedded Linux and Kernel engineering https://bootlin.com