media: hantro: add support for reset lines
Some SoCs like Allwinner H6 use reset lines for resetting Hantro G2. Add support for them. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
37af43b250
commit
ea71631b71
|
@ -16,6 +16,7 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-device.h>
|
||||
|
@ -171,6 +172,7 @@ hantro_vdev_to_func(struct video_device *vdev)
|
|||
* @dev: Pointer to device for convenient logging using
|
||||
* dev_ macros.
|
||||
* @clocks: Array of clock handles.
|
||||
* @resets: Array of reset handles.
|
||||
* @reg_bases: Mapped addresses of VPU registers.
|
||||
* @enc_base: Mapped address of VPU encoder register for convenience.
|
||||
* @dec_base: Mapped address of VPU decoder register for convenience.
|
||||
|
@ -190,6 +192,7 @@ struct hantro_dev {
|
|||
struct platform_device *pdev;
|
||||
struct device *dev;
|
||||
struct clk_bulk_data *clocks;
|
||||
struct reset_control *resets;
|
||||
void __iomem **reg_bases;
|
||||
void __iomem *enc_base;
|
||||
void __iomem *dec_base;
|
||||
|
|
|
@ -905,6 +905,10 @@ static int hantro_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(vpu->clocks[0].clk);
|
||||
}
|
||||
|
||||
vpu->resets = devm_reset_control_array_get(&pdev->dev, false, true);
|
||||
if (IS_ERR(vpu->resets))
|
||||
return PTR_ERR(vpu->resets);
|
||||
|
||||
num_bases = vpu->variant->num_regs ?: 1;
|
||||
vpu->reg_bases = devm_kcalloc(&pdev->dev, num_bases,
|
||||
sizeof(*vpu->reg_bases), GFP_KERNEL);
|
||||
|
@ -978,10 +982,16 @@ static int hantro_probe(struct platform_device *pdev)
|
|||
pm_runtime_use_autosuspend(vpu->dev);
|
||||
pm_runtime_enable(vpu->dev);
|
||||
|
||||
ret = reset_control_deassert(vpu->resets);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to deassert resets\n");
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
ret = clk_bulk_prepare(vpu->variant->num_clocks, vpu->clocks);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to prepare clocks\n");
|
||||
goto err_pm_disable;
|
||||
goto err_rst_assert;
|
||||
}
|
||||
|
||||
ret = v4l2_device_register(&pdev->dev, &vpu->v4l2_dev);
|
||||
|
@ -1037,6 +1047,8 @@ err_v4l2_unreg:
|
|||
v4l2_device_unregister(&vpu->v4l2_dev);
|
||||
err_clk_unprepare:
|
||||
clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks);
|
||||
err_rst_assert:
|
||||
reset_control_assert(vpu->resets);
|
||||
err_pm_disable:
|
||||
pm_runtime_dont_use_autosuspend(vpu->dev);
|
||||
pm_runtime_disable(vpu->dev);
|
||||
|
@ -1056,6 +1068,7 @@ static int hantro_remove(struct platform_device *pdev)
|
|||
v4l2_m2m_release(vpu->m2m_dev);
|
||||
v4l2_device_unregister(&vpu->v4l2_dev);
|
||||
clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks);
|
||||
reset_control_assert(vpu->resets);
|
||||
pm_runtime_dont_use_autosuspend(vpu->dev);
|
||||
pm_runtime_disable(vpu->dev);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue