lkml.org 
[lkml]   [2018]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 04/12] PCI: aardvark: Add clock support
    Date
    The IP relies on a gated clock. When we will add S2RAM support, this
    clock will need to be resumed before any PCIe registers are
    accessed. Add support for this clock.

    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    ---
    drivers/pci/controller/pci-aardvark.c | 29 +++++++++++++++++++++++++++
    1 file changed, 29 insertions(+)

    diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
    index da695572a2ed..108b3f15c410 100644
    --- a/drivers/pci/controller/pci-aardvark.c
    +++ b/drivers/pci/controller/pci-aardvark.c
    @@ -8,6 +8,7 @@
    * Author: Hezi Shahmoon <hezi.shahmoon@marvell.com>
    */

    +#include <linux/clk.h>
    #include <linux/delay.h>
    #include <linux/gpio.h>
    #include <linux/interrupt.h>
    @@ -190,6 +191,7 @@

    struct advk_pcie {
    struct platform_device *pdev;
    + struct clk *clk;
    void __iomem *base;
    struct list_head resources;
    struct irq_domain *irq_domain;
    @@ -1083,6 +1085,29 @@ static int advk_pcie_setup_phy(struct advk_pcie *pcie)
    return ret;
    }

    +static int advk_pcie_setup_clk(struct advk_pcie *pcie)
    +{
    + struct device *dev = &pcie->pdev->dev;
    + int ret;
    +
    + pcie->clk = devm_clk_get(dev, NULL);
    + if (IS_ERR(pcie->clk) && (PTR_ERR(pcie->clk) == -EPROBE_DEFER))
    + return PTR_ERR(pcie->clk);
    +
    + /* Old bindings miss the clock handle */
    + if (IS_ERR(pcie->clk)) {
    + dev_warn(dev, "Clock unavailable (%ld)\n", PTR_ERR(pcie->clk));
    + pcie->clk = NULL;
    + return 0;
    + }
    +
    + ret = clk_prepare_enable(pcie->clk);
    + if (ret)
    + dev_err(dev, "Clock initialization failed (%d)\n", ret);
    +
    + return ret;
    +}
    +
    static int advk_pcie_probe(struct platform_device *pdev)
    {
    struct device *dev = &pdev->dev;
    @@ -1118,6 +1143,10 @@ static int advk_pcie_probe(struct platform_device *pdev)
    return ret;
    }

    + ret = advk_pcie_setup_clk(pcie);
    + if (ret)
    + return ret;
    +
    ret = advk_pcie_setup_phy(pcie);
    if (ret)
    return ret;
    --
    2.19.1
    \
     
     \ /
      Last update: 2018-12-12 11:23    [W:3.322 / U:1.420 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site