Skip to content

Commit ea71631

Browse files
jernejskmchehab
authored andcommitted
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 <[email protected]> Reviewed-by: Andrzej Pietrasiewicz <[email protected]> Reviewed-by: Ezequiel Garcia <[email protected]> Signed-off-by: Hans Verkuil <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 37af43b commit ea71631

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

drivers/staging/media/hantro/hantro.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/videodev2.h>
1717
#include <linux/wait.h>
1818
#include <linux/clk.h>
19+
#include <linux/reset.h>
1920

2021
#include <media/v4l2-ctrls.h>
2122
#include <media/v4l2-device.h>
@@ -171,6 +172,7 @@ hantro_vdev_to_func(struct video_device *vdev)
171172
* @dev: Pointer to device for convenient logging using
172173
* dev_ macros.
173174
* @clocks: Array of clock handles.
175+
* @resets: Array of reset handles.
174176
* @reg_bases: Mapped addresses of VPU registers.
175177
* @enc_base: Mapped address of VPU encoder register for convenience.
176178
* @dec_base: Mapped address of VPU decoder register for convenience.
@@ -190,6 +192,7 @@ struct hantro_dev {
190192
struct platform_device *pdev;
191193
struct device *dev;
192194
struct clk_bulk_data *clocks;
195+
struct reset_control *resets;
193196
void __iomem **reg_bases;
194197
void __iomem *enc_base;
195198
void __iomem *dec_base;

drivers/staging/media/hantro/hantro_drv.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,10 @@ static int hantro_probe(struct platform_device *pdev)
905905
return PTR_ERR(vpu->clocks[0].clk);
906906
}
907907

908+
vpu->resets = devm_reset_control_array_get(&pdev->dev, false, true);
909+
if (IS_ERR(vpu->resets))
910+
return PTR_ERR(vpu->resets);
911+
908912
num_bases = vpu->variant->num_regs ?: 1;
909913
vpu->reg_bases = devm_kcalloc(&pdev->dev, num_bases,
910914
sizeof(*vpu->reg_bases), GFP_KERNEL);
@@ -978,10 +982,16 @@ static int hantro_probe(struct platform_device *pdev)
978982
pm_runtime_use_autosuspend(vpu->dev);
979983
pm_runtime_enable(vpu->dev);
980984

985+
ret = reset_control_deassert(vpu->resets);
986+
if (ret) {
987+
dev_err(&pdev->dev, "Failed to deassert resets\n");
988+
goto err_pm_disable;
989+
}
990+
981991
ret = clk_bulk_prepare(vpu->variant->num_clocks, vpu->clocks);
982992
if (ret) {
983993
dev_err(&pdev->dev, "Failed to prepare clocks\n");
984-
goto err_pm_disable;
994+
goto err_rst_assert;
985995
}
986996

987997
ret = v4l2_device_register(&pdev->dev, &vpu->v4l2_dev);
@@ -1037,6 +1047,8 @@ static int hantro_probe(struct platform_device *pdev)
10371047
v4l2_device_unregister(&vpu->v4l2_dev);
10381048
err_clk_unprepare:
10391049
clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks);
1050+
err_rst_assert:
1051+
reset_control_assert(vpu->resets);
10401052
err_pm_disable:
10411053
pm_runtime_dont_use_autosuspend(vpu->dev);
10421054
pm_runtime_disable(vpu->dev);
@@ -1056,6 +1068,7 @@ static int hantro_remove(struct platform_device *pdev)
10561068
v4l2_m2m_release(vpu->m2m_dev);
10571069
v4l2_device_unregister(&vpu->v4l2_dev);
10581070
clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks);
1071+
reset_control_assert(vpu->resets);
10591072
pm_runtime_dont_use_autosuspend(vpu->dev);
10601073
pm_runtime_disable(vpu->dev);
10611074
return 0;

0 commit comments

Comments
 (0)