From nobody Sat Sep 21 14:15:16 2024 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 72D06C54EE9 for ; Thu, 22 Sep 2022 14:12:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231975AbiIVOMD (ORCPT ); Thu, 22 Sep 2022 10:12:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46770 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230196AbiIVOL3 (ORCPT ); Thu, 22 Sep 2022 10:11:29 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A5FAC857EA; Thu, 22 Sep 2022 07:11:18 -0700 (PDT) X-UUID: cac8c6de29f0426fbe5ce1cf52797505-20220922 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:Message-ID:Date:Subject:CC:To:From; bh=7vgrfu9HzYAPP5NPxQjO1BcTS+gCOOj0jE9DHOgm6JQ=; b=WnZnWNxqw1xsyp/qndZImXULXkFCwthEc4HWLrSn7dRfjvcDc5xN/04YRneXBopi5GAyLxnRYheUnIBDi4k35kFN8XuBmU9/KBSZ9LBCP38rHU1ZooeGgIpUxQdSE1mb2owKYUmw4iLqf4W6kaG+15QmzI2AMFJFQUsYer6uZwo=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.11,REQID:639939f8-104d-462d-9e0f-512e7d740b62,IP:0,U RL:0,TC:0,Content:-25,EDM:0,RT:0,SF:95,FILE:0,BULK:0,RULE:Release_Ham,ACTI ON:release,TS:70 X-CID-INFO: VERSION:1.1.11,REQID:639939f8-104d-462d-9e0f-512e7d740b62,IP:0,URL :0,TC:0,Content:-25,EDM:0,RT:0,SF:95,FILE:0,BULK:0,RULE:Spam_GS981B3D,ACTI ON:quarantine,TS:70 X-CID-META: VersionHash:39a5ff1,CLOUDID:0b8db106-1cee-4c38-b21b-a45f9682fdc0,B ulkID:220922221114C1WD60S6,BulkQuantity:0,Recheck:0,SF:28|17|19|48,TC:nil, Content:0,EDM:-3,IP:nil,URL:11|1,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0 X-UUID: cac8c6de29f0426fbe5ce1cf52797505-20220922 Received: from mtkmbs13n1.mediatek.inc [(172.21.101.193)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 761123307; Thu, 22 Sep 2022 22:11:10 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs13n1.mediatek.inc (172.21.101.193) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.15; Thu, 22 Sep 2022 22:11:09 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.15 via Frontend Transport; Thu, 22 Sep 2022 22:11:09 +0800 From: Bo-Chen Chen To: , , , CC: , , , , , , , , , , Bo-Chen Chen Subject: [PATCH] reset: mediatek: Move mediatek system clock reset to reset folder Date: Thu, 22 Sep 2022 22:11:07 +0800 Message-ID: <20220922141107.10203-1-rex-bc.chen@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To manager mediatek system clock reset easier, we move the driver to drivers/reset. The modifications in this series: - Move drivers/clk/mediatek/reset.c to drivers/reset/reset-mediatek-sysclk.c - Move reset data which are scattered around the mediatek drivers to reset-mediatek-sysclk.c - For mtk clk drivers which support device, we can ues mtk_reset_controller_register() to register reset controller using auxiliary bus. - For mtk clk drivers which do not support device (only support device_node), we use mtk_reset_{init/remove}_with_node to register reset controller. Signed-off-by: Bo-Chen Chen --- drivers/clk/mediatek/Kconfig | 2 + drivers/clk/mediatek/Makefile | 2 +- drivers/clk/mediatek/clk-mt2701-eth.c | 10 +- drivers/clk/mediatek/clk-mt2701-g3d.c | 10 +- drivers/clk/mediatek/clk-mt2701-hif.c | 10 +- drivers/clk/mediatek/clk-mt2701.c | 22 +- drivers/clk/mediatek/clk-mt2712.c | 22 +- drivers/clk/mediatek/clk-mt7622-eth.c | 10 +- drivers/clk/mediatek/clk-mt7622-hif.c | 12 +- drivers/clk/mediatek/clk-mt7622.c | 22 +- drivers/clk/mediatek/clk-mt7629-eth.c | 10 +- drivers/clk/mediatek/clk-mt7629-hif.c | 12 +- drivers/clk/mediatek/clk-mt8135.c | 23 +- drivers/clk/mediatek/clk-mt8173.c | 22 +- drivers/clk/mediatek/clk-mt8183.c | 15 +- drivers/clk/mediatek/clk-mt8186-infra_ao.c | 23 +- drivers/clk/mediatek/clk-mt8192.c | 26 +- drivers/clk/mediatek/clk-mt8195-infra_ao.c | 24 +- drivers/clk/mediatek/clk-mtk.c | 61 ++- drivers/clk/mediatek/clk-mtk.h | 9 +- drivers/clk/mediatek/reset.c | 232 --------- drivers/clk/mediatek/reset.h | 82 --- drivers/reset/Kconfig | 7 + drivers/reset/Makefile | 1 + drivers/reset/reset-mediatek-sysclk.c | 578 +++++++++++++++++++++ 25 files changed, 677 insertions(+), 570 deletions(-) delete mode 100644 drivers/clk/mediatek/reset.c delete mode 100644 drivers/clk/mediatek/reset.h create mode 100644 drivers/reset/reset-mediatek-sysclk.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index d5936cfb3bee..94daf62fe35b 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -8,6 +8,8 @@ menu "Clock driver for MediaTek SoC" config COMMON_CLK_MEDIATEK tristate select RESET_CONTROLLER + select RESET_MEDIATEK_SYSCLK + select AUXILIARY_BUS help MediaTek SoCs' clock support. =20 diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index caf2ce93d666..cf0f092879a5 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_COMMON_CLK_MEDIATEK) +=3D clk-mtk.o clk-pll.o clk-gate.o clk-= apmixed.o clk-cpumux.o reset.o clk-mux.o +obj-$(CONFIG_COMMON_CLK_MEDIATEK) +=3D clk-mtk.o clk-pll.o clk-gate.o clk-= apmixed.o clk-cpumux.o clk-mux.o =20 obj-$(CONFIG_COMMON_CLK_MT6765) +=3D clk-mt6765.o obj-$(CONFIG_COMMON_CLK_MT6765_AUDIOSYS) +=3D clk-mt6765-audio.o diff --git a/drivers/clk/mediatek/clk-mt2701-eth.c b/drivers/clk/mediatek/c= lk-mt2701-eth.c index edf1e2ed2b59..2da95232e529 100644 --- a/drivers/clk/mediatek/clk-mt2701-eth.c +++ b/drivers/clk/mediatek/clk-mt2701-eth.c @@ -36,14 +36,6 @@ static const struct mtk_gate eth_clks[] =3D { GATE_ETH(CLK_ETHSYS_CRYPTO, "crypto_clk", "ethif_sel", 29), }; =20 -static u16 rst_ofs[] =3D { 0x34, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static const struct of_device_id of_match_clk_mt2701_eth[] =3D { { .compatible =3D "mediatek,mt2701-ethsys", }, {} @@ -66,7 +58,7 @@ static int clk_mt2701_eth_probe(struct platform_device *p= dev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt2701-eth-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt2701-g3d.c b/drivers/clk/mediatek/c= lk-mt2701-g3d.c index 1458109d99d9..da43c422d452 100644 --- a/drivers/clk/mediatek/clk-mt2701-g3d.c +++ b/drivers/clk/mediatek/clk-mt2701-g3d.c @@ -35,14 +35,6 @@ static const struct mtk_gate g3d_clks[] =3D { GATE_G3D(CLK_G3DSYS_CORE, "g3d_core", "mfg_sel", 0), }; =20 -static u16 rst_ofs[] =3D { 0xc, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static int clk_mt2701_g3dsys_init(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -60,7 +52,7 @@ static int clk_mt2701_g3dsys_init(struct platform_device = *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt2701-g3d-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt2701-hif.c b/drivers/clk/mediatek/c= lk-mt2701-hif.c index 434cbbe8c037..2ecccf8fe16e 100644 --- a/drivers/clk/mediatek/clk-mt2701-hif.c +++ b/drivers/clk/mediatek/clk-mt2701-hif.c @@ -33,14 +33,6 @@ static const struct mtk_gate hif_clks[] =3D { GATE_HIF(CLK_HIFSYS_PCIE2, "pcie2_clk", "ethpll_500m_ck", 26), }; =20 -static u16 rst_ofs[] =3D { 0x34, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static const struct of_device_id of_match_clk_mt2701_hif[] =3D { { .compatible =3D "mediatek,mt2701-hifsys", }, {} @@ -65,7 +57,7 @@ static int clk_mt2701_hif_probe(struct platform_device *p= dev) return r; } =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt2701-hif-rst"); =20 return 0; } diff --git a/drivers/clk/mediatek/clk-mt2701.c b/drivers/clk/mediatek/clk-m= t2701.c index 9b442af37e67..b90f611a5b52 100644 --- a/drivers/clk/mediatek/clk-mt2701.c +++ b/drivers/clk/mediatek/clk-mt2701.c @@ -735,24 +735,6 @@ static const struct mtk_fixed_factor infra_fixed_divs[= ] =3D { FACTOR(CLK_INFRA_CLK_13M, "clk13m", "clk26m", 1, 2), }; =20 -static u16 infrasys_rst_ofs[] =3D { 0x30, 0x34, }; -static u16 pericfg_rst_ofs[] =3D { 0x0, 0x4, }; - -static const struct mtk_clk_rst_desc clk_rst_desc[] =3D { - /* infrasys */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D infrasys_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infrasys_rst_ofs), - }, - /* pericfg */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D pericfg_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(pericfg_rst_ofs), - }, -}; - static struct clk_hw_onecell_data *infra_clk_data; =20 static void __init mtk_infrasys_init_early(struct device_node *node) @@ -805,7 +787,7 @@ static int mtk_infrasys_init(struct platform_device *pd= ev) if (r) return r; =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]); + mtk_reset_controller_register(&pdev->dev, "mt2701-infrasys-rst"); =20 return 0; } @@ -928,7 +910,7 @@ static int mtk_pericfg_init(struct platform_device *pde= v) if (r) return r; =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]); + mtk_reset_controller_register(&pdev->dev, "mt2701-pericfg-rst"); =20 return 0; } diff --git a/drivers/clk/mediatek/clk-mt2712.c b/drivers/clk/mediatek/clk-m= t2712.c index 56980dd6c2ea..bada923b60cf 100644 --- a/drivers/clk/mediatek/clk-mt2712.c +++ b/drivers/clk/mediatek/clk-mt2712.c @@ -1258,24 +1258,6 @@ static const struct mtk_pll_data plls[] =3D { 0, 31, 0x0300, 4, 0, 0, 0, 0x0304, 0), }; =20 -static u16 infrasys_rst_ofs[] =3D { 0x30, 0x34, }; -static u16 pericfg_rst_ofs[] =3D { 0x0, 0x4, }; - -static const struct mtk_clk_rst_desc clk_rst_desc[] =3D { - /* infra */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D infrasys_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infrasys_rst_ofs), - }, - /* peri */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D pericfg_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(pericfg_rst_ofs), - }, -}; - static int clk_mt2712_apmixed_probe(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -1379,7 +1361,7 @@ static int clk_mt2712_infra_probe(struct platform_dev= ice *pdev) pr_err("%s(): could not register clock provider: %d\n", __func__, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]); + mtk_reset_controller_register(&pdev->dev, "mt2712-infra-rst"); =20 return r; } @@ -1401,7 +1383,7 @@ static int clk_mt2712_peri_probe(struct platform_devi= ce *pdev) pr_err("%s(): could not register clock provider: %d\n", __func__, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]); + mtk_reset_controller_register(&pdev->dev, "mt2712-peri-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt7622-eth.c b/drivers/clk/mediatek/c= lk-mt7622-eth.c index 43de0477d5d9..2e668ed78cd5 100644 --- a/drivers/clk/mediatek/clk-mt7622-eth.c +++ b/drivers/clk/mediatek/clk-mt7622-eth.c @@ -65,14 +65,6 @@ static const struct mtk_gate sgmii_clks[] =3D { "ssusb_cdr_fb", 5), }; =20 -static u16 rst_ofs[] =3D { 0x34, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static int clk_mt7622_ethsys_init(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -90,7 +82,7 @@ static int clk_mt7622_ethsys_init(struct platform_device = *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt7622-eth-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt7622-hif.c b/drivers/clk/mediatek/c= lk-mt7622-hif.c index 67e96231dd25..0335d84b0043 100644 --- a/drivers/clk/mediatek/clk-mt7622-hif.c +++ b/drivers/clk/mediatek/clk-mt7622-hif.c @@ -76,14 +76,6 @@ static const struct mtk_gate pcie_clks[] =3D { GATE_PCIE(CLK_SATA_PM_EN, "sata_pm_en", "univpll2_d4", 30), }; =20 -static u16 rst_ofs[] =3D { 0x34, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static int clk_mt7622_ssusbsys_init(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -101,7 +93,7 @@ static int clk_mt7622_ssusbsys_init(struct platform_devi= ce *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt7622-usb-rst"); =20 return r; } @@ -123,7 +115,7 @@ static int clk_mt7622_pciesys_init(struct platform_devi= ce *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt7622-pcie-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt7622.c b/drivers/clk/mediatek/clk-m= t7622.c index 3b55f8641fae..ea4c21b9a6a0 100644 --- a/drivers/clk/mediatek/clk-mt7622.c +++ b/drivers/clk/mediatek/clk-mt7622.c @@ -610,24 +610,6 @@ static struct mtk_composite peri_muxes[] =3D { MUX(CLK_PERIBUS_SEL, "peribus_ck_sel", peribus_ck_parents, 0x05C, 0, 1), }; =20 -static u16 infrasys_rst_ofs[] =3D { 0x30, }; -static u16 pericfg_rst_ofs[] =3D { 0x0, 0x4, }; - -static const struct mtk_clk_rst_desc clk_rst_desc[] =3D { - /* infrasys */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D infrasys_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infrasys_rst_ofs), - }, - /* pericfg */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D pericfg_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(pericfg_rst_ofs), - }, -}; - static int mtk_topckgen_init(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -681,7 +663,7 @@ static int mtk_infrasys_init(struct platform_device *pd= ev) if (r) return r; =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]); + mtk_reset_controller_register(&pdev->dev, "mt7622-infrasys-rst"); =20 return 0; } @@ -732,7 +714,7 @@ static int mtk_pericfg_init(struct platform_device *pde= v) =20 clk_prepare_enable(clk_data->hws[CLK_PERI_UART0_PD]->clk); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]); + mtk_reset_controller_register(&pdev->dev, "mt7622-pericfg-rst"); =20 return 0; } diff --git a/drivers/clk/mediatek/clk-mt7629-eth.c b/drivers/clk/mediatek/c= lk-mt7629-eth.c index 282dd6559465..dadc76da899b 100644 --- a/drivers/clk/mediatek/clk-mt7629-eth.c +++ b/drivers/clk/mediatek/clk-mt7629-eth.c @@ -76,14 +76,6 @@ static const struct mtk_gate sgmii_clks[2][4] =3D { } }; =20 -static u16 rst_ofs[] =3D { 0x34, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static int clk_mt7629_ethsys_init(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -100,7 +92,7 @@ static int clk_mt7629_ethsys_init(struct platform_device= *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt7629-ethsys-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt7629-hif.c b/drivers/clk/mediatek/c= lk-mt7629-hif.c index 0c8b9e139789..bd6fdfd97504 100644 --- a/drivers/clk/mediatek/clk-mt7629-hif.c +++ b/drivers/clk/mediatek/clk-mt7629-hif.c @@ -71,14 +71,6 @@ static const struct mtk_gate pcie_clks[] =3D { GATE_PCIE(CLK_PCIE_P0_PIPE_EN, "pcie_p0_pipe_en", "pcie0_pipe_en", 23), }; =20 -static u16 rst_ofs[] =3D { 0x34, }; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(rst_ofs), -}; - static int clk_mt7629_ssusbsys_init(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -96,7 +88,7 @@ static int clk_mt7629_ssusbsys_init(struct platform_devic= e *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt7629-usb-rst"); =20 return r; } @@ -118,7 +110,7 @@ static int clk_mt7629_pciesys_init(struct platform_devi= ce *pdev) "could not register clock provider: %s: %d\n", pdev->name, r); =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt7629-pcie-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt8135.c b/drivers/clk/mediatek/clk-m= t8135.c index b68888a034c4..89cd8c492b91 100644 --- a/drivers/clk/mediatek/clk-mt8135.c +++ b/drivers/clk/mediatek/clk-mt8135.c @@ -514,24 +514,6 @@ static const struct mtk_composite peri_clks[] __initco= nst =3D { MUX(CLK_PERI_UART3_SEL, "uart3_ck_sel", uart_ck_sel_parents, 0x40c, 3, 1), }; =20 -static u16 infrasys_rst_ofs[] =3D { 0x30, 0x34, }; -static u16 pericfg_rst_ofs[] =3D { 0x0, 0x4, }; - -static const struct mtk_clk_rst_desc clk_rst_desc[] =3D { - /* infrasys */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D infrasys_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infrasys_rst_ofs), - }, - /* pericfg */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D pericfg_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(pericfg_rst_ofs), - } -}; - static void __init mtk_topckgen_init(struct device_node *node) { struct clk_hw_onecell_data *clk_data; @@ -577,7 +559,8 @@ static void __init mtk_infrasys_init(struct device_node= *node) pr_err("%s(): could not register clock provider: %d\n", __func__, r); =20 - mtk_register_reset_controller(node, &clk_rst_desc[0]); + mtk_reset_init_with_node(node, "clk_mt8135.mt8135-infrasys-rst"); + } CLK_OF_DECLARE(mtk_infrasys, "mediatek,mt8135-infracfg", mtk_infrasys_init= ); =20 @@ -605,7 +588,7 @@ static void __init mtk_pericfg_init(struct device_node = *node) pr_err("%s(): could not register clock provider: %d\n", __func__, r); =20 - mtk_register_reset_controller(node, &clk_rst_desc[1]); + mtk_reset_init_with_node(node, "clk_mt8135.mt8135-pericfg-rst"); } CLK_OF_DECLARE(mtk_pericfg, "mediatek,mt8135-pericfg", mtk_pericfg_init); =20 diff --git a/drivers/clk/mediatek/clk-mt8173.c b/drivers/clk/mediatek/clk-m= t8173.c index b8529ee7199d..ac01addf432f 100644 --- a/drivers/clk/mediatek/clk-mt8173.c +++ b/drivers/clk/mediatek/clk-mt8173.c @@ -819,24 +819,6 @@ static const struct mtk_gate venclt_clks[] __initconst= =3D { GATE_VENCLT(CLK_VENCLT_CKE1, "venclt_cke1", "venclt_sel", 4), }; =20 -static u16 infrasys_rst_ofs[] =3D { 0x30, 0x34, }; -static u16 pericfg_rst_ofs[] =3D { 0x0, 0x4, }; - -static const struct mtk_clk_rst_desc clk_rst_desc[] =3D { - /* infrasys */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D infrasys_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infrasys_rst_ofs), - }, - /* pericfg */ - { - .version =3D MTK_RST_SIMPLE, - .rst_bank_ofs =3D pericfg_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(pericfg_rst_ofs), - } -}; - static struct clk_hw_onecell_data *mt8173_top_clk_data __initdata; static struct clk_hw_onecell_data *mt8173_pll_clk_data __initdata; =20 @@ -900,7 +882,7 @@ static void __init mtk_infrasys_init(struct device_node= *node) pr_err("%s(): could not register clock provider: %d\n", __func__, r); =20 - mtk_register_reset_controller(node, &clk_rst_desc[0]); + mtk_reset_init_with_node(node, "clk_mt8173.mt8173-infracfg-rst"); } CLK_OF_DECLARE(mtk_infrasys, "mediatek,mt8173-infracfg", mtk_infrasys_init= ); =20 @@ -928,7 +910,7 @@ static void __init mtk_pericfg_init(struct device_node = *node) pr_err("%s(): could not register clock provider: %d\n", __func__, r); =20 - mtk_register_reset_controller(node, &clk_rst_desc[1]); + mtk_reset_init_with_node(node, "clk_mt8173.mt8173-pericfg-rst"); } CLK_OF_DECLARE(mtk_pericfg, "mediatek,mt8173-pericfg", mtk_pericfg_init); =20 diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-m= t8183.c index 8512101e1189..a41c305d62a3 100644 --- a/drivers/clk/mediatek/clk-mt8183.c +++ b/drivers/clk/mediatek/clk-mt8183.c @@ -1150,19 +1150,6 @@ static const struct mtk_pll_data plls[] =3D { 0, 0, 32, 8, 0x02B4, 1, 0x02BC, 0x0014, 1, 0x02B8, 0, 0x02B4), }; =20 -static u16 infra_rst_ofs[] =3D { - INFRA_RST0_SET_OFFSET, - INFRA_RST1_SET_OFFSET, - INFRA_RST2_SET_OFFSET, - INFRA_RST3_SET_OFFSET, -}; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SET_CLR, - .rst_bank_ofs =3D infra_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infra_rst_ofs), -}; - static int clk_mt8183_apmixed_probe(struct platform_device *pdev) { struct clk_hw_onecell_data *clk_data; @@ -1250,7 +1237,7 @@ static int clk_mt8183_infra_probe(struct platform_dev= ice *pdev) return r; } =20 - mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + mtk_reset_controller_register(&pdev->dev, "mt8183-infra-rst"); =20 return r; } diff --git a/drivers/clk/mediatek/clk-mt8186-infra_ao.c b/drivers/clk/media= tek/clk-mt8186-infra_ao.c index df2a6bd1aefa..958e28472f2b 100644 --- a/drivers/clk/mediatek/clk-mt8186-infra_ao.c +++ b/drivers/clk/mediatek/clk-mt8186-infra_ao.c @@ -192,31 +192,10 @@ static const struct mtk_gate infra_ao_clks[] =3D { GATE_INFRA_AO3(CLK_INFRA_AO_FLASHIF_66M, "infra_ao_flashif_66m", "top_axi= ", 29), }; =20 -static u16 infra_ao_rst_ofs[] =3D { - INFRA_RST0_SET_OFFSET, - INFRA_RST1_SET_OFFSET, - INFRA_RST2_SET_OFFSET, - INFRA_RST3_SET_OFFSET, - INFRA_RST4_SET_OFFSET, -}; - -static u16 infra_ao_idx_map[] =3D { - [MT8186_INFRA_THERMAL_CTRL_RST] =3D 0 * RST_NR_PER_BANK + 0, - [MT8186_INFRA_PTP_CTRL_RST] =3D 1 * RST_NR_PER_BANK + 0, -}; - -static struct mtk_clk_rst_desc infra_ao_rst_desc =3D { - .version =3D MTK_RST_SET_CLR, - .rst_bank_ofs =3D infra_ao_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infra_ao_rst_ofs), - .rst_idx_map =3D infra_ao_idx_map, - .rst_idx_map_nr =3D ARRAY_SIZE(infra_ao_idx_map), -}; - static const struct mtk_clk_desc infra_ao_desc =3D { .clks =3D infra_ao_clks, .num_clks =3D ARRAY_SIZE(infra_ao_clks), - .rst_desc =3D &infra_ao_rst_desc, + .rst_name =3D "mt8186-infra-ao-rst", }; =20 static const struct of_device_id of_match_clk_mt8186_infra_ao[] =3D { diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-m= t8192.c index ebbd2798d9a3..4fd8e4d26fef 100644 --- a/drivers/clk/mediatek/clk-mt8192.c +++ b/drivers/clk/mediatek/clk-mt8192.c @@ -1115,30 +1115,6 @@ static const struct mtk_gate top_clks[] =3D { GATE_TOP(CLK_TOP_SSUSB_PHY_REF, "ssusb_phy_ref", "clk26m", 25), }; =20 -static u16 infra_ao_rst_ofs[] =3D { - INFRA_RST0_SET_OFFSET, - INFRA_RST1_SET_OFFSET, - INFRA_RST2_SET_OFFSET, - INFRA_RST3_SET_OFFSET, - INFRA_RST4_SET_OFFSET, -}; - -static u16 infra_ao_idx_map[] =3D { - [MT8192_INFRA_RST0_THERM_CTRL_SWRST] =3D 0 * RST_NR_PER_BANK + 0, - [MT8192_INFRA_RST2_PEXTP_PHY_SWRST] =3D 2 * RST_NR_PER_BANK + 15, - [MT8192_INFRA_RST3_THERM_CTRL_PTP_SWRST] =3D 3 * RST_NR_PER_BANK + 5, - [MT8192_INFRA_RST4_PCIE_TOP_SWRST] =3D 4 * RST_NR_PER_BANK + 1, - [MT8192_INFRA_RST4_THERM_CTRL_MCU_SWRST] =3D 4 * RST_NR_PER_BANK + 12, -}; - -static const struct mtk_clk_rst_desc clk_rst_desc =3D { - .version =3D MTK_RST_SET_CLR, - .rst_bank_ofs =3D infra_ao_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infra_ao_rst_ofs), - .rst_idx_map =3D infra_ao_idx_map, - .rst_idx_map_nr =3D ARRAY_SIZE(infra_ao_idx_map), -}; - #define MT8192_PLL_FMAX (3800UL * MHZ) #define MT8192_PLL_FMIN (1500UL * MHZ) #define MT8192_INTEGER_BITS 8 @@ -1265,7 +1241,7 @@ static int clk_mt8192_infra_probe(struct platform_dev= ice *pdev) if (r) goto free_clk_data; =20 - r =3D mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc); + r =3D mtk_reset_controller_register(&pdev->dev, "mt8192-infra-rst"); if (r) goto free_clk_data; =20 diff --git a/drivers/clk/mediatek/clk-mt8195-infra_ao.c b/drivers/clk/media= tek/clk-mt8195-infra_ao.c index 97657f255618..0861ba6e6673 100644 --- a/drivers/clk/mediatek/clk-mt8195-infra_ao.c +++ b/drivers/clk/mediatek/clk-mt8195-infra_ao.c @@ -183,32 +183,10 @@ static const struct mtk_gate infra_ao_clks[] =3D { GATE_INFRA_AO4(CLK_INFRA_AO_PERI_UFS_MEM_SUB, "infra_ao_peri_ufs_mem_sub"= , "mem_466m", 31), }; =20 -static u16 infra_ao_rst_ofs[] =3D { - INFRA_RST0_SET_OFFSET, - INFRA_RST1_SET_OFFSET, - INFRA_RST2_SET_OFFSET, - INFRA_RST3_SET_OFFSET, - INFRA_RST4_SET_OFFSET, -}; - -static u16 infra_ao_idx_map[] =3D { - [MT8195_INFRA_RST0_THERM_CTRL_SWRST] =3D 0 * RST_NR_PER_BANK + 0, - [MT8195_INFRA_RST3_THERM_CTRL_PTP_SWRST] =3D 3 * RST_NR_PER_BANK + 5, - [MT8195_INFRA_RST4_THERM_CTRL_MCU_SWRST] =3D 4 * RST_NR_PER_BANK + 10, -}; - -static struct mtk_clk_rst_desc infra_ao_rst_desc =3D { - .version =3D MTK_RST_SET_CLR, - .rst_bank_ofs =3D infra_ao_rst_ofs, - .rst_bank_nr =3D ARRAY_SIZE(infra_ao_rst_ofs), - .rst_idx_map =3D infra_ao_idx_map, - .rst_idx_map_nr =3D ARRAY_SIZE(infra_ao_idx_map), -}; - static const struct mtk_clk_desc infra_ao_desc =3D { .clks =3D infra_ao_clks, .num_clks =3D ARRAY_SIZE(infra_ao_clks), - .rst_desc =3D &infra_ao_rst_desc, + .rst_name =3D "mt8195-infra-ao-rst", }; =20 static const struct of_device_id of_match_clk_mt8195_infra_ao[] =3D { diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c index 05a188c62119..8b0d3b3fd385 100644 --- a/drivers/clk/mediatek/clk-mtk.c +++ b/drivers/clk/mediatek/clk-mtk.c @@ -419,6 +419,62 @@ void mtk_clk_unregister_dividers(const struct mtk_clk_= divider *mcds, int num, } } =20 +static void mtk_reset_unregister_adev(void *_adev) +{ + struct auxiliary_device *adev =3D _adev; + + auxiliary_device_delete(adev); +} + +static void mtk_reset_adev_release(struct device *dev) +{ + struct auxiliary_device *adev =3D to_auxiliary_dev(dev); + + auxiliary_device_uninit(adev); + + kfree(adev); +} + +static struct auxiliary_device *mtk_reset_adev_alloc(struct device *dev, c= onst char *name) +{ + struct auxiliary_device *adev; + int ret; + + adev =3D kzalloc(sizeof(*adev), GFP_KERNEL); + if (!adev) + return ERR_PTR(-ENOMEM); + + adev->name =3D name; + adev->dev.parent =3D dev; + adev->dev.release =3D mtk_reset_adev_release; + + ret =3D auxiliary_device_init(adev); + if (ret) { + kfree(adev); + return ERR_PTR(ret); + } + + return adev; +} + +int mtk_reset_controller_register(struct device *dev, const char *name) +{ + struct auxiliary_device *adev; + int ret; + + adev =3D mtk_reset_adev_alloc(dev, name); + if (IS_ERR(adev)) + return PTR_ERR(adev); + + ret =3D auxiliary_device_add(adev); + if (ret) { + auxiliary_device_uninit(adev); + return ret; + } + + return devm_add_action_or_reset(dev, mtk_reset_unregister_adev, adev); +} + int mtk_clk_simple_probe(struct platform_device *pdev) { const struct mtk_clk_desc *mcd; @@ -444,9 +500,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev) =20 platform_set_drvdata(pdev, clk_data); =20 - if (mcd->rst_desc) { - r =3D mtk_register_reset_controller_with_dev(&pdev->dev, - mcd->rst_desc); + if (mcd->rst_name) { + r =3D mtk_reset_controller_register(&pdev->dev, mcd->rst_name); if (r) goto unregister_clks; } diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h index 1b95c484d5aa..95b3893f5411 100644 --- a/drivers/clk/mediatek/clk-mtk.h +++ b/drivers/clk/mediatek/clk-mtk.h @@ -7,14 +7,13 @@ #ifndef __DRV_CLK_MTK_H #define __DRV_CLK_MTK_H =20 +#include #include #include #include #include #include =20 -#include "reset.h" - #define MAX_MUX_GATE_BIT 31 #define INVALID_MUX_GATE_BIT (MAX_MUX_GATE_BIT + 1) =20 @@ -192,10 +191,14 @@ struct clk_hw *mtk_clk_register_ref2usb_tx(const char= *name, struct mtk_clk_desc { const struct mtk_gate *clks; size_t num_clks; - const struct mtk_clk_rst_desc *rst_desc; + char *rst_name; }; =20 int mtk_clk_simple_probe(struct platform_device *pdev); int mtk_clk_simple_remove(struct platform_device *pdev); =20 +int mtk_reset_controller_register(struct device *dev, const char *name); +extern int mtk_reset_init_with_node(struct device_node *np, const char *na= me); +extern void mtk_rst_remove_with_node(struct device_node *np, const char *n= ame); + #endif /* __DRV_CLK_MTK_H */ diff --git a/drivers/clk/mediatek/reset.c b/drivers/clk/mediatek/reset.c deleted file mode 100644 index 179505549a7c..000000000000 --- a/drivers/clk/mediatek/reset.c +++ /dev/null @@ -1,232 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2014 MediaTek Inc. - */ - -#include -#include -#include -#include -#include -#include - -#include "reset.h" - -static inline struct mtk_clk_rst_data *to_mtk_clk_rst_data(struct reset_co= ntroller_dev *rcdev) -{ - return container_of(rcdev, struct mtk_clk_rst_data, rcdev); -} - -static int mtk_reset_update(struct reset_controller_dev *rcdev, - unsigned long id, bool deassert) -{ - struct mtk_clk_rst_data *data =3D to_mtk_clk_rst_data(rcdev); - unsigned int val =3D deassert ? 0 : ~0; - - return regmap_update_bits(data->regmap, - data->desc->rst_bank_ofs[id / RST_NR_PER_BANK], - BIT(id % RST_NR_PER_BANK), val); -} - -static int mtk_reset_assert(struct reset_controller_dev *rcdev, - unsigned long id) -{ - return mtk_reset_update(rcdev, id, false); -} - -static int mtk_reset_deassert(struct reset_controller_dev *rcdev, - unsigned long id) -{ - return mtk_reset_update(rcdev, id, true); -} - -static int mtk_reset(struct reset_controller_dev *rcdev, unsigned long id) -{ - int ret; - - ret =3D mtk_reset_assert(rcdev, id); - if (ret) - return ret; - - return mtk_reset_deassert(rcdev, id); -} - -static int mtk_reset_update_set_clr(struct reset_controller_dev *rcdev, - unsigned long id, bool deassert) -{ - struct mtk_clk_rst_data *data =3D to_mtk_clk_rst_data(rcdev); - unsigned int deassert_ofs =3D deassert ? 0x4 : 0; - - return regmap_write(data->regmap, - data->desc->rst_bank_ofs[id / RST_NR_PER_BANK] + - deassert_ofs, - BIT(id % RST_NR_PER_BANK)); -} - -static int mtk_reset_assert_set_clr(struct reset_controller_dev *rcdev, - unsigned long id) -{ - return mtk_reset_update_set_clr(rcdev, id, false); -} - -static int mtk_reset_deassert_set_clr(struct reset_controller_dev *rcdev, - unsigned long id) -{ - return mtk_reset_update_set_clr(rcdev, id, true); -} - -static int mtk_reset_set_clr(struct reset_controller_dev *rcdev, - unsigned long id) -{ - int ret; - - ret =3D mtk_reset_assert_set_clr(rcdev, id); - if (ret) - return ret; - return mtk_reset_deassert_set_clr(rcdev, id); -} - -static const struct reset_control_ops mtk_reset_ops =3D { - .assert =3D mtk_reset_assert, - .deassert =3D mtk_reset_deassert, - .reset =3D mtk_reset, -}; - -static const struct reset_control_ops mtk_reset_ops_set_clr =3D { - .assert =3D mtk_reset_assert_set_clr, - .deassert =3D mtk_reset_deassert_set_clr, - .reset =3D mtk_reset_set_clr, -}; - -static int reset_xlate(struct reset_controller_dev *rcdev, - const struct of_phandle_args *reset_spec) -{ - struct mtk_clk_rst_data *data =3D to_mtk_clk_rst_data(rcdev); - - if (reset_spec->args[0] >=3D rcdev->nr_resets || - reset_spec->args[0] >=3D data->desc->rst_idx_map_nr) - return -EINVAL; - - return data->desc->rst_idx_map[reset_spec->args[0]]; -} - -int mtk_register_reset_controller(struct device_node *np, - const struct mtk_clk_rst_desc *desc) -{ - struct regmap *regmap; - const struct reset_control_ops *rcops =3D NULL; - struct mtk_clk_rst_data *data; - int ret; - - if (!desc) { - pr_err("mtk clock reset desc is NULL\n"); - return -EINVAL; - } - - switch (desc->version) { - case MTK_RST_SIMPLE: - rcops =3D &mtk_reset_ops; - break; - case MTK_RST_SET_CLR: - rcops =3D &mtk_reset_ops_set_clr; - break; - default: - pr_err("Unknown reset version %d\n", desc->version); - return -EINVAL; - } - - regmap =3D device_node_to_regmap(np); - if (IS_ERR(regmap)) { - pr_err("Cannot find regmap for %pOF: %pe\n", np, regmap); - return -EINVAL; - } - - data =3D kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->desc =3D desc; - data->regmap =3D regmap; - data->rcdev.owner =3D THIS_MODULE; - data->rcdev.ops =3D rcops; - data->rcdev.of_node =3D np; - - if (data->desc->rst_idx_map_nr > 0) { - data->rcdev.of_reset_n_cells =3D 1; - data->rcdev.nr_resets =3D desc->rst_idx_map_nr; - data->rcdev.of_xlate =3D reset_xlate; - } else { - data->rcdev.nr_resets =3D desc->rst_bank_nr * RST_NR_PER_BANK; - } - - ret =3D reset_controller_register(&data->rcdev); - if (ret) { - pr_err("could not register reset controller: %d\n", ret); - kfree(data); - return ret; - } - - return 0; -} - -int mtk_register_reset_controller_with_dev(struct device *dev, - const struct mtk_clk_rst_desc *desc) -{ - struct device_node *np =3D dev->of_node; - struct regmap *regmap; - const struct reset_control_ops *rcops =3D NULL; - struct mtk_clk_rst_data *data; - int ret; - - if (!desc) { - dev_err(dev, "mtk clock reset desc is NULL\n"); - return -EINVAL; - } - - switch (desc->version) { - case MTK_RST_SIMPLE: - rcops =3D &mtk_reset_ops; - break; - case MTK_RST_SET_CLR: - rcops =3D &mtk_reset_ops_set_clr; - break; - default: - dev_err(dev, "Unknown reset version %d\n", desc->version); - return -EINVAL; - } - - regmap =3D device_node_to_regmap(np); - if (IS_ERR(regmap)) { - dev_err(dev, "Cannot find regmap %pe\n", regmap); - return -EINVAL; - } - - data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->desc =3D desc; - data->regmap =3D regmap; - data->rcdev.owner =3D THIS_MODULE; - data->rcdev.ops =3D rcops; - data->rcdev.of_node =3D np; - data->rcdev.dev =3D dev; - - if (data->desc->rst_idx_map_nr > 0) { - data->rcdev.of_reset_n_cells =3D 1; - data->rcdev.nr_resets =3D desc->rst_idx_map_nr; - data->rcdev.of_xlate =3D reset_xlate; - } else { - data->rcdev.nr_resets =3D desc->rst_bank_nr * RST_NR_PER_BANK; - } - - ret =3D devm_reset_controller_register(dev, &data->rcdev); - if (ret) { - dev_err(dev, "could not register reset controller: %d\n", ret); - return ret; - } - - return 0; -} - -MODULE_LICENSE("GPL"); diff --git a/drivers/clk/mediatek/reset.h b/drivers/clk/mediatek/reset.h deleted file mode 100644 index 6a58a3d59165..000000000000 --- a/drivers/clk/mediatek/reset.h +++ /dev/null @@ -1,82 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2022 MediaTek Inc. - */ - -#ifndef __DRV_CLK_MTK_RESET_H -#define __DRV_CLK_MTK_RESET_H - -#include -#include - -#define RST_NR_PER_BANK 32 - -/* Infra global controller reset set register */ -#define INFRA_RST0_SET_OFFSET 0x120 -#define INFRA_RST1_SET_OFFSET 0x130 -#define INFRA_RST2_SET_OFFSET 0x140 -#define INFRA_RST3_SET_OFFSET 0x150 -#define INFRA_RST4_SET_OFFSET 0x730 - -/** - * enum mtk_reset_version - Version of MediaTek clock reset controller. - * @MTK_RST_SIMPLE: Use the same registers for bit set and clear. - * @MTK_RST_SET_CLR: Use separate registers for bit set and clear. - * @MTK_RST_MAX: Total quantity of version for MediaTek clock reset contro= ller. - */ -enum mtk_reset_version { - MTK_RST_SIMPLE =3D 0, - MTK_RST_SET_CLR, - MTK_RST_MAX, -}; - -/** - * struct mtk_clk_rst_desc - Description of MediaTek clock reset. - * @version: Reset version which is defined in enum mtk_reset_version. - * @rst_bank_ofs: Pointer to an array containing base offsets of the reset= register. - * @rst_bank_nr: Quantity of reset bank. - * @rst_idx_map:Pointer to an array containing ids if input argument is in= dex. - * This array is not necessary if our input argument does not mean index. - * @rst_idx_map_nr: Quantity of reset index map. - */ -struct mtk_clk_rst_desc { - enum mtk_reset_version version; - u16 *rst_bank_ofs; - u32 rst_bank_nr; - u16 *rst_idx_map; - u32 rst_idx_map_nr; -}; - -/** - * struct mtk_clk_rst_data - Data of MediaTek clock reset controller. - * @regmap: Pointer to base address of reset register address. - * @rcdev: Reset controller device. - * @desc: Pointer to description of the reset controller. - */ -struct mtk_clk_rst_data { - struct regmap *regmap; - struct reset_controller_dev rcdev; - const struct mtk_clk_rst_desc *desc; -}; - -/** - * mtk_register_reset_controller - Register MediaTek clock reset controller - * @np: Pointer to device node. - * @desc: Constant pointer to description of clock reset. - * - * Return: 0 on success and errorno otherwise. - */ -int mtk_register_reset_controller(struct device_node *np, - const struct mtk_clk_rst_desc *desc); - -/** - * mtk_register_reset_controller - Register mediatek clock reset controlle= r with device - * @np: Pointer to device. - * @desc: Constant pointer to description of clock reset. - * - * Return: 0 on success and errorno otherwise. - */ -int mtk_register_reset_controller_with_dev(struct device *dev, - const struct mtk_clk_rst_desc *desc); - -#endif /* __DRV_CLK_MTK_RESET_H */ diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index 806773e88832..81231153e7f1 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -122,6 +122,13 @@ config RESET_MCHP_SPARX5 help This driver supports switch core reset for the Microchip Sparx5 SoC. =20 +config RESET_MEDIATEK_SYSCLK + tristate "MediaTek System Clock Reset Driver" + depends on ARM || ARM64 || COMPILE_TEST + depends on AUXILIARY_BUS + help + This enables the system clock reset driver for MediaTek SoCs. + config RESET_MESON tristate "Meson Reset Driver" depends on ARCH_MESON || COMPILE_TEST diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index cd5cf8e7c6a7..2707511aaf5b 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_RESET_K210) +=3D reset-k210.o obj-$(CONFIG_RESET_LANTIQ) +=3D reset-lantiq.o obj-$(CONFIG_RESET_LPC18XX) +=3D reset-lpc18xx.o obj-$(CONFIG_RESET_MCHP_SPARX5) +=3D reset-microchip-sparx5.o +obj-$(CONFIG_RESET_MEDIATEK_SYSCLK) +=3D reset-mediatek-sysclk.o obj-$(CONFIG_RESET_MESON) +=3D reset-meson.o obj-$(CONFIG_RESET_MESON_AUDIO_ARB) +=3D reset-meson-audio-arb.o obj-$(CONFIG_RESET_NPCM) +=3D reset-npcm.o diff --git a/drivers/reset/reset-mediatek-sysclk.c b/drivers/reset/reset-me= diatek-sysclk.c new file mode 100644 index 000000000000..78194774d13d --- /dev/null +++ b/drivers/reset/reset-mediatek-sysclk.c @@ -0,0 +1,578 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2022 MediaTek Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define RST_NR_PER_BANK 32 + + /* Infra global controller reset set register */ +#define INFRA_RST0_SET_OFFSET 0x120 +#define INFRA_RST1_SET_OFFSET 0x130 +#define INFRA_RST2_SET_OFFSET 0x140 +#define INFRA_RST3_SET_OFFSET 0x150 +#define INFRA_RST4_SET_OFFSET 0x730 + +enum { + MTK_RST_ID_MT2701_ETH =3D 0, + MTK_RST_ID_MT2701_G3D, + MTK_RST_ID_MT2701_HIF, + MTK_RST_ID_MT2701_INFRASYS, + MTK_RST_ID_MT2701_PERICFG, + MTK_RST_ID_MT2712_INFRA, + MTK_RST_ID_MT2712_PERI, + MTK_RST_ID_MT7622_ETH, + MTK_RST_ID_MT7622_SSUSBSYS, + MTK_RST_ID_MT7622_PCIESYS, + MTK_RST_ID_MT7622_INFRASYS, + MTK_RST_ID_MT7622_PERICFG, + MTK_RST_ID_MT7629_ETHSYS, + MTK_RST_ID_MT7629_SSUSBSYS, + MTK_RST_ID_MT7629_PCIESYS, + MTK_RST_ID_MT8135_INFRASYS, + MTK_RST_ID_MT8135_PERICFG, + MTK_RST_ID_MT8173_INFRACFG, + MTK_RST_ID_MT8173_PERICFG, + MTK_RST_ID_MT8183_INFRA, + MTK_RST_ID_MT8186_INFRA_AO, + MTK_RST_ID_MT8192_INFRA, + MTK_RST_ID_MT8195_INFRA_AO, + MTK_RST_ID_MAX, +}; + +/** + * enum mtk_reset_version - Version of MediaTek clock reset controller. + * @MTK_RST_SIMPLE: Use the same registers for bit set and clear. + * @MTK_RST_SET_CLR: Use separate registers for bit set and clear. + * @MTK_RST_MAX: Total quantity of version for MediaTek clock reset contro= ller. + */ +enum mtk_reset_version { + MTK_RST_SIMPLE =3D 0, + MTK_RST_SET_CLR, + MTK_RST_MAX, +}; + +/** + * struct mtk_clk_rst_desc - Description of MediaTek clock reset. + * @version: Reset version which is defined in enum mtk_reset_version. + * @rst_bank_ofs: Pointer to an array containing base offsets of the reset= register. + * @rst_bank_nr: Quantity of reset bank. + * @rst_idx_map:Pointer to an array containing ids if input argument is in= dex. + * This array is not necessary if our input argument does not mean index. + * @rst_idx_map_nr: Quantity of reset index map. + */ +struct mtk_clk_rst_desc { + u8 version; + u16 *rst_bank_ofs; + u32 rst_bank_nr; + u16 *rst_idx_map; + u32 rst_idx_map_nr; +}; + +/** + * struct mtk_clk_rst_data - Data of MediaTek clock reset controller. + * @regmap: Pointer to base address of reset register address. + * @rcdev: Reset controller device. + * @desc: Pointer to description of the reset controller. + */ +struct mtk_clk_rst_data { + struct regmap *regmap; + struct reset_controller_dev rcdev; + const struct mtk_clk_rst_desc *desc; +}; + +static inline struct mtk_clk_rst_data *to_mtk_clk_rst_data(struct reset_co= ntroller_dev *rcdev) +{ + return container_of(rcdev, struct mtk_clk_rst_data, rcdev); +} + +static int mtk_reset_update(struct reset_controller_dev *rcdev, + unsigned long id, bool deassert) +{ + struct mtk_clk_rst_data *data =3D to_mtk_clk_rst_data(rcdev); + unsigned int val =3D deassert ? 0 : ~0; + + return regmap_update_bits(data->regmap, + data->desc->rst_bank_ofs[id / RST_NR_PER_BANK], + BIT(id % RST_NR_PER_BANK), val); +} + +static int mtk_reset_assert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return mtk_reset_update(rcdev, id, false); +} + +static int mtk_reset_deassert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return mtk_reset_update(rcdev, id, true); +} + +static int mtk_reset(struct reset_controller_dev *rcdev, unsigned long id) +{ + int ret; + + ret =3D mtk_reset_assert(rcdev, id); + if (ret) + return ret; + + return mtk_reset_deassert(rcdev, id); +} + +static int mtk_reset_update_set_clr(struct reset_controller_dev *rcdev, + unsigned long id, bool deassert) +{ + struct mtk_clk_rst_data *data =3D to_mtk_clk_rst_data(rcdev); + unsigned int deassert_ofs =3D deassert ? 0x4 : 0; + + return regmap_write(data->regmap, + data->desc->rst_bank_ofs[id / RST_NR_PER_BANK] + + deassert_ofs, + BIT(id % RST_NR_PER_BANK)); +} + +static int mtk_reset_assert_set_clr(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return mtk_reset_update_set_clr(rcdev, id, false); +} + +static int mtk_reset_deassert_set_clr(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return mtk_reset_update_set_clr(rcdev, id, true); +} + +static int mtk_reset_set_clr(struct reset_controller_dev *rcdev, + unsigned long id) +{ + int ret; + + ret =3D mtk_reset_assert_set_clr(rcdev, id); + if (ret) + return ret; + return mtk_reset_deassert_set_clr(rcdev, id); +} + +static const struct reset_control_ops mtk_reset_ops =3D { + .assert =3D mtk_reset_assert, + .deassert =3D mtk_reset_deassert, + .reset =3D mtk_reset, +}; + +static const struct reset_control_ops mtk_reset_ops_set_clr =3D { + .assert =3D mtk_reset_assert_set_clr, + .deassert =3D mtk_reset_deassert_set_clr, + .reset =3D mtk_reset_set_clr, +}; + +static int reset_xlate(struct reset_controller_dev *rcdev, + const struct of_phandle_args *reset_spec) +{ + struct mtk_clk_rst_data *data =3D to_mtk_clk_rst_data(rcdev); + + if (reset_spec->args[0] >=3D rcdev->nr_resets || + reset_spec->args[0] >=3D data->desc->rst_idx_map_nr) + return -EINVAL; + + return data->desc->rst_idx_map[reset_spec->args[0]]; +} + +static int register_rst_ctrl_with_node(struct device_node *np, struct mtk_= clk_rst_data *data) +{ + struct regmap *regmap; + const struct reset_control_ops *rcops =3D NULL; + int ret; + + if (!data) { + pr_err("invalid mtk clock reset data\n"); + return -EINVAL; + } + + switch (data->desc->version) { + case MTK_RST_SIMPLE: + rcops =3D &mtk_reset_ops; + break; + case MTK_RST_SET_CLR: + rcops =3D &mtk_reset_ops_set_clr; + break; + default: + pr_err("Unknown reset version %d\n", data->desc->version); + return -EINVAL; + } + + regmap =3D device_node_to_regmap(np); + if (IS_ERR(regmap)) { + pr_err("Cannot find regmap for %pOF: %pe\n", np, regmap); + return -EINVAL; + } + + data->regmap =3D regmap; + data->rcdev.owner =3D THIS_MODULE; + data->rcdev.ops =3D rcops; + data->rcdev.of_node =3D np; + + if (data->desc->rst_idx_map_nr > 0) { + data->rcdev.of_reset_n_cells =3D 1; + data->rcdev.nr_resets =3D data->desc->rst_idx_map_nr; + data->rcdev.of_xlate =3D reset_xlate; + } else { + data->rcdev.nr_resets =3D data->desc->rst_bank_nr * RST_NR_PER_BANK; + } + + ret =3D reset_controller_register(&data->rcdev); + if (ret) { + pr_err("could not register reset controller: %d\n", ret); + kfree(data); + return ret; + } + + return 0; +} + +static int register_rst_ctrl_with_dev(struct device *dev, struct mtk_clk_r= st_data *data) +{ + struct device_node *np =3D dev->of_node; + struct regmap *regmap; + const struct reset_control_ops *rcops =3D NULL; + int ret; + + if (!data) { + dev_err(dev, "invalid mtk clock reset data\n"); + return -EINVAL; + } + + switch (data->desc->version) { + case MTK_RST_SIMPLE: + rcops =3D &mtk_reset_ops; + break; + case MTK_RST_SET_CLR: + rcops =3D &mtk_reset_ops_set_clr; + break; + default: + dev_err(dev, "Unknown reset version %d\n", data->desc->version); + return -EINVAL; + } + + regmap =3D device_node_to_regmap(np); + if (IS_ERR(regmap)) { + dev_err(dev, "Cannot find regmap %pe\n", regmap); + return -EINVAL; + } + + data->regmap =3D regmap; + data->rcdev.owner =3D THIS_MODULE; + data->rcdev.ops =3D rcops; + data->rcdev.of_node =3D np; + data->rcdev.dev =3D dev; + + if (data->desc->rst_idx_map_nr > 0) { + data->rcdev.of_reset_n_cells =3D 1; + data->rcdev.nr_resets =3D data->desc->rst_idx_map_nr; + data->rcdev.of_xlate =3D reset_xlate; + } else { + data->rcdev.nr_resets =3D data->desc->rst_bank_nr * RST_NR_PER_BANK; + } + + ret =3D devm_reset_controller_register(dev, &data->rcdev); + if (ret) { + dev_err(dev, "could not register reset controller: %d\n", ret); + return ret; + } + + return 0; +} + +/* array of reset offset */ +static u16 mt2701_eth_rst_ofs[] =3D { 0x34, }; +static u16 mt2701_g3d_rst_ofs[] =3D { 0xc, }; +static u16 mt2701_infrasys_rst_ofs[] =3D { 0x30, 0x34, }; +static u16 mt2701_pericfg_rst_ofs[] =3D { 0x0, 0x4, }; +static u16 mt7622_infrasys_rst_ofs[] =3D { 0x30, }; + +static u16 mt8183_infra_ao_rst_ofs[] =3D { + INFRA_RST0_SET_OFFSET, + INFRA_RST1_SET_OFFSET, + INFRA_RST2_SET_OFFSET, + INFRA_RST3_SET_OFFSET, +}; + +static u16 mt8192_infra_ao_rst_ofs[] =3D { + INFRA_RST0_SET_OFFSET, + INFRA_RST1_SET_OFFSET, + INFRA_RST2_SET_OFFSET, + INFRA_RST3_SET_OFFSET, + INFRA_RST4_SET_OFFSET, +}; + +/* array of reset index mapping */ +static u16 mt8192_infra_ao_idx_map[] =3D { + [MT8192_INFRA_RST0_THERM_CTRL_SWRST] =3D 0 * RST_NR_PER_BANK + 0, + [MT8192_INFRA_RST2_PEXTP_PHY_SWRST] =3D 2 * RST_NR_PER_BANK + 15, + [MT8192_INFRA_RST3_THERM_CTRL_PTP_SWRST] =3D 3 * RST_NR_PER_BANK + 5, + [MT8192_INFRA_RST4_PCIE_TOP_SWRST] =3D 4 * RST_NR_PER_BANK + 1, + [MT8192_INFRA_RST4_THERM_CTRL_MCU_SWRST] =3D 4 * RST_NR_PER_BANK + 12, +}; + +static u16 mt8186_infra_ao_idx_map[] =3D { + [MT8186_INFRA_THERMAL_CTRL_RST] =3D 0 * RST_NR_PER_BANK + 0, + [MT8186_INFRA_PTP_CTRL_RST] =3D 1 * RST_NR_PER_BANK + 0, +}; + +static u16 mt8195_infra_ao_idx_map[] =3D { + [MT8195_INFRA_RST0_THERM_CTRL_SWRST] =3D 0 * RST_NR_PER_BANK + 0, + [MT8195_INFRA_RST3_THERM_CTRL_PTP_SWRST] =3D 3 * RST_NR_PER_BANK + 5, + [MT8195_INFRA_RST4_THERM_CTRL_MCU_SWRST] =3D 4 * RST_NR_PER_BANK + 10, +}; + +/* reset description */ +static const struct mtk_clk_rst_desc mt2701_eth_rst_desc =3D { + .version =3D MTK_RST_SIMPLE, + .rst_bank_ofs =3D mt2701_eth_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt2701_eth_rst_ofs), +}; + +static const struct mtk_clk_rst_desc mt2701_g3d_clk_rst_desc =3D { + .version =3D MTK_RST_SIMPLE, + .rst_bank_ofs =3D mt2701_g3d_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt2701_g3d_rst_ofs), +}; + +static const struct mtk_clk_rst_desc mt2701_infrasys_clk_rst_desc =3D { + .version =3D MTK_RST_SIMPLE, + .rst_bank_ofs =3D mt2701_infrasys_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt2701_infrasys_rst_ofs), +}; + +static const struct mtk_clk_rst_desc mt2701_pericfg_clk_rst_desc =3D { + .version =3D MTK_RST_SIMPLE, + .rst_bank_ofs =3D mt2701_pericfg_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt2701_pericfg_rst_ofs), +}; + +static const struct mtk_clk_rst_desc mt7622_infrasys_clk_rst_desc =3D { + .version =3D MTK_RST_SIMPLE, + .rst_bank_ofs =3D mt7622_infrasys_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt7622_infrasys_rst_ofs), +}; + +static struct mtk_clk_rst_desc mt8183_rst_desc =3D { + .version =3D MTK_RST_SET_CLR, + .rst_bank_ofs =3D mt8183_infra_ao_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt8183_infra_ao_rst_ofs), +}; + +static struct mtk_clk_rst_desc mt8186_rst_desc =3D { + .version =3D MTK_RST_SET_CLR, + .rst_bank_ofs =3D mt8183_infra_ao_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt8183_infra_ao_rst_ofs), + .rst_idx_map =3D mt8186_infra_ao_idx_map, + .rst_idx_map_nr =3D ARRAY_SIZE(mt8186_infra_ao_idx_map), +}; + +static struct mtk_clk_rst_desc mt8192_rst_desc =3D { + .version =3D MTK_RST_SET_CLR, + .rst_bank_ofs =3D mt8192_infra_ao_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt8192_infra_ao_rst_ofs), + .rst_idx_map =3D mt8192_infra_ao_idx_map, + .rst_idx_map_nr =3D ARRAY_SIZE(mt8192_infra_ao_idx_map), +}; + +static struct mtk_clk_rst_desc mt8195_rst_desc =3D { + .version =3D MTK_RST_SET_CLR, + .rst_bank_ofs =3D mt8192_infra_ao_rst_ofs, + .rst_bank_nr =3D ARRAY_SIZE(mt8192_infra_ao_rst_ofs), + .rst_idx_map =3D mt8195_infra_ao_idx_map, + .rst_idx_map_nr =3D ARRAY_SIZE(mt8195_infra_ao_idx_map), +}; + +static struct auxiliary_device_id mtk_sysclk_reset_ids[] =3D { + { + .name =3D "clk_mt2701_eth.mt2701-eth-rst", + .driver_data =3D MTK_RST_ID_MT2701_ETH, + }, + { + .name =3D "clk_mt2701_g3d.mt2701-g3d-rst", + .driver_data =3D MTK_RST_ID_MT2701_G3D, + }, + { + .name =3D "clk_mt2701_hif.mt2701-hif-rst", + .driver_data =3D MTK_RST_ID_MT2701_HIF, + }, + { + .name =3D "clk_mt2701.mt2701-infrasys-rst", + .driver_data =3D MTK_RST_ID_MT2701_INFRASYS, + }, + { + .name =3D "clk_mt2701.mt2701-pericfg-rst", + .driver_data =3D MTK_RST_ID_MT2701_PERICFG, + }, + { + .name =3D "clk_mt2712.mt2712-infra-rst", + .driver_data =3D MTK_RST_ID_MT2712_INFRA, + }, + { + .name =3D "clk_mt2712.mt2712-peri-rst", + .driver_data =3D MTK_RST_ID_MT2712_PERI, + }, + { + .name =3D "clk_mt7622_eth.mt7622-eth-rst", + .driver_data =3D MTK_RST_ID_MT7622_ETH, + }, + { + .name =3D "clk_mt7622_hif.mt7622-usb-rst", + .driver_data =3D MTK_RST_ID_MT7622_SSUSBSYS, + }, + { + .name =3D "clk_mt7622_hif.mt7622-pcie-rst", + .driver_data =3D MTK_RST_ID_MT7622_PCIESYS, + }, + { + .name =3D "clk_mt7622.mt7622-infrasys-rst", + .driver_data =3D MTK_RST_ID_MT7622_INFRASYS, + }, + { + .name =3D "clk_mt7622.mt7622-pericfg-rst", + .driver_data =3D MTK_RST_ID_MT7622_PERICFG, + }, + { + .name =3D "clk_mt7629_eth.mt7629-ethsys-rst", + .driver_data =3D MTK_RST_ID_MT7629_ETHSYS, + }, + { + .name =3D "clk_mt7629_hif.mt7629-usb-rst", + .driver_data =3D MTK_RST_ID_MT7629_SSUSBSYS, + }, + { + .name =3D "clk_mt7629_hif.mt7629-pcie-rst", + .driver_data =3D MTK_RST_ID_MT7629_PCIESYS, + }, + { + .name =3D "clk_mt8135.mt8135-infrasys-rst", + .driver_data =3D MTK_RST_ID_MT8135_INFRASYS, + }, + { + .name =3D "clk_mt8135.mt8135-pericfg-rst", + .driver_data =3D MTK_RST_ID_MT8135_PERICFG, + }, + { + .name =3D "clk_mt8173.mt8173-infracfg-rst", + .driver_data =3D MTK_RST_ID_MT8173_INFRACFG, + }, + { + .name =3D "clk_mt8173.mt8173-pericfg-rst", + .driver_data =3D MTK_RST_ID_MT8173_PERICFG, + }, + { + .name =3D "clk_mt8183.mt8183-infra-rst", + .driver_data =3D MTK_RST_ID_MT8183_INFRA, + }, + { + .name =3D "clk_mtk.mt8186-infra-ao-rst", + .driver_data =3D MTK_RST_ID_MT8186_INFRA_AO, + }, + { + .name =3D "clk_mt8192.mt8192-infra-rst", + .driver_data =3D MTK_RST_ID_MT8192_INFRA, + }, + { + .name =3D "clk_mtk.mt8195-infra-ao-rst", + .driver_data =3D MTK_RST_ID_MT8195_INFRA_AO, + }, + { + }, +}; +MODULE_DEVICE_TABLE(auxiliary, mtk_reset_ids); + +/* reset data */ +static struct mtk_clk_rst_data clk_rst_data[] =3D { + [MTK_RST_ID_MT2701_ETH] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT2701_G3D] =3D { .desc =3D &mt2701_g3d_clk_rst_desc, }, + [MTK_RST_ID_MT2701_HIF] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT2701_INFRASYS] =3D { .desc =3D &mt2701_infrasys_clk_rst_des= c, }, + [MTK_RST_ID_MT2701_PERICFG] =3D { .desc =3D &mt2701_pericfg_clk_rst_desc,= }, + [MTK_RST_ID_MT2712_INFRA] =3D { .desc =3D &mt2701_infrasys_clk_rst_desc, = }, + [MTK_RST_ID_MT2712_PERI] =3D { .desc =3D &mt2701_pericfg_clk_rst_desc, }, + [MTK_RST_ID_MT7622_ETH] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT7622_SSUSBSYS] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT7622_PCIESYS] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT7622_INFRASYS] =3D { .desc =3D &mt7622_infrasys_clk_rst_des= c, }, + [MTK_RST_ID_MT7622_PERICFG] =3D { .desc =3D &mt2701_pericfg_clk_rst_desc,= }, + [MTK_RST_ID_MT7629_ETHSYS] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT7629_SSUSBSYS] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT7629_PCIESYS] =3D { .desc =3D &mt2701_eth_rst_desc, }, + [MTK_RST_ID_MT8135_INFRASYS] =3D { .desc =3D &mt2701_infrasys_clk_rst_des= c, }, + [MTK_RST_ID_MT8135_PERICFG] =3D { .desc =3D &mt2701_pericfg_clk_rst_desc,= }, + [MTK_RST_ID_MT8173_INFRACFG] =3D { .desc =3D &mt2701_infrasys_clk_rst_des= c, }, + [MTK_RST_ID_MT8173_PERICFG] =3D { .desc =3D &mt2701_pericfg_clk_rst_desc,= }, + [MTK_RST_ID_MT8183_INFRA] =3D { .desc =3D &mt8183_rst_desc, }, + [MTK_RST_ID_MT8186_INFRA_AO] =3D { .desc =3D &mt8186_rst_desc, }, + [MTK_RST_ID_MT8192_INFRA] =3D { .desc =3D &mt8192_rst_desc, }, + [MTK_RST_ID_MT8195_INFRA_AO] =3D { .desc =3D &mt8195_rst_desc, }, + {}, +}; + +static struct mtk_clk_rst_data *find_rst_data(const char *name) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(mtk_sysclk_reset_ids); i++) + if (mtk_sysclk_reset_ids[i].name =3D=3D name) + return &clk_rst_data[mtk_sysclk_reset_ids[i].driver_data]; + return NULL; +} + +int mtk_reset_init_with_node(struct device_node *np, const char *name) +{ + struct mtk_clk_rst_data *data =3D find_rst_data(name); + + if (!np || !data) + return -EINVAL; + + return register_rst_ctrl_with_node(np, data); +} +EXPORT_SYMBOL_GPL(mtk_reset_init_with_node); + +void mtk_rst_remove_with_node(struct device_node *np, const char *name) +{ + struct mtk_clk_rst_data *data =3D find_rst_data(name); + + if (!np || !data) + return; + + reset_controller_unregister(&data->rcdev); +} +EXPORT_SYMBOL_GPL(mtk_rst_remove_with_node); + +static int mtk_sysclk_reset_probe(struct auxiliary_device *adev, + const struct auxiliary_device_id *id) +{ + if (id->driver_data >=3D MTK_RST_ID_MAX) + return -EINVAL; + + return register_rst_ctrl_with_dev(adev->dev.parent, &clk_rst_data[id->dri= ver_data]); +} + +static struct auxiliary_driver mtk_sysclk_reset_driver =3D { + .probe =3D mtk_sysclk_reset_probe, + .id_table =3D mtk_sysclk_reset_ids, +}; +module_auxiliary_driver(mtk_sysclk_reset_driver); + +MODULE_DESCRIPTION("MediaTek System Clock Reset Driver"); +MODULE_AUTHOR("Bo-Chen Chen "); +MODULE_LICENSE("GPL"); --=20 2.18.0