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 5B76CC55162 for ; Sun, 2 Aug 2026 20:34:56 +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:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=oTWaLSxnN3NHMfj1aYNLL1u3t5L4m5I3QCdyRARIGiY=; b=pRlUaAE7KqcF4u Ivi97aykXfGmBJFXfpSulMr0fpvzz5+2g/wxshLBfPVWZT69fJmEXTTujUJ8xqjqDT/Xp/DYlxccl hDET/bHmowH48F7N3N5l+x9uoJI3CiPk+P6lztKl/jiWNakyZGu7aq/IDdVjJX3YioIrTqg3Ur4m3 +Pjh9PIV9iKu8+3Xz92RRAzxpaNaxLt31rRfYludZv4qkEgQFAyCpxzVAhJrkwQtuwrhrpAn/ovf7 UjijFCo13Y7V5iKrZ4ewu71RLaVzRPFCbWYck8Mppl0R1NIwl5mi4/zzC9Ky2jMB7n29qL17E7fpv 7qY75OnLYvr6tILGsccQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wqctc-0000000G1zd-0Eri; Sun, 02 Aug 2026 20:34:56 +0000 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wqctY-0000000G1tG-1bzO for linux-phy@lists.infradead.org; Sun, 02 Aug 2026 20:34:55 +0000 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-4954a9e8490so11674575e9.1 for ; Sun, 02 Aug 2026 13:34:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785702891; x=1786307691; darn=lists.infradead.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=bIP93lvBLMGojmWlYFRUzPyh/SNEeVDe+e2Useud0hs=; b=rfcS4QJnpDeq3ZZo66dX6s2YJ3ax+w8d10qkH2CxkPvZwd8C1TyZQd1nW/rR+RTuhs sQjLKv5ULRDuFS8uQIzEaed9yB4Ut4NoBMgFhCPsipfDtcrOtItH5tO+LPdZrCmt2pF3 0Dbu76gu+dKaL1qzmb+SuH6hFc2Fk5nADkpiSVyL5JHtYidFzH/EKxlhE6ILjq59wHSp mARjmu28TmY4H8mh263JjNBd4IM4cLPiJxKJ2kf8WbV9CxbaGaZvSWXroUUgp1agMrGO ohDZ4twRFq0hS1vrSk3+8O7tLVS0IYH9Maa1FAQYjUUCCYyU6qTMqntsoSGx1zEGTagj kzgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785702891; x=1786307691; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=bIP93lvBLMGojmWlYFRUzPyh/SNEeVDe+e2Useud0hs=; b=ZbjfM0Lk3IlFVkZ9nVz7xFJZPH9iONPweIUekZj99lgkWPQQhdGxO0HWpBTv5fdsgp /I+3GB9XV0IgZAeVS05wsZfAbw2B7EHovppyUtjaib4Br0Hf5ypkNCks1P+NSmqa8Vlr SqA3zK59CD1XJtFvjJ38qKqlXKJisa1NR629JBsiWvXHzaz+M0yyz/pBT78zLIs+ijFY 61y45SsN//fESGl5+NNEbDULF3Kyf3A35Ldv74PHEBi3SJDYOkzswbGzXK6RBh9qKJAw g0hmEjubViMZOrpQy7Iwt/EEROiSSSjmgvhAkvNfUUHqEUm7hhTXErbgE9ZilFjJ2a7w /GHA== X-Forwarded-Encrypted: i=1; AHgh+RrP59Kda/GkC23/J+kpmwhsbdykHyCUXhXHh1QZUI0540YE4+mHNu8hvg3yvy0Oj2g2y/fc2o8KMXY=@lists.infradead.org X-Gm-Message-State: AOJu0YwDjx+toX/x/O28+R7J9k8lkO2ssW7PG5RwyYI9wT5bPy3xr12o TY37Zxo2IjSFCtWINwuqltE2/Q2k9EFIGxCwsKv6qj7nfPVbkDqpNpvO X-Gm-Gg: AR+sD10hCXwdOlHbFKp90EdiLsz6q61n/Xm0OxCvqSiofTPrXhqP8icxEHeXRnqVTXO ya2D5Nj8SNlrtRFoZLWwk9jlTbNUAD57/rIzzE5ayGfltYvufcu17DdurRXNoOyRervGmVA2Thq K6qY6KOOBRkRsUdI3UoZ2DPgKe0UVRkTCRZ0A6xcCsTECeVAzCsXpg6uOcjotdcKcaFANHI8nyd HDEqkyRNwZzsl4DRMOIdBkV67vKkL2bOuHHFSXysKoRhrPnqZ2Ytn0z7U3Zu01bUZnt/lc0dg5N BZf43WcU6gqQRRlZxZIBXQ0a8cYvplDfBgy87dh9mhtfiLviCrh/h/LpfC3qppf0RxxvjYy3yEB Bia8btf8HGckKLemDdIyO5gRZYUZSF78DT6ovPqbUreCSL5SvRnuteGZ8NQ5xCoOL8PEJ5xHK8A bTAsatJ++gcSbEnyoSDHnDxgmvYgt4v6v91kwlQM3TMLfiCSWcN+zLF+5b0ghLLa4CXw+s4FTk X-Received: by 2002:a05:600c:1912:b0:495:4f84:7280 with SMTP id 5b1f17b1804b1-4980eb8c4a1mr125120745e9.4.1785702890317; Sun, 02 Aug 2026 13:34:50 -0700 (PDT) Received: from [192.168.0.2] ([197.250.226.155]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49807bb45ebsm118499905e9.4.2026.08.02.13.34.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Aug 2026 13:34:49 -0700 (PDT) From: =?utf-8?q?Stefan_D=C3=B6singer?= Date: Sun, 02 Aug 2026 23:33:41 +0300 Subject: [PATCH v9 09/12] clk: zte: Introduce a driver for zx297520v3 matrix clocks MIME-Version: 1.0 Message-Id: <20260802-zx29clk-v9-9-d05530d85d28@gmail.com> References: <20260802-zx29clk-v9-0-d05530d85d28@gmail.com> In-Reply-To: <20260802-zx29clk-v9-0-d05530d85d28@gmail.com> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Brian Masney , Vinod Koul , Neil Armstrong , Russell King , Lee Jones Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-phy@lists.infradead.org, mfd@lists.linux.dev, =?utf-8?q?Stefan_D=C3=B6singer?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=24645; i=stefandoesinger@gmail.com; h=from:subject:message-id; bh=uI5HEaw0V5CC62qkE3Hen4IpsN3Aztamtdb5xPF4I+0=; b=owEBiQJ2/ZANAwAIAT0TvMhUTxoiAcsmYgBqb6myQUW5FISpnt/EpHclyYa2MNWJ69RX2e190 7oKC1uRhG+JAk8EAAEIADkWIQRDFvS2qgVbJ5UyXWw9E7zIVE8aIgUCam+pshsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQPRO8yFRPGiJBbA//bAYRivoNcm7TBsgct4jHkm0NR2myEoo e0G8oUoqhLi648NpmDYGAZyJp7UJ/KUe11DGWDI5La9zhDWPTiBWzDyB9CF43PcyHsuNWLA2hVz ldVnhI6D0buE506usUlBZc+bV4GmY0jpNBIk456vODh9m2D3b4w0ON6nUb/+IQenjDNnaZkugUO Yk+HaRHRW4N4QeTCjvdWz8tEyXYM8QOXKBvB15iY5SO1Cb/25pf4R4tve9oymCT3NR2lzZVQM9a hdelZ7tOT/7VcvJYbdFgxS5YzQACmA6+vZ4xa5dQyHxt4Wjo2xfiuglX+7PmmLEh840wtGkPLL6 1z+Ibt0u/bF3bNa8saT7ABNiGd0nHDykqYTlnldGXn2hXX0u1qL0Y0OjwyCLPjRgG/BOCYtUsoE R8cZbB0gGR0h7DRTdlJ13Wv1SUAJ8GczJVL5Vc/FZ8MeBKs9rM/mgYyfAg6lTMmKtDQ0hbpfbfY ajkaaIlaLVq+3uOKbsgkcFs2tph/NNfNRXQgoabVkAzZHgGZz4sTVMUikB6129CQ22JoukcUvzW j7mXnI/6LkoeHMRjmMrZQc7+Es5wbqQOBh6zYbrJVGW1nnZWV5a1fo8OEM15Jf3qX7rTKri4jjz TBO0UgZjptRkv7Als36OO6VHvYSUVinM+kKIpY0flryqBpTE23Kw= X-Developer-Key: i=stefandoesinger@gmail.com; a=openpgp; fpr=4F9C2C8728019633893EBBB98CB81F9A72BBA155 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260802_133452_663530_FC747C33 X-CRM114-Status: GOOD ( 23.30 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhpcyBjbG9jayBjb250cm9sbGVyIGNvbnRyb2xzIGhpZ2ggc3BlZWQgZGV2aWNlczogQ1BVLCBE TUEsIFJBTSwgU0RJTywKRXRoZXJuZXQuIFRoZSBvbmx5IG5vbi1jbG9jaywgbm9uLXJlc2V0IHJl Z2lzdGVycyBJIGhhdmUgc3BvdHRlZCBoZXJlCmFyZSBoYXJkd2FyZSBzcGlubG9ja3MuCgpTaWdu ZWQtb2ZmLWJ5OiBTdGVmYW4gRMO2c2luZ2VyIDxzdGVmYW5kb2VzaW5nZXJAZ21haWwuY29tPgoK LS0tCgpWZXJzaW9uIDk6CkxpbmsgaW50ZXJuYWwgcGFyZW50cyBieSBhbiAoaW50ZXJuYWwpIGNs b2NrIElEIHJhdGhlciB0aGFuIG5hbWVzLgoKVGhlcmUgYXJlIDMgaW50ZW50aW9uYWwgY2hhbmdl cyB2cyB2ZXJzaW9uIDggaW4gdGhlIGNsb2NrIHRyZWU6CiJnbWFjLWFoYiIgZGVwZW5kcyBvbiB0 aGUgYWhiIGNsb2NrIGltcG9ydGVkIGZyb20gdG9wY3JtLiBUaGlzIHdhcwphbHJlYWR5IHRoZSBj YXNlIGJlZm9yZSwgYnV0IGl0IHdhcyBtaXNzaW5nIGZyb20gdGhlIGJpbmRpbmdzIGFuZCB0aGUK Z2xvYmFsIG5hbWUgbWF0Y2hpbmcgb2JzY3VyZWQgaXQuCgpXaGVuIHJlLXRlc3Rpbmcgb3RoZXIg ZGV2aWNlcyBmb3IgcG90ZW50aWFsIHRvcGNybS0+YWhiIGRlcGVuZGVuY2llcyBJCm5vdGljZWQg dGhhdCB0aGUgdHdvIFNESU8gZGV2aWNlcyB0YWtlIHRoZWlyIHBjbGsgZnJvbSB0b3Bjcm0tPmFo YiBhcwp3ZWxsLgoKQFNhc2hpa286IEFueSBwb3NzaWJsZSBvdGhlciBjbG9jayB0cmVlIGNoYW5n ZSBjb21wYXJlZCB0byB2ZXJzaW9uIDggaXMKdW5pbnRlbnRpb25hbCBhbmQgYSBsaWtlbHkgYnVn LgoKVmVyc2lvbiA4OgpBZGQgYW5vdGhlciBkaXN0cmlidXRpb24gZ2F0ZSByZWdpc3RlcjogMHgx MTggZ2F0ZXMgb2ZmIG1hdHJpeC1nZW5lcmF0ZWQKZGl2aXNpb25zIG9mIG1wbGwsIGRwbGwgYW5k IGdwbGwuIEl0IG5pY2VseSBmaXRzIHRoZSB0b3AtPm1hdHJpeCBmb3J3YXJkCnBpY3R1cmUuCgpB WEkgNi41IE1IeiBpcyBub3QgYW4gbXBsbCBjaGlsZC4gSSBtdXN0IGhhdmUgZG9uZSBzb21ldGhp bmcgd3Jvbmcgd2hlbgpvcmlnaW5hbGx5IHRlc3RpbmcgdGhpcwoKQWRkIGV4cGxhbmF0aW9ucyBh Ym91dCBhZGRpdGlvbmFsIEFSTSBhcmNoaXRlY3RlZCB0aW1lciBjb250cm9scy4KCkFkZCBnYXRl cyBmb3IgdW5rbm93biBMVEUgaGFyZHdhcmUgYXQgb2Zmc2V0IDB4NjAuIFRoZXkgYXJlIG5vdCBl eHBvcnRlZAppbiB0aGUgYmluZGluZ3MgYmVjYXVzZSB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGNv bnN1bWVyIGlzbid0IGNsZWFyIC0KYnV0IGlmIGRwbGwgaXMgdW5wcmVwYXJlZCBhbmQgZmVlZHMg YSBieXBhc3MgMjYgTUh6IHNpZ25hbCwgdGhpcyBkZXZpY2UKc3RhcnRzIHNwYW1taW5nIElSUXMg KGFsdGhvdWdoIHRoZSAweDExOCBhbmQgdG9wKzB4MTQwIGdhdGVzIGFsc28KcHJldmVudCB0aGlz IHVzdWFsbHkpCgpEb3VibGUtY2hlY2sgcGNsayBhbmQgd2NsayBvZiBhbGwgZGV2aWNlcy4gVGhl IFNESU8gYW5kIEVEQ1AgY2xvY2tzIHdlcmUKZmxpcHBlZCBpbiBwcmV2aW91cyBzdWJtaXNzaW9u cy4KClZlcnNpb24gNzoKUmVkdWNlZCB0aGUgaW5wdXQgY2xvY2tzIGEgbG90LiBNb3N0IE1QTEwg c3ViZGl2aXNpb25zIGFyZSBjaGlsZHJlbiBvZgp0aGUgc2FtZSBnYXRlIGluIHRvcCwgc28gcHV0 IHRoZSBmaXhlZCBmYWN0b3IgY2xvY2tzIGhlcmUuCgpBZGRlZCBhIGZldyBtb3JlIGNsb2Nrczog RERSX0NUUkwsIEFYSSBidXMsIEFSTSBhcmNoaXRlY3RlZCB0aW1lci4KVGhleSBhcmUgbmVlZGVk IHRvIHRlbGwgQ0NGIHRvIGtlZXAgdGhlIHRvcCBnYXRlcyBlbmFibGVkIGFuZCBtYXJrZWQKY3Jp dGljYWwgYmVjYXVzZSB0aGV5IGFyZW4ndCBjb25zdW1lZCBieSBhIERUIG5vZGUuCgpUaGUgQVhJ IGJ1cyBpcyBkZXRlcm1pbmVkIGJ5IGEgdm90aW5nIHN5c3RlbS4gSSd2ZSBzZXQgdXAgdGhlIGRy aXZlciB0bwp3cml0ZSB0byB0aGUgYmFsbG90IHJlZ2lzdGVyIFpURSdzIGtlcm5lbCB1c2VzIGFu ZCBlbmFibGUgdm90aW5nLiBUaGlzCnNob3VsZCBtYWtlIGxpZmUgZWFzaWVyIHdpdGggdGhlIExU RSBycHJvYyBibG9iIGxhdGVyLgoKVmVyc2lvbiA1OgpNYWtlIGl0IGFuIE1GRCBjaGlsZCBkZXZp Y2UsIHJlbW92ZSBhdXggZGV2aWNlCkZpeCB6eDI5NzUyOSAtPiB6eDI5NzUyMCB0eXBvcwpGaXgg QUhCX3djbGsgLT4gYWhiX3djbGsuIFRoYXQgd2FzIGEgbGVmdG92ZXIgb2YgbXkgb2xkIGNvbXBv c2l0ZSBzdHJ1Y3RzCkFkZCBTUkFNMCBhbmQgR1NNX0NGRyBjbG9ja3MKLS0tCiBkcml2ZXJzL2Ns ay96dGUvY2xrLXp4Mjk3NTIwdjMuYyB8IDQ4MyArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA0ODMgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvY2xrL3p0ZS9jbGstengyOTc1MjB2My5jIGIvZHJpdmVycy9jbGsvenRlL2Ns ay16eDI5NzUyMHYzLmMKaW5kZXggZjk5MTU1ODJmMjYxLi42YzRhN2ExYzNhOWIgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvY2xrL3p0ZS9jbGstengyOTc1MjB2My5jCisrKyBiL2RyaXZlcnMvY2xrL3p0 ZS9jbGstengyOTc1MjB2My5jCkBAIC03NjksNiArNzY5LDQ4NSBAQCBzdGF0aWMgY29uc3Qgc3Ry dWN0IHp4X2Nsa19kYXRhIHp4Mjk3NTIwdjNfdG9wY2xrX2RhdGEgPSB7CiAJLm51bV9leHBvcnRz ID0gQVJSQVlfU0laRSh6eDI5NzUyMHYzX3RvcF9leHBvcnRzKSwKIH07CiAKK2VudW0gbWF0cml4 X2Nsb2NrX2lkcyB7CisJWlhfQ0xLX01BVFJJWF9PU0MyNk1fRDQsCisJWlhfQ0xLX01BVFJJWF9N UExMX0QyX1BSRUdBVEUsCisJWlhfQ0xLX01BVFJJWF9NUExMX0Q0X1BSRUdBVEUsCisJWlhfQ0xL X01BVFJJWF9NUExMX0Q2X1BSRUdBVEUsCisJWlhfQ0xLX01BVFJJWF9NUExMX0Q4X1BSRUdBVEUs CisJWlhfQ0xLX01BVFJJWF9NUExMX0QxMl9QUkVHQVRFLAorCVpYX0NMS19NQVRSSVhfTVBMTF9E MTZfUFJFR0FURSwKKwlaWF9DTEtfTUFUUklYX0dQTExfRDJfRDJfUFJFR0FURSwKKwlaWF9DTEtf TUFUUklYX0dQTExfRDJfRDRfUFJFR0FURSwKKwlaWF9DTEtfTUFUUklYX0RQTExfRDZfUFJFR0FU RSwKKwlaWF9DTEtfTUFUUklYX0RQTExfRDRfUFJFR0FURSwKKworCVpYX0NMS19NQVRSSVhfTVBM TF9EMTYsCisJWlhfQ0xLX01BVFJJWF9NUExMX0QxMiwKKwlaWF9DTEtfTUFUUklYX01QTExfRDgs CisJWlhfQ0xLX01BVFJJWF9NUExMX0Q2LAorCVpYX0NMS19NQVRSSVhfTVBMTF9ENCwKKwlaWF9D TEtfTUFUUklYX01QTExfRDIsCisJWlhfQ0xLX01BVFJJWF9EUExMX0Q2LAorCVpYX0NMS19NQVRS SVhfRFBMTF9ENCwKKwlaWF9DTEtfTUFUUklYX0dQTExfRDJfRDQsCisJWlhfQ0xLX01BVFJJWF9H UExMX0QyX0QyLAorCisJWlhfQ0xLX0NQVV9NVVgsCisJWlhfQ0xLX1pTUF9NVVgsCisJWlhfQ0xL X0REUl9DVFJMX01VWCwKKwlaWF9DTEtfU0QwX01VWCwKKwlaWF9DTEtfU0QxX01VWCwKKwlaWF9D TEtfTkFORF9NVVgsCisJWlhfQ0xLX0VEQ1BfTVVYLAorCVpYX0NMS19URE1fTVVYLAorCVpYX0NM S19BWElfTVVYLAorCisJWlhfQ0xLX1NZU19USU1FUl9XQ0xLLAorCVpYX0NMS19DUFVfV0NMSywK KwlaWF9DTEtfQ1BVX1BDTEssCisJWlhfQ0xLX0REUl9DVFJMX1BDTEssCisJWlhfQ0xLX0REUl9D VFJMX1dDTEssCisJWlhfQ0xLX1pTUF9XQ0xLLAorCVpYX0NMS19TRDBfUENMSywKKwlaWF9DTEtf U0QwX1dDTEssCisJWlhfQ0xLX1NEMF9DREVULAorCVpYX0NMS19TRDFfUENMSywKKwlaWF9DTEtf U0QxX1dDTEssCisJWlhfQ0xLX1NEMV9DREVULAorCVpYX0NMS19OQU5EX1dDTEssCisJWlhfQ0xL X05BTkRfUENMSywKKwlaWF9DTEtfTFRFX1RQVV9XQ0xLLAorCVpYX0NMS19MVEVfVFBVX1BDTEss CisJWlhfQ0xLX0VEQ1BfUENMSywKKwlaWF9DTEtfRURDUF9XQ0xLLAorCVpYX0NMS19TU0NfV0NM SywKKwlaWF9DTEtfU1NDX1BDTEssCisJWlhfQ0xLX1BEQ0ZHX1dDTEssCisJWlhfQ0xLX1BEQ0ZH X1BDTEssCisJWlhfQ0xLX01CT1hfUENMSywKKwlaWF9DTEtfU1JBTTBfUENMSywKKwlaWF9DTEtf R1NNX0NGR19QQ0xLLAorCVpYX0NMS19HTUFDX1dDTEssCisJWlhfQ0xLX0dNQUNfUENMSywKKwla WF9DTEtfR01BQ19BSEIsCisJWlhfQ0xLX0FYSV9XQ0xLLAorCVpYX0NMS19ETUFfUENMSywKKwla WF9DTEtfVk9VX1dDTEssCisJWlhfQ0xLX1ZPVV9QQ0xLLAorCVpYX0NMS19UT0xTUF9NUExMX0Q1 X1dDTEssCisJWlhfQ0xLX1RPTFNQX01QTExfRDRfV0NMSywKKwlaWF9DTEtfVE9MU1BfTVBMTF9E Nl9XQ0xLLAorCVpYX0NMS19UT0xTUF9NUExMX0Q4X1dDTEssCisJWlhfQ0xLX1RPTFNQX01QTExf RDEyX1dDTEssCisJWlhfQ0xLX1RPTFNQX09TQzI2TV9XQ0xLLAorCVpYX0NMS19UT0xTUF9PU0Mz MktfV0NMSywKKwlaWF9DTEtfVE9MU1BfUENMSywKKwlaWF9DTEtfVE9MU1BfVERNX1dDTEssCisJ WlhfQ0xLX1RPTFNQX0RQTExfRDRfV0NMSywKK307CisKKy8qCisgKiBGb3IgZGV2aWNlcyB3aGlj aCBoYXZlIGEgd29ya2luZyBkcml2ZXIgdGhlIHdvcmsgY2xvY2sgY2FuIGJlIGZpZ3VyZWQgb3V0 IGJ5IGdhdGluZyBvZmYgcmVnaXN0ZXJzCisgKiBpbiB0b3Bjcm0rMHgxNDAuIFRoaXMgaXMgdXNl ZCBmb3IgZGV2aWNlcyB3aGVyZSBJIGNhbid0IGludGVycHJldCB0aGUgcmVnaXN0ZXIgY29udGVu dHMgeWV0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHp4X3BhcmVudF9kZXNjIG1hdHJpeF91 bmsgPSBQQVJFTlRfRlcoIndjbGstb3NjMjZtIik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgenhf cGFyZW50X2Rlc2MgY3B1X3NlbFtdID0geworCVBBUkVOVF9GVygid2Nsay1vc2MyNm0iKSwKKwlQ QVJFTlRfRlcoIm1wbGwiKSwJCQkvKiA2MjQgTUh6ICovCisJUEFSRU5UX0lEKFpYX0NMS19NQVRS SVhfTVBMTF9EMiksCS8qIDMxMiBNSHogKi8KKwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExM X0Q0KSwJLyogMTU2IE1IeiAqLworfTsKKworLyogTG93IGNvbmZpZGVuY2Ugb24gdGhlIGFjdHVh bCB2YWx1ZSwgYnV0IGF0IGxlYXN0IEkga25vdyBpdCBpcyBiaXQgMTMgaW4gdG9wKzB4MTQwICov CitzdGF0aWMgY29uc3Qgc3RydWN0IHp4X3BhcmVudF9kZXNjIHpzcF9zZWxbXSA9IHsKKwlQQVJF TlRfRlcoIndjbGstb3NjMjZtIiksCisJUEFSRU5UX0ZXKCJkcGxsIiksCQkJLyogNDkxLjUyIE1I eiAqLworfTsKKworLyoKKyAqIFdlIGNhbid0IHJlYWxpc3RpY2FsbHkgY2hhbmdlIEREUiBzcGVl ZCB3aGlsZSBydW5uaW5nIGFuIE9TIG91dCBvZiBERFIgKGl0IHJlYWRzIGdhcmJhZ2UgZm9yIGEK KyAqIHNob3J0IHdoaWxlIG9uIHRyYW5zaXRpb24pLCBidXQgd2UgbmVlZCB0byBrbm93IGlmIHdl IGhhdmUgdG8ga2VlcCBncGxsIGFsaXZlLiAzMiBNQiBkZXZpY2VzIHVzZQorICogMjAwIE1Ieiwg d2hpbGUgNjQvMTI4IE1CIG9uZXMgdXNlIDE1NiBNSHouCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgenhfcGFyZW50X2Rlc2MgZGRyX2N0cmxfc2VsW10gPSB7CisJUEFSRU5UX0lEKFpYX0NMS19N QVRSSVhfTVBMTF9ENCksCS8qIDE1NiBNSHogKi8KKwlQQVJFTlRfRlcoImdwbGwiKSwJCQkvKiAy MDAgTUh6ICovCisJUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfTVBMTF9ENiksCS8qIDEwNCBNSHog Ki8KKwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0Q4KSwJLyogNzggTUh6ICovCit9Owor CitzdGF0aWMgY29uc3Qgc3RydWN0IHp4X3BhcmVudF9kZXNjIHNkMF9zZWxbXSA9IHsKKwlQQVJF TlRfRlcoIndjbGstb3NjMjZtIiksCisJUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfTVBMTF9ENCks CS8qIDE1NiBNSHogKi8KKwlQQVJFTlRfRlcoImdwbGwtZDIiKSwJCQkvKiAxMDAgTUh6ICovCisJ UEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfTVBMTF9EOCksCS8qIDc4IE1IeiAqLworCVBBUkVOVF9J RChaWF9DTEtfTUFUUklYX0dQTExfRDJfRDIpLAkvKiA1MCBNSHogKi8KKwlQQVJFTlRfSUQoWlhf Q0xLX01BVFJJWF9HUExMX0QyX0Q0KSwJLyogMjUgTUh6ICovCit9OworCitzdGF0aWMgY29uc3Qg c3RydWN0IHp4X3BhcmVudF9kZXNjIHNkMV9zZWxbXSA9IHsKKwlQQVJFTlRfRlcoIndjbGstb3Nj MjZtIiksCisJUEFSRU5UX0ZXKCJncGxsLWQyIiksCQkJLyogMTAwIE1IeiAqLworCVBBUkVOVF9J RChaWF9DTEtfTUFUUklYX01QTExfRDgpLAkvKiA3OCBNSHogKi8KKwlQQVJFTlRfSUQoWlhfQ0xL X01BVFJJWF9HUExMX0QyX0QyKSwJLyogNTAgTUh6ICovCisJUEFSRU5UX0lEKFpYX0NMS19NQVRS SVhfTVBMTF9EMTYpLAkvKiAzOSBNSHogKi8KKwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9HUExM X0QyX0Q0KSwJLyogMjUgTUh6ICovCit9OworCisvKgorICogWlRFJ3Mga2VybmVsIHB1dHMgdGhl IGhpZ2ggZnJlcXVlbmN5IGZpcnN0LCBidXQgdGhpcyBpcyBhZ2FpbnN0IHRoZSB1c3VhbCBjb252 ZW50aW9uIG9uIHRoaXMgU29DLgorICogSSBkb24ndCBoYXZlIGFueSBkZXZpY2UgdGhhdCBoYXMg YSByYXcgTkFORCBjb250cm9sbGVyIHRob3VnaC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB6 eF9wYXJlbnRfZGVzYyBuYW5kX3NlbFtdID0geworCVBBUkVOVF9GVygid2Nsay1vc2MyNm0iKSwK KwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0Q0KSwJLyogMTU2IE1IeiAqLworfTsKKwor c3RhdGljIGNvbnN0IHN0cnVjdCB6eF9wYXJlbnRfZGVzYyBlZGNwX3NlbFtdID0geworCVBBUkVO VF9GVygid2Nsay1vc2MyNm0iKSwKKwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0Q0KSwJ LyogMTU2IE1IeiAqLworCVBBUkVOVF9GVygibXBsbC1kNSIpLAkJCS8qIDEyNC44IE1IeiAqLwor CVBBUkVOVF9JRChaWF9DTEtfTUFUUklYX01QTExfRDYpLAkvKiAxMDQgTUh6ICovCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IHp4X3BhcmVudF9kZXNjIHRkbV9zZWxbXSA9IHsKKwlQQVJFTlRf RlcoIndjbGstb3NjMjZtIiksCisJUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfRFBMTF9ENCksCS8q IDEyMi44OCBNSHogKi8KKwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0Q2KSwJLyogMTA0 IE1IeiAqLworfTsKKworLyoKKyAqIFpURSdzIGZpcm13YXJlIHVzZXMgMHgxMjggYXMgdGhlIFBI WSdzIHZvdGUgYW5kIG5hbWVzIDB4MTIwIGFzICJQUyIgYW5kIDB4MTI0IGFzICJBUCIgdm90ZS4K KyAqIEhvd2V2ZXIsIHRoZWlyIGNwdWZyZXEgZHJpdmVyIHVsdGltYXRlbHkgdXNlcyB0aGUgIlBT IiBkZWZpbmUgYW5kIHRodXMgd3JpdGVzIHRvIDB4MTIwLCB3aGljaCBjYW4KKyAqIGJlIG9ic2Vy dmVkIGluIHRoZSBydW5uaW5nIHN5c3RlbS4KKyAqLworI2RlZmluZSBaWDI5NzUyMFYzX0FYSV9B UF9WT1RFIDB4MTIwCitzdGF0aWMgY29uc3Qgc3RydWN0IHp4X3BhcmVudF9kZXNjIGF4aV9zZWxb XSA9IHsKKwlQQVJFTlRfRlcoIndjbGstb3NjMjZtIiksCisJUEFSRU5UX0lEKFpYX0NMS19NQVRS SVhfTVBMTF9ENCksCS8qIDE1NiBNSHogKi8KKwlQQVJFTlRfRlcoIm1wbGwtZDUiKSwJCQkvKiAx MjQuOCBNSHogKi8KKwlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0Q2KSwJLyogMTA0IE1I eiAqLworCVBBUkVOVF9JRChaWF9DTEtfTUFUUklYX01QTExfRDgpLAkvKiA3OCBNSHogKi8KKwlQ QVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0QxMiksCS8qIDUyIE1IeiAqLworCVBBUkVOVF9J RChaWF9DTEtfTUFUUklYX01QTExfRDE2KSwJLyogMzkgTUh6ICovCisJUEFSRU5UX0lEKFpYX0NM S19NQVRSSVhfT1NDMjZNX0Q0KSwJLyogNi41IE1IeiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0 cnVjdCB6eF9jbG9jayB6eDI5NzUyMHYzX21hdHJpeF9jbG9ja3NbXSA9IHsKKwlbWlhfQ0xLX01B VFJJWF9PU0MyNk1fRDRdID0gRklYRURfRElWKCJtYXRyaXgtb3NjMjZtLWQ0IiwgUEFSRU5UX0ZX KCJ3Y2xrLW9zYzI2bSIpLCA0KSwKKwlbWlhfQ0xLX01BVFJJWF9NUExMX0QyX1BSRUdBVEVdID0g RklYRURfRElWKCJtYXRyaXgtbXBsbC1kMi1wcmVnYXRlIiwgUEFSRU5UX0ZXKCJtcGxsIiksIDIp LAorCVtaWF9DTEtfTUFUUklYX01QTExfRDRfUFJFR0FURV0gPSBGSVhFRF9ESVYoIm1hdHJpeC1t cGxsLWQ0LXByZWdhdGUiLCBQQVJFTlRfRlcoIm1wbGwiKSwgNCksCisJLyogZGl2IDU6IHByb3Zp ZGVkIGFzIGEgc2VwYXJhdGUgbGluZSBmcm9tIHRvcGNybSAqLworCVtaWF9DTEtfTUFUUklYX01Q TExfRDZfUFJFR0FURV0gPSBGSVhFRF9ESVYoIm1hdHJpeC1tcGxsLWQ2LXByZWdhdGUiLCBQQVJF TlRfRlcoIm1wbGwiKSwgNiksCisJW1pYX0NMS19NQVRSSVhfTVBMTF9EOF9QUkVHQVRFXSA9IEZJ WEVEX0RJVigibWF0cml4LW1wbGwtZDgtcHJlZ2F0ZSIsIFBBUkVOVF9GVygibXBsbCIpLCA4KSwK KwlbWlhfQ0xLX01BVFJJWF9NUExMX0QxMl9QUkVHQVRFXSA9IEZJWEVEX0RJVigibWF0cml4LW1w bGwtZDEyLXByZWdhdGUiLCBQQVJFTlRfRlcoIm1wbGwiKSwKKwkJCQkJCSAgICAgMTIpLAorCVta WF9DTEtfTUFUUklYX01QTExfRDE2X1BSRUdBVEVdID0gRklYRURfRElWKCJtYXRyaXgtbXBsbC1k MTYtcHJlZ2F0ZSIsIFBBUkVOVF9GVygibXBsbCIpLAorCQkJCQkJICAgICAxNiksCisKKwlbWlhf Q0xLX01BVFJJWF9HUExMX0QyX0QyX1BSRUdBVEVdID0gRklYRURfRElWKCJtYXRyaXgtZ3BsbC1k Mi1kMi1wcmVnYXRlIiwKKwkJCQkJCSAgICAgICBQQVJFTlRfRlcoImdwbGwtZDIiKSwgMiksCisJ W1pYX0NMS19NQVRSSVhfR1BMTF9EMl9ENF9QUkVHQVRFXSA9IEZJWEVEX0RJVigibWF0cml4LWdw bGwtZDItZDQtcHJlZ2F0ZSIsCisJCQkJCQkgICAgICAgUEFSRU5UX0ZXKCJncGxsLWQyIiksIDQp LAorCisJW1pYX0NMS19NQVRSSVhfRFBMTF9ENl9QUkVHQVRFXSA9IEZJWEVEX0RJVigibWF0cml4 LWRwbGwtZDYtcHJlZ2F0ZSIsIFBBUkVOVF9GVygiZHBsbCIpLCA2KSwKKwlbWlhfQ0xLX01BVFJJ WF9EUExMX0Q0X1BSRUdBVEVdID0gRklYRURfRElWKCJtYXRyaXgtZHBsbC1kNC1wcmVnYXRlIiwg UEFSRU5UX0ZXKCJkcGxsIiksIDQpLAorCisJLyoKKwkgKiBNYXRyaXggZGlzdHJpYnV0aW9uIGdh dGVzOiBFdmVyeSBtYXRyaXgtZ2VuZXJhdGVkIHN1YmRpdmlzaW9uIG9mIHRoZSBpbnB1dCBQTExz CisJICogaGFzIGEgZ2F0ZSBpbiAweDExOC4gVGhlIG9yaWdpbmFsIGlucHV0cyBmcm9tIHRvcGNy bSAobXBsbCA2MjQsIG1wbGwgMTI0LjgsIGdwbGwgMjAwLAorCSAqIGdwbGwgMTAwLCBkcGxsIDQ5 MS41MikgZG8gbm90LgorCSAqCisJICogSSBkbyBub3Qga25vdyBvZiBhbnkgdXNlciBvZiBkcGxs LWQ2IGFuZCBkbyBub3Qga25vdyB0aGUgZGl2aXNvci4gQW4gODEuOTIgTUh6IGNsb2NrIGlzCisJ ICogbGlzdGVkIGFzIGEgcm9vdCBjbG9jayB3aXRob3V0IGEgY29uc3VtZXIgaW4gWlRFJ3MgY29k ZS4gTW9zdCBsaWtlbHkgaXQgaXMgYSBwb3NzaWJsZQorCSAqIHBhcmVudCBvZiB0aGUgWlNQIG11 eC4KKwkgKi8KKwlbWlhfQ0xLX01BVFJJWF9NUExMX0QxNl0gPSBHQVRFKCJtYXRyaXgtbXBsbC1k MTYiLAorCQkJCQlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0QxNl9QUkVHQVRFKSwgMHgx MTgsIDAsCisJCQkJCVpYMjk3NTIwVjNfQVhJX0NBTkRJREFURSksCisJW1pYX0NMS19NQVRSSVhf TVBMTF9EMTJdID0gR0FURSgibWF0cml4LW1wbGwtZDEyIiwKKwkJCQkJUEFSRU5UX0lEKFpYX0NM S19NQVRSSVhfTVBMTF9EMTJfUFJFR0FURSksIDB4MTE4LCAxLAorCQkJCQlaWDI5NzUyMFYzX0FY SV9DQU5ESURBVEUpLAorCVtaWF9DTEtfTUFUUklYX01QTExfRDhdID0gR0FURSgibWF0cml4LW1w bGwtZDgiLAorCQkJCSAgICAgICBQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0Q4X1BSRUdB VEUpLCAweDExOCwgMiwKKwkJCQkgICAgICAgWlgyOTc1MjBWM19BWElfQ0FORElEQVRFKSwKKwlb WlhfQ0xLX01BVFJJWF9NUExMX0Q2XSA9IEdBVEUoIm1hdHJpeC1tcGxsLWQ2IiwKKwkJCQkgICAg ICAgUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfTVBMTF9ENl9QUkVHQVRFKSwgMHgxMTgsIDMsCisJ CQkJICAgICAgIFpYMjk3NTIwVjNfQVhJX0NBTkRJREFURSksCisJW1pYX0NMS19NQVRSSVhfTVBM TF9ENF0gPSBHQVRFKCJtYXRyaXgtbXBsbC1kNCIsCisJCQkJICAgICAgIFBBUkVOVF9JRChaWF9D TEtfTUFUUklYX01QTExfRDRfUFJFR0FURSksIDB4MTE4LCA0LAorCQkJCSAgICAgICBaWDI5NzUy MFYzX0FYSV9DQU5ESURBVEUpLAorCVtaWF9DTEtfTUFUUklYX01QTExfRDJdID0gR0FURSgibWF0 cml4LW1wbGwtZDIiLAorCQkJCQlQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9NUExMX0QyX1BSRUdB VEUpLCAweDExOCwgNSwgMCksCisKKwlbWlhfQ0xLX01BVFJJWF9EUExMX0Q2XSA9IEdBVEUoIm1h dHJpeC1kcGxsLWQ2IiwKKwkJCQkgICAgICAgUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfRFBMTF9E Nl9QUkVHQVRFKSwgMHgxMTgsIDgsIDApLAorCVtaWF9DTEtfTUFUUklYX0RQTExfRDRdID0gR0FU RSgibWF0cml4LWRwbGwtZDQiLAorCQkJCSAgICAgICBQQVJFTlRfSUQoWlhfQ0xLX01BVFJJWF9E UExMX0Q0X1BSRUdBVEUpLCAweDExOCwgOSwgMCksCisKKwlbWlhfQ0xLX01BVFJJWF9HUExMX0Qy X0Q0XSA9IEdBVEUoIm1hdHJpeC1ncGxsLWQyLWQ0IiwKKwkJCQkJICBQQVJFTlRfSUQoWlhfQ0xL X01BVFJJWF9HUExMX0QyX0Q0X1BSRUdBVEUpLAorCQkJCQkgIDB4MTE4LCAxMiwgMCksCisJW1pY X0NMS19NQVRSSVhfR1BMTF9EMl9EMl0gPSBHQVRFKCJtYXRyaXgtZ3BsbC1kMi1kMiIsCisJCQkJ CSAgUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfR1BMTF9EMl9EMl9QUkVHQVRFKSwKKwkJCQkJICAw eDExOCwgMTMsIDApLAorCisJW1pYX0NMS19DUFVfTVVYXSAgICAgICAgICA9IE1VWCgiY3B1LW11 eCIsIGNwdV9zZWwsIDB4MjAsIDAsIDIpLAorCVtaWF9DTEtfWlNQX01VWF0gICAgICAgICAgPSBN VVgoInpzcC1tdXgiLCB6c3Bfc2VsLCAweDMwLCAwLCAyKSwKKwlbWlhfQ0xLX0REUl9DVFJMX01V WF0gICAgID0gTVVYKCJkZHItY3RybC1tdXgiLCBkZHJfY3RybF9zZWwsIDB4NTAsIDAsIDIpLAor CVtaWF9DTEtfU0QwX01VWF0gICAgICAgICAgPSBNVVgoInNkMC1tdXgiLCBzZDBfc2VsLCAweDUw LCA0LCAzKSwKKwlbWlhfQ0xLX1NEMV9NVVhdICAgICAgICAgID0gTVVYKCJzZDEtbXV4Iiwgc2Qx X3NlbCwgMHg1MCwgOCwgMyksCisJW1pYX0NMS19OQU5EX01VWF0gICAgICAgICA9IE1VWCgibmFu ZC1tdXgiLCBuYW5kX3NlbCwgMHg1MCwgMTIsIDIpLAorCVtaWF9DTEtfRURDUF9NVVhdICAgICAg ICAgPSBNVVgoImVkY3AtbXV4IiwgZWRjcF9zZWwsIDB4NTAsIDE2LCAyKSwKKwlbWlhfQ0xLX1RE TV9NVVhdICAgICAgICAgID0gTVVYKCJ0ZG0tbXV4IiwgdGRtX3NlbCwgMHg1MCwgMjQsIDIpLAor CVtaWF9DTEtfQVhJX01VWF0gICAgICAgICAgPSBNVVgoImF4aS1tdXgiLCBheGlfc2VsLCBaWDI5 NzUyMFYzX0FYSV9BUF9WT1RFLCAwLCAzKSwKKworCS8qCisJICogVGhpcyBiaXQgY3V0cyBvZmYg dGhlIGNsb2NrIHNpZ25hbCB0byB0aGUgQVJNIGFyY2hpdGVjdGVkIHRpbWVyLCB3aGljaCB0aGUg a2VybmVsIHVzZXMKKwkgKiBhcyBpdHMgbWFpbiB0aW1lci4gSXQgaXNuJ3QgY3JpdGljYWwgcGVy IHNlIC0gdGhlcmUgYXJlIHBsZW50eSBvZiBwcm9wcmlldGFyeSB0aW1lcnMKKwkgKiBhdmFpbGFi bGUgdGhhdCBjb3VsZCBiZSB1c2VkIC0gYnV0IHRoZSBhcm0gYXJjaCB0aW1lciBiaW5kaW5nIGRv ZXMgbm90IGFjY2VwdCBhIGNsb2NrLCBzbworCSAqIHRoaXMgQ0NGIGRyaXZlciB3b24ndCBrbm93 IGlmIHRoZSB0aW1lciBpcyBpbiB1c2UuCisJICoKKwkgKiBUaGlzIGNsb2NrIGlzIGZlZCBieSB0 aGUgb3NjMjZtIGdhdGUgaW4gdG9wY3JtKzB4MTQwIC0gdGhpcyBjcml0aWNhbCBjbG9jayBoZXJl IHByb3RlY3RzCisJICogaXRzIHBhcmVudC4KKwkgKgorCSAqIFJlZ2lzdGVycyAweDE0OCwgMHgx NGMsIDB4MTUwLCAweDE1NCBhbGxvdyBzZXR0aW5nIGFuZCBjbGVhcmluZyB0aGUgdGltZXIgY291 bnRlci4gVG8KKwkgKiBzZXQgdGhlIHRpbWVyLCBsb2FkIGEgdmFsdWUgaW50byAweDE0OCAoaGln aCAzMiBiaXRzKSBhbmQgMHgxNGMgKGxvdyAzMiBiaXRzKSwgdGhlbgorCSAqIHRvZ2dsZSAweDE1 MCB0byAxLiAweDE1MCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gMC4gMHgxNTQgc2V0cyB0 aGUgdGltZXIgdG8gc29tZQorCSAqICJjbGVhciIgdmFsdWUsIGJ1dCB0aGlzIHZhbHVlIGlzbid0 IDAuCisJICovCisJW1pYX0NMS19TWVNfVElNRVJfV0NMS10gICA9IEdBVEUoInN5cy10aW1lci13 Y2xrIiwgUEFSRU5UX0ZXKCJ3Y2xrLW9zYzI2bSIpLCAweDE0NCwgMSwKKwkJCQkJIENMS19JU19D UklUSUNBTCksCisKKwkvKgorCSAqIEJvdGggMHgyNCBhbmQgMHgyOCBiaXRzIDEgYW5kIDIgc3Rv cCB0aGUgQ1BVLiBUaGVyZSBpcyBhbHNvIGEgYml0IGluIHRvcGNybSsweDEzOCwgd2hpY2gKKwkg KiBaVEUncyB1Ym9vdCBjYWxscyAiQTUzIHJlc2V0Iiwgd2hpY2ggYWxzbyBzdG9wcyB0aGUgQ1BV LiBJIGNhbid0IHJlYWxseSB0ZWxsIHRoZQorCSAqIGRpZmZlcmVuY2UgYmV0d2VlbiBtYXRyaXgr MHgyOCBhbmQgdG9wKzB4MTM4LiBUaGUgY2xvY2sgKG1hdHJpeCsweDI0KSBjYW4gYmUgZGlzYWJs ZWQKKwkgKiBhbmQgZW5hYmxlZCBmcm9tIHRoZSBDb3J0ZXggTTAgYW5kIGl0IHdpbGwgbmljZWx5 IHN0b3AgYW5kIHJlc3RhcnQgdGhlIEE1MywgcmV0YWluaW5nCisJICogYWxsIHN0YXRlLgorCSAq LworCVtaWF9DTEtfQ1BVX1dDTEtdICAgICAgICAgPSBHQVRFKCJjcHUtd2NsayIsIFBBUkVOVF9J RChaWF9DTEtfQ1BVX01VWCksIDB4MjQsIDEsCisJCQkJCSBDTEtfSVNfQ1JJVElDQUwpLAorCVta WF9DTEtfQ1BVX1BDTEtdICAgICAgICAgPSBHQVRFKCJjcHUtcGNsayIsIGNsa19tYWluWzBdLCAw eDI0LCAyLCBDTEtfSVNfQ1JJVElDQUwpLAorCisJLyoKKwkgKiBUaGVyZSBhcmUgYSBsb3QgbW9y ZSBjb250cm9scyBpbiBtYXRyaXgrMHgxMDAuIDEzLTE2IGFwcGVhciB0byBiZSA0IGRpZmZlcmVu dCBBWEkKKwkgKiBjaGFubmVscyBmb3IgZGlmZmVyZW50IHByaW9yaXRpZXMuIEJpdCAxOSBhcHBl YXJzIHRvIGJlIHRoZSBERFIgUEhZIHdjbGsuCisJICoKKwkgKiBUaGUgaW1wb3J0YW50IHRhc2sg aXMgdG8ga2VlcCBncGxsIGVuYWJsZWQgaWYgdGhlIGJvb3Rsb2FkZXIgc2VsZWN0ZWQgYSBncGxs LWJhc2VkIHJhdGUKKwkgKiBmb3IgUkFNLgorCSAqLworCVtaWF9DTEtfRERSX0NUUkxfUENMS10g ICAgPSBHQVRFKCJkZHItY3RybC1wY2xrIiwgY2xrX21haW5bMF0sIDB4MTAwLCAxNywgQ0xLX0lT X0NSSVRJQ0FMKSwKKwlbWlhfQ0xLX0REUl9DVFJMX1dDTEtdICAgID0gR0FURSgiZGRyLWN0cmwt d2NsayIsIFBBUkVOVF9JRChaWF9DTEtfRERSX0NUUkxfTVVYKSwgMHgxMDAsIDE4LAorCQkJCQkg Q0xLX0lTX0NSSVRJQ0FMKSwKKworCVtaWF9DTEtfWlNQX1dDTEtdICAgICAgICAgPSBHQVRFKCJ6 c3Atd2NsayIsIFBBUkVOVF9JRChaWF9DTEtfWlNQX01VWCksIDB4M2MsIDAsIDApLAorCisJLyog Qm90aCBTRElPIGNvbnRyb2xsZXJzIGRlcGVuZCBvbiB0aGUgYWhiLXBjbGsgZm9yIHJlZ2lzdGVy IGFjY2Vzcy4gKi8KKwlbWlhfQ0xLX1NEMF9QQ0xLXSAgICAgICAgID0gR0FURSgic2QwLXBjbGsi LCBQQVJFTlRfRlcoImFoYiIpLCAweDU0LCAxMiwgMCksCisJW1pYX0NMS19TRDBfV0NMS10gICAg ICAgICA9IEdBVEUoInNkMC13Y2xrIiwgUEFSRU5UX0lEKFpYX0NMS19TRDBfTVVYKSwgMHg1NCwg MTMsIDApLAorCVtaWF9DTEtfU0QwX0NERVRdICAgICAgICAgPSBHQVRFKCJzZDAtY2RldCIsIFBB UkVOVF9GVygib3NjMzJrIiksIDB4NTQsIDE0LCAwKSwKKwlbWlhfQ0xLX1NEMV9QQ0xLXSAgICAg ICAgID0gR0FURSgic2QxLXBjbGsiLCBQQVJFTlRfRlcoImFoYiIpLCAweDU0LCA0LCAwKSwKKwlb WlhfQ0xLX1NEMV9XQ0xLXSAgICAgICAgID0gR0FURSgic2QxLXdjbGsiLCBQQVJFTlRfSUQoWlhf Q0xLX1NEMV9NVVgpLCAweDU0LCA1LCAwKSwKKwkvKgorCSAqIEkgZG9uJ3Qga25vdyBob3cgdGhl IGNkZXQgY2xvY2sgd29ya3MuIENhcmQgZGV0ZWN0aW9uIGluIHRoZSB3YXkgdGhlIGR3YyxtbWMg ZHJpdmVyIHVzZXMKKwkgKiBpdCBhcHBlYXJzIGJyb2tlbiBubyBtYXR0ZXIgdGhpcyBjbG9jaydz IHNldHRpbmcuCisJICovCisJW1pYX0NMS19TRDFfQ0RFVF0gICAgICAgICA9IEdBVEUoInNkMS1j ZGV0IiwgUEFSRU5UX0ZXKCJvc2MzMmsiKSwgMHg1NCwgNiwgMCksCisKKwkvKiBUaGlzIGlzIHNv bWUgImRlbmFsaSIgTkFORCwgbm90IHRoZSBxc3BpIGNvbm5lY3RlZCBvbmUgKi8KKwlbWlhfQ0xL X05BTkRfV0NMS10gICAgICAgID0gR0FURSgibmFuZC13Y2xrIiwgUEFSRU5UX0lEKFpYX0NMS19O QU5EX01VWCksIDB4NTQsIDIwLCAwKSwKKwlbWlhfQ0xLX05BTkRfUENMS10gICAgICAgID0gR0FU RSgibmFuZC1wY2xrIiwgY2xrX21haW5bMF0sIDB4NTQsIDIxLCAwKSwKKworCS8qCisJICogVGhl cmUgaXMgYSBzZXQgb2YgZ2F0ZXMgZm9yIGFuIHVua25vd24gZGV2aWNlIGF0IG1hdHJpeCsweDYw LiBJdCBpcyBzb21lIExURSByZWxhdGVkCisJICogZGV2aWNlLiBJZiBpdCBpcyBmZWQgYW4gaW5j b3JyZWN0IGNsb2NrLCBlLmcuIGJlY2F1c2UgZHBsbCBpcyBub3QgbG9ja2VkIGFuZCBvdXRwdXRz CisJICogMjYgTUh6LCBpdCB3aWxsIHNwYW0gSVJRcyBhdCBTUEkgNjguIFRoaXMgaXMgbGlrZWx5 IGEgZGlzdHJlc3Mgbm90aWZpY2F0aW9uIHRoYXQgc29tZQorCSAqIGludGVybmFsIFBMTCBkaWQg bm90IGxvY2sgb3Igc2ltaWxhcgorCSAqCisJICogWlRFJ3Mga2VybmVsIGhhcyB0d28gZGVmaW5l cyBmb3IgU1BJIDY0OiAiTFRFX1RQVV9JTlRfUFNfSU5UIiBhbmQgIlZPVV9PU0RfSU5UIi4gVGhl CisJICogbGF0dGVyIGlzIHVubGlrZWx5IGJlY2F1c2UgVk9VIHJlbGF0ZWQgY2xvY2tzIHNpdCBp biBtYXRyaXgrMHgxNjguCisJICoKKwkgKiBCaXQgOSBpbiByZWdpc3RlciAweDExOCB0dXJucyBp dCBvZmYsIHByb3ZpZGluZyBhIGhpbnQgd2hvIHRoZSBwYXJlbnQgaXMuCisJICovCisJW1pYX0NM S19MVEVfVFBVX1dDTEtdICAgICA9IEdBVEUoImx0ZS10cHUtd2NsayIsIFBBUkVOVF9JRChaWF9D TEtfTUFUUklYX0RQTExfRDQpLAorCQkJCQkgMHg2MCwgMCwgMCksCisJW1pYX0NMS19MVEVfVFBV X1BDTEtdICAgICA9IEdBVEUoImx0ZS10cHUtcGNsayIsIGNsa19tYWluWzBdLAorCQkJCQkgMHg2 MCwgMiwgMCksCisKKwlbWlhfQ0xLX0VEQ1BfUENMS10gICAgICAgID0gR0FURSgiZWRjcC1wY2xr IiwgY2xrX21haW5bMF0sIDB4NjQsIDEsIDApLAorCVtaWF9DTEtfRURDUF9XQ0xLXSAgICAgICAg PSBHQVRFKCJlZGNwLXdjbGsiLCBQQVJFTlRfSUQoWlhfQ0xLX0VEQ1BfTVVYKSwgMHg2NCwgMiwg MCksCisKKwkvKgorCSAqIFRoaXMgc2VlbXMgdG8gYmUgYW5vdGhlciBTUEktTGlrZSBkZXZpY2Uu IFpURSdzIGZpcm13YXJlIG9wZXJhdGVzIGl0IGFuZCBmcm9tIHRlc3RpbmcKKwkgKiBpdCBsb29r cyBsaWtlIHRoZSBtYXRyaXgtb3NjMjZtIGdhdGUgaW4gdG9wKzB4MTQwIHN0b3BzIHRoaXMgZGV2 aWNlLiBUaGlzIHdvdWxkIGJlCisJICogY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBTUEkgY29u dHJvbGxlcnMgdG9vLgorCSAqLworCVtaWF9DTEtfU1NDX1dDTEtdICAgICAgICAgPSBHQVRFKCJz c2Mtd2NsayIsIFBBUkVOVF9GVygid2Nsay1vc2MyNm0iKSwgMHg4NCwgMSwgMCksCisJW1pYX0NM S19TU0NfUENMS10gICAgICAgICA9IEdBVEUoInNzYy1wY2xrIiwgY2xrX21haW5bMF0sIDB4ODQs IDIsIDApLAorCisJLyoKKwkgKiBQRENGRy4gTGlrZSBQTU0sIGVpdGhlciBjbG9jayBiaXQgd2ls bCBhbGxvdyB0aGUgZGV2aWNlIHRvIGZ1bmN0aW9uLiBQcm9iYWJseSB0aGVyZSBpcworCSAqIG5v IHdjbGsgbGluZSBhdCBhbGwgYW5kIHRoZSB0d28gYml0cyBhcmUganVzdCBhbiBhcnRpZmFjdCBv ZiBnZW5lcmFsbHkgaGF2aW5nIHR3byBiaXRzCisJICogcGVyIGRldmljZS4KKwkgKi8KKwlbWlhf Q0xLX1BEQ0ZHX1dDTEtdICAgICAgID0gR0FURSgicGRjZmctd2NsayIsIG1hdHJpeF91bmssIDB4 ODgsIDAsIENMS19JU19DUklUSUNBTCksCisJW1pYX0NMS19QRENGR19QQ0xLXSAgICAgICA9IEdB VEUoInBkY2ZnLXBjbGsiLCBjbGtfbWFpblswXSwgMHg4OCwgMSwgQ0xLX0lTX0NSSVRJQ0FMKSwK KwlbWlhfQ0xLX01CT1hfUENMS10gICAgICAgID0gR0FURSgibWJveC1wY2xrIiwgY2xrX21haW5b MF0sIDB4ODgsIDIsIDApLAorCVtaWF9DTEtfU1JBTTBfUENMS10gICAgICAgPSBHQVRFKCJzcmFt MC1wY2xrIiwgY2xrX21haW5bMF0sIDB4ODgsIDQsIDApLAorCVtaWF9DTEtfR1NNX0NGR19QQ0xL XSAgICAgPSBHQVRFKCJnc20tY2ZnLXBjbGsiLCBjbGtfbWFpblswXSwgMHg4OCwgOCwgMCksCisK KwkvKgorCSAqIFpURSdzIGRyaXZlciBoYXMgYSBzdGF0ZW1lbnQgdG8gdGhlIGVmZmVjdCBvZiAq KHRvcC0+YmFzZSsweDExYykgPSA1LCB3aXRoIGEgY29tbWVudAorCSAqIHN1Z2dlc3RpbmcgdGhh dCB0aGlzIHNldHMgYSA1MCBNSHogY2xvY2suIFRoZSBjbG9jayBjb2RlIGl0c2VsZiBsaXN0cyBH TUFDIGNsb2NrcyBpbgorCSAqIG1hdHJpeCsweDExMCBhbmQgbGlzdHMgdGhlIHBhcmVudHMgb2Yg dGhlc2UgY2xvY2tzIGFzIDUwIE1IeiBncGxsIG91dHB1dCwgYnV0CisJICogdGhlIGRvd25zdHJl YW0gWlRFIEdNQUMgZHJpdmVyIG5ldmVyIGVuYWJsZXMgdGhlIGNsb2Nrcy4gSXQgdHVybnMgb3V0 IFpURSdzIGNvZGUgaXMKKwkgKiBoaWdobHkgbWlzbGVhZGluZy4KKwkgKgorCSAqIFRoZSBHTUFD J3Mgd29yayBjbG9jayBpcyBkZWZpbml0ZWx5IG5vdCBhbnkgZ3BsbCBvdXRwdXQgYmVjYXVzZSBp dCBrZWVwcyB3b3JraW5nIGZpbmUKKwkgKiB3aXRoIGdwbGwgZGlzYWJsZWQuIEdhdGluZyBvZmYg bWF0cml4LW9zYzI2bSBicmVha3MgR01BQywgc28gaXQgbXVzdCBiZSBpdHMgcGFyZW50LgorCSAq CisJICogVGhlIEdNQUMgR2F0ZXMgYXJlIGxlZnQgZW5hYmxlZCBieSB0aGUgYm9vdCBsb2FkZXIg YW5kIGFyZSByZXF1aXJlZCBmb3IgdGhlIEdNQUMgdG8gd29yay4KKwkgKgorCSAqIEFzIGZvciB0 aGUgNTAgTUh6IGNvbW1lbnQ6IFNlZSBybWlpcGh5LXdjbGsuCisJICoKKwkgKiBUaGUgZ21hYy1h aGIgY2xvY2sgaXMgYSBjaGlsZCBvZiB0b3Bjcm0ncyBhaGItcGNsayBhbmQgaXMgcmVxdWlyZWQg Zm9yIERNQSB0cmFuc2ZlcnMgaW4KKwkgKiBhbmQgb3V0IG9mIEdNQUMuIFdpdGhvdXQgaXQsIEdN QUMgc3RpbGwgcmVjZWl2ZXMgZXRoZXJuZXQgZnJhbWVzLCBidXQgY2FuJ3QgZHJhaW4gdGhlbQor CSAqIHRvIG1lbW9yeSBhbmQgd2lsbCBldmVudHVhbGx5IHNldCB0aGUgUlggRklGTyBvdmVyZmxv dyBmbGFnLgorCSAqLworCVtaWF9DTEtfR01BQ19XQ0xLXSAgICAgICAgPSBHQVRFKCJnbWFjLXdj bGsiLCBQQVJFTlRfRlcoIndjbGstb3NjMjZtIiksIDB4MTEwLCAwLCAwKSwKKwlbWlhfQ0xLX0dN QUNfUENMS10gICAgICAgID0gR0FURSgiZ21hYy1wY2xrIiwgY2xrX21haW5bMF0sIDB4MTEwLCAx LCAwKSwKKwlbWlhfQ0xLX0dNQUNfQUhCXSAgICAgICAgID0gR0FURSgiZ21hYy1haGIiLCBQQVJF TlRfRlcoImFoYiIpLCAweDExMCwgMiwgMCksCisKKwkvKgorCSAqIElzIHRoZXJlIGFuIEFYSSBi dXMgZ2F0ZT8gVGhlIHN5bXB0b20gb2YgY3V0dGluZyBvZmYgdGhlIEFYSSBtdXggc2VsZWN0aW9u IGluIHRvcCsweDE0MAorCSAqIGlzIHRoYXQgbWF0cml4Y3JtIGJlY29tZXMgdW5yZWFkYWJsZSBm cm9tIG0wIGFuZCBBNTMgaGFuZ3MuIEluc2lkZSBtYXRyaXggaXRzZWxmIG9ubHkgMworCSAqIGJp dHMgZml0IHRoYXQgYmlsbDogMHg4YyBiaXRzIDUsIDYsIDcuIEl0IHNlZW1zIGEgYml0IHNlbGYt ZGVmZWF0aW5nIHRvIGhhdmUgYSBjbG9jaworCSAqIGdhdGUgdGhhdCBzaHV0cyBvZmYgYWNjZXNz IHRvIGl0c2VsZiB0aG91Z2guIEkgZXhwZWN0IGEgY2xvY2sgZ2F0ZSBmb3IgdGhlIGJ1cworCSAq IHNvbWV3aGVyZSwgYW5kIHRoZSBtdXggZXhpc3RzLCBzbyBleHBvc2luZyBvbmUgQVhJIGNsb2Nr IGluIHRoZSBiaW5kaW5ncyBpcyB0aGUgY29ycmVjdAorCSAqIHRoaW5nIHRvIGRvLiBJdCBhbHNv IHNlcnZlcyB0byB0ZWxsIHRoZSBrZXJuZWwgdG8ga2VlcCB0aGUgbXV4J3MgcGFyZW50IGVuYWJs ZWQuCisJICoKKwkgKiBSZWdpc3RlciAweDhjIGhhcyAxMiBzZXR0YWJsZSBiaXRzICgweGZmZiku IFVsdGltYXRlbHkgaXQgZG9lc24ndCBtYXR0ZXIgbXVjaCB3aGljaAorCSAqIGRvLW5vdC1yZW1v dmUgYml0IHdlIGRvbid0IHJlbW92ZS4gT3RoZXIgYml0cyBpbiB0aGlzIHJlZ2lzdGVyIGJlaGF2 ZSBsaWtlIGdhdGVzIChlLmcKKwkgKiBiaXRzIDExOjggY3V0IG9mZiBVU0IgdGVtcG9yYXJpbHkp LCBzbyBJIHRoaW5rIHdlIGFyZSBsb29raW5nIGluIHRoZSByaWdodCBwbGFjZS4KKwkgKgorCSAq IElmIGFuIGV4cGxhbmF0aW9uIGZvciB0aGUgcmVtYWluaW5nIGJpdHMgc3VyZmFjZXMgYW5kIHRo ZXkgYXJlIGZ1cnRoZXIgZ2F0ZXMgYW5kL29yCisJICogcmVzZXRzLCBhZGQgdGhlbSB0byB0aGUg YmluZGluZ3MuCisJICovCisJW1pYX0NMS19BWElfV0NMS10gICAgICAgICA9IEdBVEUoImF4aS13 Y2xrIiwgUEFSRU5UX0lEKFpYX0NMS19BWElfTVVYKSwgMHg4YywgNSwKKwkJCQkJIENMS19JU19D UklUSUNBTCksCisKKwlbWlhfQ0xLX0RNQV9QQ0xLXSAgICAgICAgID0gR0FURSgiZG1hLXBjbGsi LCBjbGtfbWFpblswXSwgMHg5NCwgMywgMCksCisKKwkvKgorCSAqIFRoZXJlIGFyZSBhIGxvdCBt b3JlIFZPVSByZWxhdGVkIGNvbnRyb2xzIGluIHRoZXNlIHJlZ2lzdGVycywgYnV0IHR1cm5pbmcg b2ZmIHRoZSBtYWluCisJICogY2xvY2sgc2VlbXMgdG8gc2h1dCBvZmYgdGhlIGVudGlyZSBWT1Ug TU1JTyByYW5nZS4KKwkgKi8KKwlbWlhfQ0xLX1ZPVV9XQ0xLXSAgICAgICAgID0gR0FURSgidm91 LXdjbGsiLCBtYXRyaXhfdW5rLCAweDE2OCwgMCwgMCksCisJW1pYX0NMS19WT1VfUENMS10gICAg ICAgICA9IEdBVEUoInZvdS1wY2xrIiwgY2xrX21haW5bMF0sIDB4MTY4LCAxLCAwKSwKKworCS8q CisJICogTFNQIHVwbGluayBjbG9ja3MuIFRoZSBwY2xrIGlzIGZhaXJseSBvYnZpb3VzIChkaXNh YmxpbmcgaXQgc2h1dHMgb2ZmIHRoZSBlbnRpcmUgTFNQCisJICogcmVnaXN0ZXIgYXJlYSkuIFRo ZSB3Y2xrIHNwZWVkcyB3ZXJlIGRlZHVjZWQgYnkgc2V0dGluZyB0aW1lcnMgYW5kIHFzcGkgbXV4 ZXMgdG8gYQorCSAqIHNwZWNpZmljIHNwZWVkIGFuZCBzZWVpbmcgd2hpY2ggYml0IGluIG1hdHJp eCsweDdjIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBkZXZpY2UKKwkgKiB0byB3b3JrLgor CSAqCisJICogRHVlIHRvIHRoZSB0aW1lcnMgSSBhbSBjZXJ0YWluIGFib3V0IHRoZSAyNiBNSHog YW5kIDMyIGtIeiBjbG9ja3MuIEkgY2Fubm90IGRpcmVjdGx5CisJICogb2JzZXJ2ZSB0aGUgcXNw aSBtdXggZnJlcXVlbmN5LCBzbyB0aGUgY2xvY2sgcmF0ZXMgZGVwZW5kIG9uIFpURSdzIHFzcGkg bXV4IHNlbGVjdGlvbgorCSAqIGJlaW5nIGNvcnJlY3QuCisJICoKKwkgKiBUd28gYWRkaXRpb25h bCBiaXRzIGFyZSBzcGVjaWZpYyB0byBzb3VuZCBjb21wb25lbnRzIC0gdGhlIG11eCBmb3IgdGhl IExTUCdzIFRETSBJUCBpcworCSAqIGluIG1hdHJpeGNybSBhbmQgZ2V0cyBwYXNzZWQgZG93bi4g STJTIGhhcyBhIG11eCBpbiBMU1AsIHdoaWNoIGNhbiBzZWxlY3QgdGhlIGRwbGwtZDQKKwkgKiBj bG9jay4KKwkgKi8KKwlbWlhfQ0xLX1RPTFNQX01QTExfRDVfV0NMS10gID0gR0FURSgibHNwLW1w bGwtZDUiLCBQQVJFTlRfRlcoIm1wbGwtZDUiKSwgMHg3YywgMCwgMCksCisJW1pYX0NMS19UT0xT UF9NUExMX0Q0X1dDTEtdICA9IEdBVEUoImxzcC1tcGxsLWQ0IiwgUEFSRU5UX0lEKFpYX0NMS19N QVRSSVhfTVBMTF9ENCksCisJCQkJCSAgICAweDdjLCAxLCAwKSwKKwlbWlhfQ0xLX1RPTFNQX01Q TExfRDZfV0NMS10gID0gR0FURSgibHNwLW1wbGwtZDYiLCBQQVJFTlRfSUQoWlhfQ0xLX01BVFJJ WF9NUExMX0Q2KSwKKwkJCQkJICAgIDB4N2MsIDIsIDApLAorCVtaWF9DTEtfVE9MU1BfTVBMTF9E OF9XQ0xLXSAgPSBHQVRFKCJsc3AtbXBsbC1kOCIsIFBBUkVOVF9JRChaWF9DTEtfTUFUUklYX01Q TExfRDgpLAorCQkJCQkgICAgMHg3YywgMywgMCksCisJW1pYX0NMS19UT0xTUF9NUExMX0QxMl9X Q0xLXSA9IEdBVEUoImxzcC1tcGxsLWQxMiIsIFBBUkVOVF9JRChaWF9DTEtfTUFUUklYX01QTExf RDEyKSwKKwkJCQkJICAgIDB4N2MsIDQsIDApLAorCVtaWF9DTEtfVE9MU1BfT1NDMjZNX1dDTEtd ICAgPSBHQVRFKCJsc3Atb3NjMjZtIiwgUEFSRU5UX0ZXKCJ3Y2xrLW9zYzI2bSIpLCAweDdjLCA1 LCAwKSwKKwlbWlhfQ0xLX1RPTFNQX09TQzMyS19XQ0xLXSAgID0gR0FURSgibHNwLW9zYzMyayIs IFBBUkVOVF9GVygib3NjMzJrIiksIDB4N2MsIDYsIDApLAorCVtaWF9DTEtfVE9MU1BfUENMS10g ICAgICAgICAgPSBHQVRFKCJsc3AtcGNsayIsIGNsa19tYWluWzBdLCAweDdjLCA3LCAwKSwKKwlb WlhfQ0xLX1RPTFNQX1RETV9XQ0xLXSAgICAgID0gR0FURSgibHNwLXRkbS13Y2xrIiwgUEFSRU5U X0lEKFpYX0NMS19URE1fTVVYKSwgMHg3YywgOCwgMCksCisJW1pYX0NMS19UT0xTUF9EUExMX0Q0 X1dDTEtdICA9IEdBVEUoImxzcC1kcGxsLWQ0IiwgUEFSRU5UX0lEKFpYX0NMS19NQVRSSVhfRFBM TF9ENCksCisJCQkJCSAgICAweDdjLCA5LCAwKSwKK307CisKK3N0YXRpYyBpbnQgengyOTc1MjB2 M19tYXRyaXhfaW5pdChzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJdTMyIGF4aV92YWw7CisJaW50 IHJlczsKKworCS8qIFJlYWQgdGhlIGdsb2JhbCBBWEkgc3BlZWQgc2VsZWN0aW9uLCBpbnNlcnQg aXQgaW50byBvdXIgYmFsbG90IGFuZCBlbmFibGUgdm90aW5nICovCisJcmVzID0gcmVnbWFwX3Jl YWQobWFwLCAweDAsICZheGlfdmFsKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJYXhp X3ZhbCAmPSAweDc7CisJcmVzID0gcmVnbWFwX3dyaXRlKG1hcCwgWlgyOTc1MjBWM19BWElfQVBf Vk9URSwgYXhpX3ZhbCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiByZWdt YXBfd3JpdGUobWFwLCAweDEyYywgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgengyOTc1 MjB2M19tYXRyaXhfZXhwb3J0c1tdID0geworCVtaWDI5NzUyMFYzX1NZU19USU1FUl9XQ0xLXSA9 CQlaWF9DTEtfU1lTX1RJTUVSX1dDTEssCisJW1pYMjk3NTIwVjNfQ1BVX1dDTEtdID0JCQlaWF9D TEtfQ1BVX1dDTEssCisJW1pYMjk3NTIwVjNfQ1BVX1BDTEtdID0JCQlaWF9DTEtfQ1BVX1BDTEss CisJW1pYMjk3NTIwVjNfWlNQX1dDTEtdID0JCQlaWF9DTEtfWlNQX1dDTEssCisJW1pYMjk3NTIw VjNfRERSX0NUUkxfUENMS10gPQkJWlhfQ0xLX0REUl9DVFJMX1BDTEssCisJW1pYMjk3NTIwVjNf RERSX0NUUkxfV0NMS10gPQkJWlhfQ0xLX0REUl9DVFJMX1dDTEssCisJW1pYMjk3NTIwVjNfRURD UF9XQ0xLXSA9CQlaWF9DTEtfRURDUF9XQ0xLLAorCVtaWDI5NzUyMFYzX0VEQ1BfUENMS10gPQkJ WlhfQ0xLX0VEQ1BfUENMSywKKwlbWlgyOTc1MjBWM19TRDBfV0NMS10gPQkJCVpYX0NMS19TRDBf V0NMSywKKwlbWlgyOTc1MjBWM19TRDBfUENMS10gPQkJCVpYX0NMS19TRDBfUENMSywKKwlbWlgy OTc1MjBWM19TRDBfQ0RFVF0gPQkJCVpYX0NMS19TRDBfQ0RFVCwKKwlbWlgyOTc1MjBWM19TRDFf V0NMS10gPQkJCVpYX0NMS19TRDFfV0NMSywKKwlbWlgyOTc1MjBWM19TRDFfUENMS10gPQkJCVpY X0NMS19TRDFfUENMSywKKwlbWlgyOTc1MjBWM19TRDFfQ0RFVF0gPQkJCVpYX0NMS19TRDFfQ0RF VCwKKwlbWlgyOTc1MjBWM19OQU5EX1dDTEtdID0JCVpYX0NMS19OQU5EX1dDTEssCisJW1pYMjk3 NTIwVjNfTkFORF9QQ0xLXSA9CQlaWF9DTEtfTkFORF9QQ0xLLAorCVtaWDI5NzUyMFYzX0RNQV9Q Q0xLXSA9CQkJWlhfQ0xLX0RNQV9QQ0xLLAorCVtaWDI5NzUyMFYzX01CT1hfUENMS10gPQkJWlhf Q0xLX01CT1hfUENMSywKKwlbWlgyOTc1MjBWM19QRENGR19XQ0xLXSA9CQlaWF9DTEtfUERDRkdf V0NMSywKKwlbWlgyOTc1MjBWM19QRENGR19QQ0xLXSA9CQlaWF9DTEtfUERDRkdfUENMSywKKwlb WlgyOTc1MjBWM19TU0NfV0NMS10gPQkJCVpYX0NMS19TU0NfV0NMSywKKwlbWlgyOTc1MjBWM19T U0NfUENMS10gPQkJCVpYX0NMS19TU0NfUENMSywKKwlbWlgyOTc1MjBWM19BWElfV0NMS10gPQkJ CVpYX0NMS19BWElfV0NMSywKKwlbWlgyOTc1MjBWM19HTUFDX1dDTEtdID0JCVpYX0NMS19HTUFD X1dDTEssCisJW1pYMjk3NTIwVjNfR01BQ19QQ0xLXSA9CQlaWF9DTEtfR01BQ19QQ0xLLAorCVta WDI5NzUyMFYzX0dNQUNfQUhCXSA9CQkJWlhfQ0xLX0dNQUNfQUhCLAorCVtaWDI5NzUyMFYzX1ZP VV9XQ0xLXSA9CQkJWlhfQ0xLX1ZPVV9XQ0xLLAorCVtaWDI5NzUyMFYzX1ZPVV9QQ0xLXSA9CQkJ WlhfQ0xLX1ZPVV9QQ0xLLAorCVtaWDI5NzUyMFYzX0xTUF9NUExMX0Q1X1dDTEtdID0JCVpYX0NM S19UT0xTUF9NUExMX0Q1X1dDTEssCisJW1pYMjk3NTIwVjNfTFNQX01QTExfRDRfV0NMS10gPQkJ WlhfQ0xLX1RPTFNQX01QTExfRDRfV0NMSywKKwlbWlgyOTc1MjBWM19MU1BfTVBMTF9ENl9XQ0xL XSA9CQlaWF9DTEtfVE9MU1BfTVBMTF9ENl9XQ0xLLAorCVtaWDI5NzUyMFYzX0xTUF9NUExMX0Q4 X1dDTEtdID0JCVpYX0NMS19UT0xTUF9NUExMX0Q4X1dDTEssCisJW1pYMjk3NTIwVjNfTFNQX01Q TExfRDEyX1dDTEtdID0JWlhfQ0xLX1RPTFNQX01QTExfRDEyX1dDTEssCisJW1pYMjk3NTIwVjNf TFNQX09TQzI2TV9XQ0xLXSA9CQlaWF9DTEtfVE9MU1BfT1NDMjZNX1dDTEssCisJW1pYMjk3NTIw VjNfTFNQX09TQzMyS19XQ0xLXSA9CQlaWF9DTEtfVE9MU1BfT1NDMzJLX1dDTEssCisJW1pYMjk3 NTIwVjNfTFNQX1BDTEtdID0JCQlaWF9DTEtfVE9MU1BfUENMSywKKwlbWlgyOTc1MjBWM19MU1Bf VERNX1dDTEtdID0JCVpYX0NMS19UT0xTUF9URE1fV0NMSywKKwlbWlgyOTc1MjBWM19MU1BfRFBM TF9ENF9XQ0xLXSA9CQlaWF9DTEtfVE9MU1BfRFBMTF9ENF9XQ0xLLAorCVtaWDI5NzUyMFYzX1NS QU0wX1BDTEtdID0JCVpYX0NMS19TUkFNMF9QQ0xLLAorCVtaWDI5NzUyMFYzX0dTTV9DRkdfUENM S10gPQkJWlhfQ0xLX0dTTV9DRkdfUENMSywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgenhf Y2xrX2RhdGEgengyOTc1MjB2M19tYXRyaXhjbGtfZGF0YSA9IHsKKwkuaW5pdCA9IHp4Mjk3NTIw djNfbWF0cml4X2luaXQsCisJLmNsb2NrcyA9IHp4Mjk3NTIwdjNfbWF0cml4X2Nsb2NrcywKKwku bnVtX2Nsb2NrcyA9IEFSUkFZX1NJWkUoengyOTc1MjB2M19tYXRyaXhfY2xvY2tzKSwKKwkuZXhw b3J0cyA9IHp4Mjk3NTIwdjNfbWF0cml4X2V4cG9ydHMsCisJLm51bV9leHBvcnRzID0gQVJSQVlf U0laRSh6eDI5NzUyMHYzX21hdHJpeF9leHBvcnRzKSwKK307CisKIHN0YXRpYyBpbnQgY2xrX3p4 Mjk3NTIwdjNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAljb25zdCBz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRl dik7CkBAIC03ODUsNiArMTI2NCwxMCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2Rl dmljZV9pZCBjbGtfengyOTc1MjB2M19pZHNbXSA9IHsKIAkJLm5hbWUgPSAiengyOTc1MjB2My10 b3BjbGsiLAogCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJnp4Mjk3NTIwdjNfdG9w Y2xrX2RhdGEsCiAJfSwKKwl7CisJCS5uYW1lID0gInp4Mjk3NTIwdjMtbWF0cml4Y2xrIiwKKwkJ LmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSZ6eDI5NzUyMHYzX21hdHJpeGNsa19kYXRh LAorCX0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgY2xrX3p4Mjk3 NTIwdjNfaWRzKTsKCi0tIAoyLjU0LjAKCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51 eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1waHkK From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 7E36333CE9A for ; Sun, 2 Aug 2026 20:34:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785702895; cv=none; b=ILEJ5h00KtHQ9Yvh7+HXd8SPCoMxSvDS7+h0CEt00oq/ngZZz8qNxS7E6fXZ3guBjHmQdiN4rGtiaMIOInzDC7+C32Qe9j02kaIF3lpD3zXWK71g0XzArW1Nb8OE7I+L8ejPHjSQezw9VtUi0+Iefc33oPLu+vdpvD2zkEuK3z4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785702895; c=relaxed/simple; bh=uI5HEaw0V5CC62qkE3Hen4IpsN3Aztamtdb5xPF4I+0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fPqa7EMBKVDhfc468mQ2UMXNclnv0WHcunnV2Lp8hcaWhJcAB9GG/msMj53uyYBbRHMlO6J2Ej7GT6yaGrmDZMtfMRNAooM6BAs2w8v4SHUQM2qMEdu6iPgabFTvwAf5uwdLtwEa+BrgnDjV1LSAzPXmocRVAC87fIsfYzhGm6Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JrYrl7wj; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JrYrl7wj" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4954a9e8490so11674565e9.1 for ; Sun, 02 Aug 2026 13:34:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785702891; x=1786307691; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=bIP93lvBLMGojmWlYFRUzPyh/SNEeVDe+e2Useud0hs=; b=JrYrl7wj/jGKuWAULNTY2gvu1tWPkZ9nkxSMUU0lYRYDt+zcKadDj747hBnNS3+PIY KFmBSU7uHCgHkW25iGp1yzj85LMetB7kwhTKF8CbpTCLx6pMsXLtRLZNfsfOxmYrX2pw bAhpkrKgtDC/r9lXxGCdhdTPSlWxqBIkBbHuwOdhLDjtP9nnjnq6SBJMP9aEkMbEIAoS XptN8WHzy4NJhOzyf4ckct/1U7SzBo9IH9wEbxACjgaAWeAf7YmYp0sfJLvloA5LmUQq b5+a8bYgYDtrQdUqVLrOTADTqN/jQkz2IT3YqpqjxQaboKE8oIiXk2nEi3eq6PHhXxF6 6a7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785702891; x=1786307691; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=bIP93lvBLMGojmWlYFRUzPyh/SNEeVDe+e2Useud0hs=; b=VYC5YdF4+2/F+KcypU4SG5kvqxMbJ5p0Gs3y4COm+ifbudrVPO3htd6HGtz1FBmDvk gjZe4xR0waNAaGV0ghBmWb4wZzpQqhLW+ropo1OlmLHLZ753Vxrdom3fFTHoeuNIichA aDkCgDLtpNCP4Ibs6VvykvZpQZSQTn4pSPpzlBN3tzSSugjlAA+uQza3ggatp4I/XZQK aH0F6d/cg5v4PXRb/VUlw9TexE2I7sYfudW+cvtP+47ZHpbKNQl1rdCifvIEk4aHQmox etgNwi1VMaiftZrWL6w0ruhnPIeJlgjvavTniRckHHzyqakGtYzO4EF1PmJDPL6OOnmz Hp+A== X-Forwarded-Encrypted: i=1; AHgh+Rq90LTdeEXq0Q/eW7LjWPfQLvqGZgGo99mRb19LlApZRHMiCrrlSQ3YwpWse0Q2ewRIiF9r6u0sbDfx@vger.kernel.org X-Gm-Message-State: AOJu0YxD3GTq/kM8JOJZXh5CNTxKDg4Ehj8QJYoKrkcjuXaeq/Pz3UzY xiIY6FZ79Jhus9G9Wlehy5986/XK69/HcqDory1JkcmMnoASMaxU8d2F X-Gm-Gg: AR+sD11mnc8sSZw8b2ybtaU5cY3Z8byrCeKlI8twHDAKRg1aQMF+Us71PG9DQpBcU6K EUvukGOrwNuk1dGefmduOMHaBcFzBpfTD3qiHwED8PcH4kaNDsYVdE2rxj1sZP2mB/U/8zR3JWB r0sg6NFfuGcXYGFDPJz+gCDkfnaP7fNs331HwWSCbiEgyEUmPdk0uS8B1VRywaYw6o1JzzlqItT UqgAlzGx2nHR+QeM73k/y4Qj4r7HxfYS6e2dpPZhYKCQ4rsXZBTOCLAWkeFGJZSWOHHX49bpfaJ /8dOohUJ/0Zk2E3K6CI5uvKAZ4rYDxAsXkCufTq8UqAPDS/v7ynbycv1QfueZoK82oKgV6sbpG+ 7llApK62DuQHlLnOHLkQy7LaL1FjOaLinSqCz9/Uz6F9SFXppQmT9pl1dXKRoRlK0cA8rSKbSmD 7bVqj767oJDOiv5Xdw5h1JFRGmlMsECuCD1kiqatXy4qjOyjcCBGReFRWOu4cFZZarb3FUFu0T X-Received: by 2002:a05:600c:1912:b0:495:4f84:7280 with SMTP id 5b1f17b1804b1-4980eb8c4a1mr125120745e9.4.1785702890317; Sun, 02 Aug 2026 13:34:50 -0700 (PDT) Received: from [192.168.0.2] ([197.250.226.155]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49807bb45ebsm118499905e9.4.2026.08.02.13.34.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Aug 2026 13:34:49 -0700 (PDT) From: =?utf-8?q?Stefan_D=C3=B6singer?= Date: Sun, 02 Aug 2026 23:33:41 +0300 Subject: [PATCH v9 09/12] clk: zte: Introduce a driver for zx297520v3 matrix clocks Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Message-Id: <20260802-zx29clk-v9-9-d05530d85d28@gmail.com> References: <20260802-zx29clk-v9-0-d05530d85d28@gmail.com> In-Reply-To: <20260802-zx29clk-v9-0-d05530d85d28@gmail.com> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Brian Masney , Vinod Koul , Neil Armstrong , Russell King , Lee Jones Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-phy@lists.infradead.org, mfd@lists.linux.dev, =?utf-8?q?Stefan_D=C3=B6singer?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=24645; i=stefandoesinger@gmail.com; h=from:subject:message-id; bh=uI5HEaw0V5CC62qkE3Hen4IpsN3Aztamtdb5xPF4I+0=; b=owEBiQJ2/ZANAwAIAT0TvMhUTxoiAcsmYgBqb6myQUW5FISpnt/EpHclyYa2MNWJ69RX2e190 7oKC1uRhG+JAk8EAAEIADkWIQRDFvS2qgVbJ5UyXWw9E7zIVE8aIgUCam+pshsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQPRO8yFRPGiJBbA//bAYRivoNcm7TBsgct4jHkm0NR2myEoo e0G8oUoqhLi648NpmDYGAZyJp7UJ/KUe11DGWDI5La9zhDWPTiBWzDyB9CF43PcyHsuNWLA2hVz ldVnhI6D0buE506usUlBZc+bV4GmY0jpNBIk456vODh9m2D3b4w0ON6nUb/+IQenjDNnaZkugUO Yk+HaRHRW4N4QeTCjvdWz8tEyXYM8QOXKBvB15iY5SO1Cb/25pf4R4tve9oymCT3NR2lzZVQM9a hdelZ7tOT/7VcvJYbdFgxS5YzQACmA6+vZ4xa5dQyHxt4Wjo2xfiuglX+7PmmLEh840wtGkPLL6 1z+Ibt0u/bF3bNa8saT7ABNiGd0nHDykqYTlnldGXn2hXX0u1qL0Y0OjwyCLPjRgG/BOCYtUsoE R8cZbB0gGR0h7DRTdlJ13Wv1SUAJ8GczJVL5Vc/FZ8MeBKs9rM/mgYyfAg6lTMmKtDQ0hbpfbfY ajkaaIlaLVq+3uOKbsgkcFs2tph/NNfNRXQgoabVkAzZHgGZz4sTVMUikB6129CQ22JoukcUvzW j7mXnI/6LkoeHMRjmMrZQc7+Es5wbqQOBh6zYbrJVGW1nnZWV5a1fo8OEM15Jf3qX7rTKri4jjz TBO0UgZjptRkv7Als36OO6VHvYSUVinM+kKIpY0flryqBpTE23Kw= X-Developer-Key: i=stefandoesinger@gmail.com; a=openpgp; fpr=4F9C2C8728019633893EBBB98CB81F9A72BBA155 This clock controller controls high speed devices: CPU, DMA, RAM, SDIO, Ethernet. The only non-clock, non-reset registers I have spotted here are hardware spinlocks. Signed-off-by: Stefan Dösinger --- Version 9: Link internal parents by an (internal) clock ID rather than names. There are 3 intentional changes vs version 8 in the clock tree: "gmac-ahb" depends on the ahb clock imported from topcrm. This was already the case before, but it was missing from the bindings and the global name matching obscured it. When re-testing other devices for potential topcrm->ahb dependencies I noticed that the two SDIO devices take their pclk from topcrm->ahb as well. @Sashiko: Any possible other clock tree change compared to version 8 is unintentional and a likely bug. Version 8: Add another distribution gate register: 0x118 gates off matrix-generated divisions of mpll, dpll and gpll. It nicely fits the top->matrix forward picture. AXI 6.5 MHz is not an mpll child. I must have done something wrong when originally testing this Add explanations about additional ARM architected timer controls. Add gates for unknown LTE hardware at offset 0x60. They are not exported in the bindings because the actual name of the consumer isn't clear - but if dpll is unprepared and feeds a bypass 26 MHz signal, this device starts spamming IRQs (although the 0x118 and top+0x140 gates also prevent this usually) Double-check pclk and wclk of all devices. The SDIO and EDCP clocks were flipped in previous submissions. Version 7: Reduced the input clocks a lot. Most MPLL subdivisions are children of the same gate in top, so put the fixed factor clocks here. Added a few more clocks: DDR_CTRL, AXI bus, ARM architected timer. They are needed to tell CCF to keep the top gates enabled and marked critical because they aren't consumed by a DT node. The AXI bus is determined by a voting system. I've set up the driver to write to the ballot register ZTE's kernel uses and enable voting. This should make life easier with the LTE rproc blob later. Version 5: Make it an MFD child device, remove aux device Fix zx297529 -> zx297520 typos Fix AHB_wclk -> ahb_wclk. That was a leftover of my old composite structs Add SRAM0 and GSM_CFG clocks --- drivers/clk/zte/clk-zx297520v3.c | 483 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 483 insertions(+) diff --git a/drivers/clk/zte/clk-zx297520v3.c b/drivers/clk/zte/clk-zx297520v3.c index f9915582f261..6c4a7a1c3a9b 100644 --- a/drivers/clk/zte/clk-zx297520v3.c +++ b/drivers/clk/zte/clk-zx297520v3.c @@ -769,6 +769,485 @@ static const struct zx_clk_data zx297520v3_topclk_data = { .num_exports = ARRAY_SIZE(zx297520v3_top_exports), }; +enum matrix_clock_ids { + ZX_CLK_MATRIX_OSC26M_D4, + ZX_CLK_MATRIX_MPLL_D2_PREGATE, + ZX_CLK_MATRIX_MPLL_D4_PREGATE, + ZX_CLK_MATRIX_MPLL_D6_PREGATE, + ZX_CLK_MATRIX_MPLL_D8_PREGATE, + ZX_CLK_MATRIX_MPLL_D12_PREGATE, + ZX_CLK_MATRIX_MPLL_D16_PREGATE, + ZX_CLK_MATRIX_GPLL_D2_D2_PREGATE, + ZX_CLK_MATRIX_GPLL_D2_D4_PREGATE, + ZX_CLK_MATRIX_DPLL_D6_PREGATE, + ZX_CLK_MATRIX_DPLL_D4_PREGATE, + + ZX_CLK_MATRIX_MPLL_D16, + ZX_CLK_MATRIX_MPLL_D12, + ZX_CLK_MATRIX_MPLL_D8, + ZX_CLK_MATRIX_MPLL_D6, + ZX_CLK_MATRIX_MPLL_D4, + ZX_CLK_MATRIX_MPLL_D2, + ZX_CLK_MATRIX_DPLL_D6, + ZX_CLK_MATRIX_DPLL_D4, + ZX_CLK_MATRIX_GPLL_D2_D4, + ZX_CLK_MATRIX_GPLL_D2_D2, + + ZX_CLK_CPU_MUX, + ZX_CLK_ZSP_MUX, + ZX_CLK_DDR_CTRL_MUX, + ZX_CLK_SD0_MUX, + ZX_CLK_SD1_MUX, + ZX_CLK_NAND_MUX, + ZX_CLK_EDCP_MUX, + ZX_CLK_TDM_MUX, + ZX_CLK_AXI_MUX, + + ZX_CLK_SYS_TIMER_WCLK, + ZX_CLK_CPU_WCLK, + ZX_CLK_CPU_PCLK, + ZX_CLK_DDR_CTRL_PCLK, + ZX_CLK_DDR_CTRL_WCLK, + ZX_CLK_ZSP_WCLK, + ZX_CLK_SD0_PCLK, + ZX_CLK_SD0_WCLK, + ZX_CLK_SD0_CDET, + ZX_CLK_SD1_PCLK, + ZX_CLK_SD1_WCLK, + ZX_CLK_SD1_CDET, + ZX_CLK_NAND_WCLK, + ZX_CLK_NAND_PCLK, + ZX_CLK_LTE_TPU_WCLK, + ZX_CLK_LTE_TPU_PCLK, + ZX_CLK_EDCP_PCLK, + ZX_CLK_EDCP_WCLK, + ZX_CLK_SSC_WCLK, + ZX_CLK_SSC_PCLK, + ZX_CLK_PDCFG_WCLK, + ZX_CLK_PDCFG_PCLK, + ZX_CLK_MBOX_PCLK, + ZX_CLK_SRAM0_PCLK, + ZX_CLK_GSM_CFG_PCLK, + ZX_CLK_GMAC_WCLK, + ZX_CLK_GMAC_PCLK, + ZX_CLK_GMAC_AHB, + ZX_CLK_AXI_WCLK, + ZX_CLK_DMA_PCLK, + ZX_CLK_VOU_WCLK, + ZX_CLK_VOU_PCLK, + ZX_CLK_TOLSP_MPLL_D5_WCLK, + ZX_CLK_TOLSP_MPLL_D4_WCLK, + ZX_CLK_TOLSP_MPLL_D6_WCLK, + ZX_CLK_TOLSP_MPLL_D8_WCLK, + ZX_CLK_TOLSP_MPLL_D12_WCLK, + ZX_CLK_TOLSP_OSC26M_WCLK, + ZX_CLK_TOLSP_OSC32K_WCLK, + ZX_CLK_TOLSP_PCLK, + ZX_CLK_TOLSP_TDM_WCLK, + ZX_CLK_TOLSP_DPLL_D4_WCLK, +}; + +/* + * For devices which have a working driver the work clock can be figured out by gating off registers + * in topcrm+0x140. This is used for devices where I can't interpret the register contents yet. + */ +static const struct zx_parent_desc matrix_unk = PARENT_FW("wclk-osc26m"); + +static const struct zx_parent_desc cpu_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_FW("mpll"), /* 624 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D2), /* 312 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), /* 156 MHz */ +}; + +/* Low confidence on the actual value, but at least I know it is bit 13 in top+0x140 */ +static const struct zx_parent_desc zsp_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_FW("dpll"), /* 491.52 MHz */ +}; + +/* + * We can't realistically change DDR speed while running an OS out of DDR (it reads garbage for a + * short while on transition), but we need to know if we have to keep gpll alive. 32 MB devices use + * 200 MHz, while 64/128 MB ones use 156 MHz. + */ +static const struct zx_parent_desc ddr_ctrl_sel[] = { + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), /* 156 MHz */ + PARENT_FW("gpll"), /* 200 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D6), /* 104 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D8), /* 78 MHz */ +}; + +static const struct zx_parent_desc sd0_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), /* 156 MHz */ + PARENT_FW("gpll-d2"), /* 100 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D8), /* 78 MHz */ + PARENT_ID(ZX_CLK_MATRIX_GPLL_D2_D2), /* 50 MHz */ + PARENT_ID(ZX_CLK_MATRIX_GPLL_D2_D4), /* 25 MHz */ +}; + +static const struct zx_parent_desc sd1_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_FW("gpll-d2"), /* 100 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D8), /* 78 MHz */ + PARENT_ID(ZX_CLK_MATRIX_GPLL_D2_D2), /* 50 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D16), /* 39 MHz */ + PARENT_ID(ZX_CLK_MATRIX_GPLL_D2_D4), /* 25 MHz */ +}; + +/* + * ZTE's kernel puts the high frequency first, but this is against the usual convention on this SoC. + * I don't have any device that has a raw NAND controller though. + */ +static const struct zx_parent_desc nand_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), /* 156 MHz */ +}; + +static const struct zx_parent_desc edcp_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), /* 156 MHz */ + PARENT_FW("mpll-d5"), /* 124.8 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D6), /* 104 MHz */ +}; + +static const struct zx_parent_desc tdm_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_ID(ZX_CLK_MATRIX_DPLL_D4), /* 122.88 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D6), /* 104 MHz */ +}; + +/* + * ZTE's firmware uses 0x128 as the PHY's vote and names 0x120 as "PS" and 0x124 as "AP" vote. + * However, their cpufreq driver ultimately uses the "PS" define and thus writes to 0x120, which can + * be observed in the running system. + */ +#define ZX297520V3_AXI_AP_VOTE 0x120 +static const struct zx_parent_desc axi_sel[] = { + PARENT_FW("wclk-osc26m"), + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), /* 156 MHz */ + PARENT_FW("mpll-d5"), /* 124.8 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D6), /* 104 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D8), /* 78 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D12), /* 52 MHz */ + PARENT_ID(ZX_CLK_MATRIX_MPLL_D16), /* 39 MHz */ + PARENT_ID(ZX_CLK_MATRIX_OSC26M_D4), /* 6.5 MHz */ +}; + +static const struct zx_clock zx297520v3_matrix_clocks[] = { + [ZX_CLK_MATRIX_OSC26M_D4] = FIXED_DIV("matrix-osc26m-d4", PARENT_FW("wclk-osc26m"), 4), + [ZX_CLK_MATRIX_MPLL_D2_PREGATE] = FIXED_DIV("matrix-mpll-d2-pregate", PARENT_FW("mpll"), 2), + [ZX_CLK_MATRIX_MPLL_D4_PREGATE] = FIXED_DIV("matrix-mpll-d4-pregate", PARENT_FW("mpll"), 4), + /* div 5: provided as a separate line from topcrm */ + [ZX_CLK_MATRIX_MPLL_D6_PREGATE] = FIXED_DIV("matrix-mpll-d6-pregate", PARENT_FW("mpll"), 6), + [ZX_CLK_MATRIX_MPLL_D8_PREGATE] = FIXED_DIV("matrix-mpll-d8-pregate", PARENT_FW("mpll"), 8), + [ZX_CLK_MATRIX_MPLL_D12_PREGATE] = FIXED_DIV("matrix-mpll-d12-pregate", PARENT_FW("mpll"), + 12), + [ZX_CLK_MATRIX_MPLL_D16_PREGATE] = FIXED_DIV("matrix-mpll-d16-pregate", PARENT_FW("mpll"), + 16), + + [ZX_CLK_MATRIX_GPLL_D2_D2_PREGATE] = FIXED_DIV("matrix-gpll-d2-d2-pregate", + PARENT_FW("gpll-d2"), 2), + [ZX_CLK_MATRIX_GPLL_D2_D4_PREGATE] = FIXED_DIV("matrix-gpll-d2-d4-pregate", + PARENT_FW("gpll-d2"), 4), + + [ZX_CLK_MATRIX_DPLL_D6_PREGATE] = FIXED_DIV("matrix-dpll-d6-pregate", PARENT_FW("dpll"), 6), + [ZX_CLK_MATRIX_DPLL_D4_PREGATE] = FIXED_DIV("matrix-dpll-d4-pregate", PARENT_FW("dpll"), 4), + + /* + * Matrix distribution gates: Every matrix-generated subdivision of the input PLLs + * has a gate in 0x118. The original inputs from topcrm (mpll 624, mpll 124.8, gpll 200, + * gpll 100, dpll 491.52) do not. + * + * I do not know of any user of dpll-d6 and do not know the divisor. An 81.92 MHz clock is + * listed as a root clock without a consumer in ZTE's code. Most likely it is a possible + * parent of the ZSP mux. + */ + [ZX_CLK_MATRIX_MPLL_D16] = GATE("matrix-mpll-d16", + PARENT_ID(ZX_CLK_MATRIX_MPLL_D16_PREGATE), 0x118, 0, + ZX297520V3_AXI_CANDIDATE), + [ZX_CLK_MATRIX_MPLL_D12] = GATE("matrix-mpll-d12", + PARENT_ID(ZX_CLK_MATRIX_MPLL_D12_PREGATE), 0x118, 1, + ZX297520V3_AXI_CANDIDATE), + [ZX_CLK_MATRIX_MPLL_D8] = GATE("matrix-mpll-d8", + PARENT_ID(ZX_CLK_MATRIX_MPLL_D8_PREGATE), 0x118, 2, + ZX297520V3_AXI_CANDIDATE), + [ZX_CLK_MATRIX_MPLL_D6] = GATE("matrix-mpll-d6", + PARENT_ID(ZX_CLK_MATRIX_MPLL_D6_PREGATE), 0x118, 3, + ZX297520V3_AXI_CANDIDATE), + [ZX_CLK_MATRIX_MPLL_D4] = GATE("matrix-mpll-d4", + PARENT_ID(ZX_CLK_MATRIX_MPLL_D4_PREGATE), 0x118, 4, + ZX297520V3_AXI_CANDIDATE), + [ZX_CLK_MATRIX_MPLL_D2] = GATE("matrix-mpll-d2", + PARENT_ID(ZX_CLK_MATRIX_MPLL_D2_PREGATE), 0x118, 5, 0), + + [ZX_CLK_MATRIX_DPLL_D6] = GATE("matrix-dpll-d6", + PARENT_ID(ZX_CLK_MATRIX_DPLL_D6_PREGATE), 0x118, 8, 0), + [ZX_CLK_MATRIX_DPLL_D4] = GATE("matrix-dpll-d4", + PARENT_ID(ZX_CLK_MATRIX_DPLL_D4_PREGATE), 0x118, 9, 0), + + [ZX_CLK_MATRIX_GPLL_D2_D4] = GATE("matrix-gpll-d2-d4", + PARENT_ID(ZX_CLK_MATRIX_GPLL_D2_D4_PREGATE), + 0x118, 12, 0), + [ZX_CLK_MATRIX_GPLL_D2_D2] = GATE("matrix-gpll-d2-d2", + PARENT_ID(ZX_CLK_MATRIX_GPLL_D2_D2_PREGATE), + 0x118, 13, 0), + + [ZX_CLK_CPU_MUX] = MUX("cpu-mux", cpu_sel, 0x20, 0, 2), + [ZX_CLK_ZSP_MUX] = MUX("zsp-mux", zsp_sel, 0x30, 0, 2), + [ZX_CLK_DDR_CTRL_MUX] = MUX("ddr-ctrl-mux", ddr_ctrl_sel, 0x50, 0, 2), + [ZX_CLK_SD0_MUX] = MUX("sd0-mux", sd0_sel, 0x50, 4, 3), + [ZX_CLK_SD1_MUX] = MUX("sd1-mux", sd1_sel, 0x50, 8, 3), + [ZX_CLK_NAND_MUX] = MUX("nand-mux", nand_sel, 0x50, 12, 2), + [ZX_CLK_EDCP_MUX] = MUX("edcp-mux", edcp_sel, 0x50, 16, 2), + [ZX_CLK_TDM_MUX] = MUX("tdm-mux", tdm_sel, 0x50, 24, 2), + [ZX_CLK_AXI_MUX] = MUX("axi-mux", axi_sel, ZX297520V3_AXI_AP_VOTE, 0, 3), + + /* + * This bit cuts off the clock signal to the ARM architected timer, which the kernel uses + * as its main timer. It isn't critical per se - there are plenty of proprietary timers + * available that could be used - but the arm arch timer binding does not accept a clock, so + * this CCF driver won't know if the timer is in use. + * + * This clock is fed by the osc26m gate in topcrm+0x140 - this critical clock here protects + * its parent. + * + * Registers 0x148, 0x14c, 0x150, 0x154 allow setting and clearing the timer counter. To + * set the timer, load a value into 0x148 (high 32 bits) and 0x14c (low 32 bits), then + * toggle 0x150 to 1. 0x150 will automatically reset to 0. 0x154 sets the timer to some + * "clear" value, but this value isn't 0. + */ + [ZX_CLK_SYS_TIMER_WCLK] = GATE("sys-timer-wclk", PARENT_FW("wclk-osc26m"), 0x144, 1, + CLK_IS_CRITICAL), + + /* + * Both 0x24 and 0x28 bits 1 and 2 stop the CPU. There is also a bit in topcrm+0x138, which + * ZTE's uboot calls "A53 reset", which also stops the CPU. I can't really tell the + * difference between matrix+0x28 and top+0x138. The clock (matrix+0x24) can be disabled + * and enabled from the Cortex M0 and it will nicely stop and restart the A53, retaining + * all state. + */ + [ZX_CLK_CPU_WCLK] = GATE("cpu-wclk", PARENT_ID(ZX_CLK_CPU_MUX), 0x24, 1, + CLK_IS_CRITICAL), + [ZX_CLK_CPU_PCLK] = GATE("cpu-pclk", clk_main[0], 0x24, 2, CLK_IS_CRITICAL), + + /* + * There are a lot more controls in matrix+0x100. 13-16 appear to be 4 different AXI + * channels for different priorities. Bit 19 appears to be the DDR PHY wclk. + * + * The important task is to keep gpll enabled if the bootloader selected a gpll-based rate + * for RAM. + */ + [ZX_CLK_DDR_CTRL_PCLK] = GATE("ddr-ctrl-pclk", clk_main[0], 0x100, 17, CLK_IS_CRITICAL), + [ZX_CLK_DDR_CTRL_WCLK] = GATE("ddr-ctrl-wclk", PARENT_ID(ZX_CLK_DDR_CTRL_MUX), 0x100, 18, + CLK_IS_CRITICAL), + + [ZX_CLK_ZSP_WCLK] = GATE("zsp-wclk", PARENT_ID(ZX_CLK_ZSP_MUX), 0x3c, 0, 0), + + /* Both SDIO controllers depend on the ahb-pclk for register access. */ + [ZX_CLK_SD0_PCLK] = GATE("sd0-pclk", PARENT_FW("ahb"), 0x54, 12, 0), + [ZX_CLK_SD0_WCLK] = GATE("sd0-wclk", PARENT_ID(ZX_CLK_SD0_MUX), 0x54, 13, 0), + [ZX_CLK_SD0_CDET] = GATE("sd0-cdet", PARENT_FW("osc32k"), 0x54, 14, 0), + [ZX_CLK_SD1_PCLK] = GATE("sd1-pclk", PARENT_FW("ahb"), 0x54, 4, 0), + [ZX_CLK_SD1_WCLK] = GATE("sd1-wclk", PARENT_ID(ZX_CLK_SD1_MUX), 0x54, 5, 0), + /* + * I don't know how the cdet clock works. Card detection in the way the dwc,mmc driver uses + * it appears broken no matter this clock's setting. + */ + [ZX_CLK_SD1_CDET] = GATE("sd1-cdet", PARENT_FW("osc32k"), 0x54, 6, 0), + + /* This is some "denali" NAND, not the qspi connected one */ + [ZX_CLK_NAND_WCLK] = GATE("nand-wclk", PARENT_ID(ZX_CLK_NAND_MUX), 0x54, 20, 0), + [ZX_CLK_NAND_PCLK] = GATE("nand-pclk", clk_main[0], 0x54, 21, 0), + + /* + * There is a set of gates for an unknown device at matrix+0x60. It is some LTE related + * device. If it is fed an incorrect clock, e.g. because dpll is not locked and outputs + * 26 MHz, it will spam IRQs at SPI 68. This is likely a distress notification that some + * internal PLL did not lock or similar + * + * ZTE's kernel has two defines for SPI 64: "LTE_TPU_INT_PS_INT" and "VOU_OSD_INT". The + * latter is unlikely because VOU related clocks sit in matrix+0x168. + * + * Bit 9 in register 0x118 turns it off, providing a hint who the parent is. + */ + [ZX_CLK_LTE_TPU_WCLK] = GATE("lte-tpu-wclk", PARENT_ID(ZX_CLK_MATRIX_DPLL_D4), + 0x60, 0, 0), + [ZX_CLK_LTE_TPU_PCLK] = GATE("lte-tpu-pclk", clk_main[0], + 0x60, 2, 0), + + [ZX_CLK_EDCP_PCLK] = GATE("edcp-pclk", clk_main[0], 0x64, 1, 0), + [ZX_CLK_EDCP_WCLK] = GATE("edcp-wclk", PARENT_ID(ZX_CLK_EDCP_MUX), 0x64, 2, 0), + + /* + * This seems to be another SPI-Like device. ZTE's firmware operates it and from testing + * it looks like the matrix-osc26m gate in top+0x140 stops this device. This would be + * consistent with the other SPI controllers too. + */ + [ZX_CLK_SSC_WCLK] = GATE("ssc-wclk", PARENT_FW("wclk-osc26m"), 0x84, 1, 0), + [ZX_CLK_SSC_PCLK] = GATE("ssc-pclk", clk_main[0], 0x84, 2, 0), + + /* + * PDCFG. Like PMM, either clock bit will allow the device to function. Probably there is + * no wclk line at all and the two bits are just an artifact of generally having two bits + * per device. + */ + [ZX_CLK_PDCFG_WCLK] = GATE("pdcfg-wclk", matrix_unk, 0x88, 0, CLK_IS_CRITICAL), + [ZX_CLK_PDCFG_PCLK] = GATE("pdcfg-pclk", clk_main[0], 0x88, 1, CLK_IS_CRITICAL), + [ZX_CLK_MBOX_PCLK] = GATE("mbox-pclk", clk_main[0], 0x88, 2, 0), + [ZX_CLK_SRAM0_PCLK] = GATE("sram0-pclk", clk_main[0], 0x88, 4, 0), + [ZX_CLK_GSM_CFG_PCLK] = GATE("gsm-cfg-pclk", clk_main[0], 0x88, 8, 0), + + /* + * ZTE's driver has a statement to the effect of *(top->base+0x11c) = 5, with a comment + * suggesting that this sets a 50 MHz clock. The clock code itself lists GMAC clocks in + * matrix+0x110 and lists the parents of these clocks as 50 MHz gpll output, but + * the downstream ZTE GMAC driver never enables the clocks. It turns out ZTE's code is + * highly misleading. + * + * The GMAC's work clock is definitely not any gpll output because it keeps working fine + * with gpll disabled. Gating off matrix-osc26m breaks GMAC, so it must be its parent. + * + * The GMAC Gates are left enabled by the boot loader and are required for the GMAC to work. + * + * As for the 50 MHz comment: See rmiiphy-wclk. + * + * The gmac-ahb clock is a child of topcrm's ahb-pclk and is required for DMA transfers in + * and out of GMAC. Without it, GMAC still receives ethernet frames, but can't drain them + * to memory and will eventually set the RX FIFO overflow flag. + */ + [ZX_CLK_GMAC_WCLK] = GATE("gmac-wclk", PARENT_FW("wclk-osc26m"), 0x110, 0, 0), + [ZX_CLK_GMAC_PCLK] = GATE("gmac-pclk", clk_main[0], 0x110, 1, 0), + [ZX_CLK_GMAC_AHB] = GATE("gmac-ahb", PARENT_FW("ahb"), 0x110, 2, 0), + + /* + * Is there an AXI bus gate? The symptom of cutting off the AXI mux selection in top+0x140 + * is that matrixcrm becomes unreadable from m0 and A53 hangs. Inside matrix itself only 3 + * bits fit that bill: 0x8c bits 5, 6, 7. It seems a bit self-defeating to have a clock + * gate that shuts off access to itself though. I expect a clock gate for the bus + * somewhere, and the mux exists, so exposing one AXI clock in the bindings is the correct + * thing to do. It also serves to tell the kernel to keep the mux's parent enabled. + * + * Register 0x8c has 12 settable bits (0xfff). Ultimately it doesn't matter much which + * do-not-remove bit we don't remove. Other bits in this register behave like gates (e.g + * bits 11:8 cut off USB temporarily), so I think we are looking in the right place. + * + * If an explanation for the remaining bits surfaces and they are further gates and/or + * resets, add them to the bindings. + */ + [ZX_CLK_AXI_WCLK] = GATE("axi-wclk", PARENT_ID(ZX_CLK_AXI_MUX), 0x8c, 5, + CLK_IS_CRITICAL), + + [ZX_CLK_DMA_PCLK] = GATE("dma-pclk", clk_main[0], 0x94, 3, 0), + + /* + * There are a lot more VOU related controls in these registers, but turning off the main + * clock seems to shut off the entire VOU MMIO range. + */ + [ZX_CLK_VOU_WCLK] = GATE("vou-wclk", matrix_unk, 0x168, 0, 0), + [ZX_CLK_VOU_PCLK] = GATE("vou-pclk", clk_main[0], 0x168, 1, 0), + + /* + * LSP uplink clocks. The pclk is fairly obvious (disabling it shuts off the entire LSP + * register area). The wclk speeds were deduced by setting timers and qspi muxes to a + * specific speed and seeing which bit in matrix+0x7c needs to be enabled for the device + * to work. + * + * Due to the timers I am certain about the 26 MHz and 32 kHz clocks. I cannot directly + * observe the qspi mux frequency, so the clock rates depend on ZTE's qspi mux selection + * being correct. + * + * Two additional bits are specific to sound components - the mux for the LSP's TDM IP is + * in matrixcrm and gets passed down. I2S has a mux in LSP, which can select the dpll-d4 + * clock. + */ + [ZX_CLK_TOLSP_MPLL_D5_WCLK] = GATE("lsp-mpll-d5", PARENT_FW("mpll-d5"), 0x7c, 0, 0), + [ZX_CLK_TOLSP_MPLL_D4_WCLK] = GATE("lsp-mpll-d4", PARENT_ID(ZX_CLK_MATRIX_MPLL_D4), + 0x7c, 1, 0), + [ZX_CLK_TOLSP_MPLL_D6_WCLK] = GATE("lsp-mpll-d6", PARENT_ID(ZX_CLK_MATRIX_MPLL_D6), + 0x7c, 2, 0), + [ZX_CLK_TOLSP_MPLL_D8_WCLK] = GATE("lsp-mpll-d8", PARENT_ID(ZX_CLK_MATRIX_MPLL_D8), + 0x7c, 3, 0), + [ZX_CLK_TOLSP_MPLL_D12_WCLK] = GATE("lsp-mpll-d12", PARENT_ID(ZX_CLK_MATRIX_MPLL_D12), + 0x7c, 4, 0), + [ZX_CLK_TOLSP_OSC26M_WCLK] = GATE("lsp-osc26m", PARENT_FW("wclk-osc26m"), 0x7c, 5, 0), + [ZX_CLK_TOLSP_OSC32K_WCLK] = GATE("lsp-osc32k", PARENT_FW("osc32k"), 0x7c, 6, 0), + [ZX_CLK_TOLSP_PCLK] = GATE("lsp-pclk", clk_main[0], 0x7c, 7, 0), + [ZX_CLK_TOLSP_TDM_WCLK] = GATE("lsp-tdm-wclk", PARENT_ID(ZX_CLK_TDM_MUX), 0x7c, 8, 0), + [ZX_CLK_TOLSP_DPLL_D4_WCLK] = GATE("lsp-dpll-d4", PARENT_ID(ZX_CLK_MATRIX_DPLL_D4), + 0x7c, 9, 0), +}; + +static int zx297520v3_matrix_init(struct regmap *map) +{ + u32 axi_val; + int res; + + /* Read the global AXI speed selection, insert it into our ballot and enable voting */ + res = regmap_read(map, 0x0, &axi_val); + if (res) + return res; + + axi_val &= 0x7; + res = regmap_write(map, ZX297520V3_AXI_AP_VOTE, axi_val); + if (res) + return res; + + return regmap_write(map, 0x12c, 1); +} + +static unsigned int zx297520v3_matrix_exports[] = { + [ZX297520V3_SYS_TIMER_WCLK] = ZX_CLK_SYS_TIMER_WCLK, + [ZX297520V3_CPU_WCLK] = ZX_CLK_CPU_WCLK, + [ZX297520V3_CPU_PCLK] = ZX_CLK_CPU_PCLK, + [ZX297520V3_ZSP_WCLK] = ZX_CLK_ZSP_WCLK, + [ZX297520V3_DDR_CTRL_PCLK] = ZX_CLK_DDR_CTRL_PCLK, + [ZX297520V3_DDR_CTRL_WCLK] = ZX_CLK_DDR_CTRL_WCLK, + [ZX297520V3_EDCP_WCLK] = ZX_CLK_EDCP_WCLK, + [ZX297520V3_EDCP_PCLK] = ZX_CLK_EDCP_PCLK, + [ZX297520V3_SD0_WCLK] = ZX_CLK_SD0_WCLK, + [ZX297520V3_SD0_PCLK] = ZX_CLK_SD0_PCLK, + [ZX297520V3_SD0_CDET] = ZX_CLK_SD0_CDET, + [ZX297520V3_SD1_WCLK] = ZX_CLK_SD1_WCLK, + [ZX297520V3_SD1_PCLK] = ZX_CLK_SD1_PCLK, + [ZX297520V3_SD1_CDET] = ZX_CLK_SD1_CDET, + [ZX297520V3_NAND_WCLK] = ZX_CLK_NAND_WCLK, + [ZX297520V3_NAND_PCLK] = ZX_CLK_NAND_PCLK, + [ZX297520V3_DMA_PCLK] = ZX_CLK_DMA_PCLK, + [ZX297520V3_MBOX_PCLK] = ZX_CLK_MBOX_PCLK, + [ZX297520V3_PDCFG_WCLK] = ZX_CLK_PDCFG_WCLK, + [ZX297520V3_PDCFG_PCLK] = ZX_CLK_PDCFG_PCLK, + [ZX297520V3_SSC_WCLK] = ZX_CLK_SSC_WCLK, + [ZX297520V3_SSC_PCLK] = ZX_CLK_SSC_PCLK, + [ZX297520V3_AXI_WCLK] = ZX_CLK_AXI_WCLK, + [ZX297520V3_GMAC_WCLK] = ZX_CLK_GMAC_WCLK, + [ZX297520V3_GMAC_PCLK] = ZX_CLK_GMAC_PCLK, + [ZX297520V3_GMAC_AHB] = ZX_CLK_GMAC_AHB, + [ZX297520V3_VOU_WCLK] = ZX_CLK_VOU_WCLK, + [ZX297520V3_VOU_PCLK] = ZX_CLK_VOU_PCLK, + [ZX297520V3_LSP_MPLL_D5_WCLK] = ZX_CLK_TOLSP_MPLL_D5_WCLK, + [ZX297520V3_LSP_MPLL_D4_WCLK] = ZX_CLK_TOLSP_MPLL_D4_WCLK, + [ZX297520V3_LSP_MPLL_D6_WCLK] = ZX_CLK_TOLSP_MPLL_D6_WCLK, + [ZX297520V3_LSP_MPLL_D8_WCLK] = ZX_CLK_TOLSP_MPLL_D8_WCLK, + [ZX297520V3_LSP_MPLL_D12_WCLK] = ZX_CLK_TOLSP_MPLL_D12_WCLK, + [ZX297520V3_LSP_OSC26M_WCLK] = ZX_CLK_TOLSP_OSC26M_WCLK, + [ZX297520V3_LSP_OSC32K_WCLK] = ZX_CLK_TOLSP_OSC32K_WCLK, + [ZX297520V3_LSP_PCLK] = ZX_CLK_TOLSP_PCLK, + [ZX297520V3_LSP_TDM_WCLK] = ZX_CLK_TOLSP_TDM_WCLK, + [ZX297520V3_LSP_DPLL_D4_WCLK] = ZX_CLK_TOLSP_DPLL_D4_WCLK, + [ZX297520V3_SRAM0_PCLK] = ZX_CLK_SRAM0_PCLK, + [ZX297520V3_GSM_CFG_PCLK] = ZX_CLK_GSM_CFG_PCLK, +}; + +static const struct zx_clk_data zx297520v3_matrixclk_data = { + .init = zx297520v3_matrix_init, + .clocks = zx297520v3_matrix_clocks, + .num_clocks = ARRAY_SIZE(zx297520v3_matrix_clocks), + .exports = zx297520v3_matrix_exports, + .num_exports = ARRAY_SIZE(zx297520v3_matrix_exports), +}; + static int clk_zx297520v3_probe(struct platform_device *pdev) { const struct platform_device_id *id = platform_get_device_id(pdev); @@ -785,6 +1264,10 @@ static const struct platform_device_id clk_zx297520v3_ids[] = { .name = "zx297520v3-topclk", .driver_data = (kernel_ulong_t)&zx297520v3_topclk_data, }, + { + .name = "zx297520v3-matrixclk", + .driver_data = (kernel_ulong_t)&zx297520v3_matrixclk_data, + }, { } }; MODULE_DEVICE_TABLE(platform, clk_zx297520v3_ids); -- 2.54.0