From nobody Thu Nov 28 02:45:16 2024 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 76CC818A95F; Sun, 6 Oct 2024 18:15:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728238505; cv=none; b=ScPju/qOVjdzYVtKkX6nGZSvUNOtXpQpSDRvzxjoN82LXX3QxwXS5JSzWoMa7Rp1kKDOOFsPQoqS+bdG/BnJZBuzXL+5W05DRUfZIJ28HXcLj3g8r4l34A4RfqEFsshDCOU7NwP0Z4h94Gd8VH+hAKPIKNDGLsMU9tpfqzhwrU8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728238505; c=relaxed/simple; bh=1BG6b+U8dzg9HFR9ZE5ST2KwELhXeMJ9JoGDTu4MUxs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kJrXJT2FJaDoGxWLF36mFv2fkjn/puT4s3YR17opPC/pPZdZPi4b5rYkK/p7rkrS7DChVwRMeD+VoVYG//9FgKJ759JJhElxjv2UaBKK2SycCysX26bFfw9ykhMvMI84a7tEGRS2fbFwCQUiQbBX8k5rpF3HdSo9BuZEGj02aco= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hzGaw0ih; arc=none smtp.client-ip=209.85.215.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hzGaw0ih" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-7e9fd82f1a5so503348a12.1; Sun, 06 Oct 2024 11:15:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1728238503; x=1728843303; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gQRL+4jvUJ2X96lE02r1r/21Z5HTm+wYNZIRn3wtob0=; b=hzGaw0ihOip9tYMRtRvviaJb4mRTzuVRrw/4yorpYJ/sJcU5sxnj+P1hDAWN98QDwU oiXWei5zWt6TxeqiTVlpEs/HVWmfa/gTlVKoy7TK3f0l78F2HbKcocEsGj9uwolj2WcS a3LGH6wD8Ke7EEqmvaOVQGcnISxZ7+x8u6xWOyf8W7hC6Ql/ntuyUlwzauB/vCycdtDQ HrB4SZ5LfE0dXLjYyccTQZ43D/DUfNz7O//Z06Lf9timgDUSQs2Rh6wO5DWMqB32jdF9 xYCChP3Eg6JzsVOh+bqJS+LvFPHd9Ag7ufXNminIM5n1EpLYOEcq0WSSY+djCj9xE88v 0u7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728238503; x=1728843303; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gQRL+4jvUJ2X96lE02r1r/21Z5HTm+wYNZIRn3wtob0=; b=sj2rJrChqPZRbE8nXBWi3wZNUP+m4ioBhOJe78lKZF59LejBU0vDm4GgcxB3XaQdBS AiefQybKyeXjJAQyVSUghnu6gBeI8AqIFZ+X+KLJpSh1U9O6W1b8KHfHZCE+x8mH6P5N hHPzkHMBAM0ifu2x2cO0HqbT62U+uVe+KQreaVeFkdvWyH5chGkpm7n85xHzD6/By3IK qOWARZ7uqcVxTDsV/p6pmhxZ3vhg9p3BANCV8vXXJoHqoqGNXRYWgML+r7dCsDom2v0/ yapCvaa4Y06JCVO9mvjVBseOHTlA1ollHnkv3fEPX7dQK7K7GTTsfKEnftsE9Tt6lXSe mB0w== X-Forwarded-Encrypted: i=1; AJvYcCWM03ul6A+tb2zZPK8ZVAYggptOyRA8YPAj8DZXq0xlvudVa8NtYPiXqovGBduR4y+oMZufjxQJyVaX@vger.kernel.org, AJvYcCXPo5Hu2IhVmmmQRf5iEqf81N5DjT3cQyK0T+gfjhG5qHYjqGBPWlAeYB6OPVSS97NlXCoSdLo5/HU1UgQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzqafDdDAyyxoNBbc5p1K+F99DIrRBpwhO5Qb1XQUkzFtLZNwMu YbcF7SKPDmd2lUq7ULKIxa+9y87hCtIjPpBF+ALIZ+i9oxsUEApU X-Google-Smtp-Source: AGHT+IG9jp4CGxO0hnxqY1HmAs6GHCLCtucnDK6aV+XQ2iVkHWxXc/7bR8oEuMwf+g5ImwsF3IXzQQ== X-Received: by 2002:a17:90b:a10:b0:2d8:79bf:3873 with SMTP id 98e67ed59e1d1-2e1e63217fcmr10396609a91.29.1728238502650; Sun, 06 Oct 2024 11:15:02 -0700 (PDT) Received: from localhost.localdomain ([113.30.217.221]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e1e85d9ab8sm5403095a91.29.2024.10.06.11.14.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Oct 2024 11:15:02 -0700 (PDT) From: Anand Moon To: Shawn Lin , Lorenzo Pieralisi , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Manivannan Sadhasivam , Rob Herring , Bjorn Helgaas , Heiko Stuebner , Philipp Zabel , linux-pci@vger.kernel.org (open list:PCIE DRIVER FOR ROCKCHIP), linux-rockchip@lists.infradead.org (open list:PCIE DRIVER FOR ROCKCHIP), linux-arm-kernel@lists.infradead.org (moderated list:ARM/Rockchip SoC support), linux-kernel@vger.kernel.org (open list) Cc: Anand Moon Subject: [PATCH v6 2/3] PCI: rockchip: Simplify reset control handling by using reset_control_bulk*() function Date: Sun, 6 Oct 2024 23:44:29 +0530 Message-ID: <20241006181436.3439-3-linux.amoon@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20241006181436.3439-1-linux.amoon@gmail.com> References: <20241006181436.3439-1-linux.amoon@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor the reset control handling in the Rockchip PCIe driver, introducing 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 pre the RK3399 TRM. After power up, the software driver should de-assert the reset of PCIe PHY, then wait the PLL locked by polling the status, if PLL has locked, then can de-assert the rest reset simultaneously driver need to De-assert the reset pins simultionaly. PIPE_RESET_N/MGMT_STICKY_RESET_N/MGMT_RESET_N/RESET_N. Signed-off-by: Anand Moon --- 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 | 151 +++++-------------------- drivers/pci/controller/pcie-rockchip.h | 26 +++-- 2 files changed, 49 insertions(+), 128 deletions(-) diff --git a/drivers/pci/controller/pcie-rockchip.c b/drivers/pci/controlle= r/pcie-rockchip.c index 2777ef0cb599..87daa3288a01 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 =3D to_platform_device(dev); struct device_node *node =3D dev->of_node; struct resource *regs; - int err; + int err, i; =20 if (rockchip->is_rc) { regs =3D platform_get_resource_byname(pdev, @@ -69,55 +69,23 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockch= ip) if (rockchip->link_gen < 0 || rockchip->link_gen > 2) rockchip->link_gen =3D 2; =20 - rockchip->core_rst =3D devm_reset_control_get_exclusive(dev, "core"); - if (IS_ERR(rockchip->core_rst)) { - if (PTR_ERR(rockchip->core_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing core reset property in node\n"); - return PTR_ERR(rockchip->core_rst); - } - - rockchip->mgmt_rst =3D devm_reset_control_get_exclusive(dev, "mgmt"); - if (IS_ERR(rockchip->mgmt_rst)) { - if (PTR_ERR(rockchip->mgmt_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing mgmt reset property in node\n"); - return PTR_ERR(rockchip->mgmt_rst); - } - - rockchip->mgmt_sticky_rst =3D devm_reset_control_get_exclusive(dev, - "mgmt-sticky"); - if (IS_ERR(rockchip->mgmt_sticky_rst)) { - if (PTR_ERR(rockchip->mgmt_sticky_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing mgmt-sticky reset property in node\n"); - return PTR_ERR(rockchip->mgmt_sticky_rst); - } - - rockchip->pipe_rst =3D devm_reset_control_get_exclusive(dev, "pipe"); - if (IS_ERR(rockchip->pipe_rst)) { - if (PTR_ERR(rockchip->pipe_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing pipe reset property in node\n"); - return PTR_ERR(rockchip->pipe_rst); - } + for (i =3D 0; i < ROCKCHIP_NUM_PM_RSTS; i++) + rockchip->pm_rsts[i].id =3D rockchip_pci_pm_rsts[i]; =20 - rockchip->pm_rst =3D devm_reset_control_get_exclusive(dev, "pm"); - if (IS_ERR(rockchip->pm_rst)) { - if (PTR_ERR(rockchip->pm_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing pm reset property in node\n"); - return PTR_ERR(rockchip->pm_rst); - } + err =3D devm_reset_control_bulk_get_optional_exclusive(dev, + ROCKCHIP_NUM_PM_RSTS, + rockchip->pm_rsts); + if (err) + return dev_err_probe(dev, err, "cannot get the reset control\n"); =20 - rockchip->pclk_rst =3D devm_reset_control_get_exclusive(dev, "pclk"); - if (IS_ERR(rockchip->pclk_rst)) { - if (PTR_ERR(rockchip->pclk_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing pclk reset property in node\n"); - return PTR_ERR(rockchip->pclk_rst); - } + for (i =3D 0; i < ROCKCHIP_NUM_CORE_RSTS; i++) + rockchip->core_rsts[i].id =3D rockchip_pci_core_rsts[i]; =20 - rockchip->aclk_rst =3D devm_reset_control_get_exclusive(dev, "aclk"); - if (IS_ERR(rockchip->aclk_rst)) { - if (PTR_ERR(rockchip->aclk_rst) !=3D -EPROBE_DEFER) - dev_err(dev, "missing aclk reset property in node\n"); - return PTR_ERR(rockchip->aclk_rst); - } + err =3D devm_reset_control_bulk_get_optional_exclusive(dev, + ROCKCHIP_NUM_CORE_RSTS, + rockchip->core_rsts); + if (err) + return dev_err_probe(dev, err, "cannot get the reset control\n"); =20 if (rockchip->is_rc) { rockchip->ep_gpio =3D devm_gpiod_get_optional(dev, "ep", @@ -147,23 +115,10 @@ int rockchip_pcie_init_port(struct rockchip_pcie *roc= kchip) int err, i; u32 regs; =20 - err =3D reset_control_assert(rockchip->aclk_rst); - if (err) { - dev_err(dev, "assert aclk_rst err %d\n", err); - return err; - } - - err =3D reset_control_assert(rockchip->pclk_rst); - if (err) { - dev_err(dev, "assert pclk_rst err %d\n", err); - return err; - } - - err =3D reset_control_assert(rockchip->pm_rst); - if (err) { - dev_err(dev, "assert pm_rst err %d\n", err); - return err; - } + err =3D reset_control_bulk_assert(ROCKCHIP_NUM_PM_RSTS, + rockchip->pm_rsts); + if (err) + return dev_err_probe(dev, err, "reset bulk assert pm reset\n"); =20 for (i =3D 0; i < MAX_LANE_NUM; i++) { err =3D phy_init(rockchip->phys[i]); @@ -173,47 +128,17 @@ int rockchip_pcie_init_port(struct rockchip_pcie *roc= kchip) } } =20 - err =3D reset_control_assert(rockchip->core_rst); - if (err) { - dev_err(dev, "assert core_rst err %d\n", err); - goto err_exit_phy; - } - - err =3D reset_control_assert(rockchip->mgmt_rst); - if (err) { - dev_err(dev, "assert mgmt_rst err %d\n", err); - goto err_exit_phy; - } - - err =3D 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 =3D reset_control_assert(rockchip->pipe_rst); - if (err) { - dev_err(dev, "assert pipe_rst err %d\n", err); - goto err_exit_phy; - } + err =3D reset_control_bulk_assert(ROCKCHIP_NUM_CORE_RSTS, + rockchip->core_rsts); + if (err) + return dev_err_probe(dev, err, "reset bulk assert core reset\n"); =20 udelay(10); =20 - err =3D reset_control_deassert(rockchip->pm_rst); - if (err) { - dev_err(dev, "deassert pm_rst err %d\n", err); - goto err_exit_phy; - } - - err =3D reset_control_deassert(rockchip->aclk_rst); + err =3D 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 =3D reset_control_deassert(rockchip->pclk_rst); - if (err) { - dev_err(dev, "deassert pclk_rst err %d\n", err); + dev_err(dev, "reset bulk deassert pm err %d\n", err); goto err_exit_phy; } =20 @@ -256,31 +181,15 @@ int rockchip_pcie_init_port(struct rockchip_pcie *roc= kchip) * Please don't reorder the deassert sequence of the following * four reset pins. */ - err =3D 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 =3D reset_control_deassert(rockchip->core_rst); + err =3D 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 =3D reset_control_deassert(rockchip->mgmt_rst); - if (err) { - dev_err(dev, "deassert mgmt_rst err %d\n", err); - goto err_power_off_phy; - } - - err =3D reset_control_deassert(rockchip->pipe_rst); - if (err) { - dev_err(dev, "deassert pipe_rst err %d\n", err); + dev_err(dev, "reset bulk deassert core err %d\n", err); goto err_power_off_phy; } =20 return 0; + err_power_off_phy: while (i--) phy_power_off(rockchip->phys[i]); diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controlle= r/pcie-rockchip.h index bebab80c9553..2761699f670b 100644 --- a/drivers/pci/controller/pcie-rockchip.h +++ b/drivers/pci/controller/pcie-rockchip.h @@ -15,6 +15,7 @@ #include #include #include +#include =20 /* * The upper 16 bits of PCIE_CLIENT_CONFIG are a write mask for the lower = 16 @@ -288,18 +289,29 @@ (((c) << ((b) * 8 + 5)) & \ ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_CTRL_MASK(b)) =20 +#define ROCKCHIP_NUM_PM_RSTS ARRAY_SIZE(rockchip_pci_pm_rsts) +#define ROCKCHIP_NUM_CORE_RSTS ARRAY_SIZE(rockchip_pci_core_rsts) + +static const char * const rockchip_pci_pm_rsts[] =3D { + "pm", + "pclk", + "aclk", +}; + +static const char * const rockchip_pci_core_rsts[] =3D { + "mgmt-sticky", + "mgmt", + "core", + "pipe", +}; + struct rockchip_pcie { void __iomem *reg_base; /* DT axi-base */ void __iomem *apb_base; /* DT apb-base */ bool legacy_phy; struct phy *phys[MAX_LANE_NUM]; - struct reset_control *core_rst; - struct reset_control *mgmt_rst; - struct reset_control *mgmt_sticky_rst; - struct reset_control *pipe_rst; - struct reset_control *pm_rst; - struct reset_control *aclk_rst; - struct reset_control *pclk_rst; + struct reset_control_bulk_data pm_rsts[ROCKCHIP_NUM_PM_RSTS]; + struct reset_control_bulk_data core_rsts[ROCKCHIP_NUM_CORE_RSTS]; struct clk_bulk_data *clks; int num_clks; struct regulator *vpcie12v; /* 12V power supply */ --=20 2.44.0