summaryrefslogtreecommitdiff
path: root/drivers/media/video
diff options
context:
space:
mode:
authorSachin Nikam <snikam@nvidia.com>2011-06-27 16:44:06 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:29 -0800
commit3726bebe1d30d111b40671340103fa0ff2902836 (patch)
tree48d998d2fd31ef93283f0ef449229c000969b546 /drivers/media/video
parent3f59b2ced9ba392ea81f17d7f41f96a8e9158a25 (diff)
media: video: tegra: avp: get module clock freq
AVP wants to know the clock freq of the modules like VDE and AVP itself. Added interface to handle the get clock message from AVP. Bug 843882 Original-Change-Id: I3c07814fdb9d3b0c4aae11a431d0737a1c6d6014 Signed-off-by: Sachin Nikam <snikam@nvidia.com> Reviewed-on: http://git-master/r/38506 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: R4355b6e3e721900a100ba2ab56c5b5c5cf4e7055
Diffstat (limited to 'drivers/media/video')
-rw-r--r--drivers/media/video/tegra/avp/avp_msg.h2
-rw-r--r--drivers/media/video/tegra/avp/avp_svc.c39
2 files changed, 41 insertions, 0 deletions
diff --git a/drivers/media/video/tegra/avp/avp_msg.h b/drivers/media/video/tegra/avp/avp_msg.h
index c6685a235f5a..615d890d5444 100644
--- a/drivers/media/video/tegra/avp/avp_msg.h
+++ b/drivers/media/video/tegra/avp/avp_msg.h
@@ -71,6 +71,8 @@ enum {
SVC_DFS_GET_CLK_UTIL_RESPONSE = 36,
SVC_MODULE_CLOCK_SET = 37,
SVC_MODULE_CLOCK_SET_RESPONSE = 38,
+ SVC_MODULE_CLOCK_GET = 39,
+ SVC_MODULE_CLOCK_GET_RESPONSE = 40,
};
struct svc_msg {
diff --git a/drivers/media/video/tegra/avp/avp_svc.c b/drivers/media/video/tegra/avp/avp_svc.c
index 81564ed51b1c..715e948918be 100644
--- a/drivers/media/video/tegra/avp/avp_svc.c
+++ b/drivers/media/video/tegra/avp/avp_svc.c
@@ -51,6 +51,7 @@ enum {
CLK_REQUEST_VCP = 0,
CLK_REQUEST_BSEA = 1,
CLK_REQUEST_VDE = 2,
+ CLK_REQUEST_AVP = 3,
NUM_CLK_REQUESTS,
};
@@ -60,6 +61,10 @@ struct avp_module {
};
static struct avp_module avp_modules[] = {
+ [AVP_MODULE_ID_AVP] = {
+ .name = "cop",
+ .clk_req = CLK_REQUEST_AVP,
+ },
[AVP_MODULE_ID_VCP] = {
.name = "vcp",
.clk_req = CLK_REQUEST_VCP,
@@ -496,6 +501,36 @@ static void do_svc_unsupported_msg(struct avp_svc_info *avp_svc,
sizeof(resp), GFP_KERNEL);
}
+static void do_svc_module_clock_get(struct avp_svc_info *avp_svc,
+ struct svc_msg *_msg,
+ size_t len)
+{
+ struct svc_clock_ctrl *msg = (struct svc_clock_ctrl *)_msg;
+ struct svc_clock_ctrl_response resp;
+ struct avp_module *mod;
+ struct avp_clk *aclk;
+ int ret = 0;
+
+ mod = find_avp_module(avp_svc, msg->module_id);
+ if (!mod) {
+ pr_err("avp_svc: unknown module get clock requested: %d\n",
+ msg->module_id);
+ resp.err = AVP_ERR_EINVAL;
+ goto send_response;
+ }
+
+ mutex_lock(&avp_svc->clk_lock);
+ aclk = &avp_svc->clks[mod->clk_req];
+ resp.act_freq = clk_get_rate(aclk->clk);
+ mutex_unlock(&avp_svc->clk_lock);
+ resp.err = 0;
+
+send_response:
+ resp.svc_id = SVC_MODULE_CLOCK_GET_RESPONSE;
+ trpc_send_msg(avp_svc->rpc_node, avp_svc->cpu_ep, &resp,
+ sizeof(resp), GFP_KERNEL);
+}
+
static int dispatch_svc_message(struct avp_svc_info *avp_svc,
struct svc_msg *msg,
size_t len)
@@ -582,6 +617,10 @@ static int dispatch_svc_message(struct avp_svc_info *avp_svc,
DBG(AVP_DBG_TRACE_SVC, "%s: got module_clock_set\n", __func__);
do_svc_module_clock_set(avp_svc, msg, len);
break;
+ case SVC_MODULE_CLOCK_GET:
+ DBG(AVP_DBG_TRACE_SVC, "%s: got module_clock_get\n", __func__);
+ do_svc_module_clock_get(avp_svc, msg, len);
+ break;
default:
pr_warning("avp_svc: Unsupported SVC call 0x%x\n", msg->svc_id);
do_svc_unsupported_msg(avp_svc, msg->svc_id);