Commit f9799fcc authored by Stanimir Varbanov's avatar Stanimir Varbanov Committed by Mauro Carvalho Chehab

media: venus: firmware: register separate platform_device for firmware loader

This registers a firmware platform_device and associate it with
video-firmware DT subnode. Then calls dma configure to initialize
dma and iommu.
Signed-off-by: default avatarStanimir Varbanov <stanimir.varbanov@linaro.org>
Reviewed-by: default avatarAlexandre Courbot <acourbot@chromium.org>
Tested-by: default avatarAlexandre Courbot <acourbot@chromium.org>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent a4cf7e3c
...@@ -284,6 +284,14 @@ static int venus_probe(struct platform_device *pdev) ...@@ -284,6 +284,14 @@ static int venus_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_runtime_disable; goto err_runtime_disable;
ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
if (ret)
goto err_runtime_disable;
ret = venus_firmware_init(core);
if (ret)
goto err_runtime_disable;
ret = venus_boot(core); ret = venus_boot(core);
if (ret) if (ret)
goto err_runtime_disable; goto err_runtime_disable;
...@@ -308,10 +316,6 @@ static int venus_probe(struct platform_device *pdev) ...@@ -308,10 +316,6 @@ static int venus_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_core_deinit; goto err_core_deinit;
ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
if (ret)
goto err_dev_unregister;
ret = pm_runtime_put_sync(dev); ret = pm_runtime_put_sync(dev);
if (ret) if (ret)
goto err_dev_unregister; goto err_dev_unregister;
...@@ -347,6 +351,8 @@ static int venus_remove(struct platform_device *pdev) ...@@ -347,6 +351,8 @@ static int venus_remove(struct platform_device *pdev)
venus_shutdown(dev); venus_shutdown(dev);
of_platform_depopulate(dev); of_platform_depopulate(dev);
venus_firmware_deinit(core);
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
pm_runtime_disable(dev); pm_runtime_disable(dev);
......
...@@ -131,6 +131,9 @@ struct venus_core { ...@@ -131,6 +131,9 @@ struct venus_core {
struct device *dev_dec; struct device *dev_dec;
struct device *dev_enc; struct device *dev_enc;
unsigned int use_tz; unsigned int use_tz;
struct video_firmware {
struct device *dev;
} fw;
struct mutex lock; struct mutex lock;
struct list_head instances; struct list_head instances;
atomic_t insts_count; atomic_t insts_count;
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/of_device.h>
#include <linux/qcom_scm.h> #include <linux/qcom_scm.h>
#include <linux/sizes.h> #include <linux/sizes.h>
#include <linux/soc/qcom/mdt_loader.h> #include <linux/soc/qcom/mdt_loader.h>
...@@ -144,3 +146,56 @@ int venus_shutdown(struct device *dev) ...@@ -144,3 +146,56 @@ int venus_shutdown(struct device *dev)
{ {
return qcom_scm_pas_shutdown(VENUS_PAS_ID); return qcom_scm_pas_shutdown(VENUS_PAS_ID);
} }
int venus_firmware_init(struct venus_core *core)
{
struct platform_device_info info;
struct platform_device *pdev;
struct device_node *np;
int ret;
np = of_get_child_by_name(core->dev->of_node, "video-firmware");
if (!np) {
core->use_tz = true;
return 0;
}
memset(&info, 0, sizeof(info));
info.fwnode = &np->fwnode;
info.parent = core->dev;
info.name = np->name;
info.dma_mask = DMA_BIT_MASK(32);
pdev = platform_device_register_full(&info);
if (IS_ERR(pdev)) {
of_node_put(np);
return PTR_ERR(pdev);
}
pdev->dev.of_node = np;
ret = of_dma_configure(&pdev->dev, np, true);
if (ret) {
dev_err(core->dev, "dma configure fail\n");
goto err_unregister;
}
core->fw.dev = &pdev->dev;
of_node_put(np);
return 0;
err_unregister:
platform_device_unregister(pdev);
of_node_put(np);
return ret;
}
void venus_firmware_deinit(struct venus_core *core)
{
if (!core->fw.dev)
return;
platform_device_unregister(to_platform_device(core->fw.dev));
}
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
struct device; struct device;
int venus_firmware_init(struct venus_core *core);
void venus_firmware_deinit(struct venus_core *core);
int venus_boot(struct venus_core *core); int venus_boot(struct venus_core *core);
int venus_shutdown(struct device *dev); int venus_shutdown(struct device *dev);
int venus_set_hw_state(struct venus_core *core, bool suspend); int venus_set_hw_state(struct venus_core *core, bool suspend);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment