mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 13:29:17 -04:00
media: platform: mtk-mdp3: add support for blending multiple components
Certain chips can combine several components to form complex virtual units with advanced functions. These components require simultaneous configuration of their MODs and clocks. Signed-off-by: Moudy Ho <moudy.ho@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
bd2fac0048
commit
d97fd41e83
@@ -110,17 +110,25 @@ static int mdp_path_subfrm_require(const struct mdp_path *path,
|
||||
/* Set mutex mod */
|
||||
for (index = 0; index < num_comp; index++) {
|
||||
s32 inner_id = MDP_COMP_NONE;
|
||||
const u32 *mutex_idx;
|
||||
const struct mdp_comp_blend *b;
|
||||
|
||||
if (CFG_CHECK(MT8183, p_id))
|
||||
inner_id = CFG_GET(MT8183, path->config, components[index].type);
|
||||
if (mdp_cfg_comp_is_dummy(path->mdp_dev, inner_id))
|
||||
continue;
|
||||
|
||||
ctx = &path->comps[index];
|
||||
if (is_output_disabled(p_id, ctx->param, count))
|
||||
continue;
|
||||
id = ctx->comp->public_id;
|
||||
mtk_mutex_write_mod(mutex, data->mdp_mutex_table_idx[id], false);
|
||||
|
||||
mutex_idx = data->mdp_mutex_table_idx;
|
||||
id = ctx->comp->public_id;
|
||||
mtk_mutex_write_mod(mutex, mutex_idx[id], false);
|
||||
|
||||
b = &data->comp_data[id].blend;
|
||||
if (b && b->aid_mod)
|
||||
mtk_mutex_write_mod(mutex, mutex_idx[b->b_id], false);
|
||||
}
|
||||
|
||||
mtk_mutex_write_sof(mutex, MUTEX_SOF_IDX_SINGLE_MODE);
|
||||
|
||||
@@ -864,12 +864,26 @@ int mdp_comp_clocks_on(struct device *dev, struct mdp_comp *comps, int num)
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
struct mdp_dev *m = comps[i].mdp_dev;
|
||||
enum mtk_mdp_comp_id id;
|
||||
const struct mdp_comp_blend *b;
|
||||
|
||||
/* Bypass the dummy component*/
|
||||
if (!comps[i].mdp_dev)
|
||||
if (!m)
|
||||
continue;
|
||||
|
||||
ret = mdp_comp_clock_on(dev, &comps[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
id = comps[i].public_id;
|
||||
b = &m->mdp_data->comp_data[id].blend;
|
||||
|
||||
if (b && b->aid_clk) {
|
||||
ret = mdp_comp_clock_on(dev, m->comp[b->b_id]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -880,10 +894,21 @@ void mdp_comp_clocks_off(struct device *dev, struct mdp_comp *comps, int num)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
struct mdp_dev *m = comps[i].mdp_dev;
|
||||
enum mtk_mdp_comp_id id;
|
||||
const struct mdp_comp_blend *b;
|
||||
|
||||
/* Bypass the dummy component*/
|
||||
if (!comps[i].mdp_dev)
|
||||
if (!m)
|
||||
continue;
|
||||
|
||||
mdp_comp_clock_off(dev, &comps[i]);
|
||||
|
||||
id = comps[i].public_id;
|
||||
b = &m->mdp_data->comp_data[id].blend;
|
||||
|
||||
if (b && b->aid_clk)
|
||||
mdp_comp_clock_off(dev, m->comp[b->b_id]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -201,9 +201,16 @@ struct mdp_comp_info {
|
||||
u32 dts_reg_ofst;
|
||||
};
|
||||
|
||||
struct mdp_comp_blend {
|
||||
enum mtk_mdp_comp_id b_id;
|
||||
bool aid_mod;
|
||||
bool aid_clk;
|
||||
};
|
||||
|
||||
struct mdp_comp_data {
|
||||
struct mdp_comp_match match;
|
||||
struct mdp_comp_info info;
|
||||
struct mdp_comp_blend blend;
|
||||
};
|
||||
|
||||
struct mdp_comp_ops;
|
||||
|
||||
Reference in New Issue
Block a user