Skip to content

Commit 687bfbb

Browse files
0xB0Dhverkuil
authored andcommitted
media: venus: Add support for static video encoder/decoder declarations
Add resource structure data and probe() logic to support static declarations of encoder and decoder. Right now we rely on video encoder/decoder selection happening in the dtb but, this goes against the remit of device tree which is supposed to describe hardware, not select functional logic in Linux drivers. Provide two strings in the venus resource structure enc_nodename and dec_nodename. When set the venus driver will create an OF entry in-memory consistent with: dec_nodename { compat = "video-decoder"; }; and/or enc_nodename { compat = "video-encoder"; }; This will allow us to reuse the existing driver scheme of relying on compat names maintaining compatibility with old dtb files. dec_nodename can be "video-decoder" or "video0" enc_nodename can be "video-encoder" or "video1" This change relies on of_changeset() API as a result select OF_DYNAMIC will be added to venus/Kconfig Tested-by: Renjiang Han <quic_renjiang@quicinc.com> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
1 parent daa7031 commit 687bfbb

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed

drivers/media/platform/qcom/venus/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ config VIDEO_QCOM_VENUS
33
depends on V4L_MEM2MEM_DRIVERS
44
depends on VIDEO_DEV && QCOM_SMEM
55
depends on (ARCH_QCOM && IOMMU_DMA) || COMPILE_TEST
6+
select OF_DYNAMIC if ARCH_QCOM
67
select QCOM_MDT_LOADER if ARCH_QCOM
78
select QCOM_SCM
89
select VIDEOBUF2_DMA_CONTIG

drivers/media/platform/qcom/venus/core.c

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,89 @@ static irqreturn_t venus_isr_thread(int irq, void *dev_id)
286286
return ret;
287287
}
288288

289+
#if defined(CONFIG_OF_DYNAMIC)
290+
static int venus_add_video_core(struct venus_core *core, const char *node_name,
291+
const char *compat)
292+
{
293+
struct of_changeset *ocs = core->ocs;
294+
struct device *dev = core->dev;
295+
struct device_node *np, *enp;
296+
int ret;
297+
298+
if (!node_name)
299+
return 0;
300+
301+
enp = of_find_node_by_name(dev->of_node, node_name);
302+
if (enp) {
303+
of_node_put(enp);
304+
return 0;
305+
}
306+
307+
np = of_changeset_create_node(ocs, dev->of_node, node_name);
308+
if (!np) {
309+
dev_err(dev, "Unable to create new node\n");
310+
return -ENODEV;
311+
}
312+
313+
ret = of_changeset_add_prop_string(ocs, np, "compatible", compat);
314+
if (ret)
315+
dev_err(dev, "unable to add %s\n", compat);
316+
317+
of_node_put(np);
318+
319+
return ret;
320+
}
321+
322+
static int venus_add_dynamic_nodes(struct venus_core *core)
323+
{
324+
struct device *dev = core->dev;
325+
int ret;
326+
327+
core->ocs = kmalloc(sizeof(*core->ocs), GFP_KERNEL);
328+
if (!core->ocs)
329+
return -ENOMEM;
330+
331+
of_changeset_init(core->ocs);
332+
333+
ret = venus_add_video_core(core, core->res->dec_nodename, "venus-decoder");
334+
if (ret)
335+
goto err;
336+
337+
ret = venus_add_video_core(core, core->res->enc_nodename, "venus-encoder");
338+
if (ret)
339+
goto err;
340+
341+
ret = of_changeset_apply(core->ocs);
342+
if (ret) {
343+
dev_err(dev, "applying changeset fail ret %d\n", ret);
344+
goto err;
345+
}
346+
347+
return 0;
348+
err:
349+
of_changeset_destroy(core->ocs);
350+
kfree(core->ocs);
351+
core->ocs = NULL;
352+
return ret;
353+
}
354+
355+
static void venus_remove_dynamic_nodes(struct venus_core *core)
356+
{
357+
if (core->ocs) {
358+
of_changeset_revert(core->ocs);
359+
of_changeset_destroy(core->ocs);
360+
kfree(core->ocs);
361+
}
362+
}
363+
#else
364+
static int venus_add_dynamic_nodes(struct venus_core *core)
365+
{
366+
return 0;
367+
}
368+
369+
static void venus_remove_dynamic_nodes(struct venus_core *core) {}
370+
#endif
371+
289372
static int venus_probe(struct platform_device *pdev)
290373
{
291374
struct device *dev = &pdev->dev;
@@ -365,9 +448,15 @@ static int venus_probe(struct platform_device *pdev)
365448
if (ret < 0)
366449
goto err_runtime_disable;
367450

451+
if (core->res->dec_nodename || core->res->enc_nodename) {
452+
ret = venus_add_dynamic_nodes(core);
453+
if (ret)
454+
goto err_runtime_disable;
455+
}
456+
368457
ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
369458
if (ret)
370-
goto err_runtime_disable;
459+
goto err_remove_dynamic_nodes;
371460

372461
ret = venus_firmware_init(core);
373462
if (ret)
@@ -411,6 +500,8 @@ static int venus_probe(struct platform_device *pdev)
411500
venus_firmware_deinit(core);
412501
err_of_depopulate:
413502
of_platform_depopulate(dev);
503+
err_remove_dynamic_nodes:
504+
venus_remove_dynamic_nodes(core);
414505
err_runtime_disable:
415506
pm_runtime_put_noidle(dev);
416507
pm_runtime_disable(dev);
@@ -443,6 +534,8 @@ static void venus_remove(struct platform_device *pdev)
443534

444535
venus_firmware_deinit(core);
445536

537+
venus_remove_dynamic_nodes(core);
538+
446539
pm_runtime_put_sync(dev);
447540
pm_runtime_disable(dev);
448541

drivers/media/platform/qcom/venus/core.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ struct venus_resources {
9090
u32 cp_nonpixel_start;
9191
u32 cp_nonpixel_size;
9292
const char *fwname;
93+
const char *enc_nodename;
94+
const char *dec_nodename;
9395
};
9496

9597
enum venus_fmt {
@@ -169,6 +171,7 @@ struct venus_format {
169171
* @root: debugfs root directory
170172
* @venus_ver: the venus firmware version
171173
* @dump_core: a flag indicating that a core dump is required
174+
* @ocs: OF changeset pointer
172175
*/
173176
struct venus_core {
174177
void __iomem *base;
@@ -231,6 +234,7 @@ struct venus_core {
231234
u32 rev;
232235
} venus_ver;
233236
unsigned long dump_core;
237+
struct of_changeset *ocs;
234238
};
235239

236240
struct vdec_controls {

0 commit comments

Comments
 (0)