lkml.org 
[lkml]   [2023]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 09/18] PCI: qcom: Use bulk clock APIs for handling clocks for IP rev 2.3.3
    Date
    All the clocks are enabled and disabled at the same time. So the bulk clock
    APIs can be used to handle them together. This simplifies the code a lot.

    Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    ---
    drivers/pci/controller/dwc/pcie-qcom.c | 88 ++++++--------------------
    1 file changed, 20 insertions(+), 68 deletions(-)

    diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
    index 939973733a1e..6b83e3627336 100644
    --- a/drivers/pci/controller/dwc/pcie-qcom.c
    +++ b/drivers/pci/controller/dwc/pcie-qcom.c
    @@ -169,6 +169,12 @@ struct qcom_pcie_resources_2_3_2 {
    struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
    };

    +#define QCOM_PCIE_2_3_3_MAX_CLOCKS 5
    +struct qcom_pcie_resources_2_3_3 {
    + struct clk_bulk_data clks[QCOM_PCIE_2_3_3_MAX_CLOCKS];
    + struct reset_control *rst[7];
    +};
    +
    #define QCOM_PCIE_2_4_0_MAX_CLOCKS 4
    struct qcom_pcie_resources_2_4_0 {
    struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS];
    @@ -187,15 +193,6 @@ struct qcom_pcie_resources_2_4_0 {
    struct reset_control *phy_ahb_reset;
    };

    -struct qcom_pcie_resources_2_3_3 {
    - struct clk *iface;
    - struct clk *axi_m_clk;
    - struct clk *axi_s_clk;
    - struct clk *ahb_clk;
    - struct clk *aux_clk;
    - struct reset_control *rst[7];
    -};
    -
    /* 6 clocks typically, 7 for sm8250 */
    struct qcom_pcie_resources_2_7_0 {
    struct clk_bulk_data clks[12];
    @@ -896,26 +893,17 @@ static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie)
    const char *rst_names[] = { "axi_m", "axi_s", "pipe",
    "axi_m_sticky", "sticky",
    "ahb", "sleep", };
    + int ret;

    - res->iface = devm_clk_get(dev, "iface");
    - if (IS_ERR(res->iface))
    - return PTR_ERR(res->iface);
    -
    - res->axi_m_clk = devm_clk_get(dev, "axi_m");
    - if (IS_ERR(res->axi_m_clk))
    - return PTR_ERR(res->axi_m_clk);
    -
    - res->axi_s_clk = devm_clk_get(dev, "axi_s");
    - if (IS_ERR(res->axi_s_clk))
    - return PTR_ERR(res->axi_s_clk);
    -
    - res->ahb_clk = devm_clk_get(dev, "ahb");
    - if (IS_ERR(res->ahb_clk))
    - return PTR_ERR(res->ahb_clk);
    + res->clks[0].id = "iface";
    + res->clks[1].id = "axi_m";
    + res->clks[2].id = "axi_s";
    + res->clks[3].id = "ahb";
    + res->clks[4].id = "aux";

    - res->aux_clk = devm_clk_get(dev, "aux");
    - if (IS_ERR(res->aux_clk))
    - return PTR_ERR(res->aux_clk);
    + ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
    + if (ret < 0)
    + return ret;

    for (i = 0; i < ARRAY_SIZE(rst_names); i++) {
    res->rst[i] = devm_reset_control_get(dev, rst_names[i]);
    @@ -930,11 +918,7 @@ static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie)
    {
    struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;

    - clk_disable_unprepare(res->iface);
    - clk_disable_unprepare(res->axi_m_clk);
    - clk_disable_unprepare(res->axi_s_clk);
    - clk_disable_unprepare(res->ahb_clk);
    - clk_disable_unprepare(res->aux_clk);
    + clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
    }

    static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
    @@ -969,47 +953,15 @@ static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
    */
    usleep_range(2000, 2500);

    - ret = clk_prepare_enable(res->iface);
    - if (ret) {
    - dev_err(dev, "cannot prepare/enable core clock\n");
    - goto err_clk_iface;
    - }
    -
    - ret = clk_prepare_enable(res->axi_m_clk);
    - if (ret) {
    - dev_err(dev, "cannot prepare/enable core clock\n");
    - goto err_clk_axi_m;
    - }
    -
    - ret = clk_prepare_enable(res->axi_s_clk);
    - if (ret) {
    - dev_err(dev, "cannot prepare/enable axi slave clock\n");
    - goto err_clk_axi_s;
    - }
    -
    - ret = clk_prepare_enable(res->ahb_clk);
    - if (ret) {
    - dev_err(dev, "cannot prepare/enable ahb clock\n");
    - goto err_clk_ahb;
    - }
    -
    - ret = clk_prepare_enable(res->aux_clk);
    + ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
    if (ret) {
    - dev_err(dev, "cannot prepare/enable aux clock\n");
    - goto err_clk_aux;
    + dev_err(dev, "cannot prepare/enable clocks\n");
    + goto err_assert_resets;
    }

    return 0;

    -err_clk_aux:
    - clk_disable_unprepare(res->ahb_clk);
    -err_clk_ahb:
    - clk_disable_unprepare(res->axi_s_clk);
    -err_clk_axi_s:
    - clk_disable_unprepare(res->axi_m_clk);
    -err_clk_axi_m:
    - clk_disable_unprepare(res->iface);
    -err_clk_iface:
    +err_assert_resets:
    /*
    * Not checking for failure, will anyway return
    * the original failure in 'ret'.
    --
    2.25.1
    \
     
     \ /
      Last update: 2023-03-27 01:00    [W:3.320 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site