diff options
author | Bryan O'Donoghue <bryan.odonoghue@linaro.org> | 2022-07-11 18:16:43 +0100 |
---|---|---|
committer | Bryan O'Donoghue <bryan.odonoghue@linaro.org> | 2023-01-10 10:56:28 +0000 |
commit | ab0d8bafc399e969333d274510c8e1b258281e77 (patch) | |
tree | 4447acc6d8a02be30f247bf225c1759ac0bf776a | |
parent | 7d0d51671e231c32906628c4d60473ff6cc8975e (diff) |
media: venus: pm: Add V2 individual core get and power callbacks
msm8936/msm8939 have 2 x HFI 2xx cores which can be arranged as encoder and
decoder like versions 3xx and later.
Similar to 3xx and later we have
- A power domain per core
- A clock per core
But unlike 3xx we do not have a specific encoder start/stop command
address.
Add in callbacks for HFI V2xx compliant hardware to optionally set a
power-domain and clock for the encoder and decoder cores individually.
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
-rw-r--r-- | drivers/media/platform/qcom/venus/pm_helpers.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c index 48c9084bb4db..0ef5251099c3 100644 --- a/drivers/media/platform/qcom/venus/pm_helpers.c +++ b/drivers/media/platform/qcom/venus/pm_helpers.c @@ -322,10 +322,56 @@ static int core_power_v1(struct venus_core *core, int on) return ret; } +static int vdec_get_v1(struct device *dev) +{ + struct venus_core *core = dev_get_drvdata(dev); + + return vcodec_clks_get(core, dev, core->vcodec0_clks, + core->res->vcodec0_clks); +} + +static int vdec_power_v1(struct device *dev, int on) +{ + struct venus_core *core = dev_get_drvdata(dev); + int ret = 0; + + if (on == POWER_ON) + ret = vcodec_clks_enable(core, core->vcodec0_clks); + else + vcodec_clks_disable(core, core->vcodec0_clks); + + return ret; +} + +static int venc_get_v1(struct device *dev) +{ + struct venus_core *core = dev_get_drvdata(dev); + + return vcodec_clks_get(core, dev, core->vcodec1_clks, + core->res->vcodec1_clks); +} + +static int venc_power_v1(struct device *dev, int on) +{ + struct venus_core *core = dev_get_drvdata(dev); + int ret = 0; + + if (on == POWER_ON) + ret = vcodec_clks_enable(core, core->vcodec1_clks); + else + vcodec_clks_disable(core, core->vcodec1_clks); + + return ret; +} + static const struct venus_pm_ops pm_ops_v1 = { .core_get = core_get_v1, .core_put = core_put_v1, .core_power = core_power_v1, + .vdec_get = vdec_get_v1, + .vdec_power = vdec_power_v1, + .venc_get = venc_get_v1, + .venc_power = venc_power_v1, .load_scale = load_scale_v1, }; |