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 5511FC5321E for ; Mon, 26 Aug 2024 12:44:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Subject:Cc:From: To:Date:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=h/LZjiViK1KTa6JiCSBo81f43s9SkDGG36Wi8VELnlc=; b=j0i9OSSbTafLWNZenOpDum7noW l7nkimh4Rpg9Z4GGqhH64uriZONWvoZZqszFYSUkebn/Wn703WJRsI7wjtbY0Sv5qbV2TOlAh0Cs8 v81LxYsd0X5e0TUh8cooRWS0Qep/36urj/RwAx8kzoNFUSMkcL/268o7CrJ87nhSJ1d9Few+i3PAV tKBUQ/HKgL2oPfsMro23/3cOL5dYfibQS6DuQcyyVZZ6rKtQojPVfU3FocVxxQcvc0KDF8NZdmbpZ OnakOZHksJI8nbGgxe53KWINVhpSA1aodct5vRPE1xeokZXbx1P1aa6opsYqJvVByYrDaHtyV8J6h B4pHswdA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1siZ50-00000007MOP-0LfN; Mon, 26 Aug 2024 12:44:18 +0000 Received: from mail-40133.protonmail.ch ([185.70.40.133]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1siYzX-00000007KsZ-37ax for linux-arm-kernel@lists.infradead.org; Mon, 26 Aug 2024 12:38:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail3; t=1724675917; x=1724935117; bh=h/LZjiViK1KTa6JiCSBo81f43s9SkDGG36Wi8VELnlc=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=kJSvPvHAN9W9tTPypmczzn8CP/pUIs8eoDXoR11bunadPSf/yYUWVjH5qs9ZqurMs eN8LoF5DiCDyvMGpjV23e7OSripcqbsZgUZj8h0pXLq0pfH6Y66BJml4joPJ+BVaiz oqtQDJ91WcAW8YsutLwhMcyaI3c3SBD7h+VCPoTD3ea67eqtTd/Uj4xgqtbj7jKxzw g2K5m+K54Fguhc7hNmvvukyZAZRWrYRA3uqVkp1usOsHUmT/IEIjkgTyGqKl0SsAQH lkS+0JrXP0eU4mkNFyRwejf+2j3I3XSjih+15OYbLBJcE6fVQ7JK8d8PCRhtL8yj7P 7EAvwOzLto5vg== Date: Mon, 26 Aug 2024 12:38:32 +0000 To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Michal Simek , Greg Kroah-Hartman From: Harry Austen Cc: Shubhrajyoti Datta , Dave Ertman , Ira Weiny , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Harry Austen Subject: [PATCH v3 6/9] clk: clocking-wizard: add user clock monitor support Message-ID: <20240826123602.1872-7-hpausten@protonmail.com> In-Reply-To: <20240826123602.1872-1-hpausten@protonmail.com> References: <20240826123602.1872-1-hpausten@protonmail.com> Feedback-ID: 53116287:user:proton X-Pm-Message-ID: c6c0b939de3551c63045bbf6a94385231923af91 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240826_053839_973915_13FB6361 X-CRM114-Status: GOOD ( 13.59 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Xilinx clocking wizard IP core supports monitoring of up to four optional user clock inputs, with a corresponding interrupt for notification in change of clock state (stop, underrun, overrun or glitch). Give access to this monitor logic through use of an auxiliary device. Use presence of the user monitor interrupt description in devicetree to indicate whether or not the auxiliary device should be registered. Also, this functionality is only supported from v6.0 onwards, so add indication of support to the device match data, in order to be tied to the utilised compatible string. Signed-off-by: Harry Austen --- drivers/clk/xilinx/Kconfig | 1 + drivers/clk/xilinx/clk-xlnx-clock-wizard.c | 60 ++++++++++++++++++++-- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/drivers/clk/xilinx/Kconfig b/drivers/clk/xilinx/Kconfig index 051756953558b..87f507bd9b6f3 100644 --- a/drivers/clk/xilinx/Kconfig +++ b/drivers/clk/xilinx/Kconfig @@ -21,6 +21,7 @@ config COMMON_CLK_XLNX_CLKWZRD =09tristate "Xilinx Clocking Wizard" =09depends on OF =09depends on HAS_IOMEM +=09select AUXILIARY_BUS =09help =09 Support for the Xilinx Clocking Wizard IP core clock generator. =09 Adds support for clocking wizard and compatible. diff --git a/drivers/clk/xilinx/clk-xlnx-clock-wizard.c b/drivers/clk/xilin= x/clk-xlnx-clock-wizard.c index 1a65a7d153c35..35dad2fda254b 100644 --- a/drivers/clk/xilinx/clk-xlnx-clock-wizard.c +++ b/drivers/clk/xilinx/clk-xlnx-clock-wizard.c @@ -8,6 +8,7 @@ * */ =20 +#include #include #include #include @@ -129,6 +130,7 @@ enum clk_wzrd_int_clks { * @clks_internal:=09Internal clocks * @speed_grade:=09Speed grade of the device * @suspended:=09=09Flag indicating power state of the device + * @adev:=09=09User clock monitor auxiliary device * @clk_data:=09=09Output clock data */ struct clk_wzrd { @@ -139,6 +141,7 @@ struct clk_wzrd { =09struct clk_hw *clks_internal[wzrd_clk_int_max]; =09unsigned int speed_grade; =09bool suspended; +=09struct auxiliary_device adev; =09struct clk_hw_onecell_data clk_data; }; =20 @@ -171,8 +174,9 @@ struct clk_wzrd_divider { =09spinlock_t *lock; /* divider lock */ }; =20 -struct versal_clk_data { +struct clk_wzrd_data { =09bool is_versal; +=09bool supports_monitor; }; =20 #define to_clk_wzrd(_nb) container_of(_nb, struct clk_wzrd, nb) @@ -958,16 +962,58 @@ static int __maybe_unused clk_wzrd_resume(struct devi= ce *dev) static SIMPLE_DEV_PM_OPS(clk_wzrd_dev_pm_ops, clk_wzrd_suspend, =09=09=09 clk_wzrd_resume); =20 -static const struct versal_clk_data versal_data =3D { -=09.is_versal=09=3D true, +static const struct clk_wzrd_data version_6_0_data =3D { +=09.is_versal=09=09=3D false, +=09.supports_monitor=09=3D true, }; =20 +static const struct clk_wzrd_data versal_data =3D { +=09.is_versal=09=09=3D true, +=09.supports_monitor=09=3D true, +}; + +static void clk_wzrd_unregister_adev(void *_adev) +{ +=09struct auxiliary_device *adev =3D _adev; + +=09auxiliary_device_delete(adev); +=09auxiliary_device_uninit(adev); +} + +static int clk_wzrd_setup_monitor(struct platform_device *pdev) +{ +=09struct device *dev =3D &pdev->dev; +=09const struct clk_wzrd_data *data =3D device_get_match_data(dev); +=09struct clk_wzrd *clk_wzrd =3D dev_get_drvdata(dev); +=09struct auxiliary_device *adev =3D &clk_wzrd->adev; +=09int ret; + +=09if (!data || !data->supports_monitor) +=09=09return 0; + +=09adev->name =3D "clk-mon"; +=09adev->dev.parent =3D dev; +=09adev->dev.platform_data =3D (__force void *)clk_wzrd->base; + +=09ret =3D auxiliary_device_init(adev); +=09if (ret) +=09=09return ret; + +=09ret =3D auxiliary_device_add(adev); +=09if (ret) { +=09=09auxiliary_device_uninit(adev); +=09=09return ret; +=09} + +=09return devm_add_action_or_reset(dev, clk_wzrd_unregister_adev, adev); +} + static int clk_wzrd_register_output_clocks(struct device *dev, int nr_outp= uts) { =09const char *clkout_name, *clk_name, *clk_mul_name; =09struct clk_wzrd *clk_wzrd =3D dev_get_drvdata(dev); =09u32 regl, regh, edge, regld, reghd, edged, div; -=09const struct versal_clk_data *data; +=09const struct clk_wzrd_data *data; =09unsigned long flags =3D 0; =09bool is_versal =3D false; =09void __iomem *ctrl_reg; @@ -1170,6 +1216,10 @@ static int clk_wzrd_probe(struct platform_device *pd= ev) =09=09return -EINVAL; =09} =20 +=09ret =3D clk_wzrd_setup_monitor(pdev); +=09if (ret) +=09=09return dev_err_probe(&pdev->dev, ret, "failed to setup monitor\n"); + =09ret =3D clk_wzrd_register_output_clocks(&pdev->dev, nr_outputs); =09if (ret) =09=09return ret; @@ -1204,7 +1254,7 @@ static const struct of_device_id clk_wzrd_ids[] =3D { =09{ .compatible =3D "xlnx,versal-clk-wizard", .data =3D &versal_data }, =09{ .compatible =3D "xlnx,clocking-wizard" }, =09{ .compatible =3D "xlnx,clocking-wizard-v5.2" }, -=09{ .compatible =3D "xlnx,clocking-wizard-v6.0" }, +=09{ .compatible =3D "xlnx,clocking-wizard-v6.0", .data =3D &version_6_0_d= ata }, =09{ }, }; MODULE_DEVICE_TABLE(of, clk_wzrd_ids); --=20 2.46.0