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 3B322CFC266 for ; Tue, 15 Oct 2024 05:13:33 +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:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=itcSJsJotSK/jcaVaV5tcZpuhtgwm01gUAjTOqSUyQM=; b=uDWoxT8aFwXXAvuNgTvmcjVZ05 fX3KQSK9vFbJPtpbimAFjN/8smqGZHuyxz1RgkMiIpb+2KjIsQKkwH5Z7HVYDjXC12xfJ/R4oYmQc MwhlXEXIVJb0ApTT3Sr9VFm4cSsSJgtTJRNW/gwJJ20PRjX19qCHOrVAQ1V1eCsURNfFK4g/nKRd3 hy7dOLE90Va3eY1oJEDizfwKxnVJNM7yPg7/EwbWy+ElXKewwAGJCr6WolzrtgTlAI9UrZCLne8sA nsvS07tPZAH3O8LOZWVj/u0irnQK0k5ZPgoa22cBT3FKSlEIZ2LA5rRHMx4dXk0LbwdHt3S2mukBG LKYKHUWA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1t0Zrx-000000075c1-0xqw; Tue, 15 Oct 2024 05:13:17 +0000 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1t0ZqX-000000075Uy-1nuD for linux-arm-kernel@lists.infradead.org; Tue, 15 Oct 2024 05:11:51 +0000 Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-71e49ad46b1so1985187b3a.1 for ; Mon, 14 Oct 2024 22:11:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728969108; x=1729573908; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=itcSJsJotSK/jcaVaV5tcZpuhtgwm01gUAjTOqSUyQM=; b=vggdsVtMm9AdTQa8lOflb7MMjoQRFkyFw32jLYFZRYvktvLftdPVUsAv1ncFs0OVYr slSN+Y9Ot1SBmMwKlB1VfxmDyRfOKCzHpNu/eu0+7ZXJGz6zZZ5StXPf6kpoEcN61s20 pYSWDMJ5w8XhJ5UBKYnFwYf0E2NSSw0FXUFBNWOlLrbZZYeW6PaYNusFJ9gpxskkQFUc QWviqbU66MALSYTIaYs22JpbG5bFbMMBZOojR3PQgyeI/VQWDIAzEEA76bB5fwAvPp9E HiCJj1xVyaljgfXaDn/8t0aIUCUHogtEP3/z8JEo6+cQMAMBP7ywjZyMfDSxkGEF+7eR btFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728969108; x=1729573908; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=itcSJsJotSK/jcaVaV5tcZpuhtgwm01gUAjTOqSUyQM=; b=SQHBkD3j4r/5Hfr+2PBivss9KG7ayGmb/W7MIgaQc/qOSNgswO7f+Quw8wJppixFUg 7zrPYTsXGQND0uFv+kspITME79irW+USTcV5zOVzyDJXybIT8W/67KnrtV6fp0jUxuRm 5SUPrd/0kJc1DF5yeVkQ+FJDuqrd7pLFo/7TWo7XAkp6rj6fSCmOiDGMu48tHpiHFcm2 yGP9T7itW1+Iz+/dnlvuODT8Yv4LdQT8d30FBvx/9dZlpjvt1zMjwFTEGgz0u3FVdF7N JnoS6M4mgTbC2mRrtIVGyhkSBLCVs2Cj5qJbGG2dVy7bcQsfED8QpHPO3lUL/UDzUbCF XUtQ== X-Forwarded-Encrypted: i=1; AJvYcCVtppN3gtwWfU0Cww0gFL+I+BO02Jh29HfFQaCQcAs1xoJ+BWcwLAzuo6T1xMWyfJ26sCJm4YfFkedKNDeI0Nrf@lists.infradead.org X-Gm-Message-State: AOJu0Yxo1UtRsBgiwJjprgw0CoqM9hPXyCJqBWOqgi+r4O06NoSNWQiA meVXtAHS1CNMi+alm/cWxu+zasycWasBe6tgNGegCNVr+wQQOTfh6Q0unj+wew== X-Google-Smtp-Source: AGHT+IGcczmm+9wAnSEP6Av3fDiqgeLou2z+jC7AbNImoY9K8bKikbyOt8wINuH5deg1mPWGxTr0NQ== X-Received: by 2002:a05:6a00:888:b0:71d:fd40:b484 with SMTP id d2e1a72fcca58-71e380c5033mr20946749b3a.24.1728969108206; Mon, 14 Oct 2024 22:11:48 -0700 (PDT) Received: from thinkpad ([220.158.156.88]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71e7737185dsm450968b3a.16.2024.10.14.22.11.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Oct 2024 22:11:47 -0700 (PDT) Date: Tue, 15 Oct 2024 10:41:41 +0530 From: Manivannan Sadhasivam To: Anand Moon Cc: Shawn Lin , Lorenzo Pieralisi , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Rob Herring , Bjorn Helgaas , Heiko Stuebner , Philipp Zabel , "open list:PCIE DRIVER FOR ROCKCHIP" , "open list:PCIE DRIVER FOR ROCKCHIP" , "moderated list:ARM/Rockchip SoC support" , open list Subject: Re: [PATCH v8 2/3] PCI: rockchip: Simplify reset control handling by using reset_control_bulk*() function Message-ID: <20241015051141.g6fh222zrkvnn4l6@thinkpad> References: <20241014135210.224913-1-linux.amoon@gmail.com> <20241014135210.224913-3-linux.amoon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20241014135210.224913-3-linux.amoon@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241014_221149_543666_F7B14EDF X-CRM114-Status: GOOD ( 32.70 ) 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 On Mon, Oct 14, 2024 at 07:22:03PM +0530, Anand Moon wrote: > Refactor the reset control handling in the Rockchip PCIe driver, > introduce a more robust and efficient method for assert and > deassert reset controller using reset_control_bulk*() API. Using the > reset_control_bulk APIs, the reset handling for the core clocks reset > unit becomes much simpler. > > Spilt the reset controller in two groups as per the > RK3399 TM 17.5.8.1 PCIe Initialization Sequence > 17.5.8.1.1 PCIe as Root Complex. > > 6. De-assert the PIPE_RESET_N/MGMT_STICKY_RESET_N/MGMT_RESET_N/RESET_N > simultaneously. > I'd reword it slightly: Following the recommendations in 'Rockchip RK3399 TRM v1.3 Part2': 1. Split the reset controls into two groups as per section '17.5.8.1.1 PCIe as Root Complex'. 2. Deassert the 'Pipe, MGMT Sticky, MGMT, Core' resets in groups as per section '17.5.8.1.1 PCIe as Root Complex'. This is accomplished using the reset_control_bulk APIs. > - devm_reset_control_bulk_get_exclusive(): Allows the driver to get all > resets defined in the DT thereby removing the hardcoded reset names > in the driver. > - reset_control_bulk_assert(): Allows the driver to assert the resets > defined in the driver. > - reset_control_bulk_deassert(): Allows the driver to deassert the resets > defined in the driver. > No need to list out the APIs. Just add them to the first paragraph itself to explain how they are used. > Signed-off-by: Anand Moon Some nitpicks below. Rest looks good. > --- > v8: I tried to address reviews and comments from Mani. > Follow the sequence of De-assert as per the driver code. > Drop the comment in the driver. > Improve the commit message with the description of the TMP section. > Improve the reason for the core functional changes in the commit > description. > Improve the error handling messages of the code. > v7: replace devm_reset_control_bulk_get_optional_exclusive() > with devm_reset_control_bulk_get_exclusive() > update the functional changes. > V6: Add reason for the split of the RESET pins. > v5: Fix the De-assert reset core as per the TRM > De-assert the PIPE_RESET_N/MGMT_STICKY_RESET_N/MGMT_RESET_N/RESET_N > simultaneously. > v4: use dev_err_probe in error path. > v3: Fix typo in commit message, dropped reported by. > v2: Fix compilation error reported by Intel test robot > fixed checkpatch warning. > --- > drivers/pci/controller/pcie-rockchip.c | 155 +++++-------------------- > drivers/pci/controller/pcie-rockchip.h | 26 +++-- > 2 files changed, 49 insertions(+), 132 deletions(-) > > diff --git a/drivers/pci/controller/pcie-rockchip.c b/drivers/pci/controller/pcie-rockchip.c > index 2777ef0cb599..43d83c1f3196 100644 > --- a/drivers/pci/controller/pcie-rockchip.c > +++ b/drivers/pci/controller/pcie-rockchip.c > @@ -30,7 +30,7 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip) > struct platform_device *pdev = to_platform_device(dev); > struct device_node *node = dev->of_node; > struct resource *regs; > - int err; > + int err, i; > > if (rockchip->is_rc) { > regs = platform_get_resource_byname(pdev, > @@ -69,55 +69,23 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip) > if (rockchip->link_gen < 0 || rockchip->link_gen > 2) > rockchip->link_gen = 2; > > - rockchip->core_rst = devm_reset_control_get_exclusive(dev, "core"); > - if (IS_ERR(rockchip->core_rst)) { > - if (PTR_ERR(rockchip->core_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing core reset property in node\n"); > - return PTR_ERR(rockchip->core_rst); > - } > - > - rockchip->mgmt_rst = devm_reset_control_get_exclusive(dev, "mgmt"); > - if (IS_ERR(rockchip->mgmt_rst)) { > - if (PTR_ERR(rockchip->mgmt_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing mgmt reset property in node\n"); > - return PTR_ERR(rockchip->mgmt_rst); > - } > - > - rockchip->mgmt_sticky_rst = devm_reset_control_get_exclusive(dev, > - "mgmt-sticky"); > - if (IS_ERR(rockchip->mgmt_sticky_rst)) { > - if (PTR_ERR(rockchip->mgmt_sticky_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing mgmt-sticky reset property in node\n"); > - return PTR_ERR(rockchip->mgmt_sticky_rst); > - } > - > - rockchip->pipe_rst = devm_reset_control_get_exclusive(dev, "pipe"); > - if (IS_ERR(rockchip->pipe_rst)) { > - if (PTR_ERR(rockchip->pipe_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing pipe reset property in node\n"); > - return PTR_ERR(rockchip->pipe_rst); > - } > + for (i = 0; i < ROCKCHIP_NUM_PM_RSTS; i++) > + rockchip->pm_rsts[i].id = rockchip_pci_pm_rsts[i]; > > - rockchip->pm_rst = devm_reset_control_get_exclusive(dev, "pm"); > - if (IS_ERR(rockchip->pm_rst)) { > - if (PTR_ERR(rockchip->pm_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing pm reset property in node\n"); > - return PTR_ERR(rockchip->pm_rst); > - } > + err = devm_reset_control_bulk_get_exclusive(dev, > + ROCKCHIP_NUM_PM_RSTS, > + rockchip->pm_rsts); > + if (err) > + return dev_err_probe(dev, err, "Cannot get the PM reset control\n"); "Couldn't get PM resets" > > - rockchip->pclk_rst = devm_reset_control_get_exclusive(dev, "pclk"); > - if (IS_ERR(rockchip->pclk_rst)) { > - if (PTR_ERR(rockchip->pclk_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing pclk reset property in node\n"); > - return PTR_ERR(rockchip->pclk_rst); > - } > + for (i = 0; i < ROCKCHIP_NUM_CORE_RSTS; i++) > + rockchip->core_rsts[i].id = rockchip_pci_core_rsts[i]; > > - rockchip->aclk_rst = devm_reset_control_get_exclusive(dev, "aclk"); > - if (IS_ERR(rockchip->aclk_rst)) { > - if (PTR_ERR(rockchip->aclk_rst) != -EPROBE_DEFER) > - dev_err(dev, "missing aclk reset property in node\n"); > - return PTR_ERR(rockchip->aclk_rst); > - } > + err = devm_reset_control_bulk_get_exclusive(dev, > + ROCKCHIP_NUM_CORE_RSTS, > + rockchip->core_rsts); > + if (err) > + return dev_err_probe(dev, err, "Cannot get the CORE reset control\n"); "Couldn't get Core resets" > > if (rockchip->is_rc) { > rockchip->ep_gpio = devm_gpiod_get_optional(dev, "ep", > @@ -147,23 +115,10 @@ int rockchip_pcie_init_port(struct rockchip_pcie *rockchip) > int err, i; > u32 regs; > > - err = reset_control_assert(rockchip->aclk_rst); > - if (err) { > - dev_err(dev, "assert aclk_rst err %d\n", err); > - return err; > - } > - > - err = reset_control_assert(rockchip->pclk_rst); > - if (err) { > - dev_err(dev, "assert pclk_rst err %d\n", err); > - return err; > - } > - > - err = reset_control_assert(rockchip->pm_rst); > - if (err) { > - dev_err(dev, "assert pm_rst err %d\n", err); > - return err; > - } > + err = reset_control_bulk_assert(ROCKCHIP_NUM_PM_RSTS, > + rockchip->pm_rsts); > + if (err) > + return dev_err_probe(dev, err, "Couldn't assert PM resets\n"); > > for (i = 0; i < MAX_LANE_NUM; i++) { > err = phy_init(rockchip->phys[i]); > @@ -173,47 +128,17 @@ int rockchip_pcie_init_port(struct rockchip_pcie *rockchip) > } > } > > - err = reset_control_assert(rockchip->core_rst); > - if (err) { > - dev_err(dev, "assert core_rst err %d\n", err); > - goto err_exit_phy; > - } > - > - err = reset_control_assert(rockchip->mgmt_rst); > - if (err) { > - dev_err(dev, "assert mgmt_rst err %d\n", err); > - goto err_exit_phy; > - } > - > - err = reset_control_assert(rockchip->mgmt_sticky_rst); > - if (err) { > - dev_err(dev, "assert mgmt_sticky_rst err %d\n", err); > - goto err_exit_phy; > - } > - > - err = reset_control_assert(rockchip->pipe_rst); > - if (err) { > - dev_err(dev, "assert pipe_rst err %d\n", err); > - goto err_exit_phy; > - } > + err = reset_control_bulk_assert(ROCKCHIP_NUM_CORE_RSTS, > + rockchip->core_rsts); > + if (err) > + return dev_err_probe(dev, err, "Couldn't assert Core resets\n"); "Couldn't assert Core resets\n" > > udelay(10); > > - err = reset_control_deassert(rockchip->pm_rst); > - if (err) { > - dev_err(dev, "deassert pm_rst err %d\n", err); > - goto err_exit_phy; > - } > - > - err = reset_control_deassert(rockchip->aclk_rst); > + err = reset_control_bulk_deassert(ROCKCHIP_NUM_PM_RSTS, > + rockchip->pm_rsts); > if (err) { > - dev_err(dev, "deassert aclk_rst err %d\n", err); > - goto err_exit_phy; > - } > - > - err = reset_control_deassert(rockchip->pclk_rst); > - if (err) { > - dev_err(dev, "deassert pclk_rst err %d\n", err); > + dev_err(dev, "Couldn't deassert PM resets %d\n", err); "Couldn't deassert PM resets: %d\n" > goto err_exit_phy; > } > > @@ -252,35 +177,15 @@ int rockchip_pcie_init_port(struct rockchip_pcie *rockchip) > goto err_power_off_phy; > } > > - /* > - * Please don't reorder the deassert sequence of the following > - * four reset pins. > - */ > - err = reset_control_deassert(rockchip->mgmt_sticky_rst); > - if (err) { > - dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err); > - goto err_power_off_phy; > - } > - > - err = reset_control_deassert(rockchip->core_rst); > + err = reset_control_bulk_deassert(ROCKCHIP_NUM_CORE_RSTS, > + rockchip->core_rsts); > if (err) { > - dev_err(dev, "deassert core_rst err %d\n", err); > - goto err_power_off_phy; > - } > - > - err = reset_control_deassert(rockchip->mgmt_rst); > - if (err) { > - dev_err(dev, "deassert mgmt_rst err %d\n", err); > - goto err_power_off_phy; > - } > - > - err = reset_control_deassert(rockchip->pipe_rst); > - if (err) { > - dev_err(dev, "deassert pipe_rst err %d\n", err); > + dev_err(dev, "Couldn't deassert CORE err %d\n", err); "Couldn't deassert Core resets: %d\n" > goto err_power_off_phy; > } > > return 0; > + Spurious change. - Mani -- மணிவண்ணன் சதாசிவம்