struct avp_clk clks[NUM_CLK_REQUESTS];
/* used for dvfs */
struct clk *sclk;
+ struct clk *emcclk;
struct mutex clk_lock;
aclk = &avp_svc->clks[mod->clk_req];
if (msg->enable) {
if (aclk->refcnt++ == 0) {
+ clk_enable(avp_svc->emcclk);
clk_enable(avp_svc->sclk);
clk_enable(aclk->clk);
}
} else if (--aclk->refcnt == 0) {
clk_disable(aclk->clk);
clk_disable(avp_svc->sclk);
+ clk_disable(avp_svc->emcclk);
}
}
mutex_unlock(&avp_svc->clk_lock);
pr_info("%s: remote left clock '%s' on\n", __func__,
aclk->mod->name);
clk_disable(aclk->clk);
- /* sclk was enabled once for every clock */
+ /* sclk/emcclk was enabled once for every clock */
clk_disable(avp_svc->sclk);
+ clk_disable(avp_svc->emcclk);
}
aclk->refcnt = 0;
}
ret = -ENOENT;
goto err_get_clks;
}
+
+ avp_svc->emcclk = clk_get(&pdev->dev, "emc");
+ if (IS_ERR(avp_svc->emcclk)) {
+ pr_err("avp_svc: Couldn't get emcclk for dvfs\n");
+ ret = -ENOENT;
+ goto err_get_clks;
+ }
+
+ /*
+ * The emc is a shared clock, it will be set to the highest
+ * requested rate from any user. Set the rate to ULONG_MAX to
+ * always request the max rate whenever this request is enabled
+ */
+ clk_set_rate(avp_svc->emcclk, ULONG_MAX);
+
avp_svc->rpc_node = rpc_node;
mutex_init(&avp_svc->clk_lock);
clk_put(avp_svc->clks[i].clk);
if (!IS_ERR_OR_NULL(avp_svc->sclk))
clk_put(avp_svc->sclk);
+ if (!IS_ERR_OR_NULL(avp_svc->emcclk))
+ clk_put(avp_svc->emcclk);
err_alloc:
return ERR_PTR(ret);
}
for (i = 0; i < NUM_CLK_REQUESTS; i++)
clk_put(avp_svc->clks[i].clk);
clk_put(avp_svc->sclk);
+ clk_put(avp_svc->emcclk);
kfree(avp_svc);
}