lkml.org 
[lkml]   [2022]   [Oct]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V3 21/21] PCI: tegra194: Add core monitor clock support
    Date
    Tegra supports PCIe core clock monitoring for any rate changes that may be
    happening because of the link speed changes. This is useful in tracking
    any changes in the core clock that are not initiated by the software. This
    patch adds support to parse the monitor clock info from device-tree and
    enable it if present.

    Signed-off-by: Vidya Sagar <vidyas@nvidia.com>
    ---
    V3:
    * This is a new patch in this series

    drivers/pci/controller/dwc/pcie-tegra194.c | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c
    index c88c36d85ee5..28512dc60172 100644
    --- a/drivers/pci/controller/dwc/pcie-tegra194.c
    +++ b/drivers/pci/controller/dwc/pcie-tegra194.c
    @@ -265,6 +265,7 @@ struct tegra_pcie_dw {
    struct resource *atu_dma_res;
    void __iomem *appl_base;
    struct clk *core_clk;
    + struct clk *core_clk_m;
    struct reset_control *core_apb_rst;
    struct reset_control *core_rst;
    struct dw_pcie pci;
    @@ -978,6 +979,8 @@ static int tegra_pcie_dw_host_init(struct dw_pcie_rp *pp)
    }

    clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
    + if (clk_prepare_enable(pcie->core_clk_m))
    + dev_err(pci->dev, "Failed to enable core monitor clock\n");

    return 0;
    }
    @@ -1050,6 +1053,12 @@ static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
    val &= ~PCI_DLF_EXCHANGE_ENABLE;
    dw_pcie_writel_dbi(pci, offset + PCI_DLF_CAP, val);

    + /*
    + * core_clk_m is enabled as part of host_init callback in
    + * dw_pcie_host_init(). Disable the clock since below
    + * tegra_pcie_dw_host_init() will enable it again.
    + */
    + clk_disable_unprepare(pcie->core_clk_m);
    tegra_pcie_dw_host_init(pp);
    dw_pcie_setup_rc(pp);

    @@ -1059,7 +1068,8 @@ static int tegra_pcie_dw_start_link(struct dw_pcie *pci)

    speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
    PCI_EXP_LNKSTA_CLS;
    - clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);
    + if (!pcie->core_clk_m)
    + clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);

    tegra_pcie_enable_interrupts(pp);

    @@ -1687,6 +1697,7 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)

    static void tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie)
    {
    + clk_disable_unprepare(pcie->core_clk_m);
    dw_pcie_host_deinit(&pcie->pci.pp);
    tegra_pcie_dw_pme_turnoff(pcie);
    tegra_pcie_unconfig_controller(pcie);
    @@ -2266,6 +2277,13 @@ static int tegra_pcie_dw_probe(struct platform_device *pdev)
    return PTR_ERR(pcie->core_clk);
    }

    + pcie->core_clk_m = devm_clk_get_optional(dev, "core_m");
    + if (IS_ERR(pcie->core_clk_m)) {
    + dev_err(dev, "Failed to get monitor clock: %ld\n",
    + PTR_ERR(pcie->core_clk_m));
    + return PTR_ERR(pcie->core_clk_m);
    + }
    +
    pcie->appl_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
    "appl");
    if (!pcie->appl_res) {
    @@ -2449,6 +2467,7 @@ static int tegra_pcie_dw_suspend_noirq(struct device *dev)
    if (!pcie->link_state && !pcie->slot_pluggable)
    return 0;

    + clk_disable_unprepare(pcie->core_clk_m);
    tegra_pcie_dw_pme_turnoff(pcie);
    tegra_pcie_unconfig_controller(pcie);

    --
    2.17.1
    \
     
     \ /
      Last update: 2022-10-13 20:47    [W:4.717 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site