From: Rishikesh Donadkar <r-donadkar@ti.com>
To: Jai Luthra <jai.luthra@ideasonboard.com>,
Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>,
<jai.luthra@linux.dev>, <laurent.pinchart@ideasonboard.com>,
<mripard@kernel.org>, "Vignesh Raghavendra" <vigneshr@ti.com>
Cc: <y-abhilashchandra@ti.com>, <devarsht@ti.com>, <s-jain1@ti.com>,
<mchehab@kernel.org>, <robh@kernel.org>, <krzk+dt@kernel.org>,
<p.zabel@pengutronix.de>, <conor+dt@kernel.org>,
<sakari.ailus@linux.intel.com>, <hverkuil-cisco@xs4all.nl>,
<changhuang.liang@starfivetech.com>, <jack.zhu@starfivetech.com>,
<sjoerd@collabora.com>, <dan.carpenter@linaro.org>,
<hverkuil+cisco@kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-media@vger.kernel.org>, <devicetree@vger.kernel.org>
Subject: Re: [PATCH v8 17/18] media: ti: j721e-csi2rx: Support runtime suspend
Date: Mon, 29 Dec 2025 15:37:20 +0530 [thread overview]
Message-ID: <facbd20d-15ac-4aed-a95c-dacc0076ae5f@ti.com> (raw)
In-Reply-To: <176517937821.20066.4604793543801654609@freya>
On 08/12/25 13:06, Jai Luthra wrote:
> Hi Tomi,
Hi Jai, Tomi,
>
> Quoting Tomi Valkeinen (2025-12-01 18:52:36)
>> Hi,
>>
>> On 12/11/2025 13:54, Rishikesh Donadkar wrote:
>>> From: Jai Luthra <jai.luthra@ideasonboard.com>
>>>
>>> Add support for runtime power-management to enable powering off the
>>> shared power domain between Cadence CSI2RX and TI CSI2RX wrapper when
>>> the device(s) are not in use.
>>>
>>> When powering off the IP, the PSI-L endpoint loses the paired DMA
>>> channels. Thus we have to release the DMA channels at runtime suspend
>>> and request them again at resume.
>> I'm not an expert on the dmaengine, but to me this sounds like a bug in
>> the dma driver. It just sounds very wrong...
>>
> Cc: Vignesh
>
> IIRC this was done because on AM62 the CSI2RX is on a separate power domain
> and it uses DMA channels from the system-wide DMA engine.
>
> And as those two drivers have different set of users, we have situations
> where CSI2RX goes to runtime suspend state and turns off the power and
> clocks, while the DMA engine remains on as it has other users. This leads
> to the paired PSIL channels to become invalid, and needs a re-pairing.
>
> I am not an expert on DMA engine APIs to know how feasible it would be to
> do the book-keeping of the power state of various devices in the DMA driver
> and manage the re-pairing entirely there.
>
> On AM62A and later devices, there is a dedicated instance of the BCDMA
> engine for camera pipeline on the same power domain as CSI2RX, so this is
> not a problem. Rishikesh/Vignesh please correct me if I'm wrong, as it has
> been a while since I looked at this in depth.
>
>
>>> Tested-by: Rishikesh Donadkar <r-donadkar@ti.com>
>>> Reviewed-by: Rishikesh Donadkar <r-donadkar@ti.com>
>>> Signed-off-by: Jai Luthra <jai.luthra@ideasonboard.com>
>>> Signed-off-by: Rishikesh Donadkar <r-donadkar@ti.com>
>>> ---
>>> drivers/media/platform/ti/Kconfig | 1 +
>>> .../platform/ti/j721e-csi2rx/j721e-csi2rx.c | 55 ++++++++++++++++++-
>>> 2 files changed, 54 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/media/platform/ti/Kconfig b/drivers/media/platform/ti/Kconfig
>>> index 3bc4aa35887e6..a808063e24779 100644
>>> --- a/drivers/media/platform/ti/Kconfig
>>> +++ b/drivers/media/platform/ti/Kconfig
>>> @@ -70,6 +70,7 @@ config VIDEO_TI_J721E_CSI2RX
>>> depends on VIDEO_CADENCE_CSI2RX
>>> depends on PHY_CADENCE_DPHY_RX || COMPILE_TEST
>>> depends on ARCH_K3 || COMPILE_TEST
>>> + depends on PM
>>> select VIDEOBUF2_DMA_CONTIG
>>> select V4L2_FWNODE
>>> help
>>> diff --git a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c
>>> index 528041ee78cf3..21e032c64b901 100644
>>> --- a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c
>>> +++ b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c
>>> @@ -13,6 +13,7 @@
>>> #include <linux/module.h>
>>> #include <linux/of_platform.h>
>>> #include <linux/platform_device.h>
>>> +#include <linux/pm_runtime.h>
>>> #include <linux/property.h>
>>>
>>> #include <media/cadence/cdns-csi2rx.h>
>>> @@ -963,12 +964,16 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count)
>>> unsigned long flags;
>>> int ret = 0;
>>>
>>> + ret = pm_runtime_resume_and_get(csi->dev);
>>> + if (ret)
>>> + return ret;
>>> +
>>> spin_lock_irqsave(&dma->lock, flags);
>>> if (list_empty(&dma->queue))
>>> ret = -EIO;
>>> spin_unlock_irqrestore(&dma->lock, flags);
>>> if (ret)
>>> - return ret;
>>> + goto err;
>>>
>>> ret = video_device_pipeline_start(&ctx->vdev, &csi->pipe);
>>> if (ret)
>>> @@ -1024,6 +1029,8 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count)
>>> writel(0, csi->shim + SHIM_DMACNTX(ctx->idx));
>>> err:
>>> ti_csi2rx_cleanup_buffers(ctx, VB2_BUF_STATE_QUEUED);
>>> + pm_runtime_put(csi->dev);
>>> +
>>> return ret;
>>> }
>>>
>>> @@ -1055,6 +1062,7 @@ static void ti_csi2rx_stop_streaming(struct vb2_queue *vq)
>>>
>>> ti_csi2rx_stop_dma(ctx);
>>> ti_csi2rx_cleanup_buffers(ctx, VB2_BUF_STATE_ERROR);
>>> + pm_runtime_put(csi->dev);
>>> }
>>>
>>> static const struct vb2_ops csi_vb2_qops = {
>>> @@ -1261,7 +1269,9 @@ static void ti_csi2rx_cleanup_notifier(struct ti_csi2rx_dev *csi)
>>>
>>> static void ti_csi2rx_cleanup_ctx(struct ti_csi2rx_ctx *ctx)
>>> {
>>> - dma_release_channel(ctx->dma.chan);
>>> + if (!pm_runtime_status_suspended(ctx->csi->dev))
>>> + dma_release_channel(ctx->dma.chan);
>>> +
>>> vb2_queue_release(&ctx->vidq);
>>>
>>> video_unregister_device(&ctx->vdev);
>>> @@ -1512,6 +1522,39 @@ static int ti_csi2rx_init_ctx(struct ti_csi2rx_ctx *ctx)
>>> return ret;
>>> }
>>>
>>> +static int ti_csi2rx_runtime_suspend(struct device *dev)
>>> +{
>>> + struct ti_csi2rx_dev *csi = dev_get_drvdata(dev);
>>> + int i;
>>> +
>>> + if (csi->enable_count != 0)
>>> + return -EBUSY;
>>> +
>>> + for (i = 0; i < csi->num_ctx; i++)
>>> + dma_release_channel(csi->ctx[i].dma.chan);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int ti_csi2rx_runtime_resume(struct device *dev)
>>> +{
>>> + struct ti_csi2rx_dev *csi = dev_get_drvdata(dev);
>>> + int ret, i;
>>> +
>>> + for (i = 0; i < csi->num_ctx; i++) {
>>> + ret = ti_csi2rx_init_dma(&csi->ctx[i]);
>> If runtime_resume always requests the dma channels, is the call to
>> ti_csi2rx_init_dma() in ti_csi2rx_init_ctx() needed? If not, you could
>> inline the code from ti_csi2rx_init_dma() to here and also drop the
>> dma_release_channel() call from ti_csi2rx_cleanup_ctx(), making the flow
>> more understandable.
>>
> Makes sense.
>
>>> + if (ret)
>>> + return ret;
>>> + }
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static const struct dev_pm_ops ti_csi2rx_pm_ops = {
>>> + RUNTIME_PM_OPS(ti_csi2rx_runtime_suspend, ti_csi2rx_runtime_resume,
>>> + NULL)
>>> +};
>>> +
>>> static int ti_csi2rx_probe(struct platform_device *pdev)
>>> {
>>> struct device_node *np = pdev->dev.of_node;
>>> @@ -1579,6 +1622,10 @@ static int ti_csi2rx_probe(struct platform_device *pdev)
>>> goto err_notifier;
>>> }
>>>
>>> + pm_runtime_set_active(csi->dev);
>>> + pm_runtime_enable(csi->dev);
>>> + pm_request_idle(csi->dev);
>> I always forget what exactly the runtime_pm funcs do. What's the idea
>> here? If you do something else than the plain standard
>> pm_runtime_enable(), I think it's good to mention what/why in a comment.
>>
> https://docs.kernel.org/power/runtime_pm.html#runtime-pm-initialization-device-probing-and-removal
>
> The pm_request_idle() is done to queue up a job to suspend the hardware
> until userspace starts streaming, to save power.
>
> The runtime_set_active() is used because the power domain for CSI is by
> default turned on when system boots up. But Rishikesh, please double check
> that before v9 on AM62.
I checked with AM62 when booting up, with CSI drivers being probed/not
probed. The device state was OFF by default on boot in both cases. So,
plain pm_runtime_enable() should work. That will simplify the
dma_request/release_chan() calls in the runtime suspend/resume flow.
Thanks & Regards,
Rishikesh
>
>>> return 0;
>>>
>>> err_notifier:
>>> @@ -1609,6 +1656,9 @@ static void ti_csi2rx_remove(struct platform_device *pdev)
>>> mutex_destroy(&csi->mutex);
>>> dma_free_coherent(csi->dev, csi->drain.len, csi->drain.vaddr,
>>> csi->drain.paddr);
>>> + pm_runtime_disable(&pdev->dev);
>>> + pm_runtime_set_suspended(&pdev->dev);
>>> +
>>> }
>>>
>>> static const struct of_device_id ti_csi2rx_of_match[] = {
>>> @@ -1623,6 +1673,7 @@ static struct platform_driver ti_csi2rx_pdrv = {
>>> .driver = {
>>> .name = TI_CSI2RX_MODULE_NAME,
>>> .of_match_table = ti_csi2rx_of_match,
>>> + .pm = &ti_csi2rx_pm_ops,
>>> },
>>> };
>>>
next prev parent reply other threads:[~2025-12-29 10:07 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-12 11:54 [PATCH v8 00/18] media: cadence,ti: CSI2RX Multistream Support Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 01/18] media: ti: j721e-csi2rx: Remove word size alignment on frame width Rishikesh Donadkar
2025-11-20 11:58 ` Tomi Valkeinen
2025-11-12 11:54 ` [PATCH v8 02/18] dt-bindings: media: ti,j721e-csi2rx-shim: Support 32 dma chans Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 03/18] media: ti: j721e-csi2rx: separate out device and context Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 04/18] media: ti: j721e-csi2rx: prepare SHIM code for multiple contexts Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 05/18] media: ti: j721e-csi2rx: allocate DMA channel based on context index Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 06/18] media: ti: j721e-csi2rx: add a subdev for the core device Rishikesh Donadkar
2025-11-20 12:39 ` Sakari Ailus
2025-11-21 6:59 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 07/18] media: cadence: csi2rx: Move to .enable/disable_streams API Rishikesh Donadkar
2025-11-20 13:00 ` Tomi Valkeinen
2025-11-21 7:02 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 08/18] media: ti: j721e-csi2rx: " Rishikesh Donadkar
2025-11-20 12:40 ` Sakari Ailus
2025-11-21 7:04 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 09/18] media: ti: j721e-csi2rx: get number of contexts from device tree Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 10/18] media: cadence: csi2rx: add get_frame_desc wrapper Rishikesh Donadkar
2025-11-20 12:40 ` Tomi Valkeinen
2025-12-02 9:03 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 11/18] media: ti: j721e-csi2rx: add support for processing virtual channels Rishikesh Donadkar
2025-11-20 12:32 ` Tomi Valkeinen
2025-12-01 9:25 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 12/18] media: cadence: csi2rx: add multistream support Rishikesh Donadkar
2025-11-20 12:53 ` Sakari Ailus
2025-12-09 9:43 ` Rishikesh Donadkar
2025-12-29 11:14 ` Sakari Ailus
2025-11-20 13:14 ` Tomi Valkeinen
2025-12-09 9:45 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 13/18] media: ti: j721e-csi2rx: " Rishikesh Donadkar
2025-12-01 13:03 ` Tomi Valkeinen
2025-12-09 10:08 ` Rishikesh Donadkar
2025-12-09 10:36 ` Jai Luthra
2025-12-09 11:52 ` Tomi Valkeinen
2025-12-09 12:06 ` Jai Luthra
2025-11-12 11:54 ` [PATCH v8 14/18] media: ti: j721e-csi2rx: Submit all available buffers Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 15/18] media: ti: j721e-csi2rx: Change the drain architecture for multistream Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 16/18] media: cadence: csi2rx: Support runtime PM Rishikesh Donadkar
2025-12-01 13:11 ` Tomi Valkeinen
2025-12-18 5:35 ` Rishikesh Donadkar
2025-11-12 11:54 ` [PATCH v8 17/18] media: ti: j721e-csi2rx: Support runtime suspend Rishikesh Donadkar
2025-11-20 13:16 ` Sakari Ailus
2025-12-08 7:47 ` Jai Luthra
2025-12-08 9:39 ` Sakari Ailus
2025-12-01 13:22 ` Tomi Valkeinen
2025-12-08 7:36 ` Jai Luthra
2025-12-29 10:07 ` Rishikesh Donadkar [this message]
2025-11-12 11:54 ` [PATCH v8 18/18] media: ti: j721e-csi2rx: Support system suspend using pm_notifier Rishikesh Donadkar
2025-12-01 13:46 ` Tomi Valkeinen
2025-12-08 8:01 ` Jai Luthra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=facbd20d-15ac-4aed-a95c-dacc0076ae5f@ti.com \
--to=r-donadkar@ti.com \
--cc=changhuang.liang@starfivetech.com \
--cc=conor+dt@kernel.org \
--cc=dan.carpenter@linaro.org \
--cc=devarsht@ti.com \
--cc=devicetree@vger.kernel.org \
--cc=hverkuil+cisco@kernel.org \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jack.zhu@starfivetech.com \
--cc=jai.luthra@ideasonboard.com \
--cc=jai.luthra@linux.dev \
--cc=krzk+dt@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=mripard@kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=s-jain1@ti.com \
--cc=sakari.ailus@linux.intel.com \
--cc=sjoerd@collabora.com \
--cc=tomi.valkeinen@ideasonboard.com \
--cc=vigneshr@ti.com \
--cc=y-abhilashchandra@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox