Merge "video-driver: add mmrm query support"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
4f953651a9
@@ -341,6 +341,7 @@ enum msm_vidc_core_capability_type {
|
||||
CLK_FREQ_THRESHOLD,
|
||||
NON_FATAL_FAULTS,
|
||||
ENC_AUTO_FRAMERATE,
|
||||
MMRM,
|
||||
CORE_CAP_MAX,
|
||||
};
|
||||
|
||||
|
@@ -170,6 +170,29 @@ static int msm_vidc_register_video_device(struct msm_vidc_core *core,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vidc_check_mmrm_support(struct msm_vidc_core *core)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!core || !core->capabilities) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!core->capabilities[MMRM].value)
|
||||
goto exit;
|
||||
|
||||
/* Todo: Dependency on MMRM driver changes */
|
||||
// if (!mmrm_client_check_scaling_supported(MMRM_CLIENT_CLOCK, 0)) {
|
||||
// d_vpr_e("%s: MMRM not supported\n", __func__);
|
||||
// core->capabilities[MMRM].value = 0;
|
||||
// }
|
||||
|
||||
exit:
|
||||
d_vpr_h("%s: %d\n", __func__, core->capabilities[MMRM].value);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int msm_vidc_deinitialize_core(struct msm_vidc_core *core)
|
||||
{
|
||||
int rc = 0;
|
||||
@@ -393,6 +416,12 @@ static int msm_vidc_probe_video_device(struct platform_device *pdev)
|
||||
goto enc_reg_failed;
|
||||
}
|
||||
|
||||
rc = msm_vidc_check_mmrm_support(core);
|
||||
if (rc) {
|
||||
d_vpr_e("Failed to check MMRM scaling support\n");
|
||||
rc = 0; /* Ignore error */
|
||||
}
|
||||
|
||||
core->debugfs_root = msm_vidc_debugfs_init_core(core);
|
||||
if (!core->debugfs_root)
|
||||
d_vpr_h("Failed to init debugfs core\n");
|
||||
|
@@ -662,11 +662,15 @@ int __set_clk_rate(struct msm_vidc_core *core,
|
||||
struct mmrm_client *client;
|
||||
|
||||
/* not registered */
|
||||
if (!core || !cl || !cl->mmrm_client) {
|
||||
if (!core || !cl || !core->capabilities) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
client = cl->mmrm_client;
|
||||
|
||||
if (core->capabilities[MMRM].value && !cl->mmrm_client) {
|
||||
d_vpr_e("%s: invalid mmrm client\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* This conversion is necessary since we are scaling clock values based on
|
||||
@@ -681,13 +685,26 @@ int __set_clk_rate(struct msm_vidc_core *core,
|
||||
return 0;
|
||||
|
||||
d_vpr_p("Scaling clock %s to %llu, prev %llu\n", cl->name, rate, cl->prev);
|
||||
memset(&client_data, 0, sizeof(client_data));
|
||||
client_data.num_hw_blocks = 1;
|
||||
rc = mmrm_client_set_value(client, &client_data, rate);
|
||||
if (rc) {
|
||||
d_vpr_e("%s: Failed to set clock rate %llu %s: %d\n",
|
||||
__func__, rate, cl->name, rc);
|
||||
return rc;
|
||||
|
||||
if (core->capabilities[MMRM].value) {
|
||||
/* set clock rate to mmrm driver */
|
||||
client = cl->mmrm_client;
|
||||
memset(&client_data, 0, sizeof(client_data));
|
||||
client_data.num_hw_blocks = 1;
|
||||
rc = mmrm_client_set_value(client, &client_data, rate);
|
||||
if (rc) {
|
||||
d_vpr_e("%s: Failed to set mmrm clock rate %llu %s: %d\n",
|
||||
__func__, rate, cl->name, rc);
|
||||
return rc;
|
||||
}
|
||||
} else {
|
||||
/* set clock rate to clock driver */
|
||||
rc = clk_set_rate(cl->clk, rate);
|
||||
if (rc) {
|
||||
d_vpr_e("%s: Failed to set clock rate %llu %s: %d\n",
|
||||
__func__, rate, cl->name, rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
cl->prev = rate;
|
||||
return rc;
|
||||
@@ -1425,6 +1442,16 @@ static void __deregister_mmrm(struct msm_vidc_core *core)
|
||||
{
|
||||
struct clock_info *cl;
|
||||
|
||||
if (!core || !core->capabilities) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!core->capabilities[MMRM].value) {
|
||||
d_vpr_h("%s: MMRM not supported\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
venus_hfi_for_each_clock(core, cl) {
|
||||
if (cl->has_scaling && cl->mmrm_client) {
|
||||
mmrm_client_deregister(cl->mmrm_client);
|
||||
@@ -1438,6 +1465,16 @@ static int __register_mmrm(struct msm_vidc_core *core)
|
||||
int rc = 0;
|
||||
struct clock_info *cl;
|
||||
|
||||
if (!core ||!core->capabilities) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!core->capabilities[MMRM].value) {
|
||||
d_vpr_h("%s: MMRM not supported\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
venus_hfi_for_each_clock(core, cl) {
|
||||
struct mmrm_client_desc desc;
|
||||
char *name = (char *)desc.client_info.desc.name;
|
||||
|
Reference in New Issue
Block a user