mbox series

[v2,0/5] media: intel/ipu6: initial ipu7 code sharing preparation

Message ID 20250428161643.321617-1-stanislaw.gruszka@linux.intel.com
Headers show
Series media: intel/ipu6: initial ipu7 code sharing preparation | expand

Message

Stanislaw Gruszka April 28, 2025, 4:16 p.m. UTC
Create ipu-isys.h and ipu-isys-subdev.c files that intention is to be
shared with incoming ipu7 driver. Do some cleanups on the way.

This is on top of:
https://git.linuxtv.org/sailus/media_tree.git/log/?h=devel
plus one patch:
https://lore.kernel.org/linux-media/20250317073856.162147-1-stanislaw.gruszka@linux.intel.com/

v1 -> v2:
  use ipu_isys_ prefix for common ipuX code


Stanislaw Gruszka (5):
  media: intel/ipu6: Separate ipu6 subdev functions
  media: intel/ipu6: Remove ipu6_isys dependency from ipu6_isys_subdev
  media: intel/ipu6: Remove redundant ipu6_isys_subdev_to_csi2 macro
  media: intel/ipu6: Rename ipu6_isys_subdev
  media: intel/ipu6: Move ipu_isys_subdev functions to common code

 drivers/media/pci/intel/ipu6/Makefile         |   3 +-
 .../media/pci/intel/ipu6/ipu-isys-subdev.c    | 255 ++++++++++++++++++
 drivers/media/pci/intel/ipu6/ipu-isys.h       |  44 +++
 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c |  31 +--
 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h |   7 +-
 .../media/pci/intel/ipu6/ipu6-isys-queue.c    |   6 +-
 .../media/pci/intel/ipu6/ipu6-isys-subdev.c   | 249 +----------------
 .../media/pci/intel/ipu6/ipu6-isys-subdev.h   |  40 +--
 .../media/pci/intel/ipu6/ipu6-isys-video.c    |  27 +-
 .../media/pci/intel/ipu6/ipu6-isys-video.h    |   4 +-
 drivers/media/pci/intel/ipu6/ipu6-isys.c      |   2 +-
 11 files changed, 338 insertions(+), 330 deletions(-)
 create mode 100644 drivers/media/pci/intel/ipu6/ipu-isys-subdev.c
 create mode 100644 drivers/media/pci/intel/ipu6/ipu-isys.h

Comments

Sakari Ailus May 2, 2025, 9:53 a.m. UTC | #1
Hi Stanislaw,

On Mon, Apr 28, 2025 at 06:16:40PM +0200, Stanislaw Gruszka wrote:
> isys back pointer of ipu6_isys_subdev structure is only used to get
> pointer to struct device. We can use device pointer directly, what
> would allow to refactor ipu6 subdev code to make it more independent.
> 
> Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
> ---
>  drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c   | 15 ++++-----------
>  drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c | 10 ++++------
>  drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h |  8 ++------
>  3 files changed, 10 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> index 685ef81969ac..543f81b1899f 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> @@ -98,12 +98,8 @@ s64 ipu6_isys_csi2_get_link_freq(struct ipu6_isys_csi2 *csi2)
>  static int csi2_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
>  				struct v4l2_event_subscription *sub)
>  {
> -	struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
> -	struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd);
> -	struct device *dev = &csi2->isys->adev->auxdev.dev;
> -
> -	dev_dbg(dev, "csi2 subscribe event(type %u id %u)\n",
> -		sub->type, sub->id);
> +	dev_dbg(sd->dev, "csi2 subscribe event(type %u id %u)\n", sub->type,
> +		sub->id);
>  
>  	switch (sub->type) {
>  	case V4L2_EVENT_FRAME_SYNC:
> @@ -402,8 +398,6 @@ static int ipu6_isys_csi2_set_sel(struct v4l2_subdev *sd,
>  				  struct v4l2_subdev_state *state,
>  				  struct v4l2_subdev_selection *sel)
>  {
> -	struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd);
> -	struct device *dev = &asd->isys->adev->auxdev.dev;
>  	struct v4l2_mbus_framefmt *sink_ffmt;
>  	struct v4l2_mbus_framefmt *src_ffmt;
>  	struct v4l2_rect *crop;
> @@ -442,7 +436,7 @@ static int ipu6_isys_csi2_set_sel(struct v4l2_subdev *sd,
>  		src_ffmt->code = ipu6_isys_convert_bayer_order(sink_ffmt->code,
>  							       sel->r.left,
>  							       sel->r.top);
> -	dev_dbg(dev, "set crop for %s sel: %d,%d,%d,%d code: 0x%x\n",
> +	dev_dbg(sd->dev, "set crop for %s sel: %d,%d,%d,%d code: 0x%x\n",
>  		sd->name, sel->r.left, sel->r.top, sel->r.width, sel->r.height,
>  		src_ffmt->code);
>  
> @@ -532,8 +526,7 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
>  	csi2->port = index;
>  
>  	csi2->asd.sd.entity.ops = &csi2_entity_ops;
> -	csi2->asd.isys = isys;
> -	ret = ipu6_isys_subdev_init(&csi2->asd, &csi2_sd_ops, 0,
> +	ret = ipu6_isys_subdev_init(&csi2->asd, dev, &csi2_sd_ops, 0,
>  				    NR_OF_CSI2_SINK_PADS, NR_OF_CSI2_SRC_PADS);
>  	if (ret)
>  		goto fail;
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> index e5ce76c17ca3..7c6125dc4af4 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> @@ -265,10 +265,9 @@ static const struct v4l2_subdev_internal_ops ipu6_isys_subdev_internal_ops = {
>  	.init_state = ipu6_isys_subdev_init_state,
>  };
>  
> -int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
> +int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,

I wouldn't pass a function arguments that it already has access to through
other means, i.e. dev in this case.

That being said, having a macro to obtain a struct device pointer based on
sub-device or isys could be nice, it could be called e.g.
ipu_isys_to_dev(). As this patch is simply moving the code around I'd add
this in a separate patch.

>  			  const struct v4l2_subdev_ops *ops,
> -			  unsigned int nr_ctrls,
> -			  unsigned int num_sink_pads,
> +			  unsigned int nr_ctrls, unsigned int num_sink_pads,
>  			  unsigned int num_source_pads)
>  {
>  	unsigned int num_pads = num_sink_pads + num_source_pads;
> @@ -281,12 +280,11 @@ int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
>  			 V4L2_SUBDEV_FL_HAS_EVENTS |
>  			 V4L2_SUBDEV_FL_STREAMS;
>  	asd->sd.owner = THIS_MODULE;
> -	asd->sd.dev = &asd->isys->adev->auxdev.dev;
> +	asd->sd.dev = dev;
>  	asd->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	asd->sd.internal_ops = &ipu6_isys_subdev_internal_ops;
>  
> -	asd->pad = devm_kcalloc(&asd->isys->adev->auxdev.dev, num_pads,
> -				sizeof(*asd->pad), GFP_KERNEL);
> +	asd->pad = devm_kcalloc(dev, num_pads, sizeof(*asd->pad), GFP_KERNEL);
>  	if (!asd->pad)
>  		return -ENOMEM;
>  
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> index 46a2ede867f0..732e6ecc927a 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h
> @@ -12,11 +12,8 @@
>  
>  #include "ipu-isys.h"
>  
> -struct ipu6_isys;
> -
>  struct ipu6_isys_subdev {
>  	struct v4l2_subdev sd;
> -	struct ipu6_isys *isys;
>  	u32 const *supported_codes;
>  	struct media_pad *pad;
>  	struct v4l2_ctrl_handler ctrl_handler;
> @@ -39,10 +36,9 @@ int ipu6_isys_subdev_enum_mbus_code(struct v4l2_subdev *sd,
>  				    struct v4l2_subdev_state *state,
>  				    struct v4l2_subdev_mbus_code_enum
>  				    *code);
> -int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd,
> +int ipu6_isys_subdev_init(struct ipu6_isys_subdev *asd, struct device *dev,
>  			  const struct v4l2_subdev_ops *ops,
> -			  unsigned int nr_ctrls,
> -			  unsigned int num_sink_pads,
> +			  unsigned int nr_ctrls, unsigned int num_sink_pads,
>  			  unsigned int num_source_pads);
>  void ipu6_isys_subdev_cleanup(struct ipu6_isys_subdev *asd);
>  #endif /* IPU6_ISYS_SUBDEV_H */