mbox series

[0/8] media: rzg2l-cru: Document RZ/G3E (CSI2, CRU)

Message ID 20250210114540.524790-1-tommaso.merciai.xr@bp.renesas.com
Headers show
Series media: rzg2l-cru: Document RZ/G3E (CSI2, CRU) | expand

Message

Tommaso Merciai Feb. 10, 2025, 11:45 a.m. UTC
Dear All,

In preparation of supporting the CRU/CSI2 IPs found into the Renesas RZ/G3E
SoC, this series adds support for CRU0 clocks and resets, adds also dt-bindings
for CRU and CSI2 IP and adds some fixes into rzg2l-csi2 and rzg2l-core drivers.

The series was tested in a out of tree branch with the following media
pipeline:

imx219 -> rzg3e CSI2 -> rzg3e CRU

Some logs:

root@smarc-rzg3e:~# media-ctl -p
Media controller API version 6.14.0

Media device information
------------------------
driver          rzg2l_cru
model           renesas,r9a09g047-cru
serial
bus info        platform:16000000.video
hw revision     0x0
driver version  6.14.0

Device topology
- entity 1: csi-16000400.csi2 (2 pads, 2 links, 0 routes)
            type V4L2 subdev subtype Unknown flags 0
            device node name /dev/v4l-subdev0
        pad0: Sink
                [stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
                <- "imx219 0-0010":0 [ENABLED,IMMUTABLE]
        pad1: Source
                [stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
                -> "cru-ip-16000000.video":0 [ENABLED,IMMUTABLE]

- entity 4: imx219 0-0010 (1 pad, 1 link, 0 routes)
            type V4L2 subdev subtype Sensor flags 0
            device node name /dev/v4l-subdev1
        pad0: Source
                [stream:0 fmt:SRGGB8_1X8/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range
                 crop.bounds:(8,8)/3280x2464
                 crop:(688,160)/1920x2160]
                -> "csi-16000400.csi2":0 [ENABLED,IMMUTABLE]

- entity 8: cru-ip-16000000.video (2 pads, 2 links, 0 routes)
            type V4L2 subdev subtype Unknown flags 0
            device node name /dev/v4l-subdev2
        pad0: Sink
                [stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
                <- "csi-16000400.csi2":1 [ENABLED,IMMUTABLE]
        pad1: Source
                [stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
                -> "CRU output":0 [ENABLED,IMMUTABLE]

- entity 17: CRU output (1 pad, 1 link)
             type Node subtype V4L flags 0
             device node name /dev/video0
        pad0: Sink
                <- "cru-ip-16000000.video":1 [ENABLED,IMMUTABLE]

root@smarc-rzg3e:~# v4l2-compliance
v4l2-compliance 1.26.1-5142, 64 bits, 64-bit time_t
v4l2-compliance SHA: 4aee01a02792 2023-12-12 21:40:38

Compliance test for rzg2l_cru device /dev/video0:

Driver Info:
        Driver name      : rzg2l_cru
        Card type        : RZG2L_CRU
        Bus info         : platform:16000000.video
        Driver version   : 6.14.0
        Capabilities     : 0xa4200001
        Serial           :
        Bus info         : platform:16000000.video
        Media version    : 6.14.0
        Hardware revision: 0x00000000 (0)
        Driver version   : 6.14.0
Interface Info:
        ID               : 0x03000013
        Type             : V4L Video
Entity Info:
        ID               : 0x00000011 (17)
        Name             : CRU output
        Function         : V4L2 I/O
        Pad 0x01000012   : 0: Sink, Must Connect
          Link 0x02000017: from remote pad 0x100000a of entity 'cru-ip-16000000.video' (Video Pixel Formatter): Data, Enabled, Immutable

Required ioctls:
        test MC information (see 'Media Driver Info' above): OK
        test VIDIOC_QUERYCAP: OK
        test invalid ioctls: OK

Allow for multiple opens:
        test second /dev/video0 open: OK
        test VIDIOC_QUERYCAP: OK
        test VIDIOC_G/S_PRIORITY: OK
        test for unlimited opens: OK

Debug ioctls:
        test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
        test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
        test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
        test VIDIOC_ENUMAUDIO: OK (Not Supported)
        test VIDIOC_G/S/ENUMINPUT: OK
        test VIDIOC_G/S_AUDIO: OK (Not Supported)
        Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
        test VIDIOC_G/S_MODULATOR: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_ENUMAUDOUT: OK (Not Supported)
        test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDOUT: OK (Not Supported)
        Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
        test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
        test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
        test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
        test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
        test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
        test VIDIOC_QUERYCTRL: OK (Not Supported)
        test VIDIOC_G/S_CTRL: OK (Not Supported)
        test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
        test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
        test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
        Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
        test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
        test VIDIOC_G/S_PARM: OK (Not Supported)
        test VIDIOC_G_FBUF: OK (Not Supported)
        test VIDIOC_G_FMT: OK
        test VIDIOC_TRY_FMT: OK
        test VIDIOC_S_FMT: OK
        test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
        test Cropping: OK (Not Supported)
        test Composing: OK (Not Supported)
        test Scaling: OK

Codec ioctls (Input 0):
        test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
        test VIDIOC_G_ENC_INDEX: OK (Not Supported)
        test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
        test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
        test CREATE_BUFS maximum buffers: OK
        test VIDIOC_EXPBUF: OK
        test Requests: OK (Not Supported)

Total for rzg2l_cru device /dev/video0: 47, Succeeded: 47, Failed: 0, Warnings: 0

root@smarc-rzg3e:~# v4l2-compliance -d /dev/v4l-subdev0

v4l2-compliance SHA: 4aee01a02792 2023-12-12 21:40:38

Compliance test for device /dev/v4l-subdev0:

Driver Info:
        Driver version   : 6.14.0
        Capabilities     : 0x00000000

Required ioctls:
        test VIDIOC_SUDBEV_QUERYCAP: OK
        test invalid ioctls: OK

Allow for multiple opens:
        test second /dev/v4l-subdev0 open: OK
        test VIDIOC_SUBDEV_QUERYCAP: OK
        test for unlimited opens: OK

Debug ioctls:
        test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
        test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
        test VIDIOC_ENUMAUDIO: OK (Not Supported)
        test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDIO: OK (Not Supported)
        Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
        test VIDIOC_G/S_MODULATOR: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_ENUMAUDOUT: OK (Not Supported)
        test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDOUT: OK (Not Supported)
        Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
        test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
        test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
        test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
        test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls:
        test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
        test VIDIOC_QUERYCTRL: OK (Not Supported)
        test VIDIOC_G/S_CTRL: OK (Not Supported)
        test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
        test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
        test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
        Standard Controls: 0 Private Controls: 0

Format ioctls:
        test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK (Not Supported)
        test VIDIOC_G/S_PARM: OK (Not Supported)
        test VIDIOC_G_FBUF: OK (Not Supported)
        test VIDIOC_G_FMT: OK (Not Supported)
        test VIDIOC_TRY_FMT: OK (Not Supported)
        test VIDIOC_S_FMT: OK (Not Supported)
        test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
        test Cropping: OK (Not Supported)
        test Composing: OK (Not Supported)
        test Scaling: OK (Not Supported)

Codec ioctls:
        test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
        test VIDIOC_G_ENC_INDEX: OK (Not Supported)
        test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
        test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK (Not Supported)
        test CREATE_BUFS maximum buffers: OK
        test VIDIOC_EXPBUF: OK (Not Supported)
        test Requests: OK (Not Supported)

Total for device /dev/v4l-subdev0: 44, Succeeded: 44, Failed: 0, Warnings: 0

root@smarc-rzg3e:~# v4l2-compliance -d /dev/v4l-subdev2
v4l2-compliance 1.26.1-5142, 64 [ 1509.489660] cru-ip-16000000.video: =================  START STATUS  =================
bits, 64-bit tim[ 1509.498500] cru-ip-16000000.video: ==================  END STATUS  ==================
e_t
v4l2-compliance SHA: 4aee01a02792 2023-12-12 21:40:38

Compliance test for rzg2l_cru device /dev/v4l-subdev2:

Driver Info:
        Driver version   : 6.14.0
        Capabilities     : 0x00000000
Media Driver Info:
        Driver name      : rzg2l_cru
        Model            : renesas,r9a09g047-cru
        Serial           :
        Bus info         : platform:16000000.video
        Media version    : 6.14.0
        Hardware revision: 0x00000000 (0)
        Driver version   : 6.14.0
Interface Info:
        ID               : 0x0300000f
        Type             : V4L Sub-Device
Entity Info:
        ID               : 0x00000008 (8)
        Name             : cru-ip-16000000.video
        Function         : Video Pixel Formatter
        Pad 0x01000009   : 0: Sink, Must Connect
          Link 0x02000015: from remote pad 0x1000003 of entity 'csi-16000400.csi2' (Video Interface Bridge): Data, Enabled, Immutable
        Pad 0x0100000a   : 1: Source, Must Connect
          Link 0x02000017: to remote pad 0x1000012 of entity 'CRU output' (V4L2 I/O): Data, Enabled, Immutable

Required ioctls:
        test MC information (see 'Media Driver Info' above): OK
        test VIDIOC_SUDBEV_QUERYCAP: OK
        test invalid ioctls: OK

Allow for multiple opens:
        test second /dev/v4l-subdev2 open: OK
        test VIDIOC_SUBDEV_QUERYCAP: OK
        test for unlimited opens: OK

Debug ioctls:
        test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
        test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
        test VIDIOC_ENUMAUDIO: OK (Not Supported)
        test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDIO: OK (Not Supported)
        Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
        test VIDIOC_G/S_MODULATOR: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_ENUMAUDOUT: OK (Not Supported)
        test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDOUT: OK (Not Supported)
        Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
        test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
        test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
        test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
        test VIDIOC_G/S_EDID: OK (Not Supported)

Sub-Device ioctls (Sink Pad 0):
        Try Stream 0
        test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
        test Try VIDIOC_SUBDEV_G/S_FMT: OK
        test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
        Active Stream 0
        test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
        test Active VIDIOC_SUBDEV_G/S_FMT: OK
        test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
        test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 1):
        Try Stream 0
        test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
        test Try VIDIOC_SUBDEV_G/S_FMT: OK
        test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
        Active Stream 0
        test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
        test Active VIDIOC_SUBDEV_G/S_FMT: OK
        test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
        test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Control ioctls:
        test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
        test VIDIOC_QUERYCTRL: OK (Not Supported)
        test VIDIOC_G/S_CTRL: OK (Not Supported)
        test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
        test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
        test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
        Standard Controls: 0 Private Controls: 0

Format ioctls:
        test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK (Not Supported)
        test VIDIOC_G/S_PARM: OK (Not Supported)
        test VIDIOC_G_FBUF: OK (Not Supported)
        test VIDIOC_G_FMT: OK (Not Supported)
        test VIDIOC_TRY_FMT: OK (Not Supported)
        test VIDIOC_S_FMT: OK (Not Supported)
        test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
        test Cropping: OK (Not Supported)
        test Composing: OK (Not Supported)
        test Scaling: OK (Not Supported)

Codec ioctls:
        test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
        test VIDIOC_G_ENC_INDEX: OK (Not Supported)
        test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
        test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK (Not Supported)
        test CREATE_BUFS maximum buffers: OK
        test VIDIOC_EXPBUF: OK (Not Supported)
        test Requests: OK (Not Supported)

Total for rzg2l_cru device /dev/v4l-subdev2: 59, Succeeded: 59, Failed: 0, Warnings: 0

Thanks & Regards,
Tommaso

Lad Prabhakar (3):
  media: dt-bindings: renesas,rzg2l-csi2: Document Renesas RZ/V2H(P) SoC
  media: rzg2l-cru: csi2: Use temporary variable for struct device in
    rzg2l_csi2_probe()
  media: rzg2l-cru: rzg2l-core: Use temporary variable for struct device
    in rzg2l_cru_probe()

Tommaso Merciai (5):
  clk: renesas: r9a09g047: Add support for CRU0 clocks, and resets
  media: dt-bindings: renesas,rzg2l-csi2: Document Renesas RZ/G3E CSI-2
    block
  media: dt-bindings: renesas,rzg2l-cru: Document Renesas RZ/G3E SoC
  media: rzg2l-cru: csi2: Use devm_pm_runtime_enable()
  media: rzg2l-cru: rzg2l-core: Use devm_pm_runtime_enable()

 .../bindings/media/renesas,rzg2l-cru.yaml     | 33 ++++++---
 .../bindings/media/renesas,rzg2l-csi2.yaml    | 67 ++++++++++++++-----
 drivers/clk/renesas/r9a09g047-cpg.c           | 24 +++++++
 .../platform/renesas/rzg2l-cru/rzg2l-core.c   | 32 ++++-----
 .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 38 +++++------
 5 files changed, 133 insertions(+), 61 deletions(-)

Comments

Krzysztof Kozlowski Feb. 13, 2025, 8:56 a.m. UTC | #1
On Mon, Feb 10, 2025 at 12:45:35PM +0100, Tommaso Merciai wrote:
> Document the CSI-2 block which is part of CRU found in Renesas RZ/G3E
> SoC.
> 
> The CSI-2 block on the RZ/G3E SoC is identical to one found on the
> RZ/V2H(P) SoC.
> 
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

From/SoB mismatch.

Best regards,
Krzysztof
Tommaso Merciai Feb. 13, 2025, 3:59 p.m. UTC | #2
Hi Krzysztof,

Thanks for your comment.

On Thu, Feb 13, 2025 at 09:56:58AM +0100, Krzysztof Kozlowski wrote:
> On Mon, Feb 10, 2025 at 12:45:35PM +0100, Tommaso Merciai wrote:
> > Document the CSI-2 block which is part of CRU found in Renesas RZ/G3E
> > SoC.
> > 
> > The CSI-2 block on the RZ/G3E SoC is identical to one found on the
> > RZ/V2H(P) SoC.
> > 
> > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> 
> From/SoB mismatch.

Ouch sorry, I miss this part on my new setup.
I'll fix that on v2 same of dt-bindings failure on 4/8.

> 
> Best regards,
> Krzysztof
> 

Thanks & Regards,
Tommaso
Laurent Pinchart Feb. 14, 2025, 12:47 a.m. UTC | #3
Hi Tommaso, Prabhakar,

Thank you for the patch.

On Mon, Feb 10, 2025 at 12:45:37PM +0100, Tommaso Merciai wrote:
> From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> 
> Use a temporary variable for the struct device pointers to avoid

s/temporary/local/ (in the subject message too).

> dereferencing.

The only advantage of this is shortened lines. That's a coding style
preference, and I'm fine with this patch, but the commit message should
mention this, not "avoid dereferencing".

> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> ---
>  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 31 ++++++++++---------
>  1 file changed, 16 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> index 881e910dce02..948f1917b830 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> @@ -764,10 +764,11 @@ static const struct media_entity_operations rzg2l_csi2_entity_ops = {
>  
>  static int rzg2l_csi2_probe(struct platform_device *pdev)
>  {
> +	struct device *dev = &pdev->dev;
>  	struct rzg2l_csi2 *csi2;
>  	int ret;
>  
> -	csi2 = devm_kzalloc(&pdev->dev, sizeof(*csi2), GFP_KERNEL);
> +	csi2 = devm_kzalloc(dev, sizeof(*csi2), GFP_KERNEL);
>  	if (!csi2)
>  		return -ENOMEM;
>  
> @@ -775,28 +776,28 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
>  	if (IS_ERR(csi2->base))
>  		return PTR_ERR(csi2->base);
>  
> -	csi2->cmn_rstb = devm_reset_control_get_exclusive(&pdev->dev, "cmn-rstb");
> +	csi2->cmn_rstb = devm_reset_control_get_exclusive(dev, "cmn-rstb");
>  	if (IS_ERR(csi2->cmn_rstb))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->cmn_rstb),
> +		return dev_err_probe(dev, PTR_ERR(csi2->cmn_rstb),
>  				     "Failed to get cpg cmn-rstb\n");
>  
> -	csi2->presetn = devm_reset_control_get_shared(&pdev->dev, "presetn");
> +	csi2->presetn = devm_reset_control_get_shared(dev, "presetn");
>  	if (IS_ERR(csi2->presetn))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->presetn),
> +		return dev_err_probe(dev, PTR_ERR(csi2->presetn),
>  				     "Failed to get cpg presetn\n");
>  
> -	csi2->sysclk = devm_clk_get(&pdev->dev, "system");
> +	csi2->sysclk = devm_clk_get(dev, "system");
>  	if (IS_ERR(csi2->sysclk))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->sysclk),
> +		return dev_err_probe(dev, PTR_ERR(csi2->sysclk),
>  				     "Failed to get system clk\n");
>  
> -	csi2->vclk = devm_clk_get(&pdev->dev, "video");
> +	csi2->vclk = devm_clk_get(dev, "video");
>  	if (IS_ERR(csi2->vclk))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->vclk),
> +		return dev_err_probe(dev, PTR_ERR(csi2->vclk),
>  				     "Failed to get video clock\n");
>  	csi2->vclk_rate = clk_get_rate(csi2->vclk);
>  
> -	csi2->dev = &pdev->dev;
> +	csi2->dev = dev;
>  
>  	platform_set_drvdata(pdev, csi2);
>  
> @@ -804,18 +805,18 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
>  	if (ret)
>  		return ret;
>  
> -	pm_runtime_enable(&pdev->dev);
> +	pm_runtime_enable(dev);
>  
>  	ret = rzg2l_validate_csi2_lanes(csi2);
>  	if (ret)
>  		goto error_pm;
>  
> -	csi2->subdev.dev = &pdev->dev;
> +	csi2->subdev.dev = dev;
>  	v4l2_subdev_init(&csi2->subdev, &rzg2l_csi2_subdev_ops);
>  	csi2->subdev.internal_ops = &rzg2l_csi2_internal_ops;
> -	v4l2_set_subdevdata(&csi2->subdev, &pdev->dev);
> +	v4l2_set_subdevdata(&csi2->subdev, dev);
>  	snprintf(csi2->subdev.name, sizeof(csi2->subdev.name),
> -		 "csi-%s", dev_name(&pdev->dev));
> +		 "csi-%s", dev_name(dev));
>  	csi2->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
>  
>  	csi2->subdev.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> @@ -852,7 +853,7 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
>  	v4l2_async_nf_cleanup(&csi2->notifier);
>  	media_entity_cleanup(&csi2->subdev.entity);
>  error_pm:
> -	pm_runtime_disable(&pdev->dev);
> +	pm_runtime_disable(dev);
>  
>  	return ret;
>  }
>
Laurent Pinchart Feb. 14, 2025, 12:49 a.m. UTC | #4
Hi Tommaso, Prabhakar,

Thank you for the patch.

On Mon, Feb 10, 2025 at 12:45:39PM +0100, Tommaso Merciai wrote:
> From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> 
> Use a temporary variable for the struct device pointers to avoid
> dereferencing.

Same comments as for 5/8.

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> ---
>  .../platform/renesas/rzg2l-cru/rzg2l-core.c   | 29 ++++++++++---------
>  1 file changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
> index 89be584a4988..70fed0ce45ea 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c
> @@ -240,10 +240,11 @@ static int rzg2l_cru_media_init(struct rzg2l_cru_dev *cru)
>  
>  static int rzg2l_cru_probe(struct platform_device *pdev)
>  {
> +	struct device *dev = &pdev->dev;
>  	struct rzg2l_cru_dev *cru;
>  	int irq, ret;
>  
> -	cru = devm_kzalloc(&pdev->dev, sizeof(*cru), GFP_KERNEL);
> +	cru = devm_kzalloc(dev, sizeof(*cru), GFP_KERNEL);
>  	if (!cru)
>  		return -ENOMEM;
>  
> @@ -251,32 +252,32 @@ static int rzg2l_cru_probe(struct platform_device *pdev)
>  	if (IS_ERR(cru->base))
>  		return PTR_ERR(cru->base);
>  
> -	cru->presetn = devm_reset_control_get_shared(&pdev->dev, "presetn");
> +	cru->presetn = devm_reset_control_get_shared(dev, "presetn");
>  	if (IS_ERR(cru->presetn))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(cru->presetn),
> +		return dev_err_probe(dev, PTR_ERR(cru->presetn),
>  				     "Failed to get cpg presetn\n");
>  
> -	cru->aresetn = devm_reset_control_get_exclusive(&pdev->dev, "aresetn");
> +	cru->aresetn = devm_reset_control_get_exclusive(dev, "aresetn");
>  	if (IS_ERR(cru->aresetn))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(cru->aresetn),
> +		return dev_err_probe(dev, PTR_ERR(cru->aresetn),
>  				     "Failed to get cpg aresetn\n");
>  
> -	cru->vclk = devm_clk_get(&pdev->dev, "video");
> +	cru->vclk = devm_clk_get(dev, "video");
>  	if (IS_ERR(cru->vclk))
> -		return dev_err_probe(&pdev->dev, PTR_ERR(cru->vclk),
> +		return dev_err_probe(dev, PTR_ERR(cru->vclk),
>  				     "Failed to get video clock\n");
>  
> -	cru->dev = &pdev->dev;
> -	cru->info = of_device_get_match_data(&pdev->dev);
> +	cru->dev = dev;
> +	cru->info = of_device_get_match_data(dev);
>  
>  	irq = platform_get_irq(pdev, 0);
>  	if (irq < 0)
>  		return irq;
>  
> -	ret = devm_request_irq(&pdev->dev, irq, rzg2l_cru_irq, 0,
> +	ret = devm_request_irq(dev, irq, rzg2l_cru_irq, 0,
>  			       KBUILD_MODNAME, cru);
>  	if (ret)
> -		return dev_err_probe(&pdev->dev, ret, "failed to request irq\n");
> +		return dev_err_probe(dev, ret, "failed to request irq\n");
>  
>  	platform_set_drvdata(pdev, cru);
>  
> @@ -285,8 +286,8 @@ static int rzg2l_cru_probe(struct platform_device *pdev)
>  		return ret;
>  
>  	cru->num_buf = RZG2L_CRU_HW_BUFFER_DEFAULT;
> -	pm_suspend_ignore_children(&pdev->dev, true);
> -	pm_runtime_enable(&pdev->dev);
> +	pm_suspend_ignore_children(dev, true);
> +	pm_runtime_enable(dev);
>  
>  	ret = rzg2l_cru_media_init(cru);
>  	if (ret)
> @@ -296,7 +297,7 @@ static int rzg2l_cru_probe(struct platform_device *pdev)
>  
>  error_dma_unregister:
>  	rzg2l_cru_dma_unregister(cru);
> -	pm_runtime_disable(&pdev->dev);
> +	pm_runtime_disable(dev);
>  
>  	return ret;
>  }
Tommaso Merciai Feb. 18, 2025, 12:12 p.m. UTC | #5
Hi Laurent,

Thanks for your review.

On Fri, Feb 14, 2025 at 02:47:29AM +0200, Laurent Pinchart wrote:
> Hi Tommaso, Prabhakar,
> 
> Thank you for the patch.
> 
> On Mon, Feb 10, 2025 at 12:45:37PM +0100, Tommaso Merciai wrote:
> > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > 
> > Use a temporary variable for the struct device pointers to avoid
> 
> s/temporary/local/ (in the subject message too).

I'll fix this in v2.
Thanks.

> 
> > dereferencing.
> 
> The only advantage of this is shortened lines. That's a coding style
> preference, and I'm fine with this patch, but the commit message should
> mention this, not "avoid dereferencing".

I will go for:

Use a local variable for the struct device pointers. This increases code
readability with shortened lines.

Thanks.
> 
> > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> > ---
> >  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 31 ++++++++++---------
> >  1 file changed, 16 insertions(+), 15 deletions(-)
> > 
> > diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> > index 881e910dce02..948f1917b830 100644
> > --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> > +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> > @@ -764,10 +764,11 @@ static const struct media_entity_operations rzg2l_csi2_entity_ops = {
> >  
> >  static int rzg2l_csi2_probe(struct platform_device *pdev)
> >  {
> > +	struct device *dev = &pdev->dev;
> >  	struct rzg2l_csi2 *csi2;
> >  	int ret;
> >  
> > -	csi2 = devm_kzalloc(&pdev->dev, sizeof(*csi2), GFP_KERNEL);
> > +	csi2 = devm_kzalloc(dev, sizeof(*csi2), GFP_KERNEL);
> >  	if (!csi2)
> >  		return -ENOMEM;
> >  
> > @@ -775,28 +776,28 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
> >  	if (IS_ERR(csi2->base))
> >  		return PTR_ERR(csi2->base);
> >  
> > -	csi2->cmn_rstb = devm_reset_control_get_exclusive(&pdev->dev, "cmn-rstb");
> > +	csi2->cmn_rstb = devm_reset_control_get_exclusive(dev, "cmn-rstb");
> >  	if (IS_ERR(csi2->cmn_rstb))
> > -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->cmn_rstb),
> > +		return dev_err_probe(dev, PTR_ERR(csi2->cmn_rstb),
> >  				     "Failed to get cpg cmn-rstb\n");
> >  
> > -	csi2->presetn = devm_reset_control_get_shared(&pdev->dev, "presetn");
> > +	csi2->presetn = devm_reset_control_get_shared(dev, "presetn");
> >  	if (IS_ERR(csi2->presetn))
> > -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->presetn),
> > +		return dev_err_probe(dev, PTR_ERR(csi2->presetn),
> >  				     "Failed to get cpg presetn\n");
> >  
> > -	csi2->sysclk = devm_clk_get(&pdev->dev, "system");
> > +	csi2->sysclk = devm_clk_get(dev, "system");
> >  	if (IS_ERR(csi2->sysclk))
> > -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->sysclk),
> > +		return dev_err_probe(dev, PTR_ERR(csi2->sysclk),
> >  				     "Failed to get system clk\n");
> >  
> > -	csi2->vclk = devm_clk_get(&pdev->dev, "video");
> > +	csi2->vclk = devm_clk_get(dev, "video");
> >  	if (IS_ERR(csi2->vclk))
> > -		return dev_err_probe(&pdev->dev, PTR_ERR(csi2->vclk),
> > +		return dev_err_probe(dev, PTR_ERR(csi2->vclk),
> >  				     "Failed to get video clock\n");
> >  	csi2->vclk_rate = clk_get_rate(csi2->vclk);
> >  
> > -	csi2->dev = &pdev->dev;
> > +	csi2->dev = dev;
> >  
> >  	platform_set_drvdata(pdev, csi2);
> >  
> > @@ -804,18 +805,18 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
> >  	if (ret)
> >  		return ret;
> >  
> > -	pm_runtime_enable(&pdev->dev);
> > +	pm_runtime_enable(dev);
> >  
> >  	ret = rzg2l_validate_csi2_lanes(csi2);
> >  	if (ret)
> >  		goto error_pm;
> >  
> > -	csi2->subdev.dev = &pdev->dev;
> > +	csi2->subdev.dev = dev;
> >  	v4l2_subdev_init(&csi2->subdev, &rzg2l_csi2_subdev_ops);
> >  	csi2->subdev.internal_ops = &rzg2l_csi2_internal_ops;
> > -	v4l2_set_subdevdata(&csi2->subdev, &pdev->dev);
> > +	v4l2_set_subdevdata(&csi2->subdev, dev);
> >  	snprintf(csi2->subdev.name, sizeof(csi2->subdev.name),
> > -		 "csi-%s", dev_name(&pdev->dev));
> > +		 "csi-%s", dev_name(dev));
> >  	csi2->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
> >  
> >  	csi2->subdev.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> > @@ -852,7 +853,7 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
> >  	v4l2_async_nf_cleanup(&csi2->notifier);
> >  	media_entity_cleanup(&csi2->subdev.entity);
> >  error_pm:
> > -	pm_runtime_disable(&pdev->dev);
> > +	pm_runtime_disable(dev);
> >  
> >  	return ret;
> >  }
> > 
> 
> -- 
> Regards,
> 
> Laurent Pinchart

Thanks & Regards,
Tommaso
Geert Uytterhoeven Feb. 20, 2025, 2:36 p.m. UTC | #6
On Mon, 10 Feb 2025 at 12:46, Tommaso Merciai <tomm.merciai@gmail.com> wrote:
> Add support for CRU0 clocks and resets along with the corresponding
> divider.
>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
i.e. will queue in renesas-clk for v6.15.

Gr{oetje,eeting}s,

                        Geert
Geert Uytterhoeven Feb. 20, 2025, 2:39 p.m. UTC | #7
Hi Biju,

On Mon, 10 Feb 2025 at 12:54, Biju Das <biju.das.jz@bp.renesas.com> wrote:
> > -----Original Message-----
> > From: Tommaso Merciai <tomm.merciai@gmail.com>
> > Sent: 10 February 2025 11:46
> > Subject: [PATCH 1/8] clk: renesas: r9a09g047: Add support for CRU0 clocks, and resets
> >
> > Add support for CRU0 clocks and resets along with the corresponding divider.
> >
> > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

> > --- a/drivers/clk/renesas/r9a09g047-cpg.c
> > +++ b/drivers/clk/renesas/r9a09g047-cpg.c
> > @@ -49,6 +53,12 @@ static const struct clk_div_table dtable_1_8[] = {
> >       {0, 0},
> >  };
> >
> > +static const struct clk_div_table dtable_2_4[] = {
> > +     {0, 2},
> > +     {1, 4},
> > +     {0, 0},
>
> Not sure {0, 2}, {1, 4}, {0, 0}, to make lines shorter?

All SoCs from the RZ/G2L and RZ/V2H families use this formatting style:

    git grep -wW clk_div_table -- drivers/clk/renesas/r9a0*

Gr{oetje,eeting}s,

                        Geert