diff options
Diffstat (limited to 'target/linux/at91/patches-5.15/155-media-atmel-properly-get-pm_runtime.patch')
-rw-r--r-- | target/linux/at91/patches-5.15/155-media-atmel-properly-get-pm_runtime.patch | 159 |
1 files changed, 0 insertions, 159 deletions
diff --git a/target/linux/at91/patches-5.15/155-media-atmel-properly-get-pm_runtime.patch b/target/linux/at91/patches-5.15/155-media-atmel-properly-get-pm_runtime.patch deleted file mode 100644 index 58f90db46d..0000000000 --- a/target/linux/at91/patches-5.15/155-media-atmel-properly-get-pm_runtime.patch +++ /dev/null @@ -1,159 +0,0 @@ -From c7660cc977621c4a14d870d523918df067f0db39 Mon Sep 17 00:00:00 2001 -From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> -Date: Fri, 23 Apr 2021 16:47:42 +0200 -Subject: [PATCH 155/247] media: atmel: properly get pm_runtime - -There are several issues in the way the atmel driver handles -pm_runtime_get_sync(): - -- it doesn't check return codes; -- it doesn't properly decrement the usage_count on all places; -- it starts streaming even if pm_runtime_get_sync() fails. -- while it tries to get pm_runtime at the clock enable logic, - it doesn't check if the operation was suceeded. - -Replace all occurrences of it to use the new kAPI: -pm_runtime_resume_and_get(), which ensures that, if the -return code is not negative, the usage_count was incremented. - -With that, add additional checks when this is called, in order -to ensure that errors will be properly addressed. - -Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> ---- - drivers/media/platform/atmel/atmel-isc-base.c | 30 ++++++++++++++----- - drivers/media/platform/atmel/atmel-isi.c | 19 +++++++++--- - 2 files changed, 38 insertions(+), 11 deletions(-) - ---- a/drivers/media/platform/atmel/atmel-isc-base.c -+++ b/drivers/media/platform/atmel/atmel-isc-base.c -@@ -294,9 +294,13 @@ static int isc_wait_clk_stable(struct cl - static int isc_clk_prepare(struct clk_hw *hw) - { - struct isc_clk *isc_clk = to_isc_clk(hw); -+ int ret; - -- if (isc_clk->id == ISC_ISPCK) -- pm_runtime_get_sync(isc_clk->dev); -+ if (isc_clk->id == ISC_ISPCK) { -+ ret = pm_runtime_resume_and_get(isc_clk->dev); -+ if (ret < 0) -+ return ret; -+ } - - return isc_wait_clk_stable(hw); - } -@@ -353,9 +357,13 @@ static int isc_clk_is_enabled(struct clk - { - struct isc_clk *isc_clk = to_isc_clk(hw); - u32 status; -+ int ret; - -- if (isc_clk->id == ISC_ISPCK) -- pm_runtime_get_sync(isc_clk->dev); -+ if (isc_clk->id == ISC_ISPCK) { -+ ret = pm_runtime_resume_and_get(isc_clk->dev); -+ if (ret < 0) -+ return 0; -+ } - - regmap_read(isc_clk->regmap, ISC_CLKSR, &status); - -@@ -807,7 +815,12 @@ static int isc_start_streaming(struct vb - goto err_start_stream; - } - -- pm_runtime_get_sync(isc->dev); -+ ret = pm_runtime_resume_and_get(isc->dev); -+ if (ret < 0) { -+ v4l2_err(&isc->v4l2_dev, "RPM resume failed in subdev %d\n", -+ ret); -+ goto err_pm_get; -+ } - - ret = isc_configure(isc); - if (unlikely(ret)) -@@ -838,7 +851,7 @@ static int isc_start_streaming(struct vb - - err_configure: - pm_runtime_put_sync(isc->dev); -- -+err_pm_get: - v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0); - - err_start_stream: -@@ -1809,6 +1822,7 @@ static void isc_awb_work(struct work_str - u32 baysel; - unsigned long flags; - u32 min, max; -+ int ret; - - /* streaming is not active anymore */ - if (isc->stop) -@@ -1831,7 +1845,9 @@ static void isc_awb_work(struct work_str - ctrls->hist_id = hist_id; - baysel = isc->config.sd_format->cfa_baycfg << ISC_HIS_CFG_BAYSEL_SHIFT; - -- pm_runtime_get_sync(isc->dev); -+ ret = pm_runtime_resume_and_get(isc->dev); -+ if (ret < 0) -+ return; - - /* - * only update if we have all the required histograms and controls ---- a/drivers/media/platform/atmel/atmel-isi.c -+++ b/drivers/media/platform/atmel/atmel-isi.c -@@ -423,7 +423,9 @@ static int start_streaming(struct vb2_qu - struct frame_buffer *buf, *node; - int ret; - -- pm_runtime_get_sync(isi->dev); -+ ret = pm_runtime_resume_and_get(isi->dev); -+ if (ret < 0) -+ return ret; - - /* Enable stream on the sub device */ - ret = v4l2_subdev_call(isi->entity.subdev, video, s_stream, 1); -@@ -783,9 +785,10 @@ static int isi_enum_frameintervals(struc - return 0; - } - --static void isi_camera_set_bus_param(struct atmel_isi *isi) -+static int isi_camera_set_bus_param(struct atmel_isi *isi) - { - u32 cfg1 = 0; -+ int ret; - - /* set bus param for ISI */ - if (isi->pdata.hsync_act_low) -@@ -802,12 +805,16 @@ static void isi_camera_set_bus_param(str - cfg1 |= ISI_CFG1_THMASK_BEATS_16; - - /* Enable PM and peripheral clock before operate isi registers */ -- pm_runtime_get_sync(isi->dev); -+ ret = pm_runtime_resume_and_get(isi->dev); -+ if (ret < 0) -+ return ret; - - isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); - isi_writel(isi, ISI_CFG1, cfg1); - - pm_runtime_put(isi->dev); -+ -+ return 0; - } - - /* -----------------------------------------------------------------------*/ -@@ -1086,7 +1093,11 @@ static int isi_graph_notify_complete(str - dev_err(isi->dev, "No supported mediabus format found\n"); - return ret; - } -- isi_camera_set_bus_param(isi); -+ ret = isi_camera_set_bus_param(isi); -+ if (ret) { -+ dev_err(isi->dev, "Can't wake up device\n"); -+ return ret; -+ } - - ret = isi_set_default_fmt(isi); - if (ret) { |