From nobody Thu Apr 2 13:09:07 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 307CEC4332F for ; Tue, 15 Nov 2022 23:38:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231402AbiKOXiX (ORCPT ); Tue, 15 Nov 2022 18:38:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40776 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231296AbiKOXiN (ORCPT ); Tue, 15 Nov 2022 18:38:13 -0500 Received: from JPN01-OS0-obe.outbound.protection.outlook.com (mail-os0jpn01on2101.outbound.protection.outlook.com [40.107.113.101]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B525F2F014; Tue, 15 Nov 2022 15:38:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Zx3zbLid8vnqb1qd6H7LMhn4wVcJ+Lp7rNYHEQtSMmPGCnk9XFG0+nmb/aMKpy03pXLdsrK4V07X5KkTQOnlz7MFt8B7PeNRoXOi6+RxyYZ8ZzmWRpR2r7NPhYtpDptniPd5EEFoZmyY4yZXZa2S/7Yiz3m0LDK/VJ3BuWx4roUiW+YgqUyTdDU+ic2bS76z3kbUTeJPyxNvR2t0ML7aot8QXbJB3LR7UYU+2iL7KgZujot5sK9dBFFt3GncLcz2Y4PO+MGwX7yV60T/ITU7KLA101vXteRFRY5eAyACnWCIaUmRRt8JOnIAwjLPPoYvaY/Oa05ou4aqpUM8QmwQug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=j1cGHvTkjdY9OxBVTybT34f5HBYR3sOWmTuy940HFTk=; b=mq+dFkEOwlgDxwQtBglNE6hCtbljP1Vq5ZVoLh3tcPp4mUzJDlZYt68j72iYmDFH9fH7UX9DprX999zUp2xk4bMIUp76Ng8SXO2lZa/ChXRh2FxBceT6fB6n9VgOl7SrZd24B/DfVrwju8KFzUhZMVUr43CihMj2voM7kwK/Js4i4Vhe3L0Lne49MXszhzPz/7mWtQD+XGPR7RSh6qMrW9eChxBMFmw2+0JXWe6hmhotNFGQTnVdQWbEUZBdNGmjEvdDK6LrxNwxx7ZWw9JuHAjWoBXtyFrMtAutCaZOlc+RLXpFkfopgXWd4jNiNPWHI5VhgEQmmyYT34ziTqir9Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=renesas.com; dmarc=pass action=none header.from=renesas.com; dkim=pass header.d=renesas.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesas.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=j1cGHvTkjdY9OxBVTybT34f5HBYR3sOWmTuy940HFTk=; b=IeTAXo4M10RN+CTWXFL95JGGdzq7xK/ydL/CFVJRcz48WTgcSriPUPwf0kWjUuh/huD36BZjKJDt8O2BEx+LH6D8E+51oTUTaNUYvhvVnXDRY+RYu37deg6+CAk5uMyvZyvqht5biY9Wh0Toy5ocodenJnadO3Wa174qn22iR+M= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=renesas.com; Received: from OSAPR01MB3892.jpnprd01.prod.outlook.com (2603:1096:604:5b::23) by OS3PR01MB8842.jpnprd01.prod.outlook.com (2603:1096:604:17f::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.18; Tue, 15 Nov 2022 23:38:08 +0000 Received: from OSAPR01MB3892.jpnprd01.prod.outlook.com ([fe80::60f7:f062:7c7c:d289]) by OSAPR01MB3892.jpnprd01.prod.outlook.com ([fe80::60f7:f062:7c7c:d289%6]) with mapi id 15.20.5813.018; Tue, 15 Nov 2022 23:38:08 +0000 From: Alex Helms To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-clk@vger.kernel.org Cc: krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org, sboyd@kernel.org, mturquette@baylibre.com, geert+renesas@glider.be, alexander.helms.jy@renesas.com Subject: [PATCH v3 1/2] dt-bindings: clock: Add bindings for Renesas ProXO Date: Tue, 15 Nov 2022 16:37:48 -0700 Message-Id: <20221115233749.10161-2-alexander.helms.jy@renesas.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221115233749.10161-1-alexander.helms.jy@renesas.com> References: <20221115233749.10161-1-alexander.helms.jy@renesas.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR13CA0052.namprd13.prod.outlook.com (2603:10b6:a03:2c2::27) To OSAPR01MB3892.jpnprd01.prod.outlook.com (2603:1096:604:5b::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSAPR01MB3892:EE_|OS3PR01MB8842:EE_ X-MS-Office365-Filtering-Correlation-Id: f6f13374-72fa-4ede-a259-08dac7627314 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: GrEFatCia1mOoharHW2u3+D3UsISkGhxKrC/QQo0oj7YaHo+OWNen4T/m7V2yH348A+38bzBw9Jd6Me0RJwwfxfaNjwi5byQzlc7d6X0pOgJrk6Ju24kovNkQ6x/VIY+sK9FMZNXW0PBL9gcHK15a5jGnyILtX4+KGL3yzFywviMpXAqNM0o2IADFTsA0VcLls+MGsstlXKAM2WmWEe1GRKJxmyf+DA+Wjk4CjahTt7WTKkOMfGbp38tJK/zx4PFfYCM2tDYY/i4r+jLvRq6m6L3ZZgOu7+Y8PgkVOB7xDM1OgcCj1CH9O+UZrznetGzkk51v/SLDr5+OP3JEjN/FrhRow2zbbyZpkz1n5eDEBLrMj1Hxb5mfMgGdT0zlHrLJTTSeEG2Jfbs95E/cQTqsPD9DcSFcCOFAf0GENYJDj3z3XfIe4oo/oBU/bSXMJrZUtxdwLyceMQAfGj4Ouw7ULr6k0IpRI7eNagNhSeSMme/7H79Bz/yZewaewh+RV0/JaMGrjhjSPdNj74sFmYQZQfIYfsWCpWG4UDmBepphzdobZxxRz/sMlV840lo17M9hJ9TFDkb/4CPjmt/1Pr5vhyyzbB9Z4BZJneRp00y+CVbbUxaMj+QMa6AGXdhT2pR1MF+XOgGYfaSHJpEZMLejBQJTFWuutOhN3S1Ls1pGIRNVXodmdsTuPgoioale07gmW+PLfMYKPoNxkReFCI5gwDJSBiUBxUSmXBaYXiA2St4bXqM/+gislT2c1jv1U/bubtA8xVr+I6yqoGpvGd5XP5xEtclUy5E031y0shnrCCTZTqtLdktooV0Jn1hhy3kqjB+0wmepUfvheUo1f88mg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OSAPR01MB3892.jpnprd01.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(136003)(346002)(376002)(396003)(366004)(39860400002)(451199015)(1076003)(186003)(36756003)(966005)(83380400001)(6486002)(478600001)(6512007)(2616005)(107886003)(6666004)(52116002)(6506007)(86362001)(103116003)(38350700002)(8936002)(38100700002)(41300700001)(2906002)(26005)(5660300002)(316002)(8676002)(66476007)(66946007)(66556008)(4326008);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?dbu7LqBInr4FH9oHuQnUey1+92uYyQ7uEEWVjNVfX86e3zFFwyLVSgV/Npox?= =?us-ascii?Q?H7zdEZdQzzAJOdIKRUXXYrYIYafc1G9o25tD8+PoircdlbRgMyYVUfxZGJow?= =?us-ascii?Q?6ZNSkdI2xiCP9EqjlcgfV/dWIsWTCBz4qcpsA/J3/SW6gGIwVgm3DmWUN1YJ?= =?us-ascii?Q?HDxp+G2Aupc6PxMxI3mTQpwrICBy4Ex6M0nGrsS6TL8cR4bvbz7kuybY3VcH?= =?us-ascii?Q?px1lWv/mEV6/IXMeNJ8ToR9w6V0Wfi3najVQlQnHRDEoP4HzI6awHkdJdJOy?= =?us-ascii?Q?KaSV2UWZGYzWSqxN4t41/A0ujllchzuezSyDbwI5EanwvJnRYLBo1dVZTKUx?= =?us-ascii?Q?RpzbQFlUkbBiIIj1R2X/jzGABGof+b93I7U4XDhpA2MZk7cNKR/rc5Onkps4?= =?us-ascii?Q?O29AJii5sQvhMkkDl3591PwRnE8h6+9yVQD3FTp5M1znrqdIGXm1gRNEvhT+?= =?us-ascii?Q?w+cr1NbevaHYKOaRF34S7Z+3586XXnmbxQr8sEL2PxUOALq6Asct+UIyOd7F?= =?us-ascii?Q?WdB+CSlicG0F30bN0Xo4HL2se46NAEt2rXiv0T62Igy9zaTNr9Jsq6Brs5hi?= =?us-ascii?Q?C50KoL3IG3C7h8GNuq2eom24BDAxE0md/PX88ShNKhf+MSWzXlchjwZkUtT7?= =?us-ascii?Q?qv/CjoBfz+8nH/EeSLY6g4s/aHM7M9EU/crNmcOt59s/FuFpAq/hpqTwMNke?= =?us-ascii?Q?dsxJr0cqWQ4iUXx5P4wPwndDiNcEP8x7YxUUjfgRBdEvAygcNUwoIk8+RSRJ?= =?us-ascii?Q?bCzuKh7cRspqnSYIbd7Pck5/3W6XDq9DWDxgvOCld3E5U67VbNtJiDB5FEUH?= =?us-ascii?Q?LJg6/g88Wct39Jrrf9gEq3R/u6XRw3e5ymr6qxrktw7NCvMdKJJZ4dlCiTrz?= =?us-ascii?Q?seJL/5nBXxXfw39/qvCMqCkjcSM4Lk0q7QY0AGqb8ljm38gXvV6W1UATsXUl?= =?us-ascii?Q?R+gmlhG2fvVdu6WE8jJ+57U8esVAHTIiJ+2Nwqf0yQQ+yYRreREgnIe9XClg?= =?us-ascii?Q?j1VKCuJMpe/DooweGOStiHkzvzYxel5Gh7ENC1bByVQ+0Zb2fGVq5Ng46bX7?= =?us-ascii?Q?9g4bW24rWcR5xZxuPSy1UEF76QlX5PYF6MhR1jMsB7Mn+J3e8/f+yMAH4P/8?= =?us-ascii?Q?kV7pYmg61Yny39B8QFaR+opQJBV6PTozlg+4wsFoFqIwnvC7ge8G+quhqOGP?= =?us-ascii?Q?x9d31Mc9Lj/CQTTwYsQ1LBnN1XwryheRm1P/12xx7eCRCDvsUcaEFejjNRwn?= =?us-ascii?Q?nRA+wb2ZI2W4cF39nV4aTagXRJUkzufoM7EBvjCrwnC+hXMaplFOo3e75TEn?= =?us-ascii?Q?yNRtT1X6bcU7fSH6IQ7NupONyeA29zHC+5RtVTkW5J0Tz4gUMTUl8AlUBg0e?= =?us-ascii?Q?q2lS/Rb0Jf9cjGo1csTdj5O8W9h60n07fdiB9F62WkVyoy20adUjOBqmeO3X?= =?us-ascii?Q?JYMj7Jdi/spfeNxdnM4YJbpwAvWBJvt14QOq78em0LKGiy2JZ2xyJXcvOuz/?= =?us-ascii?Q?9NmZqKpHyDtUFikpaRZl9A/Ub3G2uwcf47/PAb3fPevbqbbKL7KZrn09icOH?= =?us-ascii?Q?O5PrdY9TIAnv2HWqPMootM6QVG5neSEcK7kthZVqU17JcD/besfze9i6zZiN?= =?us-ascii?Q?ByDMsn8NhVYo9tpp8DcljPM=3D?= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-Network-Message-Id: f6f13374-72fa-4ede-a259-08dac7627314 X-MS-Exchange-CrossTenant-AuthSource: OSAPR01MB3892.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2022 23:38:07.9675 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: qdqgiTDwhaAu4sHDsa8Rfv6cohgvda/8DtLcfmjiT4fogJSCH8aT7/DeqxLXxI2pwnWWfTjWLauCpr/z8F5TKXu6296WmDWbf6mUni3klP4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS3PR01MB8842 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add dt bindings for the Renesas ProXO oscillator. Signed-off-by: Alex Helms --- .../bindings/clock/renesas,proxo.yaml | 51 +++++++++++++++++++ MAINTAINERS | 5 ++ 2 files changed, 56 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/renesas,proxo.y= aml diff --git a/Documentation/devicetree/bindings/clock/renesas,proxo.yaml b/D= ocumentation/devicetree/bindings/clock/renesas,proxo.yaml new file mode 100644 index 000000000..ff960196d --- /dev/null +++ b/Documentation/devicetree/bindings/clock/renesas,proxo.yaml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/renesas,proxo.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Renesas ProXO Oscillator Device Tree Bindings + +maintainers: + - Alex Helms + +description: + Renesas ProXO is a family of programmable ultra-low phase noise + quartz-based oscillators. + +properties: + '#clock-cells': + const: 0 + + compatible: + enum: + - renesas,proxo-xp + + reg: + maxItems: 1 + + clock-output-names: + maxItems: 1 + + renesas,crystal-frequency-hz: + description: Internal crystal frequency, default is 50000000 (50MHz) + +required: + - '#clock-cells' + - compatible + - reg + +additionalProperties: false + +examples: + - | + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + proxo: clock-controller@55 { + compatible =3D "renesas,proxo-xp"; + reg =3D <0x55>; + #clock-cells =3D <0>; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 350102355..d52a8a5d2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16080,6 +16080,11 @@ S: Supported F: Documentation/devicetree/bindings/iio/adc/renesas,rzg2l-adc.yaml F: drivers/iio/adc/rzg2l_adc.c =20 +RENESAS PROXO CLOCK DRIVER +M: Alex Helms +S: Maintained +F: Documentation/devicetree/bindings/clock/renesas,proxo.yaml + RESET CONTROLLER FRAMEWORK M: Philipp Zabel S: Maintained --=20 2.30.2 From nobody Thu Apr 2 13:09:07 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 81CD0C433FE for ; Tue, 15 Nov 2022 23:38:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231206AbiKOXi0 (ORCPT ); Tue, 15 Nov 2022 18:38:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40798 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231580AbiKOXiP (ORCPT ); Tue, 15 Nov 2022 18:38:15 -0500 Received: from JPN01-OS0-obe.outbound.protection.outlook.com (mail-os0jpn01on2101.outbound.protection.outlook.com [40.107.113.101]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B42F62A27C; Tue, 15 Nov 2022 15:38:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Wtw+WUclIkVKKE9Kz2fKR7lsBn3gaCeVAPzPvS8h3RR8ZW8wis/aPCIPmSoZXaq7bdJwK5NkIky4XmraBJPacc2XT3fhXYcvKl+lTvdhdhPj1UonY8Ino+zv4LU+qKBwwuo+BYmXbcWCrpFu4cV6FQZS4jBThOmBywQoLELg1I4Ssj7DtbiqvVT3fqX0hgvmMNFzL4QhE23OO2hthmv/gU6Ly/5jNsvffpu3N9tsa/Cxy0gt42bmYmyfwddxFQrKFUUhXSrP57/N53yqnHEo7hWzddpP60Gs/qMfx/yL9bJ3Gw0xSsv/TFOdf9IODMhiizJAp0ErchdCp2bV525gLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=KxuLH6HTvJ99lMDIe9+ZKFcNFsWiCK41QU/oWCAQQNY=; b=QWr5CPa6q8/VkDkfz72JLOSTZ8Rvv3j8ANXPqNitNLEkJubxLxrF53s3OFpT0w4GGnvgT3DSHbW8cEGPxM5PPHm8ziDS+V29NGDE5QFO42i+4EdBof+hUrfc59ah9oWh/UFxk8hPlPJkLOIWolZvgXvGfPn8fBwxtvx3UdSH4EHu7mIPFXgaRXTkt+3ZhOp6YLlFgHMQ3d9bZh/cp1ri/RspBYgu4gMG12vw1hhp6YsC8TgPWtjRRF+Wp092mpccap2AXFjuug/JmkSIZSvf4L/KhhrvqNluc85Vs8WP7Efw7s339mjEWhcF3BLeZQKRCwEWibYnei58acjtgiEbPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=renesas.com; dmarc=pass action=none header.from=renesas.com; dkim=pass header.d=renesas.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesas.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KxuLH6HTvJ99lMDIe9+ZKFcNFsWiCK41QU/oWCAQQNY=; b=DkYx9GK3SuHf4P0DaqfjFZnEyvJrHt3Ntf+AIyBtIhOa2NOAgtPe2gDGfbMbcuGJKgdadxn4RXpAOfA9YcG13aYn6hT2DAWn0I7FqBtnc9RCNhdoJXAc0cY/n40cd1ppkgx5wC3BARslTBPVjpPjZtrJYWv9DmJr0L6MDRrs0hM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=renesas.com; Received: from OSAPR01MB3892.jpnprd01.prod.outlook.com (2603:1096:604:5b::23) by OS3PR01MB8842.jpnprd01.prod.outlook.com (2603:1096:604:17f::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.18; Tue, 15 Nov 2022 23:38:09 +0000 Received: from OSAPR01MB3892.jpnprd01.prod.outlook.com ([fe80::60f7:f062:7c7c:d289]) by OSAPR01MB3892.jpnprd01.prod.outlook.com ([fe80::60f7:f062:7c7c:d289%6]) with mapi id 15.20.5813.018; Tue, 15 Nov 2022 23:38:09 +0000 From: Alex Helms To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-clk@vger.kernel.org Cc: krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org, sboyd@kernel.org, mturquette@baylibre.com, geert+renesas@glider.be, alexander.helms.jy@renesas.com Subject: [PATCH v3 2/2] clk: Add support for Renesas ProXO oscillator Date: Tue, 15 Nov 2022 16:37:49 -0700 Message-Id: <20221115233749.10161-3-alexander.helms.jy@renesas.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221115233749.10161-1-alexander.helms.jy@renesas.com> References: <20221115233749.10161-1-alexander.helms.jy@renesas.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR13CA0052.namprd13.prod.outlook.com (2603:10b6:a03:2c2::27) To OSAPR01MB3892.jpnprd01.prod.outlook.com (2603:1096:604:5b::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSAPR01MB3892:EE_|OS3PR01MB8842:EE_ X-MS-Office365-Filtering-Correlation-Id: 0316ef2c-bf10-42ea-05b3-08dac7627441 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: lK43rrcdf4uj1SwnjEAN1f8qP8CZwBccrWxHTHrrFK3uD6dA4q9+mMiVUbGqwRbYEGQQjqYheHN5jhVRl6lwVSlZhHIdRrp0xgUcf3CIBCtfI9pR0e1izRkweOvmHvKgWVbJzDY/q16rTkjBhFuPTqDkrk/dtCze0jlfhqVLCQPj84oeFORVKvgD6DMndDFh2+HwmIj/JKFu9PW5NHsYf4yTDta9eUCysyOhw5+V2enniZ/7LGDaFKdac9oVIxcUrQN2gMrq20xamYe4papnuLEdG7+tkFHNl85LcMcwFz0Tpjs1uKqy0YOqxxaG/Qdh4dB/Qs6XlWdKEsWxtIf+NjnanbRsgJJCSNvn6zKqZHI9B/BHojd33NLciaO7srw0ziKCuAb4sGiyfYuhlAY0AY4vci0vTMPKZju6YE06jCttjpP1+bAYaQIvR68yOSbqnhK+AGn3MDlSewsuBbLtvC6iz3Qffh6kXofAh7K6x5o+rAw2Xv/7Gv1F4CtZJpuH44qFF5tYzlhChyQtseXXsqdTgHFUUURenAfOONRRHVhbek11z/LviDL750Ab4f9qxJgtlGWfvZFFrgMEMxdXgc5dlt4klWD7yvroh2+7lOmae4f69FWBUILabRAEeJPonJ4VXalDh7JdzEP65WdDn9vqgT0pcRh6mYdQwqaZT6uwucp63t+sWxdekqJVTkiPmsaMHl5Du25FM6d5P1+sYFykoI+bcg+3ws9B3ulZLt6kSSpcuIxQuCbYcfuHcNea X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OSAPR01MB3892.jpnprd01.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(136003)(346002)(376002)(396003)(366004)(39860400002)(451199015)(1076003)(186003)(36756003)(83380400001)(6486002)(478600001)(6512007)(2616005)(107886003)(6666004)(52116002)(6506007)(86362001)(103116003)(38350700002)(8936002)(38100700002)(41300700001)(2906002)(26005)(5660300002)(30864003)(316002)(8676002)(66476007)(66946007)(66556008)(4326008);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?sSLwzu2e1D6R5ruuHCA8blUq3yMC1TFcfvkoXJbuKjqwlV6Cbl3MszcjaQEm?= =?us-ascii?Q?lm9S22paGFKnyWK5c5wgxyI+LG3PF2m1L7FnTeuHrqTb8ksGDPXkmbLkBAV7?= =?us-ascii?Q?RHMy2mUBD3fukXe+++Wdygd+wXzryKk1s9KLQPXJCShgTDQWj981uAztpiCs?= =?us-ascii?Q?CKvQz1I7nWA0tjjDcRMxe/eXZkIaBJCrx8zhhiLaUkjGH3CoDanyNcbP39dy?= =?us-ascii?Q?1WlARhFSY4drAZclOOCZGclkDWTD7J5bPaLq8zwkaCNEo4SbaMOvtOYuKsVr?= =?us-ascii?Q?acLE0XpWz3g9dFlvpEI+ebcyclqgxb2SSfHAnCyXUGoNFaOF7RQShLw//LY3?= =?us-ascii?Q?jnzo9XfDH13ifyg5HcsQPFXEcF5CZNtPYtJBSgvgfRqkJeooh7EurYUXV5Ye?= =?us-ascii?Q?RWeFwkiZgeHPhikwYV0PAulKfO8TXojnOuth3OBoLoZPP7/nzxu2KnaXSYnV?= =?us-ascii?Q?+aXw/XhRaKaeqH/xQV3J7JpgGnI1uucmTEN0QwPAP+V03BkHAxzg7oYnJa9J?= =?us-ascii?Q?siYRWLrhQo5vXvJ1Ug2dYnCg2o0QgZ/IIBImd4RssUkiEbsNn7oAhQhgov66?= =?us-ascii?Q?evXoVWaej89H0kI7WrQLuGjtfYMPWEAgZr3bNGmj04yQbCx1ERdA8+DEzUV4?= =?us-ascii?Q?EgZPUF4rrs+QnLAK9TRiLQXit/EtyBKQSlQjbjipJEAWljlrko5BL8+Cu3oE?= =?us-ascii?Q?M3H5DNmEwzjOgWkdcIshpxZFdIUVdZzFv7HZTA3rkMCFhW6oiflX3lacsQ1F?= =?us-ascii?Q?LHJK6e3X9hg7kK09CyVkarbiegUccIlmymFCrggxNolshBpAxWK9Ys1gRkDt?= =?us-ascii?Q?q6L605Z7XYRPaSd1ud6Tfhl0rn6HoYVn0zQxR4LXy9e7+mZgbEw//OJpAxLl?= =?us-ascii?Q?7Dq8BYsIvHElEsCXzAwMQjP5H/pLXd/bq+pezJ+378nS9FXX8PdK3Y2rEmSj?= =?us-ascii?Q?RTmh6xGtJ7jcv1cdqUld6N53DP6ERdLPSkgb/LZ85tQFQtmc/qOt5kahA8C/?= =?us-ascii?Q?gQO1LwtAd8D1Wh9XyB2p4U66RblDIv+b7MZL2eW4r1MAvwIkxFxIDHvFgSRu?= =?us-ascii?Q?k0nFe3SU/GFaUAodmBZtaotXtF4VlYmVGOPG6X3pHnBW5E92F20VTJ5KIs5u?= =?us-ascii?Q?XW9mqxVpYnzCubDgZN8G+NLSJra/DkWuqGd7/cIwCJYPTR7a8ZGm593BhBag?= =?us-ascii?Q?2s983Qk5RCxi1gB/G25fkY6wj/NeSp0SxTFhiiTnwQ+47t7BIOUnEwwRHtVS?= =?us-ascii?Q?mzdFt1tATiKM3+BjpnrnvFI3mJr3TS3asLYjSJMphtdDOD89LTFKgss1qcAU?= =?us-ascii?Q?TGJEfyKRXeCBLnCMwLCwO+Eq+Zs1O7/b5w3h3gLujRmjWPb5CVta2ARx8rXP?= =?us-ascii?Q?QpNdkq7OIlg2wdm82klJ+DJdsg7NTf+DOaeWT3s52LhYXy4k/SOsTs+CSGgz?= =?us-ascii?Q?6mixsRSiAfaZrrl6gY0q/zXswHbeQcPgudMJLBb/MHOAPiZWdeHtPTPZAh4P?= =?us-ascii?Q?ggmfy33y1pERcVoubnaNa/obCVBSzS14A5faB9FHIY0ydUCd47G+/uCMmvm+?= =?us-ascii?Q?dqqQGCNseADh01jiD5XoHr5vcROhHnQMR6Zym7akhBd5BLCzVYOCVNfAZjw2?= =?us-ascii?Q?pUeBX1fiwbGq3BYqanWOTto=3D?= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0316ef2c-bf10-42ea-05b3-08dac7627441 X-MS-Exchange-CrossTenant-AuthSource: OSAPR01MB3892.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2022 23:38:09.8580 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: W+2tQuBf2yxllxdZehzZ3Vhh8XwrgLhKAQHtmHCBorN7tk4r7AfzpeVpaRmB4YeSAWlg+KiKZLSPftSNRJH1DsbQBOOtTpNJypaMz0Y0uKM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS3PR01MB8842 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" ProXO is a programmable ultra-low phase noise quartz-based oscillator with a single output. This driver supports changing the frequency of the ProXP XP variant. Signed-off-by: Alex Helms --- MAINTAINERS | 1 + drivers/clk/Kconfig | 7 + drivers/clk/Makefile | 1 + drivers/clk/clk-proxo.c | 410 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 419 insertions(+) create mode 100644 drivers/clk/clk-proxo.c diff --git a/MAINTAINERS b/MAINTAINERS index d52a8a5d2..c7f5c0655 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16084,6 +16084,7 @@ RENESAS PROXO CLOCK DRIVER M: Alex Helms S: Maintained F: Documentation/devicetree/bindings/clock/renesas,proxo.yaml +F: drivers/clk/clk-proxo.c =20 RESET CONTROLLER FRAMEWORK M: Philipp Zabel diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 8f905df60..31f684d69 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig @@ -396,6 +396,13 @@ config COMMON_CLK_K210 help Support for the Canaan Kendryte K210 RISC-V SoC clocks. =20 +config COMMON_CLK_PROXO + bool "Clock driver for Renesas ProXO" + depends on I2C && OF + select REGMAP_I2C + help + Support for the Renesas ProXO oscillator clock. + source "drivers/clk/actions/Kconfig" source "drivers/clk/analogbits/Kconfig" source "drivers/clk/baikal-t1/Kconfig" diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index 99941b4a3..be6e28cc4 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -52,6 +52,7 @@ obj-$(CONFIG_ARCH_NSPIRE) +=3D clk-nspire.o obj-$(CONFIG_COMMON_CLK_OXNAS) +=3D clk-oxnas.o obj-$(CONFIG_COMMON_CLK_PALMAS) +=3D clk-palmas.o obj-$(CONFIG_CLK_LS1028A_PLLDIG) +=3D clk-plldig.o +obj-$(CONFIG_COMMON_CLK_PROXO) +=3D clk-proxo.o obj-$(CONFIG_COMMON_CLK_PWM) +=3D clk-pwm.o obj-$(CONFIG_CLK_QORIQ) +=3D clk-qoriq.o obj-$(CONFIG_COMMON_CLK_RK808) +=3D clk-rk808.o diff --git a/drivers/clk/clk-proxo.c b/drivers/clk/clk-proxo.c new file mode 100644 index 000000000..7d4268687 --- /dev/null +++ b/drivers/clk/clk-proxo.c @@ -0,0 +1,410 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Common clock framework driver for the ProXO family of quartz-based osci= llators. + * + * Copyright (c) 2022 Renesas Electronics Corporation + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Most ProXO products have a 50MHz xtal, can be overridden in device tree= */ +#define PROXO_DEFAULT_XTAL 50000000 + +/* VCO range is 6.86 GHz to 8.65 GHz */ +#define PROXO_FVCO_MIN 6860000000ULL +#define PROXO_FVCO_MAX 8650000000ULL + +/* Output range is 15MHz to 2.1GHz */ +#define PROXO_FOUT_MIN 15000000UL +#define PROXO_FOUT_MAX 2100000000UL + +#define PROXO_FRAC_BITS 24 +#define PROXO_FRAC_DIVISOR BIT(PROXO_FRAC_BITS) + +/* Disable the doubler if the crystal is > 80MHz */ +#define PROXO_FDBL_MAX 80000000U + +#define PROXO_OUTDIV_MIN 4 +#define PROXO_OUTDIV_MAX 511 +#define PROXO_FB_MIN 41 + +#define PROXO_REG_FREQ0 0x10 +#define PROXO_REG_XO 0x51 +#define PROXO_REG_TRIG 0x62 + +#define OUTDIV_8_MASK 0x80 +#define FBDIV_INT_8_7_MASK 0x30 +#define FBDIV_INT_6_0_MASK 0x7f +#define DOUBLE_DIS_MASK 0x80 +#define CP_MASK 0x0e +#define PLL_MODE_MASK 0x01 + +enum proxo_model { + PROXO_XP, +}; + +enum proxo_pll_mode { + PLL_MODE_FRAC, + PLL_MODE_INT, +}; + +struct clk_proxo { + struct clk_hw hw; + struct regmap *regmap; + struct i2c_client *i2c_client; + enum proxo_model model; + u32 fxtal; + u64 fvco; + u32 fout; + u8 double_dis; + u16 fb_int; + u32 fb_frac; + u16 out_div; +}; + +#define to_clk_proxo(_hw) container_of(_hw, struct clk_proxo, hw) + +static u8 proxo_get_cp_value(u64 fvco) +{ + if (fvco < 7000000000ULL) + return 5; + else if (fvco >=3D 7000000000ULL && fvco < 7400000000ULL) + return 4; + else if (fvco >=3D 7400000000ULL && fvco < 7800000000ULL) + return 3; + else + return 2; +} + +static u64 proxo_calc_fvco(u32 fxtal, u8 double_dis, u16 fb_int, u32 fb_fr= ac) +{ + u64 fref, fvco; + u8 doubler; + + doubler =3D double_dis ? 1 : 2; + fref =3D (u64)fxtal * doubler; + fvco =3D (fref * fb_int) + div_u64(fref * fb_frac, PROXO_FRAC_DIVISOR); + + return fvco; +} + +static int proxo_get_divs(struct clk_proxo *proxo, u16 *out_div, u16 *fb_i= nt, u32 *fb_frac, + u8 *double_dis) +{ + int ret; + u8 reg[6]; + unsigned int xo; + + ret =3D regmap_bulk_read(proxo->regmap, PROXO_REG_FREQ0, reg, ARRAY_SIZE(= reg)); + if (ret) + return ret; + + ret =3D regmap_read(proxo->regmap, PROXO_REG_XO, &xo); + if (ret) + return ret; + + *out_div =3D (u16_get_bits(reg[1], OUTDIV_8_MASK) << 8) + reg[0]; + *fb_int =3D (u16_get_bits(reg[2], FBDIV_INT_8_7_MASK) << 7) + (reg[1] & F= BDIV_INT_6_0_MASK); + *fb_frac =3D ((u32)reg[5] << 16) + ((u32)reg[4] << 8) + reg[3]; + *double_dis =3D !!(xo & DOUBLE_DIS_MASK); + + if (*fb_frac > (PROXO_FRAC_DIVISOR >> 1)) + (*fb_int)--; + + pr_debug("%s - out_div: %u, fb_int: %u, fb_frac: %u, doubler_dis: %u\n", + __func__, *out_div, *fb_int, *fb_frac, *double_dis); + + return ret; +} + +static int proxo_get_defaults(struct clk_proxo *proxo) +{ + int ret; + + ret =3D proxo_get_divs(proxo, &proxo->out_div, &proxo->fb_int, &proxo->fb= _frac, + &proxo->double_dis); + if (ret) + return ret; + + proxo->fvco =3D proxo_calc_fvco(proxo->fxtal, proxo->double_dis, proxo->f= b_int, + proxo->fb_frac); + proxo->fout =3D div_u64(proxo->fvco, proxo->out_div); + + pr_debug("%s - out_div: %u, fb_int: %u, fb_frac: %u, doubler_dis: %u, fvc= o: %llu, fout: %u\n", + __func__, proxo->out_div, proxo->fb_int, proxo->fb_frac, proxo->double_= dis, + proxo->fvco, proxo->fout); + + return ret; +} + +static int proxo_calc_divs(unsigned long frequency, struct clk_proxo *prox= o, u32 *fout, + u16 *out_div, u16 *fb_int, u32 *fb_frac, u8 *double_dis) +{ + int i; + u8 doubler; + u16 out_div_start; + u32 fref; + u64 fvco; + bool found =3D false, allow_frac =3D false; + + out_div_start =3D 1 + div64_u64(PROXO_FVCO_MIN, frequency); + doubler =3D proxo->fxtal <=3D PROXO_FDBL_MAX ? 2 : 1; + fref =3D proxo->fxtal * doubler; + *fout =3D (u32)max(PROXO_FOUT_MIN, min(PROXO_FOUT_MAX, (unsigned long)*fo= ut)); + *out_div =3D PROXO_OUTDIV_MIN; + *fb_int =3D PROXO_FB_MIN; + *fb_frac =3D 0; + *double_dis =3D doubler =3D=3D 1 ? 1 : 0; + +retry: + for (i =3D out_div_start; i <=3D PROXO_OUTDIV_MAX; ++i) { + *out_div =3D i; + fvco =3D frequency * *out_div; + if (fvco > PROXO_FVCO_MAX) { + allow_frac =3D true; + goto retry; + } + *fb_int =3D div_u64_rem(fvco, fref, fb_frac); + if (*fb_frac =3D=3D 0) { + found =3D true; + break; + } + if (allow_frac) { + *fb_frac =3D 1 + (u32)div_u64((u64)*fb_frac << PROXO_FRAC_BITS, fref); + found =3D true; + break; + } + } + + if (!found) + return -EINVAL; + + if (fvco < PROXO_FVCO_MIN || fvco > PROXO_FVCO_MAX) + return -EINVAL; + + fvco =3D ((u64)fref * *fb_int) + div_u64((u64)fref * *fb_frac, PROXO_FRAC= _DIVISOR); + *fout =3D div_u64(fvco, *out_div); + + return 0; +} + +static int proxo_update_frequency(struct clk_proxo *proxo) +{ + enum proxo_pll_mode pll_mode; + u8 cp_value; + u16 fb_int; + u8 reg[6]; + + cp_value =3D proxo_get_cp_value(proxo->fvco); + pll_mode =3D proxo->fb_frac =3D=3D 0 ? PLL_MODE_INT : PLL_MODE_FRAC; + fb_int =3D proxo->fb_frac > (PROXO_FRAC_DIVISOR >> 1) ? proxo->fb_int + 1= : proxo->fb_int; + + reg[0] =3D proxo->out_div & 0xff; + reg[1] =3D ((proxo->out_div >> 1) & OUTDIV_8_MASK) + (fb_int & FBDIV_INT_= 6_0_MASK); + reg[2] =3D (fb_int >> 3) & FBDIV_INT_8_7_MASK; + reg[2] =3D u8_replace_bits(reg[2], cp_value, CP_MASK); + reg[2] =3D u8_replace_bits(reg[2], pll_mode, PLL_MODE_MASK); + reg[3] =3D proxo->fb_frac & 0xff; + reg[4] =3D (proxo->fb_frac >> 8) & 0xff; + reg[5] =3D (proxo->fb_frac >> 16) & 0xff; + + return regmap_bulk_write(proxo->regmap, PROXO_REG_FREQ0, reg, ARRAY_SIZE(= reg)); +} + +static int proxo_set_frequency(struct clk_proxo *proxo, unsigned long freq= uency) +{ + int ret; + + ret =3D proxo_calc_divs(frequency, proxo, &proxo->fout, &proxo->out_div, = &proxo->fb_int, + &proxo->fb_frac, &proxo->double_dis); + if (ret) + return ret; + + proxo->fvco =3D proxo_calc_fvco(proxo->fxtal, proxo->double_dis, proxo->f= b_int, + proxo->fb_frac); + proxo->fout =3D div_u64(proxo->fvco, proxo->out_div); + + pr_debug("%s - out_div: %u, fb_int: %u, fb_frac: %u, doubler_dis: %u, fvc= o: %llu, fout: %u\n", + __func__, proxo->out_div, proxo->fb_int, proxo->fb_frac, + proxo->double_dis, proxo->fvco, proxo->fout); + + proxo_update_frequency(proxo); + + /* trigger frequency change */ + regmap_write(proxo->regmap, PROXO_REG_TRIG, 0x00); + regmap_write(proxo->regmap, PROXO_REG_TRIG, 0x01); + regmap_write(proxo->regmap, PROXO_REG_TRIG, 0x00); + + return ret; +} + +static unsigned long proxo_recalc_rate(struct clk_hw *hw, unsigned long pa= rent_rate) +{ + struct clk_proxo *proxo =3D to_clk_proxo(hw); + int ret; + u8 double_dis; + u16 out_div, fb_int; + u32 fout, fb_frac; + u64 fvco; + + ret =3D proxo_get_divs(proxo, &out_div, &fb_int, &fb_frac, &double_dis); + if (ret) { + dev_err(&proxo->i2c_client->dev, "unable to recalc rate\n"); + return 0; + } + + fvco =3D proxo_calc_fvco(proxo->fxtal, double_dis, fb_int, fb_frac); + fout =3D div_u64(fvco, out_div); + + return fout; +} + +static long proxo_round_rate(struct clk_hw *hw, unsigned long rate, unsign= ed long *parent_rate) +{ + struct clk_proxo *proxo =3D to_clk_proxo(hw); + int ret; + u8 double_dis; + u16 out_div, fb_int; + u32 fout, fb_frac; + + if (!rate) + return 0; + + ret =3D proxo_calc_divs(rate, proxo, &fout, &out_div, &fb_int, &fb_frac, = &double_dis); + if (ret) { + dev_err(&proxo->i2c_client->dev, "unable to round rate\n"); + return 0; + } + + return fout; +} + +static int proxo_set_rate(struct clk_hw *hw, unsigned long rate, unsigned = long parent_rate) +{ + struct clk_proxo *proxo =3D to_clk_proxo(hw); + + if (rate < PROXO_FOUT_MIN || rate > PROXO_FOUT_MAX) { + dev_err(&proxo->i2c_client->dev, "requested frequency %lu Hz is out of r= ange\n", + rate); + return -EINVAL; + } + + return proxo_set_frequency(proxo, rate); +} + +static const struct clk_ops proxo_clk_ops =3D { + .recalc_rate =3D proxo_recalc_rate, + .round_rate =3D proxo_round_rate, + .set_rate =3D proxo_set_rate, +}; + +static const struct i2c_device_id proxo_i2c_id[] =3D { + { "proxo-xp", PROXO_XP }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, proxo_i2c_id); + +static const struct regmap_config proxo_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D 0x63, + .cache_type =3D REGCACHE_RBTREE, + .use_single_write =3D true, + .use_single_read =3D true, +}; + +static int proxo_probe(struct i2c_client *client) +{ + struct clk_proxo *proxo; + struct clk_init_data init; + const struct i2c_device_id *id =3D i2c_match_id(proxo_i2c_id, client); + int ret; + + proxo =3D devm_kzalloc(&client->dev, sizeof(*proxo), GFP_KERNEL); + if (!proxo) + return -ENOMEM; + + init.ops =3D &proxo_clk_ops; + init.flags =3D 0; + init.num_parents =3D 0; + proxo->hw.init =3D &init; + proxo->i2c_client =3D client; + proxo->model =3D id->driver_data; + + if (of_property_read_string(client->dev.of_node, "clock-output-names", &i= nit.name)) + init.name =3D client->dev.of_node->name; + + if (of_property_read_u32(client->dev.of_node, "renesas,crystal-frequency-= hz", &proxo->fxtal)) + proxo->fxtal =3D PROXO_DEFAULT_XTAL; + + proxo->regmap =3D devm_regmap_init_i2c(client, &proxo_regmap_config); + if (IS_ERR(proxo->regmap)) + return PTR_ERR(proxo->regmap); + + i2c_set_clientdata(client, proxo); + + ret =3D proxo_get_defaults(proxo); + if (ret) { + dev_err(&client->dev, "getting defaults failed\n"); + return ret; + } + + ret =3D devm_clk_hw_register(&client->dev, &proxo->hw); + if (ret) { + dev_err(&client->dev, "clock registration failed\n"); + return ret; + } + + ret =3D of_clk_add_hw_provider(client->dev.of_node, of_clk_hw_simple_get,= &proxo->hw); + if (ret) { + dev_err(&client->dev, "unable to add clk provider\n"); + return ret; + } + + ret =3D clk_set_rate_range(proxo->hw.clk, PROXO_FOUT_MIN, PROXO_FOUT_MAX); + if (ret) { + dev_err(&client->dev, "clk_set_rate_range failed\n"); + return ret; + } + + dev_info(&client->dev, "registered, current frequency %u Hz\n", proxo->fo= ut); + + return ret; +} + +static int proxo_remove(struct i2c_client *client) +{ + of_clk_del_provider(client->dev.of_node); + return 0; +} + +static const struct of_device_id proxo_of_match[] =3D { + { .compatible =3D "renesas,proxo-xp" }, + {}, +}; +MODULE_DEVICE_TABLE(of, proxo_of_match); + +static struct i2c_driver proxo_i2c_driver =3D { + .driver =3D { + .name =3D "proxo", + .of_match_table =3D proxo_of_match, + }, + .probe_new =3D proxo_probe, + .remove =3D proxo_remove, + .id_table =3D proxo_i2c_id, +}; +module_i2c_driver(proxo_i2c_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Alex Helms