lkml.org 
[lkml]   [2018]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 2/5] net: macb: Support clock management for tsu_clk
    Date
    From: Harini Katakam <harinik@xilinx.com>

    TSU clock needs to be enabled/disabled as per support in devicetree
    and it should also be controlled during suspend/resume (WOL has no
    dependency on this clock).

    Signed-off-by: Harini Katakam <harinik@xilinx.com>
    ---
    drivers/net/ethernet/cadence/macb.h | 3 ++-
    drivers/net/ethernet/cadence/macb_main.c | 30 +++++++++++++++++++++++++-----
    2 files changed, 27 insertions(+), 6 deletions(-)

    diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h
    index 8665982..9e7fb14 100644
    --- a/drivers/net/ethernet/cadence/macb.h
    +++ b/drivers/net/ethernet/cadence/macb.h
    @@ -1074,7 +1074,7 @@ struct macb_config {
    unsigned int dma_burst_length;
    int (*clk_init)(struct platform_device *pdev, struct clk **pclk,
    struct clk **hclk, struct clk **tx_clk,
    - struct clk **rx_clk);
    + struct clk **rx_clk, struct clk **tsu_clk);
    int (*init)(struct platform_device *pdev);
    int jumbo_max_len;
    };
    @@ -1154,6 +1154,7 @@ struct macb {
    struct clk *hclk;
    struct clk *tx_clk;
    struct clk *rx_clk;
    + struct clk *tsu_clk;
    struct net_device *dev;
    union {
    struct macb_stats macb;
    diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
    index f4030c1..ae61927 100644
    --- a/drivers/net/ethernet/cadence/macb_main.c
    +++ b/drivers/net/ethernet/cadence/macb_main.c
    @@ -3245,7 +3245,7 @@ static void macb_probe_queues(void __iomem *mem,

    static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
    struct clk **hclk, struct clk **tx_clk,
    - struct clk **rx_clk)
    + struct clk **rx_clk, struct clk **tsu_clk)
    {
    struct macb_platform_data *pdata;
    int err;
    @@ -3279,6 +3279,10 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
    if (IS_ERR(*rx_clk))
    *rx_clk = NULL;

    + *tsu_clk = devm_clk_get(&pdev->dev, "tsu_clk");
    + if (IS_ERR(*tsu_clk))
    + *tsu_clk = NULL;
    +
    err = clk_prepare_enable(*pclk);
    if (err) {
    dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err);
    @@ -3303,8 +3307,17 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
    goto err_disable_txclk;
    }

    + err = clk_prepare_enable(*tsu_clk);
    + if (err) {
    + dev_err(&pdev->dev, "failed to enable tsu_clk (%u)\n", err);
    + goto err_disable_rxclk;
    + }
    +
    return 0;

    +err_disable_rxclk:
    + clk_disable_unprepare(*rx_clk);
    +
    err_disable_txclk:
    clk_disable_unprepare(*tx_clk);

    @@ -3754,13 +3767,14 @@ static const struct net_device_ops at91ether_netdev_ops = {

    static int at91ether_clk_init(struct platform_device *pdev, struct clk **pclk,
    struct clk **hclk, struct clk **tx_clk,
    - struct clk **rx_clk)
    + struct clk **rx_clk, struct clk **tsu_clk)
    {
    int err;

    *hclk = NULL;
    *tx_clk = NULL;
    *rx_clk = NULL;
    + *tsu_clk = NULL;

    *pclk = devm_clk_get(&pdev->dev, "ether_clk");
    if (IS_ERR(*pclk))
    @@ -3898,11 +3912,12 @@ static int macb_probe(struct platform_device *pdev)
    {
    const struct macb_config *macb_config = &default_gem_config;
    int (*clk_init)(struct platform_device *, struct clk **,
    - struct clk **, struct clk **, struct clk **)
    - = macb_config->clk_init;
    + struct clk **, struct clk **, struct clk **,
    + struct clk **) = macb_config->clk_init;
    int (*init)(struct platform_device *) = macb_config->init;
    struct device_node *np = pdev->dev.of_node;
    struct clk *pclk, *hclk = NULL, *tx_clk = NULL, *rx_clk = NULL;
    + struct clk *tsu_clk = NULL;
    unsigned int queue_mask, num_queues;
    struct macb_platform_data *pdata;
    bool native_io;
    @@ -3930,7 +3945,7 @@ static int macb_probe(struct platform_device *pdev)
    }
    }

    - err = clk_init(pdev, &pclk, &hclk, &tx_clk, &rx_clk);
    + err = clk_init(pdev, &pclk, &hclk, &tx_clk, &rx_clk, &tsu_clk);
    if (err)
    return err;

    @@ -3967,6 +3982,7 @@ static int macb_probe(struct platform_device *pdev)
    bp->hclk = hclk;
    bp->tx_clk = tx_clk;
    bp->rx_clk = rx_clk;
    + bp->tsu_clk = tsu_clk;
    if (macb_config)
    bp->jumbo_max_len = macb_config->jumbo_max_len;

    @@ -4064,6 +4080,7 @@ static int macb_probe(struct platform_device *pdev)
    clk_disable_unprepare(hclk);
    clk_disable_unprepare(pclk);
    clk_disable_unprepare(rx_clk);
    + clk_disable_unprepare(tsu_clk);

    return err;
    }
    @@ -4091,6 +4108,7 @@ static int macb_remove(struct platform_device *pdev)
    clk_disable_unprepare(bp->hclk);
    clk_disable_unprepare(bp->pclk);
    clk_disable_unprepare(bp->rx_clk);
    + clk_disable_unprepare(bp->tsu_clk);
    of_node_put(bp->phy_node);
    free_netdev(dev);
    }
    @@ -4117,6 +4135,7 @@ static int __maybe_unused macb_suspend(struct device *dev)
    clk_disable_unprepare(bp->pclk);
    clk_disable_unprepare(bp->rx_clk);
    }
    + clk_disable_unprepare(bp->tsu_clk);

    return 0;
    }
    @@ -4137,6 +4156,7 @@ static int __maybe_unused macb_resume(struct device *dev)
    clk_prepare_enable(bp->tx_clk);
    clk_prepare_enable(bp->rx_clk);
    }
    + clk_prepare_enable(bp->tsu_clk);

    netif_device_attach(netdev);

    --
    2.7.4
    \
     
     \ /
      Last update: 2018-03-22 14:54    [W:4.112 / U:0.420 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site