Commit fd123a94 authored by Grygorii Strashko's avatar Grygorii Strashko Committed by David S. Miller

net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister

There are two issues with TI CPTS code which are reproducible when TI
CPSW ethX device passes few up/down iterations:
- cpts refclk prepare counter continuously incremented after each
up/down iteration;
- devm_clk_get(dev, "cpts") is called many times.

Hence, fix these issues by using clk_disable_unprepare() in
cpts_clk_release() and skipping devm_clk_get() if cpts refclk has been
acquired already.
Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Acked-by: default avatarRichard Cochran <richardcochran@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b63ba58e
...@@ -230,18 +230,20 @@ static void cpts_overflow_check(struct work_struct *work) ...@@ -230,18 +230,20 @@ static void cpts_overflow_check(struct work_struct *work)
static void cpts_clk_init(struct device *dev, struct cpts *cpts) static void cpts_clk_init(struct device *dev, struct cpts *cpts)
{ {
cpts->refclk = devm_clk_get(dev, "cpts"); if (!cpts->refclk) {
if (IS_ERR(cpts->refclk)) { cpts->refclk = devm_clk_get(dev, "cpts");
dev_err(dev, "Failed to get cpts refclk\n"); if (IS_ERR(cpts->refclk)) {
cpts->refclk = NULL; dev_err(dev, "Failed to get cpts refclk\n");
return; cpts->refclk = NULL;
return;
}
} }
clk_prepare_enable(cpts->refclk); clk_prepare_enable(cpts->refclk);
} }
static void cpts_clk_release(struct cpts *cpts) static void cpts_clk_release(struct cpts *cpts)
{ {
clk_disable(cpts->refclk); clk_disable_unprepare(cpts->refclk);
} }
static int cpts_match(struct sk_buff *skb, unsigned int ptp_class, static int cpts_match(struct sk_buff *skb, unsigned int ptp_class,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment