diff mbox series

[v4,1/1] media: v4l2-subdev: Rename .init_cfg() operation to .init_state()

Message ID 20231127090744.30012-2-laurent.pinchart@ideasonboard.com (mailing list archive)
State New
Headers show
Series media: v4l2-subdev: Make .init_cfg() an internal operation | expand

Commit Message

Laurent Pinchart Nov. 27, 2023, 9:07 a.m. UTC
The subdev .init_cfg() operation is affected by two issues:

- It has long been extended to initialize a whole v4l2_subdev_state
  instead of just a v4l2_subdev_pad_config, but its name has stuck
  around.

- Despite operating on a whole subdev state and not being directly
  exposed to the subdev users (either in-kernel or through the userspace
  API), .init_cfg() is categorized as a subdev pad operation.

This participates in making the subdev API confusing for new developers.
Fix it by renaming the operation to .init_state(), and make it a subdev
internal operation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
---
Changes since v3:

- Rebase on top of the new stm32-dcmipp driver
- Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
  rebase

Changes since v2:

- Rebase on top of the latest media tree

Changes since v1:

- Fix compilation of the vsp1 driver
---
 drivers/media/i2c/adv7180.c                   | 10 ++--
 drivers/media/i2c/ccs/ccs-core.c              |  6 +--
 drivers/media/i2c/ds90ub913.c                 | 10 ++--
 drivers/media/i2c/ds90ub953.c                 | 10 ++--
 drivers/media/i2c/ds90ub960.c                 | 11 ++--
 drivers/media/i2c/gc2145.c                    | 10 ++--
 drivers/media/i2c/hi846.c                     | 10 ++--
 drivers/media/i2c/imx214.c                    | 12 +++--
 drivers/media/i2c/imx219.c                    |  9 ++--
 drivers/media/i2c/imx290.c                    | 10 ++--
 drivers/media/i2c/imx296.c                    | 10 ++--
 drivers/media/i2c/imx334.c                    | 12 +++--
 drivers/media/i2c/imx335.c                    | 12 +++--
 drivers/media/i2c/imx412.c                    | 12 +++--
 drivers/media/i2c/imx415.c                    | 10 ++--
 drivers/media/i2c/mt9m001.c                   | 10 ++--
 drivers/media/i2c/mt9m111.c                   | 10 ++--
 drivers/media/i2c/mt9m114.c                   | 16 +++---
 drivers/media/i2c/mt9p031.c                   |  8 +--
 drivers/media/i2c/mt9v111.c                   | 10 ++--
 drivers/media/i2c/ov01a10.c                   | 10 ++--
 drivers/media/i2c/ov02a10.c                   | 10 ++--
 drivers/media/i2c/ov2640.c                    | 10 ++--
 drivers/media/i2c/ov2680.c                    | 10 ++--
 drivers/media/i2c/ov2740.c                    | 10 ++--
 drivers/media/i2c/ov5640.c                    | 10 ++--
 drivers/media/i2c/ov5645.c                    | 12 +++--
 drivers/media/i2c/ov5670.c                    | 10 ++--
 drivers/media/i2c/ov7251.c                    | 12 +++--
 drivers/media/i2c/ov8858.c                    | 10 ++--
 drivers/media/i2c/ov9282.c                    | 12 +++--
 drivers/media/i2c/st-vgxy61.c                 | 10 ++--
 drivers/media/i2c/tc358746.c                  | 10 ++--
 drivers/media/i2c/tda1997x.c                  | 10 ++--
 drivers/media/i2c/thp7312.c                   | 10 ++--
 drivers/media/i2c/tvp5150.c                   |  6 +--
 drivers/media/pci/intel/ivsc/mei_csi.c        | 10 ++--
 drivers/media/platform/cadence/cdns-csi2rx.c  | 10 ++--
 .../platform/microchip/microchip-csi2dc.c     | 10 ++--
 .../platform/microchip/microchip-isc-scaler.c | 10 ++--
 drivers/media/platform/nxp/imx-mipi-csis.c    | 10 ++--
 drivers/media/platform/nxp/imx7-media-csi.c   |  6 +--
 .../platform/nxp/imx8-isi/imx8-isi-crossbar.c | 10 ++--
 .../platform/nxp/imx8-isi/imx8-isi-pipe.c     | 10 ++--
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 10 ++--
 .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 10 ++--
 .../platform/renesas/rzg2l-cru/rzg2l-ip.c     | 10 ++--
 .../media/platform/renesas/vsp1/vsp1_brx.c    |  1 -
 .../media/platform/renesas/vsp1/vsp1_clu.c    |  1 -
 .../media/platform/renesas/vsp1/vsp1_entity.c | 53 +++++++++----------
 .../media/platform/renesas/vsp1/vsp1_entity.h |  2 -
 .../media/platform/renesas/vsp1/vsp1_hsit.c   |  1 -
 .../media/platform/renesas/vsp1/vsp1_lif.c    |  1 -
 .../media/platform/renesas/vsp1/vsp1_lut.c    |  1 -
 .../media/platform/renesas/vsp1/vsp1_rwpf.c   |  1 -
 .../media/platform/renesas/vsp1/vsp1_sru.c    |  1 -
 .../media/platform/renesas/vsp1/vsp1_uds.c    |  1 -
 .../media/platform/renesas/vsp1/vsp1_uif.c    |  1 -
 .../platform/rockchip/rkisp1/rkisp1-csi.c     | 10 ++--
 .../platform/rockchip/rkisp1/rkisp1-isp.c     | 10 ++--
 .../platform/rockchip/rkisp1/rkisp1-resizer.c | 10 ++--
 .../st/stm32/stm32-dcmipp/dcmipp-byteproc.c   |  6 +--
 .../st/stm32/stm32-dcmipp/dcmipp-parallel.c   |  6 +--
 .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  1 +
 .../platform/sunxi/sun4i-csi/sun4i_csi.h      |  1 +
 .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  9 ++--
 .../sunxi/sun6i-csi/sun6i_csi_bridge.c        | 10 ++--
 .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c   | 10 ++--
 .../sun8i_a83t_mipi_csi2.c                    | 10 ++--
 drivers/media/platform/ti/cal/cal-camerarx.c  | 10 ++--
 drivers/media/platform/video-mux.c            | 10 ++--
 .../media/platform/xilinx/xilinx-csi2rxss.c   | 10 ++--
 .../media/test-drivers/vimc/vimc-debayer.c    | 11 ++--
 drivers/media/test-drivers/vimc/vimc-scaler.c | 11 ++--
 drivers/media/test-drivers/vimc/vimc-sensor.c | 11 ++--
 drivers/media/v4l2-core/v4l2-subdev.c         | 20 +++----
 drivers/staging/media/imx/imx-ic-prp.c        |  2 +-
 drivers/staging/media/imx/imx-ic-prpencvf.c   |  2 +-
 drivers/staging/media/imx/imx-media-csi.c     |  2 +-
 drivers/staging/media/imx/imx-media-utils.c   |  8 +--
 drivers/staging/media/imx/imx-media-vdic.c    |  2 +-
 drivers/staging/media/imx/imx-media.h         |  4 +-
 drivers/staging/media/imx/imx6-mipi-csi2.c    |  2 +-
 .../staging/media/starfive/camss/stf-isp.c    |  6 ++-
 .../media/sunxi/sun6i-isp/sun6i_isp_proc.c    | 10 ++--
 include/media/v4l2-subdev.h                   |  7 +--
 86 files changed, 487 insertions(+), 264 deletions(-)

Comments

Tomi Valkeinen Nov. 27, 2023, 9:38 a.m. UTC | #1
Hi,

On 27/11/2023 11:07, Laurent Pinchart wrote:
> The subdev .init_cfg() operation is affected by two issues:
> 
> - It has long been extended to initialize a whole v4l2_subdev_state
>    instead of just a v4l2_subdev_pad_config, but its name has stuck
>    around.
> 
> - Despite operating on a whole subdev state and not being directly
>    exposed to the subdev users (either in-kernel or through the userspace
>    API), .init_cfg() is categorized as a subdev pad operation.
> 
> This participates in making the subdev API confusing for new developers.
> Fix it by renaming the operation to .init_state(), and make it a subdev
> internal operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc

I didn't go through each and every change in the drivers, but the 
framework parts look fine, and I didn't see any issues in the driver 
changes either. So:

Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>

  Tomi
Philipp Zabel Nov. 27, 2023, 9:48 a.m. UTC | #2
Hi Laurent,

On Mo, 2023-11-27 at 11:07 +0200, Laurent Pinchart wrote:
> The subdev .init_cfg() operation is affected by two issues:
> 
> - It has long been extended to initialize a whole v4l2_subdev_state
>   instead of just a v4l2_subdev_pad_config, but its name has stuck
>   around.
> 
> - Despite operating on a whole subdev state and not being directly
>   exposed to the subdev users (either in-kernel or through the userspace
>   API), .init_cfg() is categorized as a subdev pad operation.
> 
> This participates in making the subdev API confusing for new developers.
> Fix it by renaming the operation to .init_state(), and make it a subdev
> internal operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc

Thank you for cleaning this up,


Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

regards
Philipp
Alain Volmat Nov. 27, 2023, 10:03 a.m. UTC | #3
Hi,

On Mon, Nov 27, 2023 at 11:07:44AM +0200, Laurent Pinchart wrote:
> The subdev .init_cfg() operation is affected by two issues:
> 
> - It has long been extended to initialize a whole v4l2_subdev_state
>   instead of just a v4l2_subdev_pad_config, but its name has stuck
>   around.
> 
> - Despite operating on a whole subdev state and not being directly
>   exposed to the subdev users (either in-kernel or through the userspace
>   API), .init_cfg() is categorized as a subdev pad operation.
> 
> This participates in making the subdev API confusing for new developers.
> Fix it by renaming the operation to .init_state(), and make it a subdev
> internal operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
> ---
> Changes since v3:
> 
> - Rebase on top of the new stm32-dcmipp driver
> - Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
>   rebase
> 
> Changes since v2:
> 
> - Rebase on top of the latest media tree
> 
> Changes since v1:
> 
> - Fix compilation of the vsp1 driver
> ---
>  drivers/media/i2c/adv7180.c                   | 10 ++--
>  drivers/media/i2c/ccs/ccs-core.c              |  6 +--
>  drivers/media/i2c/ds90ub913.c                 | 10 ++--
>  drivers/media/i2c/ds90ub953.c                 | 10 ++--
>  drivers/media/i2c/ds90ub960.c                 | 11 ++--
>  drivers/media/i2c/gc2145.c                    | 10 ++--
>  drivers/media/i2c/hi846.c                     | 10 ++--
>  drivers/media/i2c/imx214.c                    | 12 +++--
>  drivers/media/i2c/imx219.c                    |  9 ++--
>  drivers/media/i2c/imx290.c                    | 10 ++--
>  drivers/media/i2c/imx296.c                    | 10 ++--
>  drivers/media/i2c/imx334.c                    | 12 +++--
>  drivers/media/i2c/imx335.c                    | 12 +++--
>  drivers/media/i2c/imx412.c                    | 12 +++--
>  drivers/media/i2c/imx415.c                    | 10 ++--
>  drivers/media/i2c/mt9m001.c                   | 10 ++--
>  drivers/media/i2c/mt9m111.c                   | 10 ++--
>  drivers/media/i2c/mt9m114.c                   | 16 +++---
>  drivers/media/i2c/mt9p031.c                   |  8 +--
>  drivers/media/i2c/mt9v111.c                   | 10 ++--
>  drivers/media/i2c/ov01a10.c                   | 10 ++--
>  drivers/media/i2c/ov02a10.c                   | 10 ++--
>  drivers/media/i2c/ov2640.c                    | 10 ++--
>  drivers/media/i2c/ov2680.c                    | 10 ++--
>  drivers/media/i2c/ov2740.c                    | 10 ++--
>  drivers/media/i2c/ov5640.c                    | 10 ++--
>  drivers/media/i2c/ov5645.c                    | 12 +++--
>  drivers/media/i2c/ov5670.c                    | 10 ++--
>  drivers/media/i2c/ov7251.c                    | 12 +++--
>  drivers/media/i2c/ov8858.c                    | 10 ++--
>  drivers/media/i2c/ov9282.c                    | 12 +++--
>  drivers/media/i2c/st-vgxy61.c                 | 10 ++--
>  drivers/media/i2c/tc358746.c                  | 10 ++--
>  drivers/media/i2c/tda1997x.c                  | 10 ++--
>  drivers/media/i2c/thp7312.c                   | 10 ++--
>  drivers/media/i2c/tvp5150.c                   |  6 +--
>  drivers/media/pci/intel/ivsc/mei_csi.c        | 10 ++--
>  drivers/media/platform/cadence/cdns-csi2rx.c  | 10 ++--
>  .../platform/microchip/microchip-csi2dc.c     | 10 ++--
>  .../platform/microchip/microchip-isc-scaler.c | 10 ++--
>  drivers/media/platform/nxp/imx-mipi-csis.c    | 10 ++--
>  drivers/media/platform/nxp/imx7-media-csi.c   |  6 +--
>  .../platform/nxp/imx8-isi/imx8-isi-crossbar.c | 10 ++--
>  .../platform/nxp/imx8-isi/imx8-isi-pipe.c     | 10 ++--
>  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 10 ++--
>  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 10 ++--
>  .../platform/renesas/rzg2l-cru/rzg2l-ip.c     | 10 ++--
>  .../media/platform/renesas/vsp1/vsp1_brx.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_clu.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_entity.c | 53 +++++++++----------
>  .../media/platform/renesas/vsp1/vsp1_entity.h |  2 -
>  .../media/platform/renesas/vsp1/vsp1_hsit.c   |  1 -
>  .../media/platform/renesas/vsp1/vsp1_lif.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_lut.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_rwpf.c   |  1 -
>  .../media/platform/renesas/vsp1/vsp1_sru.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_uds.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_uif.c    |  1 -
>  .../platform/rockchip/rkisp1/rkisp1-csi.c     | 10 ++--
>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 10 ++--
>  .../platform/rockchip/rkisp1/rkisp1-resizer.c | 10 ++--
>  .../st/stm32/stm32-dcmipp/dcmipp-byteproc.c   |  6 +--
>  .../st/stm32/stm32-dcmipp/dcmipp-parallel.c   |  6 +--
>  .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  1 +
>  .../platform/sunxi/sun4i-csi/sun4i_csi.h      |  1 +
>  .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  9 ++--
>  .../sunxi/sun6i-csi/sun6i_csi_bridge.c        | 10 ++--
>  .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c   | 10 ++--
>  .../sun8i_a83t_mipi_csi2.c                    | 10 ++--
>  drivers/media/platform/ti/cal/cal-camerarx.c  | 10 ++--
>  drivers/media/platform/video-mux.c            | 10 ++--
>  .../media/platform/xilinx/xilinx-csi2rxss.c   | 10 ++--
>  .../media/test-drivers/vimc/vimc-debayer.c    | 11 ++--
>  drivers/media/test-drivers/vimc/vimc-scaler.c | 11 ++--
>  drivers/media/test-drivers/vimc/vimc-sensor.c | 11 ++--
>  drivers/media/v4l2-core/v4l2-subdev.c         | 20 +++----
>  drivers/staging/media/imx/imx-ic-prp.c        |  2 +-
>  drivers/staging/media/imx/imx-ic-prpencvf.c   |  2 +-
>  drivers/staging/media/imx/imx-media-csi.c     |  2 +-
>  drivers/staging/media/imx/imx-media-utils.c   |  8 +--
>  drivers/staging/media/imx/imx-media-vdic.c    |  2 +-
>  drivers/staging/media/imx/imx-media.h         |  4 +-
>  drivers/staging/media/imx/imx6-mipi-csi2.c    |  2 +-
>  .../staging/media/starfive/camss/stf-isp.c    |  6 ++-
>  .../media/sunxi/sun6i-isp/sun6i_isp_proc.c    | 10 ++--
>  include/media/v4l2-subdev.h                   |  7 +--
>  86 files changed, 487 insertions(+), 264 deletions(-)
> 
> diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c
> index 444c322d756a..e10811cce801 100644
> --- a/drivers/media/i2c/adv7180.c
> +++ b/drivers/media/i2c/adv7180.c
> @@ -813,8 +813,8 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int adv7180_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int adv7180_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> @@ -929,7 +929,6 @@ static const struct v4l2_subdev_core_ops adv7180_core_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops adv7180_pad_ops = {
> -	.init_cfg = adv7180_init_cfg,
>  	.enum_mbus_code = adv7180_enum_mbus_code,
>  	.set_fmt = adv7180_set_pad_format,
>  	.get_fmt = adv7180_get_pad_format,
> @@ -947,6 +946,10 @@ static const struct v4l2_subdev_ops adv7180_ops = {
>  	.sensor = &adv7180_sensor_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops adv7180_internal_ops = {
> +	.init_state = adv7180_init_state,
> +};
> +
>  static irqreturn_t adv7180_irq(int irq, void *devid)
>  {
>  	struct adv7180_state *state = devid;
> @@ -1458,6 +1461,7 @@ static int adv7180_probe(struct i2c_client *client)
>  	state->input = 0;
>  	sd = &state->sd;
>  	v4l2_i2c_subdev_init(sd, client, &adv7180_ops);
> +	sd->internal_ops = &adv7180_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  
>  	ret = adv7180_init_controls(state);
> diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
> index fb713b03ad4a..92ef98a2b951 100644
> --- a/drivers/media/i2c/ccs/ccs-core.c
> +++ b/drivers/media/i2c/ccs/ccs-core.c
> @@ -3006,8 +3006,8 @@ static int ccs_init_subdev(struct ccs_sensor *sensor,
>  	return 0;
>  }
>  
> -static int ccs_init_cfg(struct v4l2_subdev *sd,
> -			struct v4l2_subdev_state *sd_state)
> +static int ccs_init_state(struct v4l2_subdev *sd,
> +			  struct v4l2_subdev_state *sd_state)
>  {
>  	struct ccs_subdev *ssd = to_ccs_subdev(sd);
>  	struct ccs_sensor *sensor = ssd->sensor;
> @@ -3055,7 +3055,6 @@ static const struct v4l2_subdev_video_ops ccs_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ccs_pad_ops = {
> -	.init_cfg = ccs_init_cfg,
>  	.enum_mbus_code = ccs_enum_mbus_code,
>  	.get_fmt = ccs_get_format,
>  	.set_fmt = ccs_set_format,
> @@ -3079,6 +3078,7 @@ static const struct media_entity_operations ccs_entity_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops ccs_internal_src_ops = {
> +	.init_state = ccs_init_state,
>  	.registered = ccs_registered,
>  	.unregistered = ccs_unregistered,
>  };
> diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c
> index 8bb6be956780..ca9bb29dab89 100644
> --- a/drivers/media/i2c/ds90ub913.c
> +++ b/drivers/media/i2c/ds90ub913.c
> @@ -443,8 +443,8 @@ static int ub913_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ub913_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *state)
> +static int ub913_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_route routes[] = {
>  		{
> @@ -503,7 +503,6 @@ static const struct v4l2_subdev_pad_ops ub913_pad_ops = {
>  	.get_frame_desc = ub913_get_frame_desc,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = ub913_set_fmt,
> -	.init_cfg = ub913_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops ub913_subdev_ops = {
> @@ -511,6 +510,10 @@ static const struct v4l2_subdev_ops ub913_subdev_ops = {
>  	.pad = &ub913_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ub913_internal_ops = {
> +	.init_state = ub913_init_state,
> +};
> +
>  static const struct media_entity_operations ub913_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -744,6 +747,7 @@ static int ub913_subdev_init(struct ub913_data *priv)
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub913_subdev_ops);
> +	priv->sd.internal_ops = &ub913_internal_ops;
>  	priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
>  	priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	priv->sd.entity.ops = &ub913_entity_ops;
> diff --git a/drivers/media/i2c/ds90ub953.c b/drivers/media/i2c/ds90ub953.c
> index 4eb08e3a31c7..16f88db14981 100644
> --- a/drivers/media/i2c/ds90ub953.c
> +++ b/drivers/media/i2c/ds90ub953.c
> @@ -575,8 +575,8 @@ static int ub953_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ub953_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *state)
> +static int ub953_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_route routes[] = {
>  		{
> @@ -713,7 +713,6 @@ static const struct v4l2_subdev_pad_ops ub953_pad_ops = {
>  	.get_frame_desc = ub953_get_frame_desc,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = ub953_set_fmt,
> -	.init_cfg = ub953_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_core_ops ub953_subdev_core_ops = {
> @@ -727,6 +726,10 @@ static const struct v4l2_subdev_ops ub953_subdev_ops = {
>  	.pad = &ub953_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ub953_internal_ops = {
> +	.init_state = ub953_init_state,
> +};
> +
>  static const struct media_entity_operations ub953_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1240,6 +1243,7 @@ static int ub953_subdev_init(struct ub953_data *priv)
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub953_subdev_ops);
> +	priv->sd.internal_ops = &ub953_internal_ops;
>  
>  	priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			  V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_STREAMS;
> diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
> index 1d1476098c92..ffe5f25f8647 100644
> --- a/drivers/media/i2c/ds90ub960.c
> +++ b/drivers/media/i2c/ds90ub960.c
> @@ -2906,8 +2906,8 @@ static int ub960_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ub960_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *state)
> +static int ub960_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *state)
>  {
>  	struct ub960_data *priv = sd_to_ub960(sd);
>  
> @@ -2938,8 +2938,6 @@ static const struct v4l2_subdev_pad_ops ub960_pad_ops = {
>  
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = ub960_set_fmt,
> -
> -	.init_cfg = ub960_init_cfg,
>  };
>  
>  static int ub960_log_status(struct v4l2_subdev *sd)
> @@ -3091,6 +3089,10 @@ static const struct v4l2_subdev_core_ops ub960_subdev_core_ops = {
>  	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ub960_internal_ops = {
> +	.init_state = ub960_init_state,
> +};
> +
>  static const struct v4l2_subdev_ops ub960_subdev_ops = {
>  	.core = &ub960_subdev_core_ops,
>  	.pad = &ub960_pad_ops,
> @@ -3650,6 +3652,7 @@ static int ub960_create_subdev(struct ub960_data *priv)
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub960_subdev_ops);
> +	priv->sd.internal_ops = &ub960_internal_ops;
>  
>  	v4l2_ctrl_handler_init(&priv->ctrl_handler, 1);
>  	priv->sd.ctrl_handler = &priv->ctrl_handler;
> diff --git a/drivers/media/i2c/gc2145.c b/drivers/media/i2c/gc2145.c
> index 12d3780b5548..bef7b0e056a8 100644
> --- a/drivers/media/i2c/gc2145.c
> +++ b/drivers/media/i2c/gc2145.c
> @@ -653,8 +653,8 @@ static void gc2145_update_pad_format(struct gc2145 *gc2145,
>  	fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int gc2145_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int gc2145_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct gc2145 *gc2145 = to_gc2145(sd);
>  	struct v4l2_mbus_framefmt *format;
> @@ -1079,7 +1079,6 @@ static const struct v4l2_subdev_video_ops gc2145_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops gc2145_pad_ops = {
> -	.init_cfg = gc2145_init_cfg,
>  	.enum_mbus_code = gc2145_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = gc2145_set_pad_format,
> @@ -1093,6 +1092,10 @@ static const struct v4l2_subdev_ops gc2145_subdev_ops = {
>  	.pad = &gc2145_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops gc2145_subdev_internal_ops = {
> +	.init_state = gc2145_init_state,
> +};
> +
>  static int gc2145_set_ctrl_test_pattern(struct gc2145 *gc2145, int value)
>  {
>  	int ret = 0;
> @@ -1286,6 +1289,7 @@ static int gc2145_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&gc2145->sd, client, &gc2145_subdev_ops);
> +	gc2145->sd.internal_ops = &gc2145_subdev_internal_ops;
>  
>  	/* Check the hardware configuration in device tree */
>  	if (gc2145_check_hwcfg(dev))
> diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c
> index 0595080c2211..9c565ec033d4 100644
> --- a/drivers/media/i2c/hi846.c
> +++ b/drivers/media/i2c/hi846.c
> @@ -1871,8 +1871,8 @@ static int hi846_get_selection(struct v4l2_subdev *sd,
>  	}
>  }
>  
> -static int hi846_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *sd_state)
> +static int hi846_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *sd_state)
>  {
>  	struct hi846 *hi846 = to_hi846(sd);
>  	struct v4l2_mbus_framefmt *mf;
> @@ -1895,7 +1895,6 @@ static const struct v4l2_subdev_video_ops hi846_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops hi846_pad_ops = {
> -	.init_cfg = hi846_init_cfg,
>  	.enum_frame_size = hi846_enum_frame_size,
>  	.enum_mbus_code = hi846_enum_mbus_code,
>  	.set_fmt = hi846_set_format,
> @@ -1908,6 +1907,10 @@ static const struct v4l2_subdev_ops hi846_subdev_ops = {
>  	.pad = &hi846_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops hi846_internal_ops = {
> +	.init_state = hi846_init_state,
> +};
> +
>  static const struct media_entity_operations hi846_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -2071,6 +2074,7 @@ static int hi846_probe(struct i2c_client *client)
>  		return ret;
>  
>  	v4l2_i2c_subdev_init(&hi846->sd, client, &hi846_subdev_ops);
> +	hi846->sd.internal_ops = &hi846_internal_ops;
>  
>  	mutex_init(&hi846->mutex);
>  
> diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c
> index 8bc7b114c57d..474c95572bf6 100644
> --- a/drivers/media/i2c/imx214.c
> +++ b/drivers/media/i2c/imx214.c
> @@ -633,8 +633,8 @@ static int imx214_get_selection(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int imx214_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int imx214_entity_init_state(struct v4l2_subdev *subdev,
> +				    struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { };
>  
> @@ -839,7 +839,6 @@ static const struct v4l2_subdev_pad_ops imx214_subdev_pad_ops = {
>  	.get_fmt = imx214_get_format,
>  	.set_fmt = imx214_set_format,
>  	.get_selection = imx214_get_selection,
> -	.init_cfg = imx214_entity_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops imx214_subdev_ops = {
> @@ -848,6 +847,10 @@ static const struct v4l2_subdev_ops imx214_subdev_ops = {
>  	.pad = &imx214_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx214_internal_ops = {
> +	.init_state = imx214_entity_init_state,
> +};
> +
>  static const struct regmap_config sensor_regmap_config = {
>  	.reg_bits = 16,
>  	.val_bits = 8,
> @@ -957,6 +960,7 @@ static int imx214_probe(struct i2c_client *client)
>  	}
>  
>  	v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops);
> +	imx214->sd.internal_ops = &imx214_internal_ops;
>  
>  	/*
>  	 * Enable power initially, to avoid warnings
> @@ -1021,7 +1025,7 @@ static int imx214_probe(struct i2c_client *client)
>  		goto free_ctrl;
>  	}
>  
> -	imx214_entity_init_cfg(&imx214->sd, NULL);
> +	imx214_entity_init_state(&imx214->sd, NULL);
>  
>  	ret = v4l2_async_register_subdev_sensor(&imx214->sd);
>  	if (ret < 0) {
> diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c
> index 675795ac2e83..e17ef2e9d9d0 100644
> --- a/drivers/media/i2c/imx219.c
> +++ b/drivers/media/i2c/imx219.c
> @@ -905,8 +905,8 @@ static int imx219_get_selection(struct v4l2_subdev *sd,
>  	return -EINVAL;
>  }
>  
> -static int imx219_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int imx219_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -933,7 +933,6 @@ static const struct v4l2_subdev_video_ops imx219_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx219_pad_ops = {
> -	.init_cfg = imx219_init_cfg,
>  	.enum_mbus_code = imx219_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = imx219_set_pad_format,
> @@ -947,6 +946,9 @@ static const struct v4l2_subdev_ops imx219_subdev_ops = {
>  	.pad = &imx219_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx219_internal_ops = {
> +	.init_state = imx219_init_state,
> +};
>  
>  /* -----------------------------------------------------------------------------
>   * Power management
> @@ -1098,6 +1100,7 @@ static int imx219_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops);
> +	imx219->sd.internal_ops = &imx219_internal_ops;
>  
>  	/* Check the hardware configuration in device tree */
>  	if (imx219_check_hwcfg(dev, imx219))
> diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
> index aa8cfbcd40aa..52ba6188911b 100644
> --- a/drivers/media/i2c/imx290.c
> +++ b/drivers/media/i2c/imx290.c
> @@ -1195,8 +1195,8 @@ static int imx290_get_selection(struct v4l2_subdev *sd,
>  	}
>  }
>  
> -static int imx290_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int imx290_entity_init_state(struct v4l2_subdev *subdev,
> +				    struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -1221,7 +1221,6 @@ static const struct v4l2_subdev_video_ops imx290_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx290_pad_ops = {
> -	.init_cfg = imx290_entity_init_cfg,
>  	.enum_mbus_code = imx290_enum_mbus_code,
>  	.enum_frame_size = imx290_enum_frame_size,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1235,6 +1234,10 @@ static const struct v4l2_subdev_ops imx290_subdev_ops = {
>  	.pad = &imx290_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx290_internal_ops = {
> +	.init_state = imx290_entity_init_state,
> +};
> +
>  static const struct media_entity_operations imx290_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1248,6 +1251,7 @@ static int imx290_subdev_init(struct imx290 *imx290)
>  	imx290->current_mode = &imx290_modes_ptr(imx290)[0];
>  
>  	v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
> +	imx290->sd.internal_ops = &imx290_internal_ops;
>  	imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			    V4L2_SUBDEV_FL_HAS_EVENTS;
>  	imx290->sd.dev = imx290->dev;
> diff --git a/drivers/media/i2c/imx296.c b/drivers/media/i2c/imx296.c
> index 8399cca496a7..83149fa729c4 100644
> --- a/drivers/media/i2c/imx296.c
> +++ b/drivers/media/i2c/imx296.c
> @@ -798,8 +798,8 @@ static int imx296_set_selection(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int imx296_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int imx296_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_selection sel = {
>  		.target = V4L2_SEL_TGT_CROP,
> @@ -830,7 +830,6 @@ static const struct v4l2_subdev_pad_ops imx296_subdev_pad_ops = {
>  	.set_fmt = imx296_set_format,
>  	.get_selection = imx296_get_selection,
>  	.set_selection = imx296_set_selection,
> -	.init_cfg = imx296_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops imx296_subdev_ops = {
> @@ -838,12 +837,17 @@ static const struct v4l2_subdev_ops imx296_subdev_ops = {
>  	.pad = &imx296_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx296_internal_ops = {
> +	.init_state = imx296_init_state,
> +};
> +
>  static int imx296_subdev_init(struct imx296 *sensor)
>  {
>  	struct i2c_client *client = to_i2c_client(sensor->dev);
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&sensor->subdev, client, &imx296_subdev_ops);
> +	sensor->subdev.internal_ops = &imx296_internal_ops;
>  
>  	ret = imx296_ctrls_init(sensor);
>  	if (ret < 0)
> diff --git a/drivers/media/i2c/imx334.c b/drivers/media/i2c/imx334.c
> index 42cf71c1f6fd..6725b3e2a73e 100644
> --- a/drivers/media/i2c/imx334.c
> +++ b/drivers/media/i2c/imx334.c
> @@ -935,14 +935,14 @@ static int imx334_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * imx334_init_cfg() - Initialize sub-device state
> + * imx334_init_state() - Initialize sub-device state
>   * @sd: pointer to imx334 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device state
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int imx334_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int imx334_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct imx334 *imx334 = to_imx334(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -1190,7 +1190,6 @@ static const struct v4l2_subdev_video_ops imx334_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx334_pad_ops = {
> -	.init_cfg = imx334_init_cfg,
>  	.enum_mbus_code = imx334_enum_mbus_code,
>  	.enum_frame_size = imx334_enum_frame_size,
>  	.get_fmt = imx334_get_pad_format,
> @@ -1202,6 +1201,10 @@ static const struct v4l2_subdev_ops imx334_subdev_ops = {
>  	.pad = &imx334_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx334_internal_ops = {
> +	.init_state = imx334_init_state,
> +};
> +
>  /**
>   * imx334_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -1359,6 +1362,7 @@ static int imx334_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&imx334->sd, client, &imx334_subdev_ops);
> +	imx334->sd.internal_ops = &imx334_internal_ops;
>  
>  	ret = imx334_parse_hw_config(imx334);
>  	if (ret) {
> diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
> index 0432f059e913..205a150971b7 100644
> --- a/drivers/media/i2c/imx335.c
> +++ b/drivers/media/i2c/imx335.c
> @@ -618,14 +618,14 @@ static int imx335_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * imx335_init_cfg() - Initialize sub-device state
> + * imx335_init_state() - Initialize sub-device state
>   * @sd: pointer to imx335 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device configuration
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int imx335_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int imx335_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct imx335 *imx335 = to_imx335(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -835,7 +835,6 @@ static const struct v4l2_subdev_video_ops imx335_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx335_pad_ops = {
> -	.init_cfg = imx335_init_cfg,
>  	.enum_mbus_code = imx335_enum_mbus_code,
>  	.enum_frame_size = imx335_enum_frame_size,
>  	.get_fmt = imx335_get_pad_format,
> @@ -847,6 +846,10 @@ static const struct v4l2_subdev_ops imx335_subdev_ops = {
>  	.pad = &imx335_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx335_internal_ops = {
> +	.init_state = imx335_init_state,
> +};
> +
>  /**
>   * imx335_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -999,6 +1002,7 @@ static int imx335_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
> +	imx335->sd.internal_ops = &imx335_internal_ops;
>  
>  	ret = imx335_parse_hw_config(imx335);
>  	if (ret) {
> diff --git a/drivers/media/i2c/imx412.c b/drivers/media/i2c/imx412.c
> index 41d756a20f3c..0efce329525e 100644
> --- a/drivers/media/i2c/imx412.c
> +++ b/drivers/media/i2c/imx412.c
> @@ -770,14 +770,14 @@ static int imx412_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * imx412_init_cfg() - Initialize sub-device state
> + * imx412_init_state() - Initialize sub-device state
>   * @sd: pointer to imx412 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device configuration
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int imx412_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int imx412_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct imx412 *imx412 = to_imx412(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -997,7 +997,6 @@ static const struct v4l2_subdev_video_ops imx412_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx412_pad_ops = {
> -	.init_cfg = imx412_init_cfg,
>  	.enum_mbus_code = imx412_enum_mbus_code,
>  	.enum_frame_size = imx412_enum_frame_size,
>  	.get_fmt = imx412_get_pad_format,
> @@ -1009,6 +1008,10 @@ static const struct v4l2_subdev_ops imx412_subdev_ops = {
>  	.pad = &imx412_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx412_internal_ops = {
> +	.init_state = imx412_init_state,
> +};
> +
>  /**
>   * imx412_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -1177,6 +1180,7 @@ static int imx412_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&imx412->sd, client, &imx412_subdev_ops);
> +	imx412->sd.internal_ops = &imx412_internal_ops;
>  
>  	ret = imx412_parse_hw_config(imx412);
>  	if (ret) {
> diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
> index 6436a32c4025..1e5f20c3ed82 100644
> --- a/drivers/media/i2c/imx415.c
> +++ b/drivers/media/i2c/imx415.c
> @@ -880,8 +880,8 @@ static int imx415_get_selection(struct v4l2_subdev *sd,
>  	return -EINVAL;
>  }
>  
> -static int imx415_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int imx415_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format format = {
>  		.format = {
> @@ -905,7 +905,6 @@ static const struct v4l2_subdev_pad_ops imx415_subdev_pad_ops = {
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = imx415_set_format,
>  	.get_selection = imx415_get_selection,
> -	.init_cfg = imx415_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops imx415_subdev_ops = {
> @@ -913,12 +912,17 @@ static const struct v4l2_subdev_ops imx415_subdev_ops = {
>  	.pad = &imx415_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx415_internal_ops = {
> +	.init_state = imx415_init_state,
> +};
> +
>  static int imx415_subdev_init(struct imx415 *sensor)
>  {
>  	struct i2c_client *client = to_i2c_client(sensor->dev);
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&sensor->subdev, client, &imx415_subdev_ops);
> +	sensor->subdev.internal_ops = &imx415_internal_ops;
>  
>  	ret = imx415_ctrls_init(sensor);
>  	if (ret)
> diff --git a/drivers/media/i2c/mt9m001.c b/drivers/media/i2c/mt9m001.c
> index 4c897bb07fed..ad1a3ab77411 100644
> --- a/drivers/media/i2c/mt9m001.c
> +++ b/drivers/media/i2c/mt9m001.c
> @@ -650,8 +650,8 @@ static const struct v4l2_subdev_core_ops mt9m001_subdev_core_ops = {
>  #endif
>  };
>  
> -static int mt9m001_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9m001_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct i2c_client *client = v4l2_get_subdevdata(sd);
>  	struct mt9m001 *mt9m001 = to_mt9m001(client);
> @@ -708,7 +708,6 @@ static const struct v4l2_subdev_sensor_ops mt9m001_subdev_sensor_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m001_subdev_pad_ops = {
> -	.init_cfg	= mt9m001_init_cfg,
>  	.enum_mbus_code = mt9m001_enum_mbus_code,
>  	.get_selection	= mt9m001_get_selection,
>  	.set_selection	= mt9m001_set_selection,
> @@ -724,6 +723,10 @@ static const struct v4l2_subdev_ops mt9m001_subdev_ops = {
>  	.pad	= &mt9m001_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9m001_internal_ops = {
> +	.init_state	= mt9m001_init_state,
> +};
> +
>  static int mt9m001_probe(struct i2c_client *client)
>  {
>  	struct mt9m001 *mt9m001;
> @@ -755,6 +758,7 @@ static int mt9m001_probe(struct i2c_client *client)
>  		return PTR_ERR(mt9m001->reset_gpio);
>  
>  	v4l2_i2c_subdev_init(&mt9m001->subdev, client, &mt9m001_subdev_ops);
> +	mt9m001->subdev.internal_ops = &mt9m001_internal_ops;
>  	mt9m001->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  				 V4L2_SUBDEV_FL_HAS_EVENTS;
>  	v4l2_ctrl_handler_init(&mt9m001->hdl, 4);
> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> index 17ca92810b58..54a7a4c623ea 100644
> --- a/drivers/media/i2c/mt9m111.c
> +++ b/drivers/media/i2c/mt9m111.c
> @@ -1111,8 +1111,8 @@ static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
>  	return 0;
>  }
>  
> -static int mt9m111_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9m111_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *format =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -1156,7 +1156,6 @@ static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
> -	.init_cfg	= mt9m111_init_cfg,
>  	.enum_mbus_code = mt9m111_enum_mbus_code,
>  	.get_selection	= mt9m111_get_selection,
>  	.set_selection	= mt9m111_set_selection,
> @@ -1171,6 +1170,10 @@ static const struct v4l2_subdev_ops mt9m111_subdev_ops = {
>  	.pad	= &mt9m111_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9m111_internal_ops = {
> +	.init_state	= mt9m111_init_state,
> +};
> +
>  /*
>   * Interface active, can use i2c. If it fails, it can indeed mean, that
>   * this wasn't our capture interface, so, we wait for the right one
> @@ -1275,6 +1278,7 @@ static int mt9m111_probe(struct i2c_client *client)
>  	mt9m111->ctx = &context_b;
>  
>  	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
> +	mt9m111->subdev.internal_ops = &mt9m111_internal_ops;
>  	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  				 V4L2_SUBDEV_FL_HAS_EVENTS;
>  
> diff --git a/drivers/media/i2c/mt9m114.c b/drivers/media/i2c/mt9m114.c
> index 23cf84f1a746..0a22f328981d 100644
> --- a/drivers/media/i2c/mt9m114.c
> +++ b/drivers/media/i2c/mt9m114.c
> @@ -1152,8 +1152,8 @@ static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd)
>  	return container_of(sd, struct mt9m114, pa.sd);
>  }
>  
> -static int mt9m114_pa_init_cfg(struct v4l2_subdev *sd,
> -			       struct v4l2_subdev_state *state)
> +static int mt9m114_pa_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_mbus_framefmt *format;
>  	struct v4l2_rect *crop;
> @@ -1304,7 +1304,6 @@ static int mt9m114_pa_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = {
> -	.init_cfg = mt9m114_pa_init_cfg,
>  	.enum_mbus_code = mt9m114_pa_enum_mbus_code,
>  	.enum_frame_size = mt9m114_pa_enum_framesizes,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1317,6 +1316,10 @@ static const struct v4l2_subdev_ops mt9m114_pa_ops = {
>  	.pad = &mt9m114_pa_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = {
> +	.init_state = mt9m114_pa_init_state,
> +};
> +
>  static int mt9m114_pa_init(struct mt9m114 *sensor)
>  {
>  	struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl;
> @@ -1329,6 +1332,7 @@ static int mt9m114_pa_init(struct mt9m114 *sensor)
>  
>  	/* Initialize the subdev. */
>  	v4l2_subdev_init(sd, &mt9m114_pa_ops);
> +	sd->internal_ops = &mt9m114_pa_internal_ops;
>  	v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array");
>  
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> @@ -1624,8 +1628,8 @@ static int mt9m114_ifp_s_frame_interval(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int mt9m114_ifp_init_cfg(struct v4l2_subdev *sd,
> -				struct v4l2_subdev_state *state)
> +static int mt9m114_ifp_init_state(struct v4l2_subdev *sd,
> +				  struct v4l2_subdev_state *state)
>  {
>  	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
>  	struct v4l2_mbus_framefmt *format;
> @@ -1968,7 +1972,6 @@ static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = {
> -	.init_cfg = mt9m114_ifp_init_cfg,
>  	.enum_mbus_code = mt9m114_ifp_enum_mbus_code,
>  	.enum_frame_size = mt9m114_ifp_enum_framesizes,
>  	.enum_frame_interval = mt9m114_ifp_enum_frameintervals,
> @@ -1984,6 +1987,7 @@ static const struct v4l2_subdev_ops mt9m114_ifp_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = {
> +	.init_state = mt9m114_ifp_init_state,
>  	.registered = mt9m114_ifp_registered,
>  	.unregistered = mt9m114_ifp_unregistered,
>  };
> diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
> index 89bcd48748b9..596200d0248c 100644
> --- a/drivers/media/i2c/mt9p031.c
> +++ b/drivers/media/i2c/mt9p031.c
> @@ -696,8 +696,8 @@ static int mt9p031_set_selection(struct v4l2_subdev *subdev,
>  	return 0;
>  }
>  
> -static int mt9p031_init_cfg(struct v4l2_subdev *subdev,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9p031_init_state(struct v4l2_subdev *subdev,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
>  	struct v4l2_mbus_framefmt *format;
> @@ -1041,7 +1041,6 @@ static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
> -	.init_cfg = mt9p031_init_cfg,
>  	.enum_mbus_code = mt9p031_enum_mbus_code,
>  	.enum_frame_size = mt9p031_enum_frame_size,
>  	.get_fmt = mt9p031_get_format,
> @@ -1057,6 +1056,7 @@ static const struct v4l2_subdev_ops mt9p031_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
> +	.init_state = mt9p031_init_state,
>  	.registered = mt9p031_registered,
>  	.open = mt9p031_open,
>  	.close = mt9p031_close,
> @@ -1189,7 +1189,7 @@ static int mt9p031_probe(struct i2c_client *client)
>  
>  	mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  
> -	ret = mt9p031_init_cfg(&mt9p031->subdev, NULL);
> +	ret = mt9p031_init_state(&mt9p031->subdev, NULL);
>  	if (ret)
>  		goto done;
>  
> diff --git a/drivers/media/i2c/mt9v111.c b/drivers/media/i2c/mt9v111.c
> index 6752582cb2c7..b186e9160d94 100644
> --- a/drivers/media/i2c/mt9v111.c
> +++ b/drivers/media/i2c/mt9v111.c
> @@ -948,8 +948,8 @@ static int mt9v111_set_format(struct v4l2_subdev *subdev,
>  	return 0;
>  }
>  
> -static int mt9v111_init_cfg(struct v4l2_subdev *subdev,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9v111_init_state(struct v4l2_subdev *subdev,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	*v4l2_subdev_state_get_format(sd_state, 0) = mt9v111_def_fmt;
>  
> @@ -967,7 +967,6 @@ static const struct v4l2_subdev_video_ops mt9v111_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9v111_pad_ops = {
> -	.init_cfg		= mt9v111_init_cfg,
>  	.enum_mbus_code		= mt9v111_enum_mbus_code,
>  	.enum_frame_size	= mt9v111_enum_frame_size,
>  	.enum_frame_interval	= mt9v111_enum_frame_interval,
> @@ -981,6 +980,10 @@ static const struct v4l2_subdev_ops mt9v111_ops = {
>  	.pad	= &mt9v111_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9v111_internal_ops = {
> +	.init_state		= mt9v111_init_state,
> +};
> +
>  static const struct media_entity_operations mt9v111_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1194,6 +1197,7 @@ static int mt9v111_probe(struct i2c_client *client)
>  	mt9v111->pending	= true;
>  
>  	v4l2_i2c_subdev_init(&mt9v111->sd, client, &mt9v111_ops);
> +	mt9v111->sd.internal_ops = &mt9v111_internal_ops;
>  
>  	mt9v111->sd.flags	|= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	mt9v111->sd.entity.ops	= &mt9v111_subdev_entity_ops;
> diff --git a/drivers/media/i2c/ov01a10.c b/drivers/media/i2c/ov01a10.c
> index ba295d1575f0..5606437f37d0 100644
> --- a/drivers/media/i2c/ov01a10.c
> +++ b/drivers/media/i2c/ov01a10.c
> @@ -729,8 +729,8 @@ static int ov01a10_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov01a10_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *state)
> +static int ov01a10_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -813,7 +813,6 @@ static const struct v4l2_subdev_video_ops ov01a10_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov01a10_pad_ops = {
> -	.init_cfg = ov01a10_init_cfg,
>  	.set_fmt = ov01a10_set_format,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.get_selection = ov01a10_get_selection,
> @@ -827,6 +826,10 @@ static const struct v4l2_subdev_ops ov01a10_subdev_ops = {
>  	.pad = &ov01a10_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov01a10_internal_ops = {
> +	.init_state = ov01a10_init_state,
> +};
> +
>  static const struct media_entity_operations ov01a10_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -873,6 +876,7 @@ static int ov01a10_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&ov01a10->sd, client, &ov01a10_subdev_ops);
> +	ov01a10->sd.internal_ops = &ov01a10_internal_ops;
>  
>  	ret = ov01a10_identify_module(ov01a10);
>  	if (ret)
> diff --git a/drivers/media/i2c/ov02a10.c b/drivers/media/i2c/ov02a10.c
> index 8454cb39a47b..6c30e1a0d814 100644
> --- a/drivers/media/i2c/ov02a10.c
> +++ b/drivers/media/i2c/ov02a10.c
> @@ -511,8 +511,8 @@ static int __ov02a10_stop_stream(struct ov02a10 *ov02a10)
>  					 SC_CTRL_MODE_STANDBY);
>  }
>  
> -static int ov02a10_entity_init_cfg(struct v4l2_subdev *sd,
> -				   struct v4l2_subdev_state *sd_state)
> +static int ov02a10_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -709,7 +709,6 @@ static const struct v4l2_subdev_video_ops ov02a10_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov02a10_pad_ops = {
> -	.init_cfg = ov02a10_entity_init_cfg,
>  	.enum_mbus_code = ov02a10_enum_mbus_code,
>  	.enum_frame_size = ov02a10_enum_frame_sizes,
>  	.get_fmt = ov02a10_get_fmt,
> @@ -721,6 +720,10 @@ static const struct v4l2_subdev_ops ov02a10_subdev_ops = {
>  	.pad	= &ov02a10_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov02a10_internal_ops = {
> +	.init_state = ov02a10_init_state,
> +};
> +
>  static const struct media_entity_operations ov02a10_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -869,6 +872,7 @@ static int ov02a10_probe(struct i2c_client *client)
>  				     "failed to check HW configuration\n");
>  
>  	v4l2_i2c_subdev_init(&ov02a10->subdev, client, &ov02a10_subdev_ops);
> +	ov02a10->subdev.internal_ops = &ov02a10_internal_ops;
>  
>  	ov02a10->mipi_clock_voltage = OV02A10_MIPI_TX_SPEED_DEFAULT;
>  	ov02a10->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10;
> diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
> index 28911d5169f7..67c4bd2916e8 100644
> --- a/drivers/media/i2c/ov2640.c
> +++ b/drivers/media/i2c/ov2640.c
> @@ -996,8 +996,8 @@ static int ov2640_set_fmt(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int ov2640_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov2640_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *try_fmt =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -1125,7 +1125,6 @@ static const struct v4l2_subdev_core_ops ov2640_subdev_core_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov2640_subdev_pad_ops = {
> -	.init_cfg	= ov2640_init_cfg,
>  	.enum_mbus_code = ov2640_enum_mbus_code,
>  	.get_selection	= ov2640_get_selection,
>  	.get_fmt	= ov2640_get_fmt,
> @@ -1142,6 +1141,10 @@ static const struct v4l2_subdev_ops ov2640_subdev_ops = {
>  	.video	= &ov2640_subdev_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov2640_internal_ops = {
> +	.init_state	= ov2640_init_state,
> +};
> +
>  static int ov2640_probe_dt(struct i2c_client *client,
>  		struct ov2640_priv *priv)
>  {
> @@ -1211,6 +1214,7 @@ static int ov2640_probe(struct i2c_client *client)
>  	priv->cfmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
>  
>  	v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
> +	priv->subdev.internal_ops = &ov2640_internal_ops;
>  	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			      V4L2_SUBDEV_FL_HAS_EVENTS;
>  	mutex_init(&priv->lock);
> diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c
> index 9b53ea9af45a..d34d1972dcd9 100644
> --- a/drivers/media/i2c/ov2680.c
> +++ b/drivers/media/i2c/ov2680.c
> @@ -755,8 +755,8 @@ static int ov2680_set_selection(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov2680_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov2680_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct ov2680_dev *sensor = to_ov2680_dev(sd);
>  
> @@ -876,7 +876,6 @@ static const struct v4l2_subdev_video_ops ov2680_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov2680_pad_ops = {
> -	.init_cfg		= ov2680_init_cfg,
>  	.enum_mbus_code		= ov2680_enum_mbus_code,
>  	.enum_frame_size	= ov2680_enum_frame_size,
>  	.enum_frame_interval	= ov2680_enum_frame_interval,
> @@ -891,6 +890,10 @@ static const struct v4l2_subdev_ops ov2680_subdev_ops = {
>  	.pad	= &ov2680_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov2680_internal_ops = {
> +	.init_state		= ov2680_init_state,
> +};
> +
>  static int ov2680_mode_init(struct ov2680_dev *sensor)
>  {
>  	/* set initial mode */
> @@ -915,6 +918,7 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor)
>  	int ret = 0;
>  
>  	v4l2_i2c_subdev_init(&sensor->sd, client, &ov2680_subdev_ops);
> +	sensor->sd.internal_ops = &ov2680_internal_ops;
>  
>  	sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
> diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
> index 23cbd8b7846e..f0be51b343a7 100644
> --- a/drivers/media/i2c/ov2740.c
> +++ b/drivers/media/i2c/ov2740.c
> @@ -879,8 +879,8 @@ static int ov2740_enum_frame_size(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov2740_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov2740_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	ov2740_update_pad_format(&supported_modes[0],
>  				 v4l2_subdev_state_get_format(sd_state, 0));
> @@ -897,7 +897,6 @@ static const struct v4l2_subdev_pad_ops ov2740_pad_ops = {
>  	.set_fmt = ov2740_set_format,
>  	.enum_mbus_code = ov2740_enum_mbus_code,
>  	.enum_frame_size = ov2740_enum_frame_size,
> -	.init_cfg = ov2740_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops ov2740_subdev_ops = {
> @@ -905,6 +904,10 @@ static const struct v4l2_subdev_ops ov2740_subdev_ops = {
>  	.pad = &ov2740_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov2740_internal_ops = {
> +	.init_state = ov2740_init_state,
> +};
> +
>  static const struct media_entity_operations ov2740_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1074,6 +1077,7 @@ static int ov2740_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&ov2740->sd, client, &ov2740_subdev_ops);
> +	ov2740->sd.internal_ops = &ov2740_internal_ops;
>  	full_power = acpi_dev_state_d0(&client->dev);
>  	if (full_power) {
>  		ret = ov2740_identify_module(ov2740);
> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> index 3f79a3b77044..6fd98b8cb181 100644
> --- a/drivers/media/i2c/ov5640.c
> +++ b/drivers/media/i2c/ov5640.c
> @@ -3744,8 +3744,8 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int ov5640_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int ov5640_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct ov5640_dev *sensor = to_ov5640_dev(sd);
>  	struct v4l2_mbus_framefmt *fmt =
> @@ -3776,7 +3776,6 @@ static const struct v4l2_subdev_video_ops ov5640_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
> -	.init_cfg = ov5640_init_cfg,
>  	.enum_mbus_code = ov5640_enum_mbus_code,
>  	.get_fmt = ov5640_get_fmt,
>  	.set_fmt = ov5640_set_fmt,
> @@ -3791,6 +3790,10 @@ static const struct v4l2_subdev_ops ov5640_subdev_ops = {
>  	.pad = &ov5640_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov5640_internal_ops = {
> +	.init_state = ov5640_init_state,
> +};
> +
>  static int ov5640_get_regulators(struct ov5640_dev *sensor)
>  {
>  	int i;
> @@ -3905,6 +3908,7 @@ static int ov5640_probe(struct i2c_client *client)
>  		return PTR_ERR(sensor->reset_gpio);
>  
>  	v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
> +	sensor->sd.internal_ops = &ov5640_internal_ops;
>  
>  	sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			    V4L2_SUBDEV_FL_HAS_EVENTS;
> diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
> index 695f4f673536..a26ac11c989d 100644
> --- a/drivers/media/i2c/ov5645.c
> +++ b/drivers/media/i2c/ov5645.c
> @@ -934,8 +934,8 @@ static int ov5645_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov5645_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int ov5645_init_state(struct v4l2_subdev *subdev,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { 0 };
>  
> @@ -1023,7 +1023,6 @@ static const struct v4l2_subdev_video_ops ov5645_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov5645_subdev_pad_ops = {
> -	.init_cfg = ov5645_entity_init_cfg,
>  	.enum_mbus_code = ov5645_enum_mbus_code,
>  	.enum_frame_size = ov5645_enum_frame_size,
>  	.get_fmt = ov5645_get_format,
> @@ -1036,6 +1035,10 @@ static const struct v4l2_subdev_ops ov5645_subdev_ops = {
>  	.pad = &ov5645_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov5645_internal_ops = {
> +	.init_state = ov5645_init_state,
> +};
> +
>  static int ov5645_probe(struct i2c_client *client)
>  {
>  	struct device *dev = &client->dev;
> @@ -1162,6 +1165,7 @@ static int ov5645_probe(struct i2c_client *client)
>  	}
>  
>  	v4l2_i2c_subdev_init(&ov5645->sd, client, &ov5645_subdev_ops);
> +	ov5645->sd.internal_ops = &ov5645_internal_ops;
>  	ov5645->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	ov5645->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	ov5645->sd.dev = &client->dev;
> @@ -1220,7 +1224,7 @@ static int ov5645_probe(struct i2c_client *client)
>  	pm_runtime_get_noresume(dev);
>  	pm_runtime_enable(dev);
>  
> -	ov5645_entity_init_cfg(&ov5645->sd, NULL);
> +	ov5645_init_state(&ov5645->sd, NULL);
>  
>  	ret = v4l2_async_register_subdev(&ov5645->sd);
>  	if (ret < 0) {
> diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c
> index 470d848f40d8..2aee85965cf7 100644
> --- a/drivers/media/i2c/ov5670.c
> +++ b/drivers/media/i2c/ov5670.c
> @@ -2196,8 +2196,8 @@ static int ov5670_init_controls(struct ov5670 *ov5670)
>  	return ret;
>  }
>  
> -static int ov5670_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int ov5670_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_mbus_framefmt *fmt =
>  				v4l2_subdev_state_get_format(state, 0);
> @@ -2592,7 +2592,6 @@ static const struct v4l2_subdev_video_ops ov5670_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov5670_pad_ops = {
> -	.init_cfg = ov5670_init_cfg,
>  	.enum_mbus_code = ov5670_enum_mbus_code,
>  	.get_fmt = ov5670_get_pad_format,
>  	.set_fmt = ov5670_set_pad_format,
> @@ -2612,6 +2611,10 @@ static const struct v4l2_subdev_ops ov5670_subdev_ops = {
>  	.sensor = &ov5670_sensor_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov5670_internal_ops = {
> +	.init_state = ov5670_init_state,
> +};
> +
>  static const struct media_entity_operations ov5670_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -2675,6 +2678,7 @@ static int ov5670_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&ov5670->sd, client, &ov5670_subdev_ops);
> +	ov5670->sd.internal_ops = &ov5670_internal_ops;
>  
>  	ret = ov5670_regulators_probe(ov5670);
>  	if (ret)
> diff --git a/drivers/media/i2c/ov7251.c b/drivers/media/i2c/ov7251.c
> index 774f5dfb8186..897a0763df4a 100644
> --- a/drivers/media/i2c/ov7251.c
> +++ b/drivers/media/i2c/ov7251.c
> @@ -1282,8 +1282,8 @@ static int ov7251_set_format(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int ov7251_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int ov7251_init_state(struct v4l2_subdev *subdev,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> @@ -1441,7 +1441,6 @@ static const struct v4l2_subdev_video_ops ov7251_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov7251_subdev_pad_ops = {
> -	.init_cfg = ov7251_entity_init_cfg,
>  	.enum_mbus_code = ov7251_enum_mbus_code,
>  	.enum_frame_size = ov7251_enum_frame_size,
>  	.enum_frame_interval = ov7251_enum_frame_ival,
> @@ -1455,6 +1454,10 @@ static const struct v4l2_subdev_ops ov7251_subdev_ops = {
>  	.pad = &ov7251_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov7251_internal_ops = {
> +	.init_state = ov7251_init_state,
> +};
> +
>  static int ov7251_check_hwcfg(struct ov7251 *ov7251)
>  {
>  	struct fwnode_handle *fwnode = dev_fwnode(ov7251->dev);
> @@ -1693,6 +1696,7 @@ static int ov7251_probe(struct i2c_client *client)
>  	}
>  
>  	v4l2_i2c_subdev_init(&ov7251->sd, client, &ov7251_subdev_ops);
> +	ov7251->sd.internal_ops = &ov7251_internal_ops;
>  	ov7251->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	ov7251->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	ov7251->sd.dev = &client->dev;
> @@ -1750,7 +1754,7 @@ static int ov7251_probe(struct i2c_client *client)
>  		goto free_entity;
>  	}
>  
> -	ov7251_entity_init_cfg(&ov7251->sd, NULL);
> +	ov7251_init_state(&ov7251->sd, NULL);
>  
>  	return 0;
>  
> diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c
> index 0e3776136136..174c65f76886 100644
> --- a/drivers/media/i2c/ov8858.c
> +++ b/drivers/media/i2c/ov8858.c
> @@ -1476,8 +1476,8 @@ static int ov8858_enum_mbus_code(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov8858_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov8858_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	const struct ov8858_mode *def_mode = &ov8858_modes[0];
>  	struct v4l2_subdev_format fmt = {
> @@ -1494,7 +1494,6 @@ static int ov8858_init_cfg(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops ov8858_pad_ops = {
> -	.init_cfg = ov8858_init_cfg,
>  	.enum_mbus_code = ov8858_enum_mbus_code,
>  	.enum_frame_size = ov8858_enum_frame_sizes,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1512,6 +1511,10 @@ static const struct v4l2_subdev_ops ov8858_subdev_ops = {
>  	.pad	= &ov8858_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov8858_internal_ops = {
> +	.init_state = ov8858_init_state,
> +};
> +
>  /* ----------------------------------------------------------------------------
>   * Controls handling
>   */
> @@ -1899,6 +1902,7 @@ static int ov8858_probe(struct i2c_client *client)
>  				     "Failed to get powerdown gpio\n");
>  
>  	v4l2_i2c_subdev_init(&ov8858->subdev, client, &ov8858_subdev_ops);
> +	ov8858->subdev.internal_ops = &ov8858_internal_ops;
>  
>  	ret = ov8858_configure_regulators(ov8858);
>  	if (ret)
> diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
> index 1707bc22ca91..251a4b534914 100644
> --- a/drivers/media/i2c/ov9282.c
> +++ b/drivers/media/i2c/ov9282.c
> @@ -876,14 +876,14 @@ static int ov9282_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * ov9282_init_cfg() - Initialize sub-device state
> + * ov9282_init_state() - Initialize sub-device state
>   * @sd: pointer to ov9282 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device configuration
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int ov9282_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov9282_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct ov9282 *ov9282 = to_ov9282(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -1192,7 +1192,6 @@ static const struct v4l2_subdev_video_ops ov9282_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov9282_pad_ops = {
> -	.init_cfg = ov9282_init_cfg,
>  	.enum_mbus_code = ov9282_enum_mbus_code,
>  	.enum_frame_size = ov9282_enum_frame_size,
>  	.get_fmt = ov9282_get_pad_format,
> @@ -1206,6 +1205,10 @@ static const struct v4l2_subdev_ops ov9282_subdev_ops = {
>  	.pad = &ov9282_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov9282_internal_ops = {
> +	.init_state = ov9282_init_state,
> +};
> +
>  /**
>   * ov9282_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -1394,6 +1397,7 @@ static int ov9282_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&ov9282->sd, client, &ov9282_subdev_ops);
> +	ov9282->sd.internal_ops = &ov9282_internal_ops;
>  	v4l2_i2c_subdev_set_name(&ov9282->sd, client,
>  				 device_get_match_data(ov9282->dev), NULL);
>  
> diff --git a/drivers/media/i2c/st-vgxy61.c b/drivers/media/i2c/st-vgxy61.c
> index 507cd9661e9d..98d8975dcd67 100644
> --- a/drivers/media/i2c/st-vgxy61.c
> +++ b/drivers/media/i2c/st-vgxy61.c
> @@ -1322,8 +1322,8 @@ static int vgxy61_set_fmt(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int vgxy61_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int vgxy61_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct vgxy61_dev *sensor = to_vgxy61_dev(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -1469,7 +1469,6 @@ static const struct v4l2_subdev_video_ops vgxy61_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops vgxy61_pad_ops = {
> -	.init_cfg = vgxy61_init_cfg,
>  	.enum_mbus_code = vgxy61_enum_mbus_code,
>  	.get_fmt = vgxy61_get_fmt,
>  	.set_fmt = vgxy61_set_fmt,
> @@ -1482,6 +1481,10 @@ static const struct v4l2_subdev_ops vgxy61_subdev_ops = {
>  	.pad = &vgxy61_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vgxy61_internal_ops = {
> +	.init_state = vgxy61_init_state,
> +};
> +
>  static const struct media_entity_operations vgxy61_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1842,6 +1845,7 @@ static int vgxy61_probe(struct i2c_client *client)
>  		device_property_read_bool(dev, "st,strobe-gpios-polarity");
>  
>  	v4l2_i2c_subdev_init(&sensor->sd, client, &vgxy61_subdev_ops);
> +	sensor->sd.internal_ops = &vgxy61_internal_ops;
>  	sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	sensor->sd.entity.ops = &vgxy61_subdev_entity_ops;
> diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c
> index 8be9c0f293e0..106de4271d2e 100644
> --- a/drivers/media/i2c/tc358746.c
> +++ b/drivers/media/i2c/tc358746.c
> @@ -740,8 +740,8 @@ static int tc358746_s_stream(struct v4l2_subdev *sd, int enable)
>  	return v4l2_subdev_call(src, video, s_stream, 0);
>  }
>  
> -static int tc358746_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *state)
> +static int tc358746_init_state(struct v4l2_subdev *sd,
> +			       struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_mbus_framefmt *fmt;
>  
> @@ -1038,7 +1038,6 @@ static const struct v4l2_subdev_video_ops tc358746_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops tc358746_pad_ops = {
> -	.init_cfg = tc358746_init_cfg,
>  	.enum_mbus_code = tc358746_enum_mbus_code,
>  	.set_fmt = tc358746_set_fmt,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1052,6 +1051,10 @@ static const struct v4l2_subdev_ops tc358746_ops = {
>  	.pad = &tc358746_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops tc358746_internal_ops = {
> +	.init_state = tc358746_init_state,
> +};
> +
>  static const struct media_entity_operations tc358746_entity_ops = {
>  	.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
>  	.link_validate = v4l2_subdev_link_validate,
> @@ -1282,6 +1285,7 @@ tc358746_init_subdev(struct tc358746 *tc358746, struct i2c_client *client)
>  	int err;
>  
>  	v4l2_i2c_subdev_init(sd, client, &tc358746_ops);
> +	sd->internal_ops = &tc358746_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	sd->entity.ops = &tc358746_entity_ops;
> diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c
> index 63c12b77ff1e..1ea703a9909f 100644
> --- a/drivers/media/i2c/tda1997x.c
> +++ b/drivers/media/i2c/tda1997x.c
> @@ -1734,8 +1734,8 @@ static const struct v4l2_subdev_video_ops tda1997x_video_ops = {
>   * v4l2_subdev_pad_ops
>   */
>  
> -static int tda1997x_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *sd_state)
> +static int tda1997x_init_state(struct v4l2_subdev *sd,
> +			       struct v4l2_subdev_state *sd_state)
>  {
>  	struct tda1997x_state *state = to_state(sd);
>  	struct v4l2_mbus_framefmt *mf;
> @@ -1925,7 +1925,6 @@ static int tda1997x_enum_dv_timings(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops tda1997x_pad_ops = {
> -	.init_cfg = tda1997x_init_cfg,
>  	.enum_mbus_code = tda1997x_enum_mbus_code,
>  	.get_fmt = tda1997x_get_format,
>  	.set_fmt = tda1997x_set_format,
> @@ -2047,6 +2046,10 @@ static const struct v4l2_subdev_ops tda1997x_subdev_ops = {
>  	.pad = &tda1997x_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops tda1997x_internal_ops = {
> +	.init_state = tda1997x_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * v4l2_controls
>   */
> @@ -2588,6 +2591,7 @@ static int tda1997x_probe(struct i2c_client *client)
>  	/* initialize subdev */
>  	sd = &state->sd;
>  	v4l2_i2c_subdev_init(sd, client, &tda1997x_subdev_ops);
> +	sd->internal_ops = &tda1997x_internal_ops;
>  	snprintf(sd->name, sizeof(sd->name), "%s %d-%04x",
>  		 id->name, i2c_adapter_id(client->adapter),
>  		 client->addr);
> diff --git a/drivers/media/i2c/thp7312.c b/drivers/media/i2c/thp7312.c
> index 8d818ce055de..04b78c1f8090 100644
> --- a/drivers/media/i2c/thp7312.c
> +++ b/drivers/media/i2c/thp7312.c
> @@ -837,8 +837,8 @@ static int thp7312_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int thp7312_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int thp7312_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	const struct thp7312_mode_info *default_mode = &thp7312_mode_info_data[0];
>  	struct v4l2_mbus_framefmt *fmt;
> @@ -875,7 +875,6 @@ static const struct v4l2_subdev_video_ops thp7312_video_ops = {
>  
>  static const struct v4l2_subdev_pad_ops thp7312_pad_ops = {
>  	.enum_mbus_code = thp7312_enum_mbus_code,
> -	.init_cfg = thp7312_init_cfg,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = thp7312_set_fmt,
>  	.enum_frame_size = thp7312_enum_frame_size,
> @@ -888,6 +887,10 @@ static const struct v4l2_subdev_ops thp7312_subdev_ops = {
>  	.pad = &thp7312_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops thp7312_internal_ops = {
> +	.init_state = thp7312_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * V4L2 Control Operations
>   */
> @@ -2103,6 +2106,7 @@ static int thp7312_probe(struct i2c_client *client)
>  		return thp7312_register_flash_mode(thp7312);
>  
>  	v4l2_i2c_subdev_init(&thp7312->sd, client, &thp7312_subdev_ops);
> +	thp7312->sd.internal_ops = &thp7312_internal_ops;
>  	thp7312->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	thp7312->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	thp7312->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
> diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
> index 76a92bfb6fde..9fc586cfdcd8 100644
> --- a/drivers/media/i2c/tvp5150.c
> +++ b/drivers/media/i2c/tvp5150.c
> @@ -1209,8 +1209,8 @@ static int tvp5150_get_mbus_config(struct v4l2_subdev *sd,
>  /****************************************************************************
>  			V4L2 subdev pad ops
>   ****************************************************************************/
> -static int tvp5150_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int tvp5150_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct tvp5150 *decoder = to_tvp5150(sd);
>  	v4l2_std_id std;
> @@ -1722,7 +1722,6 @@ static const struct v4l2_subdev_vbi_ops tvp5150_vbi_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops tvp5150_pad_ops = {
> -	.init_cfg = tvp5150_init_cfg,
>  	.enum_mbus_code = tvp5150_enum_mbus_code,
>  	.enum_frame_size = tvp5150_enum_frame_size,
>  	.set_fmt = tvp5150_fill_fmt,
> @@ -1741,6 +1740,7 @@ static const struct v4l2_subdev_ops tvp5150_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops tvp5150_internal_ops = {
> +	.init_state = tvp5150_init_state,
>  	.registered = tvp5150_registered,
>  	.open = tvp5150_open,
>  	.close = tvp5150_close,
> diff --git a/drivers/media/pci/intel/ivsc/mei_csi.c b/drivers/media/pci/intel/ivsc/mei_csi.c
> index 8bf90e2bd856..15b905f66ab7 100644
> --- a/drivers/media/pci/intel/ivsc/mei_csi.c
> +++ b/drivers/media/pci/intel/ivsc/mei_csi.c
> @@ -346,8 +346,8 @@ mei_csi_get_pad_format(struct v4l2_subdev *sd,
>  	}
>  }
>  
> -static int mei_csi_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mei_csi_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *mbusformat;
>  	struct mei_csi *csi = sd_to_csi(sd);
> @@ -554,7 +554,6 @@ static const struct v4l2_subdev_video_ops mei_csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mei_csi_pad_ops = {
> -	.init_cfg = mei_csi_init_cfg,
>  	.get_fmt = mei_csi_get_fmt,
>  	.set_fmt = mei_csi_set_fmt,
>  };
> @@ -564,6 +563,10 @@ static const struct v4l2_subdev_ops mei_csi_subdev_ops = {
>  	.pad = &mei_csi_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mei_csi_internal_ops = {
> +	.init_state = mei_csi_init_state,
> +};
> +
>  static const struct media_entity_operations mei_csi_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -747,6 +750,7 @@ static int mei_csi_probe(struct mei_cl_device *cldev,
>  
>  	csi->subdev.dev = &cldev->dev;
>  	v4l2_subdev_init(&csi->subdev, &mei_csi_subdev_ops);
> +	csi->subdev.internal_ops = &mei_csi_internal_ops;
>  	v4l2_set_subdevdata(&csi->subdev, csi);
>  	csi->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			    V4L2_SUBDEV_FL_HAS_EVENTS;
> diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
> index 0171ea7b834d..fead5426830e 100644
> --- a/drivers/media/platform/cadence/cdns-csi2rx.c
> +++ b/drivers/media/platform/cadence/cdns-csi2rx.c
> @@ -418,8 +418,8 @@ static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
>  	return 0;
>  }
>  
> -static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
> -			   struct v4l2_subdev_state *state)
> +static int csi2rx_init_state(struct v4l2_subdev *subdev,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format format = {
>  		.pad = CSI2RX_PAD_SINK,
> @@ -441,7 +441,6 @@ static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
>  static const struct v4l2_subdev_pad_ops csi2rx_pad_ops = {
>  	.get_fmt	= v4l2_subdev_get_fmt,
>  	.set_fmt	= csi2rx_set_fmt,
> -	.init_cfg	= csi2rx_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_video_ops csi2rx_video_ops = {
> @@ -453,6 +452,10 @@ static const struct v4l2_subdev_ops csi2rx_subdev_ops = {
>  	.pad		= &csi2rx_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops csi2rx_internal_ops = {
> +	.init_state	= csi2rx_init_state,
> +};
> +
>  static const struct media_entity_operations csi2rx_media_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -663,6 +666,7 @@ static int csi2rx_probe(struct platform_device *pdev)
>  	csi2rx->subdev.owner = THIS_MODULE;
>  	csi2rx->subdev.dev = &pdev->dev;
>  	v4l2_subdev_init(&csi2rx->subdev, &csi2rx_subdev_ops);
> +	csi2rx->subdev.internal_ops = &csi2rx_internal_ops;
>  	v4l2_set_subdevdata(&csi2rx->subdev, &pdev->dev);
>  	snprintf(csi2rx->subdev.name, sizeof(csi2rx->subdev.name),
>  		 "%s.%s", KBUILD_MODNAME, dev_name(&pdev->dev));
> diff --git a/drivers/media/platform/microchip/microchip-csi2dc.c b/drivers/media/platform/microchip/microchip-csi2dc.c
> index 87a2d092aad2..fee73260bb1e 100644
> --- a/drivers/media/platform/microchip/microchip-csi2dc.c
> +++ b/drivers/media/platform/microchip/microchip-csi2dc.c
> @@ -435,8 +435,8 @@ static int csi2dc_s_stream(struct v4l2_subdev *csi2dc_sd, int enable)
>  	return ret;
>  }
>  
> -static int csi2dc_init_cfg(struct v4l2_subdev *csi2dc_sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int csi2dc_init_state(struct v4l2_subdev *csi2dc_sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *v4l2_try_fmt =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -461,7 +461,6 @@ static const struct v4l2_subdev_pad_ops csi2dc_pad_ops = {
>  	.enum_mbus_code = csi2dc_enum_mbus_code,
>  	.set_fmt = csi2dc_set_fmt,
>  	.get_fmt = csi2dc_get_fmt,
> -	.init_cfg = csi2dc_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_video_ops csi2dc_video_ops = {
> @@ -473,6 +472,10 @@ static const struct v4l2_subdev_ops csi2dc_subdev_ops = {
>  	.video = &csi2dc_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops csi2dc_internal_ops = {
> +	.init_state = csi2dc_init_state,
> +};
> +
>  static int csi2dc_async_bound(struct v4l2_async_notifier *notifier,
>  			      struct v4l2_subdev *subdev,
>  			      struct v4l2_async_connection *asd)
> @@ -677,6 +680,7 @@ static int csi2dc_probe(struct platform_device *pdev)
>  	}
>  
>  	v4l2_subdev_init(&csi2dc->csi2dc_sd, &csi2dc_subdev_ops);
> +	csi2dc->csi2dc_sd.internal_ops = &csi2dc_internal_ops;
>  
>  	csi2dc->csi2dc_sd.owner = THIS_MODULE;
>  	csi2dc->csi2dc_sd.dev = dev;
> diff --git a/drivers/media/platform/microchip/microchip-isc-scaler.c b/drivers/media/platform/microchip/microchip-isc-scaler.c
> index 58dffbc9fbcb..e83463543e21 100644
> --- a/drivers/media/platform/microchip/microchip-isc-scaler.c
> +++ b/drivers/media/platform/microchip/microchip-isc-scaler.c
> @@ -145,8 +145,8 @@ static int isc_scaler_g_sel(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int isc_scaler_init_cfg(struct v4l2_subdev *sd,
> -			       struct v4l2_subdev_state *sd_state)
> +static int isc_scaler_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *v4l2_try_fmt =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -170,7 +170,6 @@ static const struct v4l2_subdev_pad_ops isc_scaler_pad_ops = {
>  	.set_fmt = isc_scaler_set_fmt,
>  	.get_fmt = isc_scaler_get_fmt,
>  	.get_selection = isc_scaler_g_sel,
> -	.init_cfg = isc_scaler_init_cfg,
>  };
>  
>  static const struct media_entity_operations isc_scaler_entity_ops = {
> @@ -181,11 +180,16 @@ static const struct v4l2_subdev_ops xisc_scaler_subdev_ops = {
>  	.pad = &isc_scaler_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops isc_scaler_internal_ops = {
> +	.init_state = isc_scaler_init_state,
> +};
> +
>  int isc_scaler_init(struct isc_device *isc)
>  {
>  	int ret;
>  
>  	v4l2_subdev_init(&isc->scaler_sd, &xisc_scaler_subdev_ops);
> +	isc->scaler_sd.internal_ops = &isc_scaler_internal_ops;
>  
>  	isc->scaler_sd.owner = THIS_MODULE;
>  	isc->scaler_sd.dev = isc->dev;
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index a2c748217376..b12e2435ef60 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -1122,8 +1122,8 @@ static int mipi_csis_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
>  	return 0;
>  }
>  
> -static int mipi_csis_init_cfg(struct v4l2_subdev *sd,
> -			      struct v4l2_subdev_state *sd_state)
> +static int mipi_csis_init_state(struct v4l2_subdev *sd,
> +				struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.pad = CSIS_PAD_SINK,
> @@ -1163,7 +1163,6 @@ static const struct v4l2_subdev_video_ops mipi_csis_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mipi_csis_pad_ops = {
> -	.init_cfg		= mipi_csis_init_cfg,
>  	.enum_mbus_code		= mipi_csis_enum_mbus_code,
>  	.get_fmt		= v4l2_subdev_get_fmt,
>  	.set_fmt		= mipi_csis_set_fmt,
> @@ -1176,6 +1175,10 @@ static const struct v4l2_subdev_ops mipi_csis_subdev_ops = {
>  	.pad	= &mipi_csis_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mipi_csis_internal_ops = {
> +	.init_state		= mipi_csis_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media entity operations
>   */
> @@ -1350,6 +1353,7 @@ static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
>  	int ret;
>  
>  	v4l2_subdev_init(sd, &mipi_csis_subdev_ops);
> +	sd->internal_ops = &mipi_csis_internal_ops;
>  	sd->owner = THIS_MODULE;
>  	snprintf(sd->name, sizeof(sd->name), "csis-%s",
>  		 dev_name(csis->dev));
> diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c
> index 1d2464ca59b8..651151da3ab4 100644
> --- a/drivers/media/platform/nxp/imx7-media-csi.c
> +++ b/drivers/media/platform/nxp/imx7-media-csi.c
> @@ -1729,8 +1729,8 @@ static int imx7_csi_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int imx7_csi_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *sd_state)
> +static int imx7_csi_init_state(struct v4l2_subdev *sd,
> +			       struct v4l2_subdev_state *sd_state)
>  {
>  	const struct imx7_csi_pixfmt *cc;
>  	int i;
> @@ -2006,7 +2006,6 @@ static const struct v4l2_subdev_video_ops imx7_csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx7_csi_pad_ops = {
> -	.init_cfg	= imx7_csi_init_cfg,
>  	.enum_mbus_code	= imx7_csi_enum_mbus_code,
>  	.get_fmt	= v4l2_subdev_get_fmt,
>  	.set_fmt	= imx7_csi_set_fmt,
> @@ -2019,6 +2018,7 @@ static const struct v4l2_subdev_ops imx7_csi_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops imx7_csi_internal_ops = {
> +	.init_state	= imx7_csi_init_state,
>  	.registered	= imx7_csi_registered,
>  	.unregistered	= imx7_csi_unregistered,
>  };
> diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
> index 9401261eb239..575f17337388 100644
> --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
> +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
> @@ -176,8 +176,8 @@ mxc_isi_crossbar_xlate_streams(struct mxc_isi_crossbar *xbar,
>  	return sd;
>  }
>  
> -static int mxc_isi_crossbar_init_cfg(struct v4l2_subdev *sd,
> -				     struct v4l2_subdev_state *state)
> +static int mxc_isi_crossbar_init_state(struct v4l2_subdev *sd,
> +				       struct v4l2_subdev_state *state)
>  {
>  	struct mxc_isi_crossbar *xbar = to_isi_crossbar(sd);
>  	struct v4l2_subdev_krouting routing = { };
> @@ -404,7 +404,6 @@ static int mxc_isi_crossbar_disable_streams(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops mxc_isi_crossbar_subdev_pad_ops = {
> -	.init_cfg = mxc_isi_crossbar_init_cfg,
>  	.enum_mbus_code = mxc_isi_crossbar_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = mxc_isi_crossbar_set_fmt,
> @@ -417,6 +416,10 @@ static const struct v4l2_subdev_ops mxc_isi_crossbar_subdev_ops = {
>  	.pad = &mxc_isi_crossbar_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mxc_isi_crossbar_internal_ops = {
> +	.init_state = mxc_isi_crossbar_init_state,
> +};
> +
>  static const struct media_entity_operations mxc_isi_cross_entity_ops = {
>  	.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
>  	.link_validate	= v4l2_subdev_link_validate,
> @@ -438,6 +441,7 @@ int mxc_isi_crossbar_init(struct mxc_isi_dev *isi)
>  	xbar->isi = isi;
>  
>  	v4l2_subdev_init(sd, &mxc_isi_crossbar_subdev_ops);
> +	sd->internal_ops = &mxc_isi_crossbar_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
>  	strscpy(sd->name, "crossbar", sizeof(sd->name));
>  	sd->dev = isi->dev;
> diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
> index 14c6da392803..d76eb58deb09 100644
> --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
> +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
> @@ -341,8 +341,8 @@ mxc_isi_pipe_get_pad_compose(struct mxc_isi_pipe *pipe,
>  	return v4l2_subdev_state_get_compose(state, pad);
>  }
>  
> -static int mxc_isi_pipe_init_cfg(struct v4l2_subdev *sd,
> -				 struct v4l2_subdev_state *state)
> +static int mxc_isi_pipe_init_state(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_state *state)
>  {
>  	struct mxc_isi_pipe *pipe = to_isi_pipe(sd);
>  	struct v4l2_mbus_framefmt *fmt_source;
> @@ -682,7 +682,6 @@ static int mxc_isi_pipe_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops mxc_isi_pipe_subdev_pad_ops = {
> -	.init_cfg = mxc_isi_pipe_init_cfg,
>  	.enum_mbus_code = mxc_isi_pipe_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = mxc_isi_pipe_set_fmt,
> @@ -694,6 +693,10 @@ static const struct v4l2_subdev_ops mxc_isi_pipe_subdev_ops = {
>  	.pad = &mxc_isi_pipe_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mxc_isi_pipe_internal_ops = {
> +	.init_state = mxc_isi_pipe_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * IRQ handling
>   */
> @@ -767,6 +770,7 @@ int mxc_isi_pipe_init(struct mxc_isi_dev *isi, unsigned int id)
>  
>  	sd = &pipe->sd;
>  	v4l2_subdev_init(sd, &mxc_isi_pipe_subdev_ops);
> +	sd->internal_ops = &mxc_isi_pipe_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	snprintf(sd->name, sizeof(sd->name), "mxc_isi.%d", pipe->id);
>  	sd->dev = isi->dev;
> diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> index 02a4c546a90a..ba2e81f24965 100644
> --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> @@ -437,8 +437,8 @@ static int imx8mq_mipi_csi_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int imx8mq_mipi_csi_init_cfg(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *sd_state)
> +static int imx8mq_mipi_csi_init_state(struct v4l2_subdev *sd,
> +				      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *fmt_sink;
>  	struct v4l2_mbus_framefmt *fmt_source;
> @@ -535,7 +535,6 @@ static const struct v4l2_subdev_video_ops imx8mq_mipi_csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx8mq_mipi_csi_pad_ops = {
> -	.init_cfg		= imx8mq_mipi_csi_init_cfg,
>  	.enum_mbus_code		= imx8mq_mipi_csi_enum_mbus_code,
>  	.get_fmt		= v4l2_subdev_get_fmt,
>  	.set_fmt		= imx8mq_mipi_csi_set_fmt,
> @@ -546,6 +545,10 @@ static const struct v4l2_subdev_ops imx8mq_mipi_csi_subdev_ops = {
>  	.pad	= &imx8mq_mipi_csi_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx8mq_mipi_csi_internal_ops = {
> +	.init_state		= imx8mq_mipi_csi_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media entity operations
>   */
> @@ -760,6 +763,7 @@ static int imx8mq_mipi_csi_subdev_init(struct csi_state *state)
>  	int ret;
>  
>  	v4l2_subdev_init(sd, &imx8mq_mipi_csi_subdev_ops);
> +	sd->internal_ops = &imx8mq_mipi_csi_internal_ops;
>  	sd->owner = THIS_MODULE;
>  	snprintf(sd->name, sizeof(sd->name), "%s %s",
>  		 MIPI_CSI2_SUBDEV_NAME, dev_name(state->dev));
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> index 04e61e783045..d20f4eff93a4 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> @@ -530,8 +530,8 @@ static int rzg2l_csi2_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int rzg2l_csi2_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rzg2l_csi2_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { .pad = RZG2L_CSI2_SINK, };
>  
> @@ -582,7 +582,6 @@ static const struct v4l2_subdev_video_ops rzg2l_csi2_video_ops = {
>  
>  static const struct v4l2_subdev_pad_ops rzg2l_csi2_pad_ops = {
>  	.enum_mbus_code = rzg2l_csi2_enum_mbus_code,
> -	.init_cfg = rzg2l_csi2_init_config,
>  	.enum_frame_size = rzg2l_csi2_enum_frame_size,
>  	.set_fmt = rzg2l_csi2_set_format,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -593,6 +592,10 @@ static const struct v4l2_subdev_ops rzg2l_csi2_subdev_ops = {
>  	.pad	= &rzg2l_csi2_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rzg2l_csi2_internal_ops = {
> +	.init_state = rzg2l_csi2_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Async handling and registration of subdevices and links.
>   */
> @@ -777,6 +780,7 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
>  
>  	csi2->subdev.dev = &pdev->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);
>  	snprintf(csi2->subdev.name, sizeof(csi2->subdev.name),
>  		 "csi-%s", dev_name(&pdev->dev));
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
> index 17a59dfc8363..9f351a05893e 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
> @@ -168,8 +168,8 @@ static int rzg2l_cru_ip_enum_frame_size(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int rzg2l_cru_ip_init_config(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *sd_state)
> +static int rzg2l_cru_ip_init_state(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { .pad = RZG2L_CRU_IP_SINK, };
>  
> @@ -192,7 +192,6 @@ static const struct v4l2_subdev_video_ops rzg2l_cru_ip_video_ops = {
>  static const struct v4l2_subdev_pad_ops rzg2l_cru_ip_pad_ops = {
>  	.enum_mbus_code = rzg2l_cru_ip_enum_mbus_code,
>  	.enum_frame_size = rzg2l_cru_ip_enum_frame_size,
> -	.init_cfg = rzg2l_cru_ip_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rzg2l_cru_ip_set_format,
>  };
> @@ -202,6 +201,10 @@ static const struct v4l2_subdev_ops rzg2l_cru_ip_subdev_ops = {
>  	.pad = &rzg2l_cru_ip_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rzg2l_cru_ip_internal_ops = {
> +	.init_state = rzg2l_cru_ip_init_state,
> +};
> +
>  static const struct media_entity_operations rzg2l_cru_ip_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -213,6 +216,7 @@ int rzg2l_cru_ip_subdev_register(struct rzg2l_cru_dev *cru)
>  
>  	ip->subdev.dev = cru->dev;
>  	v4l2_subdev_init(&ip->subdev, &rzg2l_cru_ip_subdev_ops);
> +	ip->subdev.internal_ops = &rzg2l_cru_ip_internal_ops;
>  	v4l2_set_subdevdata(&ip->subdev, cru);
>  	snprintf(ip->subdev.name, sizeof(ip->subdev.name),
>  		 "cru-ip-%s", dev_name(cru->dev));
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_brx.c b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
> index 758525a03289..a8535c6e2c46 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_brx.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
> @@ -264,7 +264,6 @@ static int brx_set_selection(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops brx_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = brx_enum_mbus_code,
>  	.enum_frame_size = brx_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_clu.c b/drivers/media/platform/renesas/vsp1/vsp1_clu.c
> index 50a5c0dc0e86..625776a9bda4 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_clu.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_clu.c
> @@ -155,7 +155,6 @@ static int clu_set_format(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops clu_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = clu_enum_mbus_code,
>  	.enum_frame_size = clu_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> index 0280b8ff7ba9..0a5a7f9cc870 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> @@ -170,33 +170,6 @@ vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
>  	}
>  }
>  
> -/*
> - * vsp1_entity_init_cfg - Initialize formats on all pads
> - * @subdev: V4L2 subdevice
> - * @sd_state: V4L2 subdev state
> - *
> - * Initialize all pad formats with default values in the given subdev state.
> - * This function can be used as a handler for the subdev pad::init_cfg
> - * operation.
> - */
> -int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
> -			 struct v4l2_subdev_state *sd_state)
> -{
> -	unsigned int pad;
> -
> -	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> -		struct v4l2_subdev_format format = {
> -			.pad = pad,
> -			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> -			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> -		};
> -
> -		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> -	}
> -
> -	return 0;
> -}
> -
>  /*
>   * vsp1_subdev_get_pad_format - Subdev pad get_fmt handler
>   * @subdev: V4L2 subdevice
> @@ -424,6 +397,29 @@ int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
>  	return ret;
>  }
>  
> +static int vsp1_entity_init_state(struct v4l2_subdev *subdev,
> +				  struct v4l2_subdev_state *sd_state)
> +{
> +	unsigned int pad;
> +
> +	/* Initialize all pad formats with default values. */
> +	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> +		struct v4l2_subdev_format format = {
> +			.pad = pad,
> +			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> +			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> +		};
> +
> +		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct v4l2_subdev_internal_ops vsp1_entity_internal_ops = {
> +	.init_state = vsp1_entity_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media Operations
>   */
> @@ -658,6 +654,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
>  	/* Initialize the V4L2 subdev. */
>  	subdev = &entity->subdev;
>  	v4l2_subdev_init(subdev, ops);
> +	subdev->internal_ops = &vsp1_entity_internal_ops;
>  
>  	subdev->entity.function = function;
>  	subdev->entity.ops = &vsp1->media_ops;
> @@ -666,7 +663,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
>  	snprintf(subdev->name, sizeof(subdev->name), "%s %s",
>  		 dev_name(vsp1->dev), name);
>  
> -	vsp1_entity_init_cfg(subdev, NULL);
> +	vsp1_entity_init_state(subdev, NULL);
>  
>  	/*
>  	 * Allocate the subdev state to store formats and selection
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> index 8c737cadee81..735f32dde4b5 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> @@ -146,8 +146,6 @@ struct v4l2_rect *
>  vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
>  			      struct v4l2_subdev_state *sd_state,
>  			      unsigned int pad, unsigned int target);
> -int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
> -			 struct v4l2_subdev_state *sd_state);
>  
>  void vsp1_entity_route_setup(struct vsp1_entity *entity,
>  			     struct vsp1_pipeline *pipe,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_hsit.c b/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
> index 6342ac7bdf54..bc1299c29ac9 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
> @@ -113,7 +113,6 @@ static int hsit_set_format(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops hsit_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = hsit_enum_mbus_code,
>  	.enum_frame_size = hsit_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_lif.c b/drivers/media/platform/renesas/vsp1/vsp1_lif.c
> index 75c24df41a7a..b1d21a54837b 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_lif.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_lif.c
> @@ -68,7 +68,6 @@ static int lif_set_format(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops lif_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = lif_enum_mbus_code,
>  	.enum_frame_size = lif_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_lut.c b/drivers/media/platform/renesas/vsp1/vsp1_lut.c
> index ac6802a325f5..451d24ab0b56 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_lut.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_lut.c
> @@ -131,7 +131,6 @@ static int lut_set_format(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops lut_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = lut_enum_mbus_code,
>  	.enum_frame_size = lut_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> index 16941ff9dbdd..b2ff3c9a6322 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> @@ -240,7 +240,6 @@ static int vsp1_rwpf_set_selection(struct v4l2_subdev *subdev,
>  }
>  
>  const struct v4l2_subdev_pad_ops vsp1_rwpf_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = vsp1_rwpf_enum_mbus_code,
>  	.enum_frame_size = vsp1_rwpf_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_sru.c b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> index 2dd6f8575614..11e008aa9f20 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> @@ -252,7 +252,6 @@ static int sru_set_format(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sru_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = sru_enum_mbus_code,
>  	.enum_frame_size = sru_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uds.c b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> index 59ff4ae46cea..d89f1197b86c 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> @@ -239,7 +239,6 @@ static int uds_set_format(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops uds_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = uds_enum_mbus_code,
>  	.enum_frame_size = uds_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uif.c b/drivers/media/platform/renesas/vsp1/vsp1_uif.c
> index d84d10f35090..f66936a28a2a 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_uif.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_uif.c
> @@ -174,7 +174,6 @@ static int uif_set_selection(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops uif_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = uif_enum_mbus_code,
>  	.enum_frame_size = uif_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
> index 47f4353a1784..e6642a2167ef 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
> @@ -270,8 +270,8 @@ static int rkisp1_csi_enum_mbus_code(struct v4l2_subdev *sd,
>  	return -EINVAL;
>  }
>  
> -static int rkisp1_csi_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rkisp1_csi_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
>  
> @@ -405,7 +405,6 @@ static const struct v4l2_subdev_video_ops rkisp1_csi_video_ops = {
>  
>  static const struct v4l2_subdev_pad_ops rkisp1_csi_pad_ops = {
>  	.enum_mbus_code = rkisp1_csi_enum_mbus_code,
> -	.init_cfg = rkisp1_csi_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rkisp1_csi_set_fmt,
>  };
> @@ -415,6 +414,10 @@ static const struct v4l2_subdev_ops rkisp1_csi_ops = {
>  	.pad = &rkisp1_csi_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rkisp1_csi_internal_ops = {
> +	.init_state = rkisp1_csi_init_state,
> +};
> +
>  int rkisp1_csi_register(struct rkisp1_device *rkisp1)
>  {
>  	struct rkisp1_csi *csi = &rkisp1->csi;
> @@ -426,6 +429,7 @@ int rkisp1_csi_register(struct rkisp1_device *rkisp1)
>  
>  	sd = &csi->sd;
>  	v4l2_subdev_init(sd, &rkisp1_csi_ops);
> +	sd->internal_ops = &rkisp1_csi_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sd->entity.ops = &rkisp1_csi_media_ops;
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
> index 96353648c032..ca6703bfd27b 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
> @@ -409,8 +409,8 @@ static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rkisp1_isp_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
>  	struct v4l2_rect *sink_crop, *src_crop;
> @@ -769,7 +769,6 @@ static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
>  	.enum_frame_size = rkisp1_isp_enum_frame_size,
>  	.get_selection = rkisp1_isp_get_selection,
>  	.set_selection = rkisp1_isp_set_selection,
> -	.init_cfg = rkisp1_isp_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rkisp1_isp_set_fmt,
>  	.link_validate = v4l2_subdev_link_validate_default,
> @@ -880,6 +879,10 @@ static const struct v4l2_subdev_ops rkisp1_isp_ops = {
>  	.pad = &rkisp1_isp_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rkisp1_isp_internal_ops = {
> +	.init_state = rkisp1_isp_init_state,
> +};
> +
>  int rkisp1_isp_register(struct rkisp1_device *rkisp1)
>  {
>  	struct rkisp1_isp *isp = &rkisp1->isp;
> @@ -890,6 +893,7 @@ int rkisp1_isp_register(struct rkisp1_device *rkisp1)
>  	isp->rkisp1 = rkisp1;
>  
>  	v4l2_subdev_init(sd, &rkisp1_isp_ops);
> +	sd->internal_ops = &rkisp1_isp_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	sd->entity.ops = &rkisp1_isp_media_ops;
>  	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
> index 9f94b9f60c35..f7af360dcb28 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
> @@ -366,8 +366,8 @@ static int rkisp1_rsz_enum_mbus_code(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int rkisp1_rsz_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rkisp1_rsz_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
>  	struct v4l2_rect *sink_crop;
> @@ -605,7 +605,6 @@ static const struct v4l2_subdev_pad_ops rkisp1_rsz_pad_ops = {
>  	.enum_mbus_code = rkisp1_rsz_enum_mbus_code,
>  	.get_selection = rkisp1_rsz_get_selection,
>  	.set_selection = rkisp1_rsz_set_selection,
> -	.init_cfg = rkisp1_rsz_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rkisp1_rsz_set_fmt,
>  	.link_validate = v4l2_subdev_link_validate_default,
> @@ -652,6 +651,10 @@ static const struct v4l2_subdev_ops rkisp1_rsz_ops = {
>  	.pad = &rkisp1_rsz_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rkisp1_rsz_internal_ops = {
> +	.init_state = rkisp1_rsz_init_state,
> +};
> +
>  static void rkisp1_rsz_unregister(struct rkisp1_resizer *rsz)
>  {
>  	if (!rsz->rkisp1)
> @@ -681,6 +684,7 @@ static int rkisp1_rsz_register(struct rkisp1_resizer *rsz)
>  	}
>  
>  	v4l2_subdev_init(sd, &rkisp1_rsz_ops);
> +	sd->internal_ops = &rkisp1_rsz_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sd->entity.ops = &rkisp1_rsz_media_ops;
>  	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_SCALER;
> diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
> index 0bc897d2d577..5a361ad6b023 100644
> --- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
> +++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
> @@ -159,8 +159,8 @@ static void dcmipp_byteproc_adjust_fmt(struct v4l2_mbus_framefmt *fmt)
>  	dcmipp_colorimetry_clamp(fmt);
>  }
>  
> -static int dcmipp_byteproc_init_cfg(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *sd_state)
> +static int dcmipp_byteproc_init_state(struct v4l2_subdev *sd,
> +				      struct v4l2_subdev_state *sd_state)
>  {
>  	unsigned int i;
>  
> @@ -383,7 +383,6 @@ static int dcmipp_byteproc_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops dcmipp_byteproc_pad_ops = {
> -	.init_cfg		= dcmipp_byteproc_init_cfg,
>  	.enum_mbus_code		= dcmipp_byteproc_enum_mbus_code,
>  	.enum_frame_size	= dcmipp_byteproc_enum_frame_size,
>  	.get_fmt		= v4l2_subdev_get_fmt,
> @@ -518,6 +517,7 @@ static void dcmipp_byteproc_release(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_internal_ops dcmipp_byteproc_int_ops = {
> +	.init_state = dcmipp_byteproc_init_state,
>  	.release = dcmipp_byteproc_release,
>  };
>  
> diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
> index 5571d2773026..62c5c3331cfe 100644
> --- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
> +++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
> @@ -143,8 +143,8 @@ static const struct v4l2_mbus_framefmt fmt_default = {
>  	.xfer_func = DCMIPP_XFER_FUNC_DEFAULT,
>  };
>  
> -static int dcmipp_par_init_cfg(struct v4l2_subdev *sd,
> -			       struct v4l2_subdev_state *sd_state)
> +static int dcmipp_par_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	unsigned int i;
>  
> @@ -262,7 +262,6 @@ static int dcmipp_par_set_fmt(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops dcmipp_par_pad_ops = {
> -	.init_cfg		= dcmipp_par_init_cfg,
>  	.enum_mbus_code		= dcmipp_par_enum_mbus_code,
>  	.enum_frame_size	= dcmipp_par_enum_frame_size,
>  	.get_fmt		= v4l2_subdev_get_fmt,
> @@ -394,6 +393,7 @@ static void dcmipp_par_release(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_internal_ops dcmipp_par_int_ops = {
> +	.init_state = dcmipp_par_init_state,
>  	.release = dcmipp_par_release,
>  };
>  

Ok for me for the stm32-dcmipp, thanks Laurent,

Acked-by: Alain Volmat <alain.volmat@foss.st.com>

Regards,

Alain

> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> index ad13d447d483..097a3a08ef7d 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> @@ -211,6 +211,7 @@ static int sun4i_csi_probe(struct platform_device *pdev)
>  
>  	/* Initialize subdev */
>  	v4l2_subdev_init(subdev, &sun4i_csi_subdev_ops);
> +	subdev->internal_ops = &sun4i_csi_subdev_internal_ops;
>  	subdev->flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
> index 8eeed87bfb13..4e0c2df45d4d 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
> @@ -89,6 +89,7 @@ enum csi_subdev_pads {
>  };
>  
>  extern const struct v4l2_subdev_ops sun4i_csi_subdev_ops;
> +extern const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops;
>  
>  struct sun4i_csi_format {
>  	u32			mbus;
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> index c37bb1d76ef6..744197b0fccb 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> @@ -266,8 +266,8 @@ static const struct v4l2_mbus_framefmt sun4i_csi_pad_fmt_default = {
>  	.xfer_func = V4L2_XFER_FUNC_DEFAULT,
>  };
>  
> -static int sun4i_csi_subdev_init_cfg(struct v4l2_subdev *subdev,
> -				     struct v4l2_subdev_state *sd_state)
> +static int sun4i_csi_subdev_init_state(struct v4l2_subdev *subdev,
> +				       struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *fmt;
>  
> @@ -334,7 +334,6 @@ sun4i_csi_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
>  
>  static const struct v4l2_subdev_pad_ops sun4i_csi_subdev_pad_ops = {
>  	.link_validate	= v4l2_subdev_link_validate_default,
> -	.init_cfg	= sun4i_csi_subdev_init_cfg,
>  	.get_fmt	= sun4i_csi_subdev_get_fmt,
>  	.set_fmt	= sun4i_csi_subdev_set_fmt,
>  	.enum_mbus_code	= sun4i_csi_subdev_enum_mbus_code,
> @@ -344,6 +343,10 @@ const struct v4l2_subdev_ops sun4i_csi_subdev_ops = {
>  	.pad = &sun4i_csi_subdev_pad_ops,
>  };
>  
> +const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops = {
> +	.init_state	= sun4i_csi_subdev_init_state,
> +};
> +
>  int sun4i_csi_v4l2_register(struct sun4i_csi *csi)
>  {
>  	struct video_device *vdev = &csi->vdev;
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> index d57481feee05..d006d9dd0170 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> @@ -501,8 +501,8 @@ sun6i_csi_bridge_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun6i_csi_bridge_init_cfg(struct v4l2_subdev *subdev,
> -				     struct v4l2_subdev_state *state)
> +static int sun6i_csi_bridge_init_state(struct v4l2_subdev *subdev,
> +				       struct v4l2_subdev_state *state)
>  {
>  	struct sun6i_csi_device *csi_dev = v4l2_get_subdevdata(subdev);
>  	unsigned int pad = SUN6I_CSI_BRIDGE_PAD_SINK;
> @@ -581,7 +581,6 @@ static int sun6i_csi_bridge_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun6i_csi_bridge_pad_ops = {
> -	.init_cfg	= sun6i_csi_bridge_init_cfg,
>  	.enum_mbus_code	= sun6i_csi_bridge_enum_mbus_code,
>  	.get_fmt	= sun6i_csi_bridge_get_fmt,
>  	.set_fmt	= sun6i_csi_bridge_set_fmt,
> @@ -592,6 +591,10 @@ static const struct v4l2_subdev_ops sun6i_csi_bridge_subdev_ops = {
>  	.pad	= &sun6i_csi_bridge_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun6i_csi_bridge_internal_ops = {
> +	.init_state	= sun6i_csi_bridge_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun6i_csi_bridge_entity_ops = {
> @@ -782,6 +785,7 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun6i_csi_bridge_subdev_ops);
> +	subdev->internal_ops = &sun6i_csi_bridge_internal_ops;
>  	strscpy(subdev->name, SUN6I_CSI_BRIDGE_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> index d2c9f5d20496..f9d4dc45b490 100644
> --- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> +++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> @@ -305,8 +305,8 @@ sun6i_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun6i_mipi_csi2_init_cfg(struct v4l2_subdev *subdev,
> -				    struct v4l2_subdev_state *state)
> +static int sun6i_mipi_csi2_init_state(struct v4l2_subdev *subdev,
> +				      struct v4l2_subdev_state *state)
>  {
>  	struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
>  	unsigned int pad = SUN6I_MIPI_CSI2_PAD_SINK;
> @@ -385,7 +385,6 @@ static int sun6i_mipi_csi2_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun6i_mipi_csi2_pad_ops = {
> -	.init_cfg	= sun6i_mipi_csi2_init_cfg,
>  	.enum_mbus_code	= sun6i_mipi_csi2_enum_mbus_code,
>  	.get_fmt	= sun6i_mipi_csi2_get_fmt,
>  	.set_fmt	= sun6i_mipi_csi2_set_fmt,
> @@ -396,6 +395,10 @@ static const struct v4l2_subdev_ops sun6i_mipi_csi2_subdev_ops = {
>  	.pad	= &sun6i_mipi_csi2_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun6i_mipi_csi2_internal_ops = {
> +	.init_state	= sun6i_mipi_csi2_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun6i_mipi_csi2_entity_ops = {
> @@ -504,6 +507,7 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mipi_csi2_device *csi2_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun6i_mipi_csi2_subdev_ops);
> +	subdev->internal_ops = &sun6i_mipi_csi2_internal_ops;
>  	strscpy(subdev->name, SUN6I_MIPI_CSI2_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> index d6275954af98..4a5698eb12b7 100644
> --- a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> +++ b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> @@ -338,8 +338,8 @@ sun8i_a83t_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun8i_a83t_mipi_csi2_init_cfg(struct v4l2_subdev *subdev,
> -					 struct v4l2_subdev_state *state)
> +static int sun8i_a83t_mipi_csi2_init_state(struct v4l2_subdev *subdev,
> +					   struct v4l2_subdev_state *state)
>  {
>  	struct sun8i_a83t_mipi_csi2_device *csi2_dev =
>  		v4l2_get_subdevdata(subdev);
> @@ -422,7 +422,6 @@ static int sun8i_a83t_mipi_csi2_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun8i_a83t_mipi_csi2_pad_ops = {
> -	.init_cfg	= sun8i_a83t_mipi_csi2_init_cfg,
>  	.enum_mbus_code	= sun8i_a83t_mipi_csi2_enum_mbus_code,
>  	.get_fmt	= sun8i_a83t_mipi_csi2_get_fmt,
>  	.set_fmt	= sun8i_a83t_mipi_csi2_set_fmt,
> @@ -433,6 +432,10 @@ static const struct v4l2_subdev_ops sun8i_a83t_mipi_csi2_subdev_ops = {
>  	.pad	= &sun8i_a83t_mipi_csi2_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun8i_a83t_mipi_csi2_internal_ops = {
> +	.init_state	= sun8i_a83t_mipi_csi2_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun8i_a83t_mipi_csi2_entity_ops = {
> @@ -542,6 +545,7 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun8i_a83t_mipi_csi2_subdev_ops);
> +	subdev->internal_ops = &sun8i_a83t_mipi_csi2_internal_ops;
>  	strscpy(subdev->name, SUN8I_A83T_MIPI_CSI2_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/ti/cal/cal-camerarx.c b/drivers/media/platform/ti/cal/cal-camerarx.c
> index 61433744c6c4..4afc2ad00330 100644
> --- a/drivers/media/platform/ti/cal/cal-camerarx.c
> +++ b/drivers/media/platform/ti/cal/cal-camerarx.c
> @@ -721,8 +721,8 @@ static int cal_camerarx_sd_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int cal_camerarx_sd_init_cfg(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *state)
> +static int cal_camerarx_sd_init_state(struct v4l2_subdev *sd,
> +				      struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format format = {
>  		.which = state ? V4L2_SUBDEV_FORMAT_TRY
> @@ -782,7 +782,6 @@ static const struct v4l2_subdev_video_ops cal_camerarx_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops cal_camerarx_pad_ops = {
> -	.init_cfg = cal_camerarx_sd_init_cfg,
>  	.enum_mbus_code = cal_camerarx_sd_enum_mbus_code,
>  	.enum_frame_size = cal_camerarx_sd_enum_frame_size,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -795,6 +794,10 @@ static const struct v4l2_subdev_ops cal_camerarx_subdev_ops = {
>  	.pad = &cal_camerarx_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops cal_camerarx_internal_ops = {
> +	.init_state = cal_camerarx_sd_init_state,
> +};
> +
>  static struct media_entity_operations cal_camerarx_media_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -846,6 +849,7 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
>  	/* Initialize the V4L2 subdev and media entity. */
>  	sd = &phy->subdev;
>  	v4l2_subdev_init(sd, &cal_camerarx_subdev_ops);
> +	sd->internal_ops = &cal_camerarx_internal_ops;
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	snprintf(sd->name, sizeof(sd->name), "CAMERARX%u", instance);
> diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c
> index 06a28531ed02..31e9e92e723e 100644
> --- a/drivers/media/platform/video-mux.c
> +++ b/drivers/media/platform/video-mux.c
> @@ -282,8 +282,8 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int video_mux_init_cfg(struct v4l2_subdev *sd,
> -			      struct v4l2_subdev_state *sd_state)
> +static int video_mux_init_state(struct v4l2_subdev *sd,
> +				struct v4l2_subdev_state *sd_state)
>  {
>  	struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
>  	struct v4l2_mbus_framefmt *mbusformat;
> @@ -302,7 +302,6 @@ static int video_mux_init_cfg(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops video_mux_pad_ops = {
> -	.init_cfg = video_mux_init_cfg,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = video_mux_set_format,
>  };
> @@ -312,6 +311,10 @@ static const struct v4l2_subdev_ops video_mux_subdev_ops = {
>  	.video = &video_mux_subdev_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops video_mux_internal_ops = {
> +	.init_state = video_mux_init_state,
> +};
> +
>  static int video_mux_notify_bound(struct v4l2_async_notifier *notifier,
>  				  struct v4l2_subdev *sd,
>  				  struct v4l2_async_connection *asd)
> @@ -400,6 +403,7 @@ static int video_mux_probe(struct platform_device *pdev)
>  	platform_set_drvdata(pdev, vmux);
>  
>  	v4l2_subdev_init(&vmux->subdev, &video_mux_subdev_ops);
> +	vmux->subdev.internal_ops = &video_mux_internal_ops;
>  	snprintf(vmux->subdev.name, sizeof(vmux->subdev.name), "%pOFn", np);
>  	vmux->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	vmux->subdev.dev = dev;
> diff --git a/drivers/media/platform/xilinx/xilinx-csi2rxss.c b/drivers/media/platform/xilinx/xilinx-csi2rxss.c
> index bca8ec94ee35..f953d5474ae0 100644
> --- a/drivers/media/platform/xilinx/xilinx-csi2rxss.c
> +++ b/drivers/media/platform/xilinx/xilinx-csi2rxss.c
> @@ -661,8 +661,8 @@ __xcsi2rxss_get_pad_format(struct xcsi2rxss_state *xcsi2rxss,
>  	}
>  }
>  
> -static int xcsi2rxss_init_cfg(struct v4l2_subdev *sd,
> -			      struct v4l2_subdev_state *sd_state)
> +static int xcsi2rxss_init_state(struct v4l2_subdev *sd,
> +				struct v4l2_subdev_state *sd_state)
>  {
>  	struct xcsi2rxss_state *xcsi2rxss = to_xcsi2rxssstate(sd);
>  	struct v4l2_mbus_framefmt *format;
> @@ -780,7 +780,6 @@ static const struct v4l2_subdev_video_ops xcsi2rxss_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops xcsi2rxss_pad_ops = {
> -	.init_cfg = xcsi2rxss_init_cfg,
>  	.get_fmt = xcsi2rxss_get_format,
>  	.set_fmt = xcsi2rxss_set_format,
>  	.enum_mbus_code = xcsi2rxss_enum_mbus_code,
> @@ -793,6 +792,10 @@ static const struct v4l2_subdev_ops xcsi2rxss_ops = {
>  	.pad = &xcsi2rxss_pad_ops
>  };
>  
> +static const struct v4l2_subdev_internal_ops xcsi2rxss_internal_ops = {
> +	.init_state = xcsi2rxss_init_state,
> +};
> +
>  static int xcsi2rxss_parse_of(struct xcsi2rxss_state *xcsi2rxss)
>  {
>  	struct device *dev = xcsi2rxss->dev;
> @@ -970,6 +973,7 @@ static int xcsi2rxss_probe(struct platform_device *pdev)
>  	/* Initialize V4L2 subdevice and media entity */
>  	subdev = &xcsi2rxss->subdev;
>  	v4l2_subdev_init(subdev, &xcsi2rxss_ops);
> +	subdev->internal_ops = &xcsi2rxss_internal_ops;
>  	subdev->dev = dev;
>  	strscpy(subdev->name, dev_name(dev), sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_HAS_DEVNODE;
> diff --git a/drivers/media/test-drivers/vimc/vimc-debayer.c b/drivers/media/test-drivers/vimc/vimc-debayer.c
> index a2fb32c97c84..d72ed086e00b 100644
> --- a/drivers/media/test-drivers/vimc/vimc-debayer.c
> +++ b/drivers/media/test-drivers/vimc/vimc-debayer.c
> @@ -150,8 +150,8 @@ static bool vimc_debayer_src_code_is_valid(u32 code)
>  	return false;
>  }
>  
> -static int vimc_debayer_init_cfg(struct v4l2_subdev *sd,
> -				 struct v4l2_subdev_state *sd_state)
> +static int vimc_debayer_init_state(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_state *sd_state)
>  {
>  	struct vimc_debayer_device *vdebayer = v4l2_get_subdevdata(sd);
>  	struct v4l2_mbus_framefmt *mf;
> @@ -307,7 +307,6 @@ static int vimc_debayer_set_fmt(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops vimc_debayer_pad_ops = {
> -	.init_cfg		= vimc_debayer_init_cfg,
>  	.enum_mbus_code		= vimc_debayer_enum_mbus_code,
>  	.enum_frame_size	= vimc_debayer_enum_frame_size,
>  	.get_fmt		= vimc_debayer_get_fmt,
> @@ -395,6 +394,10 @@ static const struct v4l2_subdev_ops vimc_debayer_ops = {
>  	.video = &vimc_debayer_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vimc_debayer_internal_ops = {
> +	.init_state = vimc_debayer_init_state,
> +};
> +
>  static unsigned int vimc_debayer_get_val(const u8 *bytes,
>  					 const unsigned int n_bytes)
>  {
> @@ -595,6 +598,8 @@ static struct vimc_ent_device *vimc_debayer_add(struct vimc_device *vimc,
>  	if (ret)
>  		goto err_free_hdl;
>  
> +	vdebayer->sd.internal_ops = &vimc_debayer_internal_ops;
> +
>  	vdebayer->ved.process_frame = vimc_debayer_process_frame;
>  	vdebayer->ved.dev = vimc->mdev.dev;
>  	vdebayer->mean_win_size = vimc_debayer_ctrl_mean_win_size.def;
> diff --git a/drivers/media/test-drivers/vimc/vimc-scaler.c b/drivers/media/test-drivers/vimc/vimc-scaler.c
> index f6592a789f1e..afe13d6af321 100644
> --- a/drivers/media/test-drivers/vimc/vimc-scaler.c
> +++ b/drivers/media/test-drivers/vimc/vimc-scaler.c
> @@ -70,8 +70,8 @@ vimc_scaler_get_crop_bound_sink(const struct v4l2_mbus_framefmt *sink_fmt)
>  	return r;
>  }
>  
> -static int vimc_scaler_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *sd_state)
> +static int vimc_scaler_init_state(struct v4l2_subdev *sd,
> +				  struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *mf;
>  	struct v4l2_rect *r;
> @@ -292,7 +292,6 @@ static int vimc_scaler_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops vimc_scaler_pad_ops = {
> -	.init_cfg		= vimc_scaler_init_cfg,
>  	.enum_mbus_code		= vimc_scaler_enum_mbus_code,
>  	.enum_frame_size	= vimc_scaler_enum_frame_size,
>  	.get_fmt		= vimc_scaler_get_fmt,
> @@ -347,6 +346,10 @@ static const struct v4l2_subdev_ops vimc_scaler_ops = {
>  	.video = &vimc_scaler_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vimc_scaler_internal_ops = {
> +	.init_state = vimc_scaler_init_state,
> +};
> +
>  static void vimc_scaler_fill_src_frame(const struct vimc_scaler_device *const vscaler,
>  				    const u8 *const sink_frame)
>  {
> @@ -424,6 +427,8 @@ static struct vimc_ent_device *vimc_scaler_add(struct vimc_device *vimc,
>  		return ERR_PTR(ret);
>  	}
>  
> +	vscaler->sd.internal_ops = &vimc_scaler_internal_ops;
> +
>  	vscaler->ved.process_frame = vimc_scaler_process_frame;
>  	vscaler->ved.dev = vimc->mdev.dev;
>  
> diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
> index 676ab503f0ca..5e34b1aed95e 100644
> --- a/drivers/media/test-drivers/vimc/vimc-sensor.c
> +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
> @@ -41,8 +41,8 @@ static const struct v4l2_mbus_framefmt fmt_default = {
>  	.colorspace = V4L2_COLORSPACE_SRGB,
>  };
>  
> -static int vimc_sensor_init_cfg(struct v4l2_subdev *sd,
> -				struct v4l2_subdev_state *sd_state)
> +static int vimc_sensor_init_state(struct v4l2_subdev *sd,
> +				  struct v4l2_subdev_state *sd_state)
>  {
>  	unsigned int i;
>  
> @@ -183,7 +183,6 @@ static int vimc_sensor_set_fmt(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops vimc_sensor_pad_ops = {
> -	.init_cfg		= vimc_sensor_init_cfg,
>  	.enum_mbus_code		= vimc_sensor_enum_mbus_code,
>  	.enum_frame_size	= vimc_sensor_enum_frame_size,
>  	.get_fmt		= vimc_sensor_get_fmt,
> @@ -294,6 +293,10 @@ static const struct v4l2_subdev_ops vimc_sensor_ops = {
>  	.video = &vimc_sensor_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vimc_sensor_internal_ops = {
> +	.init_state = vimc_sensor_init_state,
> +};
> +
>  static int vimc_sensor_s_ctrl(struct v4l2_ctrl *ctrl)
>  {
>  	struct vimc_sensor_device *vsensor =
> @@ -429,6 +432,8 @@ static struct vimc_ent_device *vimc_sensor_add(struct vimc_device *vimc,
>  	if (ret)
>  		goto err_free_tpg;
>  
> +	vsensor->sd.internal_ops = &vimc_sensor_internal_ops;
> +
>  	vsensor->ved.process_frame = vimc_sensor_process_frame;
>  	vsensor->ved.dev = vimc->mdev.dev;
>  
> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
> index 985873b7981e..4fbefe4cd714 100644
> --- a/drivers/media/v4l2-core/v4l2-subdev.c
> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
> @@ -1460,16 +1460,18 @@ __v4l2_subdev_state_alloc(struct v4l2_subdev *sd, const char *lock_name,
>  		}
>  	}
>  
> -	/*
> -	 * There can be no race at this point, but we lock the state anyway to
> -	 * satisfy lockdep checks.
> -	 */
> -	v4l2_subdev_lock_state(state);
> -	ret = v4l2_subdev_call(sd, pad, init_cfg, state);
> -	v4l2_subdev_unlock_state(state);
> +	if (sd->internal_ops && sd->internal_ops->init_state) {
> +		/*
> +		 * There can be no race at this point, but we lock the state
> +		 * anyway to satisfy lockdep checks.
> +		 */
> +		v4l2_subdev_lock_state(state);
> +		ret = sd->internal_ops->init_state(sd, state);
> +		v4l2_subdev_unlock_state(state);
>  
> -	if (ret < 0 && ret != -ENOIOCTLCMD)
> -		goto err;
> +		if (ret)
> +			goto err;
> +	}
>  
>  	return state;
>  
> diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media/imx/imx-ic-prp.c
> index 61d69f19657e..8bd9be49cc08 100644
> --- a/drivers/staging/media/imx/imx-ic-prp.c
> +++ b/drivers/staging/media/imx/imx-ic-prp.c
> @@ -448,7 +448,6 @@ static int prp_registered(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_pad_ops prp_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = prp_enum_mbus_code,
>  	.get_fmt = prp_get_fmt,
>  	.set_fmt = prp_set_fmt,
> @@ -472,6 +471,7 @@ static const struct v4l2_subdev_ops prp_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops prp_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = prp_registered,
>  };
>  
> diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c
> index ec73c901079e..04878f07eeba 100644
> --- a/drivers/staging/media/imx/imx-ic-prpencvf.c
> +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c
> @@ -1296,7 +1296,6 @@ static void prp_unregistered(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_pad_ops prp_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = prp_enum_mbus_code,
>  	.enum_frame_size = prp_enum_frame_size,
>  	.get_fmt = prp_get_fmt,
> @@ -1320,6 +1319,7 @@ static const struct v4l2_subdev_ops prp_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops prp_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = prp_registered,
>  	.unregistered = prp_unregistered,
>  };
> diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
> index 33902f5daf80..2fc94011fe4d 100644
> --- a/drivers/staging/media/imx/imx-media-csi.c
> +++ b/drivers/staging/media/imx/imx-media-csi.c
> @@ -1866,7 +1866,6 @@ static const struct v4l2_subdev_video_ops csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops csi_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = csi_enum_mbus_code,
>  	.enum_frame_size = csi_enum_frame_size,
>  	.enum_frame_interval = csi_enum_frame_interval,
> @@ -1884,6 +1883,7 @@ static const struct v4l2_subdev_ops csi_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops csi_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = csi_registered,
>  	.unregistered = csi_unregistered,
>  };
> diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c
> index ec4349ab48cd..1b5af8945e6b 100644
> --- a/drivers/staging/media/imx/imx-media-utils.c
> +++ b/drivers/staging/media/imx/imx-media-utils.c
> @@ -426,10 +426,10 @@ EXPORT_SYMBOL_GPL(imx_media_init_mbus_fmt);
>  
>  /*
>   * Initializes the TRY format to the ACTIVE format on all pads
> - * of a subdev. Can be used as the .init_cfg pad operation.
> + * of a subdev. Can be used as the .init_state internal operation.
>   */
> -int imx_media_init_cfg(struct v4l2_subdev *sd,
> -		       struct v4l2_subdev_state *sd_state)
> +int imx_media_init_state(struct v4l2_subdev *sd,
> +			 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *mf_try;
>  	unsigned int pad;
> @@ -451,7 +451,7 @@ int imx_media_init_cfg(struct v4l2_subdev *sd,
>  
>  	return 0;
>  }
> -EXPORT_SYMBOL_GPL(imx_media_init_cfg);
> +EXPORT_SYMBOL_GPL(imx_media_init_state);
>  
>  /*
>   * Default the colorspace in tryfmt to SRGB if set to an unsupported
> diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c
> index 792bca1d2d25..810b38ea3ab9 100644
> --- a/drivers/staging/media/imx/imx-media-vdic.c
> +++ b/drivers/staging/media/imx/imx-media-vdic.c
> @@ -882,7 +882,6 @@ static void vdic_unregistered(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_pad_ops vdic_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = vdic_enum_mbus_code,
>  	.get_fmt = vdic_get_fmt,
>  	.set_fmt = vdic_set_fmt,
> @@ -906,6 +905,7 @@ static const struct v4l2_subdev_ops vdic_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops vdic_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = vdic_registered,
>  	.unregistered = vdic_unregistered,
>  };
> diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h
> index 2640cd34dce2..f095d9134fee 100644
> --- a/drivers/staging/media/imx/imx-media.h
> +++ b/drivers/staging/media/imx/imx-media.h
> @@ -192,8 +192,8 @@ static inline int imx_media_enum_ipu_formats(u32 *code, u32 index,
>  int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
>  			    u32 width, u32 height, u32 code, u32 field,
>  			    const struct imx_media_pixfmt **cc);
> -int imx_media_init_cfg(struct v4l2_subdev *sd,
> -		       struct v4l2_subdev_state *sd_state);
> +int imx_media_init_state(struct v4l2_subdev *sd,
> +			 struct v4l2_subdev_state *sd_state);
>  void imx_media_try_colorimetry(struct v4l2_mbus_framefmt *tryfmt,
>  			       bool ic_route);
>  int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
> diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> index 6906220ee89e..0d8b42061623 100644
> --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> @@ -619,7 +619,6 @@ static const struct v4l2_subdev_video_ops csi2_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops csi2_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.get_fmt = csi2_get_fmt,
>  	.set_fmt = csi2_set_fmt,
>  };
> @@ -631,6 +630,7 @@ static const struct v4l2_subdev_ops csi2_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops csi2_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = csi2_registered,
>  };
>  
> diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
> index 893dbd8cddc8..6bffffb2b20c 100644
> --- a/drivers/staging/media/starfive/camss/stf-isp.c
> +++ b/drivers/staging/media/starfive/camss/stf-isp.c
> @@ -311,7 +311,6 @@ static const struct v4l2_subdev_video_ops isp_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops isp_pad_ops = {
> -	.init_cfg = isp_init_formats,
>  	.enum_mbus_code = isp_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = isp_set_format,
> @@ -324,6 +323,10 @@ static const struct v4l2_subdev_ops isp_v4l2_ops = {
>  	.pad = &isp_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops isp_internal_ops = {
> +	.init_state = isp_init_formats,
> +};
> +
>  static const struct media_entity_operations isp_media_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -335,6 +338,7 @@ int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev)
>  	int ret;
>  
>  	v4l2_subdev_init(sd, &isp_v4l2_ops);
> +	sd->internal_ops = &isp_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	snprintf(sd->name, ARRAY_SIZE(sd->name), "stf_isp");
>  	v4l2_set_subdevdata(sd, isp_dev);
> diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> index b2ce0d4fae95..46a334b602f1 100644
> --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> @@ -256,8 +256,8 @@ sun6i_isp_proc_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun6i_isp_proc_init_cfg(struct v4l2_subdev *subdev,
> -				   struct v4l2_subdev_state *state)
> +static int sun6i_isp_proc_init_state(struct v4l2_subdev *subdev,
> +				     struct v4l2_subdev_state *state)
>  {
>  	struct sun6i_isp_device *isp_dev = v4l2_get_subdevdata(subdev);
>  	unsigned int pad = SUN6I_ISP_PROC_PAD_SINK_CSI;
> @@ -336,7 +336,6 @@ static int sun6i_isp_proc_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun6i_isp_proc_pad_ops = {
> -	.init_cfg	= sun6i_isp_proc_init_cfg,
>  	.enum_mbus_code	= sun6i_isp_proc_enum_mbus_code,
>  	.get_fmt	= sun6i_isp_proc_get_fmt,
>  	.set_fmt	= sun6i_isp_proc_set_fmt,
> @@ -347,6 +346,10 @@ static const struct v4l2_subdev_ops sun6i_isp_proc_subdev_ops = {
>  	.pad	= &sun6i_isp_proc_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun6i_isp_proc_internal_ops = {
> +	.init_state = sun6i_isp_proc_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun6i_isp_proc_entity_ops = {
> @@ -501,6 +504,7 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun6i_isp_proc_subdev_ops);
> +	subdev->internal_ops = &sun6i_isp_proc_internal_ops;
>  	strscpy(subdev->name, SUN6I_ISP_PROC_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
> index 2a438e516095..8b08f6640dee 100644
> --- a/include/media/v4l2-subdev.h
> +++ b/include/media/v4l2-subdev.h
> @@ -771,7 +771,6 @@ struct v4l2_subdev_state {
>  /**
>   * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
>   *
> - * @init_cfg: initialize the subdev state to default values
>   * @enum_mbus_code: callback for VIDIOC_SUBDEV_ENUM_MBUS_CODE() ioctl handler
>   *		    code.
>   * @enum_frame_size: callback for VIDIOC_SUBDEV_ENUM_FRAME_SIZE() ioctl handler
> @@ -836,8 +835,6 @@ struct v4l2_subdev_state {
>   *	directly, use v4l2_subdev_disable_streams() instead.
>   */
>  struct v4l2_subdev_pad_ops {
> -	int (*init_cfg)(struct v4l2_subdev *sd,
> -			struct v4l2_subdev_state *state);
>  	int (*enum_mbus_code)(struct v4l2_subdev *sd,
>  			      struct v4l2_subdev_state *state,
>  			      struct v4l2_subdev_mbus_code_enum *code);
> @@ -914,6 +911,8 @@ struct v4l2_subdev_ops {
>  /**
>   * struct v4l2_subdev_internal_ops - V4L2 subdev internal ops
>   *
> + * @init_state: initialize the subdev state to default values
> + *
>   * @registered: called when this subdev is registered. When called the v4l2_dev
>   *	field is set to the correct v4l2_device.
>   *
> @@ -939,6 +938,8 @@ struct v4l2_subdev_ops {
>   *	these ops.
>   */
>  struct v4l2_subdev_internal_ops {
> +	int (*init_state)(struct v4l2_subdev *sd,
> +			  struct v4l2_subdev_state *state);
>  	int (*registered)(struct v4l2_subdev *sd);
>  	void (*unregistered)(struct v4l2_subdev *sd);
>  	int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
> -- 
> Regards,
> 
> Laurent Pinchart
>
Tommaso Merciai Nov. 27, 2023, 11:27 a.m. UTC | #4
Hi Laurent,
Patch looks good to me.

Some clarification:

I'm working as you know on alvium driver actually v14 sent.
Need to wait for a feedback on this or I can send v15 with the following
missing stuff:

diff --git a/drivers/media/i2c/alvium-csi2.c b/drivers/media/i2c/alvium-csi2.c
index 1c6450c9b994..3f4104ab3094 100644
--- a/drivers/media/i2c/alvium-csi2.c
+++ b/drivers/media/i2c/alvium-csi2.c
@@ -1850,8 +1850,8 @@ static int alvium_s_stream(struct v4l2_subdev *sd, int enable)
        return ret;
 }

-static int alvium_init_cfg(struct v4l2_subdev *sd,
-                          struct v4l2_subdev_state *state)
+static int alvium_init_state(struct v4l2_subdev *sd,
+                            struct v4l2_subdev_state *state)
 {
        struct alvium_dev *alvium = sd_to_alvium(sd);
        struct alvium_mode *mode = &alvium->mode;
@@ -2233,7 +2233,6 @@ static const struct v4l2_subdev_video_ops alvium_video_ops = {
 };

 static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
-       .init_cfg = alvium_init_cfg,
        .enum_mbus_code = alvium_enum_mbus_code,
        .get_fmt = v4l2_subdev_get_fmt,
        .set_fmt = alvium_set_fmt,
@@ -2241,6 +2240,10 @@ static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
        .set_selection = alvium_set_selection,
 };

+static const struct v4l2_subdev_internal_ops alvium_internal_ops = {
+       .init_state = alvium_init_state,
+};
+
 static const struct v4l2_subdev_ops alvium_subdev_ops = {
        .core   = &alvium_core_ops,
        .pad    = &alvium_pad_ops,
@@ -2271,6 +2274,7 @@ static int alvium_subdev_init(struct alvium_dev *alvium)
        /* init alvium sd */
        v4l2_i2c_subdev_init(sd, client, &alvium_subdev_ops);

+       sd->internal_ops = &alvium_internal_ops;
        sd->flags |= V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_HAS_DEVNODE;
        alvium->pad.flags = MEDIA_PAD_FL_SOURCE;
        sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;

Rebased this morning on top of Sakari master branch :)

Let me know.
Thanks in advance,

Regards,
Tommaso

On Mon, Nov 27, 2023 at 11:07:44AM +0200, Laurent Pinchart wrote:
> The subdev .init_cfg() operation is affected by two issues:
> 
> - It has long been extended to initialize a whole v4l2_subdev_state
>   instead of just a v4l2_subdev_pad_config, but its name has stuck
>   around.
> 
> - Despite operating on a whole subdev state and not being directly
>   exposed to the subdev users (either in-kernel or through the userspace
>   API), .init_cfg() is categorized as a subdev pad operation.
> 
> This participates in making the subdev API confusing for new developers.
> Fix it by renaming the operation to .init_state(), and make it a subdev
> internal operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
> ---
> Changes since v3:
> 
> - Rebase on top of the new stm32-dcmipp driver
> - Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
>   rebase
> 
> Changes since v2:
> 
> - Rebase on top of the latest media tree
> 
> Changes since v1:
> 
> - Fix compilation of the vsp1 driver
> ---
>  drivers/media/i2c/adv7180.c                   | 10 ++--
>  drivers/media/i2c/ccs/ccs-core.c              |  6 +--
>  drivers/media/i2c/ds90ub913.c                 | 10 ++--
>  drivers/media/i2c/ds90ub953.c                 | 10 ++--
>  drivers/media/i2c/ds90ub960.c                 | 11 ++--
>  drivers/media/i2c/gc2145.c                    | 10 ++--
>  drivers/media/i2c/hi846.c                     | 10 ++--
>  drivers/media/i2c/imx214.c                    | 12 +++--
>  drivers/media/i2c/imx219.c                    |  9 ++--
>  drivers/media/i2c/imx290.c                    | 10 ++--
>  drivers/media/i2c/imx296.c                    | 10 ++--
>  drivers/media/i2c/imx334.c                    | 12 +++--
>  drivers/media/i2c/imx335.c                    | 12 +++--
>  drivers/media/i2c/imx412.c                    | 12 +++--
>  drivers/media/i2c/imx415.c                    | 10 ++--
>  drivers/media/i2c/mt9m001.c                   | 10 ++--
>  drivers/media/i2c/mt9m111.c                   | 10 ++--
>  drivers/media/i2c/mt9m114.c                   | 16 +++---
>  drivers/media/i2c/mt9p031.c                   |  8 +--
>  drivers/media/i2c/mt9v111.c                   | 10 ++--
>  drivers/media/i2c/ov01a10.c                   | 10 ++--
>  drivers/media/i2c/ov02a10.c                   | 10 ++--
>  drivers/media/i2c/ov2640.c                    | 10 ++--
>  drivers/media/i2c/ov2680.c                    | 10 ++--
>  drivers/media/i2c/ov2740.c                    | 10 ++--
>  drivers/media/i2c/ov5640.c                    | 10 ++--
>  drivers/media/i2c/ov5645.c                    | 12 +++--
>  drivers/media/i2c/ov5670.c                    | 10 ++--
>  drivers/media/i2c/ov7251.c                    | 12 +++--
>  drivers/media/i2c/ov8858.c                    | 10 ++--
>  drivers/media/i2c/ov9282.c                    | 12 +++--
>  drivers/media/i2c/st-vgxy61.c                 | 10 ++--
>  drivers/media/i2c/tc358746.c                  | 10 ++--
>  drivers/media/i2c/tda1997x.c                  | 10 ++--
>  drivers/media/i2c/thp7312.c                   | 10 ++--
>  drivers/media/i2c/tvp5150.c                   |  6 +--
>  drivers/media/pci/intel/ivsc/mei_csi.c        | 10 ++--
>  drivers/media/platform/cadence/cdns-csi2rx.c  | 10 ++--
>  .../platform/microchip/microchip-csi2dc.c     | 10 ++--
>  .../platform/microchip/microchip-isc-scaler.c | 10 ++--
>  drivers/media/platform/nxp/imx-mipi-csis.c    | 10 ++--
>  drivers/media/platform/nxp/imx7-media-csi.c   |  6 +--
>  .../platform/nxp/imx8-isi/imx8-isi-crossbar.c | 10 ++--
>  .../platform/nxp/imx8-isi/imx8-isi-pipe.c     | 10 ++--
>  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 10 ++--
>  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 10 ++--
>  .../platform/renesas/rzg2l-cru/rzg2l-ip.c     | 10 ++--
>  .../media/platform/renesas/vsp1/vsp1_brx.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_clu.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_entity.c | 53 +++++++++----------
>  .../media/platform/renesas/vsp1/vsp1_entity.h |  2 -
>  .../media/platform/renesas/vsp1/vsp1_hsit.c   |  1 -
>  .../media/platform/renesas/vsp1/vsp1_lif.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_lut.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_rwpf.c   |  1 -
>  .../media/platform/renesas/vsp1/vsp1_sru.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_uds.c    |  1 -
>  .../media/platform/renesas/vsp1/vsp1_uif.c    |  1 -
>  .../platform/rockchip/rkisp1/rkisp1-csi.c     | 10 ++--
>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 10 ++--
>  .../platform/rockchip/rkisp1/rkisp1-resizer.c | 10 ++--
>  .../st/stm32/stm32-dcmipp/dcmipp-byteproc.c   |  6 +--
>  .../st/stm32/stm32-dcmipp/dcmipp-parallel.c   |  6 +--
>  .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  1 +
>  .../platform/sunxi/sun4i-csi/sun4i_csi.h      |  1 +
>  .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  9 ++--
>  .../sunxi/sun6i-csi/sun6i_csi_bridge.c        | 10 ++--
>  .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c   | 10 ++--
>  .../sun8i_a83t_mipi_csi2.c                    | 10 ++--
>  drivers/media/platform/ti/cal/cal-camerarx.c  | 10 ++--
>  drivers/media/platform/video-mux.c            | 10 ++--
>  .../media/platform/xilinx/xilinx-csi2rxss.c   | 10 ++--
>  .../media/test-drivers/vimc/vimc-debayer.c    | 11 ++--
>  drivers/media/test-drivers/vimc/vimc-scaler.c | 11 ++--
>  drivers/media/test-drivers/vimc/vimc-sensor.c | 11 ++--
>  drivers/media/v4l2-core/v4l2-subdev.c         | 20 +++----
>  drivers/staging/media/imx/imx-ic-prp.c        |  2 +-
>  drivers/staging/media/imx/imx-ic-prpencvf.c   |  2 +-
>  drivers/staging/media/imx/imx-media-csi.c     |  2 +-
>  drivers/staging/media/imx/imx-media-utils.c   |  8 +--
>  drivers/staging/media/imx/imx-media-vdic.c    |  2 +-
>  drivers/staging/media/imx/imx-media.h         |  4 +-
>  drivers/staging/media/imx/imx6-mipi-csi2.c    |  2 +-
>  .../staging/media/starfive/camss/stf-isp.c    |  6 ++-
>  .../media/sunxi/sun6i-isp/sun6i_isp_proc.c    | 10 ++--
>  include/media/v4l2-subdev.h                   |  7 +--
>  86 files changed, 487 insertions(+), 264 deletions(-)
> 
> diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c
> index 444c322d756a..e10811cce801 100644
> --- a/drivers/media/i2c/adv7180.c
> +++ b/drivers/media/i2c/adv7180.c
> @@ -813,8 +813,8 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int adv7180_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int adv7180_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> @@ -929,7 +929,6 @@ static const struct v4l2_subdev_core_ops adv7180_core_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops adv7180_pad_ops = {
> -	.init_cfg = adv7180_init_cfg,
>  	.enum_mbus_code = adv7180_enum_mbus_code,
>  	.set_fmt = adv7180_set_pad_format,
>  	.get_fmt = adv7180_get_pad_format,
> @@ -947,6 +946,10 @@ static const struct v4l2_subdev_ops adv7180_ops = {
>  	.sensor = &adv7180_sensor_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops adv7180_internal_ops = {
> +	.init_state = adv7180_init_state,
> +};
> +
>  static irqreturn_t adv7180_irq(int irq, void *devid)
>  {
>  	struct adv7180_state *state = devid;
> @@ -1458,6 +1461,7 @@ static int adv7180_probe(struct i2c_client *client)
>  	state->input = 0;
>  	sd = &state->sd;
>  	v4l2_i2c_subdev_init(sd, client, &adv7180_ops);
> +	sd->internal_ops = &adv7180_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  
>  	ret = adv7180_init_controls(state);
> diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
> index fb713b03ad4a..92ef98a2b951 100644
> --- a/drivers/media/i2c/ccs/ccs-core.c
> +++ b/drivers/media/i2c/ccs/ccs-core.c
> @@ -3006,8 +3006,8 @@ static int ccs_init_subdev(struct ccs_sensor *sensor,
>  	return 0;
>  }
>  
> -static int ccs_init_cfg(struct v4l2_subdev *sd,
> -			struct v4l2_subdev_state *sd_state)
> +static int ccs_init_state(struct v4l2_subdev *sd,
> +			  struct v4l2_subdev_state *sd_state)
>  {
>  	struct ccs_subdev *ssd = to_ccs_subdev(sd);
>  	struct ccs_sensor *sensor = ssd->sensor;
> @@ -3055,7 +3055,6 @@ static const struct v4l2_subdev_video_ops ccs_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ccs_pad_ops = {
> -	.init_cfg = ccs_init_cfg,
>  	.enum_mbus_code = ccs_enum_mbus_code,
>  	.get_fmt = ccs_get_format,
>  	.set_fmt = ccs_set_format,
> @@ -3079,6 +3078,7 @@ static const struct media_entity_operations ccs_entity_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops ccs_internal_src_ops = {
> +	.init_state = ccs_init_state,
>  	.registered = ccs_registered,
>  	.unregistered = ccs_unregistered,
>  };
> diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c
> index 8bb6be956780..ca9bb29dab89 100644
> --- a/drivers/media/i2c/ds90ub913.c
> +++ b/drivers/media/i2c/ds90ub913.c
> @@ -443,8 +443,8 @@ static int ub913_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ub913_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *state)
> +static int ub913_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_route routes[] = {
>  		{
> @@ -503,7 +503,6 @@ static const struct v4l2_subdev_pad_ops ub913_pad_ops = {
>  	.get_frame_desc = ub913_get_frame_desc,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = ub913_set_fmt,
> -	.init_cfg = ub913_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops ub913_subdev_ops = {
> @@ -511,6 +510,10 @@ static const struct v4l2_subdev_ops ub913_subdev_ops = {
>  	.pad = &ub913_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ub913_internal_ops = {
> +	.init_state = ub913_init_state,
> +};
> +
>  static const struct media_entity_operations ub913_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -744,6 +747,7 @@ static int ub913_subdev_init(struct ub913_data *priv)
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub913_subdev_ops);
> +	priv->sd.internal_ops = &ub913_internal_ops;
>  	priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
>  	priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	priv->sd.entity.ops = &ub913_entity_ops;
> diff --git a/drivers/media/i2c/ds90ub953.c b/drivers/media/i2c/ds90ub953.c
> index 4eb08e3a31c7..16f88db14981 100644
> --- a/drivers/media/i2c/ds90ub953.c
> +++ b/drivers/media/i2c/ds90ub953.c
> @@ -575,8 +575,8 @@ static int ub953_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ub953_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *state)
> +static int ub953_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_route routes[] = {
>  		{
> @@ -713,7 +713,6 @@ static const struct v4l2_subdev_pad_ops ub953_pad_ops = {
>  	.get_frame_desc = ub953_get_frame_desc,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = ub953_set_fmt,
> -	.init_cfg = ub953_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_core_ops ub953_subdev_core_ops = {
> @@ -727,6 +726,10 @@ static const struct v4l2_subdev_ops ub953_subdev_ops = {
>  	.pad = &ub953_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ub953_internal_ops = {
> +	.init_state = ub953_init_state,
> +};
> +
>  static const struct media_entity_operations ub953_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1240,6 +1243,7 @@ static int ub953_subdev_init(struct ub953_data *priv)
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub953_subdev_ops);
> +	priv->sd.internal_ops = &ub953_internal_ops;
>  
>  	priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			  V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_STREAMS;
> diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
> index 1d1476098c92..ffe5f25f8647 100644
> --- a/drivers/media/i2c/ds90ub960.c
> +++ b/drivers/media/i2c/ds90ub960.c
> @@ -2906,8 +2906,8 @@ static int ub960_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ub960_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *state)
> +static int ub960_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *state)
>  {
>  	struct ub960_data *priv = sd_to_ub960(sd);
>  
> @@ -2938,8 +2938,6 @@ static const struct v4l2_subdev_pad_ops ub960_pad_ops = {
>  
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = ub960_set_fmt,
> -
> -	.init_cfg = ub960_init_cfg,
>  };
>  
>  static int ub960_log_status(struct v4l2_subdev *sd)
> @@ -3091,6 +3089,10 @@ static const struct v4l2_subdev_core_ops ub960_subdev_core_ops = {
>  	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ub960_internal_ops = {
> +	.init_state = ub960_init_state,
> +};
> +
>  static const struct v4l2_subdev_ops ub960_subdev_ops = {
>  	.core = &ub960_subdev_core_ops,
>  	.pad = &ub960_pad_ops,
> @@ -3650,6 +3652,7 @@ static int ub960_create_subdev(struct ub960_data *priv)
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub960_subdev_ops);
> +	priv->sd.internal_ops = &ub960_internal_ops;
>  
>  	v4l2_ctrl_handler_init(&priv->ctrl_handler, 1);
>  	priv->sd.ctrl_handler = &priv->ctrl_handler;
> diff --git a/drivers/media/i2c/gc2145.c b/drivers/media/i2c/gc2145.c
> index 12d3780b5548..bef7b0e056a8 100644
> --- a/drivers/media/i2c/gc2145.c
> +++ b/drivers/media/i2c/gc2145.c
> @@ -653,8 +653,8 @@ static void gc2145_update_pad_format(struct gc2145 *gc2145,
>  	fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int gc2145_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int gc2145_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct gc2145 *gc2145 = to_gc2145(sd);
>  	struct v4l2_mbus_framefmt *format;
> @@ -1079,7 +1079,6 @@ static const struct v4l2_subdev_video_ops gc2145_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops gc2145_pad_ops = {
> -	.init_cfg = gc2145_init_cfg,
>  	.enum_mbus_code = gc2145_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = gc2145_set_pad_format,
> @@ -1093,6 +1092,10 @@ static const struct v4l2_subdev_ops gc2145_subdev_ops = {
>  	.pad = &gc2145_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops gc2145_subdev_internal_ops = {
> +	.init_state = gc2145_init_state,
> +};
> +
>  static int gc2145_set_ctrl_test_pattern(struct gc2145 *gc2145, int value)
>  {
>  	int ret = 0;
> @@ -1286,6 +1289,7 @@ static int gc2145_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&gc2145->sd, client, &gc2145_subdev_ops);
> +	gc2145->sd.internal_ops = &gc2145_subdev_internal_ops;
>  
>  	/* Check the hardware configuration in device tree */
>  	if (gc2145_check_hwcfg(dev))
> diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c
> index 0595080c2211..9c565ec033d4 100644
> --- a/drivers/media/i2c/hi846.c
> +++ b/drivers/media/i2c/hi846.c
> @@ -1871,8 +1871,8 @@ static int hi846_get_selection(struct v4l2_subdev *sd,
>  	}
>  }
>  
> -static int hi846_init_cfg(struct v4l2_subdev *sd,
> -			  struct v4l2_subdev_state *sd_state)
> +static int hi846_init_state(struct v4l2_subdev *sd,
> +			    struct v4l2_subdev_state *sd_state)
>  {
>  	struct hi846 *hi846 = to_hi846(sd);
>  	struct v4l2_mbus_framefmt *mf;
> @@ -1895,7 +1895,6 @@ static const struct v4l2_subdev_video_ops hi846_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops hi846_pad_ops = {
> -	.init_cfg = hi846_init_cfg,
>  	.enum_frame_size = hi846_enum_frame_size,
>  	.enum_mbus_code = hi846_enum_mbus_code,
>  	.set_fmt = hi846_set_format,
> @@ -1908,6 +1907,10 @@ static const struct v4l2_subdev_ops hi846_subdev_ops = {
>  	.pad = &hi846_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops hi846_internal_ops = {
> +	.init_state = hi846_init_state,
> +};
> +
>  static const struct media_entity_operations hi846_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -2071,6 +2074,7 @@ static int hi846_probe(struct i2c_client *client)
>  		return ret;
>  
>  	v4l2_i2c_subdev_init(&hi846->sd, client, &hi846_subdev_ops);
> +	hi846->sd.internal_ops = &hi846_internal_ops;
>  
>  	mutex_init(&hi846->mutex);
>  
> diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c
> index 8bc7b114c57d..474c95572bf6 100644
> --- a/drivers/media/i2c/imx214.c
> +++ b/drivers/media/i2c/imx214.c
> @@ -633,8 +633,8 @@ static int imx214_get_selection(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int imx214_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int imx214_entity_init_state(struct v4l2_subdev *subdev,
> +				    struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { };
>  
> @@ -839,7 +839,6 @@ static const struct v4l2_subdev_pad_ops imx214_subdev_pad_ops = {
>  	.get_fmt = imx214_get_format,
>  	.set_fmt = imx214_set_format,
>  	.get_selection = imx214_get_selection,
> -	.init_cfg = imx214_entity_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops imx214_subdev_ops = {
> @@ -848,6 +847,10 @@ static const struct v4l2_subdev_ops imx214_subdev_ops = {
>  	.pad = &imx214_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx214_internal_ops = {
> +	.init_state = imx214_entity_init_state,
> +};
> +
>  static const struct regmap_config sensor_regmap_config = {
>  	.reg_bits = 16,
>  	.val_bits = 8,
> @@ -957,6 +960,7 @@ static int imx214_probe(struct i2c_client *client)
>  	}
>  
>  	v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops);
> +	imx214->sd.internal_ops = &imx214_internal_ops;
>  
>  	/*
>  	 * Enable power initially, to avoid warnings
> @@ -1021,7 +1025,7 @@ static int imx214_probe(struct i2c_client *client)
>  		goto free_ctrl;
>  	}
>  
> -	imx214_entity_init_cfg(&imx214->sd, NULL);
> +	imx214_entity_init_state(&imx214->sd, NULL);
>  
>  	ret = v4l2_async_register_subdev_sensor(&imx214->sd);
>  	if (ret < 0) {
> diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c
> index 675795ac2e83..e17ef2e9d9d0 100644
> --- a/drivers/media/i2c/imx219.c
> +++ b/drivers/media/i2c/imx219.c
> @@ -905,8 +905,8 @@ static int imx219_get_selection(struct v4l2_subdev *sd,
>  	return -EINVAL;
>  }
>  
> -static int imx219_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int imx219_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -933,7 +933,6 @@ static const struct v4l2_subdev_video_ops imx219_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx219_pad_ops = {
> -	.init_cfg = imx219_init_cfg,
>  	.enum_mbus_code = imx219_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = imx219_set_pad_format,
> @@ -947,6 +946,9 @@ static const struct v4l2_subdev_ops imx219_subdev_ops = {
>  	.pad = &imx219_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx219_internal_ops = {
> +	.init_state = imx219_init_state,
> +};
>  
>  /* -----------------------------------------------------------------------------
>   * Power management
> @@ -1098,6 +1100,7 @@ static int imx219_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops);
> +	imx219->sd.internal_ops = &imx219_internal_ops;
>  
>  	/* Check the hardware configuration in device tree */
>  	if (imx219_check_hwcfg(dev, imx219))
> diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
> index aa8cfbcd40aa..52ba6188911b 100644
> --- a/drivers/media/i2c/imx290.c
> +++ b/drivers/media/i2c/imx290.c
> @@ -1195,8 +1195,8 @@ static int imx290_get_selection(struct v4l2_subdev *sd,
>  	}
>  }
>  
> -static int imx290_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int imx290_entity_init_state(struct v4l2_subdev *subdev,
> +				    struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -1221,7 +1221,6 @@ static const struct v4l2_subdev_video_ops imx290_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx290_pad_ops = {
> -	.init_cfg = imx290_entity_init_cfg,
>  	.enum_mbus_code = imx290_enum_mbus_code,
>  	.enum_frame_size = imx290_enum_frame_size,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1235,6 +1234,10 @@ static const struct v4l2_subdev_ops imx290_subdev_ops = {
>  	.pad = &imx290_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx290_internal_ops = {
> +	.init_state = imx290_entity_init_state,
> +};
> +
>  static const struct media_entity_operations imx290_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1248,6 +1251,7 @@ static int imx290_subdev_init(struct imx290 *imx290)
>  	imx290->current_mode = &imx290_modes_ptr(imx290)[0];
>  
>  	v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
> +	imx290->sd.internal_ops = &imx290_internal_ops;
>  	imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			    V4L2_SUBDEV_FL_HAS_EVENTS;
>  	imx290->sd.dev = imx290->dev;
> diff --git a/drivers/media/i2c/imx296.c b/drivers/media/i2c/imx296.c
> index 8399cca496a7..83149fa729c4 100644
> --- a/drivers/media/i2c/imx296.c
> +++ b/drivers/media/i2c/imx296.c
> @@ -798,8 +798,8 @@ static int imx296_set_selection(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int imx296_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int imx296_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_selection sel = {
>  		.target = V4L2_SEL_TGT_CROP,
> @@ -830,7 +830,6 @@ static const struct v4l2_subdev_pad_ops imx296_subdev_pad_ops = {
>  	.set_fmt = imx296_set_format,
>  	.get_selection = imx296_get_selection,
>  	.set_selection = imx296_set_selection,
> -	.init_cfg = imx296_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops imx296_subdev_ops = {
> @@ -838,12 +837,17 @@ static const struct v4l2_subdev_ops imx296_subdev_ops = {
>  	.pad = &imx296_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx296_internal_ops = {
> +	.init_state = imx296_init_state,
> +};
> +
>  static int imx296_subdev_init(struct imx296 *sensor)
>  {
>  	struct i2c_client *client = to_i2c_client(sensor->dev);
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&sensor->subdev, client, &imx296_subdev_ops);
> +	sensor->subdev.internal_ops = &imx296_internal_ops;
>  
>  	ret = imx296_ctrls_init(sensor);
>  	if (ret < 0)
> diff --git a/drivers/media/i2c/imx334.c b/drivers/media/i2c/imx334.c
> index 42cf71c1f6fd..6725b3e2a73e 100644
> --- a/drivers/media/i2c/imx334.c
> +++ b/drivers/media/i2c/imx334.c
> @@ -935,14 +935,14 @@ static int imx334_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * imx334_init_cfg() - Initialize sub-device state
> + * imx334_init_state() - Initialize sub-device state
>   * @sd: pointer to imx334 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device state
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int imx334_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int imx334_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct imx334 *imx334 = to_imx334(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -1190,7 +1190,6 @@ static const struct v4l2_subdev_video_ops imx334_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx334_pad_ops = {
> -	.init_cfg = imx334_init_cfg,
>  	.enum_mbus_code = imx334_enum_mbus_code,
>  	.enum_frame_size = imx334_enum_frame_size,
>  	.get_fmt = imx334_get_pad_format,
> @@ -1202,6 +1201,10 @@ static const struct v4l2_subdev_ops imx334_subdev_ops = {
>  	.pad = &imx334_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx334_internal_ops = {
> +	.init_state = imx334_init_state,
> +};
> +
>  /**
>   * imx334_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -1359,6 +1362,7 @@ static int imx334_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&imx334->sd, client, &imx334_subdev_ops);
> +	imx334->sd.internal_ops = &imx334_internal_ops;
>  
>  	ret = imx334_parse_hw_config(imx334);
>  	if (ret) {
> diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
> index 0432f059e913..205a150971b7 100644
> --- a/drivers/media/i2c/imx335.c
> +++ b/drivers/media/i2c/imx335.c
> @@ -618,14 +618,14 @@ static int imx335_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * imx335_init_cfg() - Initialize sub-device state
> + * imx335_init_state() - Initialize sub-device state
>   * @sd: pointer to imx335 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device configuration
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int imx335_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int imx335_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct imx335 *imx335 = to_imx335(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -835,7 +835,6 @@ static const struct v4l2_subdev_video_ops imx335_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx335_pad_ops = {
> -	.init_cfg = imx335_init_cfg,
>  	.enum_mbus_code = imx335_enum_mbus_code,
>  	.enum_frame_size = imx335_enum_frame_size,
>  	.get_fmt = imx335_get_pad_format,
> @@ -847,6 +846,10 @@ static const struct v4l2_subdev_ops imx335_subdev_ops = {
>  	.pad = &imx335_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx335_internal_ops = {
> +	.init_state = imx335_init_state,
> +};
> +
>  /**
>   * imx335_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -999,6 +1002,7 @@ static int imx335_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
> +	imx335->sd.internal_ops = &imx335_internal_ops;
>  
>  	ret = imx335_parse_hw_config(imx335);
>  	if (ret) {
> diff --git a/drivers/media/i2c/imx412.c b/drivers/media/i2c/imx412.c
> index 41d756a20f3c..0efce329525e 100644
> --- a/drivers/media/i2c/imx412.c
> +++ b/drivers/media/i2c/imx412.c
> @@ -770,14 +770,14 @@ static int imx412_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * imx412_init_cfg() - Initialize sub-device state
> + * imx412_init_state() - Initialize sub-device state
>   * @sd: pointer to imx412 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device configuration
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int imx412_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int imx412_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct imx412 *imx412 = to_imx412(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -997,7 +997,6 @@ static const struct v4l2_subdev_video_ops imx412_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx412_pad_ops = {
> -	.init_cfg = imx412_init_cfg,
>  	.enum_mbus_code = imx412_enum_mbus_code,
>  	.enum_frame_size = imx412_enum_frame_size,
>  	.get_fmt = imx412_get_pad_format,
> @@ -1009,6 +1008,10 @@ static const struct v4l2_subdev_ops imx412_subdev_ops = {
>  	.pad = &imx412_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx412_internal_ops = {
> +	.init_state = imx412_init_state,
> +};
> +
>  /**
>   * imx412_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -1177,6 +1180,7 @@ static int imx412_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&imx412->sd, client, &imx412_subdev_ops);
> +	imx412->sd.internal_ops = &imx412_internal_ops;
>  
>  	ret = imx412_parse_hw_config(imx412);
>  	if (ret) {
> diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
> index 6436a32c4025..1e5f20c3ed82 100644
> --- a/drivers/media/i2c/imx415.c
> +++ b/drivers/media/i2c/imx415.c
> @@ -880,8 +880,8 @@ static int imx415_get_selection(struct v4l2_subdev *sd,
>  	return -EINVAL;
>  }
>  
> -static int imx415_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int imx415_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format format = {
>  		.format = {
> @@ -905,7 +905,6 @@ static const struct v4l2_subdev_pad_ops imx415_subdev_pad_ops = {
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = imx415_set_format,
>  	.get_selection = imx415_get_selection,
> -	.init_cfg = imx415_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops imx415_subdev_ops = {
> @@ -913,12 +912,17 @@ static const struct v4l2_subdev_ops imx415_subdev_ops = {
>  	.pad = &imx415_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx415_internal_ops = {
> +	.init_state = imx415_init_state,
> +};
> +
>  static int imx415_subdev_init(struct imx415 *sensor)
>  {
>  	struct i2c_client *client = to_i2c_client(sensor->dev);
>  	int ret;
>  
>  	v4l2_i2c_subdev_init(&sensor->subdev, client, &imx415_subdev_ops);
> +	sensor->subdev.internal_ops = &imx415_internal_ops;
>  
>  	ret = imx415_ctrls_init(sensor);
>  	if (ret)
> diff --git a/drivers/media/i2c/mt9m001.c b/drivers/media/i2c/mt9m001.c
> index 4c897bb07fed..ad1a3ab77411 100644
> --- a/drivers/media/i2c/mt9m001.c
> +++ b/drivers/media/i2c/mt9m001.c
> @@ -650,8 +650,8 @@ static const struct v4l2_subdev_core_ops mt9m001_subdev_core_ops = {
>  #endif
>  };
>  
> -static int mt9m001_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9m001_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct i2c_client *client = v4l2_get_subdevdata(sd);
>  	struct mt9m001 *mt9m001 = to_mt9m001(client);
> @@ -708,7 +708,6 @@ static const struct v4l2_subdev_sensor_ops mt9m001_subdev_sensor_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m001_subdev_pad_ops = {
> -	.init_cfg	= mt9m001_init_cfg,
>  	.enum_mbus_code = mt9m001_enum_mbus_code,
>  	.get_selection	= mt9m001_get_selection,
>  	.set_selection	= mt9m001_set_selection,
> @@ -724,6 +723,10 @@ static const struct v4l2_subdev_ops mt9m001_subdev_ops = {
>  	.pad	= &mt9m001_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9m001_internal_ops = {
> +	.init_state	= mt9m001_init_state,
> +};
> +
>  static int mt9m001_probe(struct i2c_client *client)
>  {
>  	struct mt9m001 *mt9m001;
> @@ -755,6 +758,7 @@ static int mt9m001_probe(struct i2c_client *client)
>  		return PTR_ERR(mt9m001->reset_gpio);
>  
>  	v4l2_i2c_subdev_init(&mt9m001->subdev, client, &mt9m001_subdev_ops);
> +	mt9m001->subdev.internal_ops = &mt9m001_internal_ops;
>  	mt9m001->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  				 V4L2_SUBDEV_FL_HAS_EVENTS;
>  	v4l2_ctrl_handler_init(&mt9m001->hdl, 4);
> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> index 17ca92810b58..54a7a4c623ea 100644
> --- a/drivers/media/i2c/mt9m111.c
> +++ b/drivers/media/i2c/mt9m111.c
> @@ -1111,8 +1111,8 @@ static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
>  	return 0;
>  }
>  
> -static int mt9m111_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9m111_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *format =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -1156,7 +1156,6 @@ static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
> -	.init_cfg	= mt9m111_init_cfg,
>  	.enum_mbus_code = mt9m111_enum_mbus_code,
>  	.get_selection	= mt9m111_get_selection,
>  	.set_selection	= mt9m111_set_selection,
> @@ -1171,6 +1170,10 @@ static const struct v4l2_subdev_ops mt9m111_subdev_ops = {
>  	.pad	= &mt9m111_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9m111_internal_ops = {
> +	.init_state	= mt9m111_init_state,
> +};
> +
>  /*
>   * Interface active, can use i2c. If it fails, it can indeed mean, that
>   * this wasn't our capture interface, so, we wait for the right one
> @@ -1275,6 +1278,7 @@ static int mt9m111_probe(struct i2c_client *client)
>  	mt9m111->ctx = &context_b;
>  
>  	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
> +	mt9m111->subdev.internal_ops = &mt9m111_internal_ops;
>  	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  				 V4L2_SUBDEV_FL_HAS_EVENTS;
>  
> diff --git a/drivers/media/i2c/mt9m114.c b/drivers/media/i2c/mt9m114.c
> index 23cf84f1a746..0a22f328981d 100644
> --- a/drivers/media/i2c/mt9m114.c
> +++ b/drivers/media/i2c/mt9m114.c
> @@ -1152,8 +1152,8 @@ static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd)
>  	return container_of(sd, struct mt9m114, pa.sd);
>  }
>  
> -static int mt9m114_pa_init_cfg(struct v4l2_subdev *sd,
> -			       struct v4l2_subdev_state *state)
> +static int mt9m114_pa_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_mbus_framefmt *format;
>  	struct v4l2_rect *crop;
> @@ -1304,7 +1304,6 @@ static int mt9m114_pa_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = {
> -	.init_cfg = mt9m114_pa_init_cfg,
>  	.enum_mbus_code = mt9m114_pa_enum_mbus_code,
>  	.enum_frame_size = mt9m114_pa_enum_framesizes,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1317,6 +1316,10 @@ static const struct v4l2_subdev_ops mt9m114_pa_ops = {
>  	.pad = &mt9m114_pa_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = {
> +	.init_state = mt9m114_pa_init_state,
> +};
> +
>  static int mt9m114_pa_init(struct mt9m114 *sensor)
>  {
>  	struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl;
> @@ -1329,6 +1332,7 @@ static int mt9m114_pa_init(struct mt9m114 *sensor)
>  
>  	/* Initialize the subdev. */
>  	v4l2_subdev_init(sd, &mt9m114_pa_ops);
> +	sd->internal_ops = &mt9m114_pa_internal_ops;
>  	v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array");
>  
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> @@ -1624,8 +1628,8 @@ static int mt9m114_ifp_s_frame_interval(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int mt9m114_ifp_init_cfg(struct v4l2_subdev *sd,
> -				struct v4l2_subdev_state *state)
> +static int mt9m114_ifp_init_state(struct v4l2_subdev *sd,
> +				  struct v4l2_subdev_state *state)
>  {
>  	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
>  	struct v4l2_mbus_framefmt *format;
> @@ -1968,7 +1972,6 @@ static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = {
> -	.init_cfg = mt9m114_ifp_init_cfg,
>  	.enum_mbus_code = mt9m114_ifp_enum_mbus_code,
>  	.enum_frame_size = mt9m114_ifp_enum_framesizes,
>  	.enum_frame_interval = mt9m114_ifp_enum_frameintervals,
> @@ -1984,6 +1987,7 @@ static const struct v4l2_subdev_ops mt9m114_ifp_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = {
> +	.init_state = mt9m114_ifp_init_state,
>  	.registered = mt9m114_ifp_registered,
>  	.unregistered = mt9m114_ifp_unregistered,
>  };
> diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
> index 89bcd48748b9..596200d0248c 100644
> --- a/drivers/media/i2c/mt9p031.c
> +++ b/drivers/media/i2c/mt9p031.c
> @@ -696,8 +696,8 @@ static int mt9p031_set_selection(struct v4l2_subdev *subdev,
>  	return 0;
>  }
>  
> -static int mt9p031_init_cfg(struct v4l2_subdev *subdev,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9p031_init_state(struct v4l2_subdev *subdev,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
>  	struct v4l2_mbus_framefmt *format;
> @@ -1041,7 +1041,6 @@ static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
> -	.init_cfg = mt9p031_init_cfg,
>  	.enum_mbus_code = mt9p031_enum_mbus_code,
>  	.enum_frame_size = mt9p031_enum_frame_size,
>  	.get_fmt = mt9p031_get_format,
> @@ -1057,6 +1056,7 @@ static const struct v4l2_subdev_ops mt9p031_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
> +	.init_state = mt9p031_init_state,
>  	.registered = mt9p031_registered,
>  	.open = mt9p031_open,
>  	.close = mt9p031_close,
> @@ -1189,7 +1189,7 @@ static int mt9p031_probe(struct i2c_client *client)
>  
>  	mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  
> -	ret = mt9p031_init_cfg(&mt9p031->subdev, NULL);
> +	ret = mt9p031_init_state(&mt9p031->subdev, NULL);
>  	if (ret)
>  		goto done;
>  
> diff --git a/drivers/media/i2c/mt9v111.c b/drivers/media/i2c/mt9v111.c
> index 6752582cb2c7..b186e9160d94 100644
> --- a/drivers/media/i2c/mt9v111.c
> +++ b/drivers/media/i2c/mt9v111.c
> @@ -948,8 +948,8 @@ static int mt9v111_set_format(struct v4l2_subdev *subdev,
>  	return 0;
>  }
>  
> -static int mt9v111_init_cfg(struct v4l2_subdev *subdev,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mt9v111_init_state(struct v4l2_subdev *subdev,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	*v4l2_subdev_state_get_format(sd_state, 0) = mt9v111_def_fmt;
>  
> @@ -967,7 +967,6 @@ static const struct v4l2_subdev_video_ops mt9v111_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9v111_pad_ops = {
> -	.init_cfg		= mt9v111_init_cfg,
>  	.enum_mbus_code		= mt9v111_enum_mbus_code,
>  	.enum_frame_size	= mt9v111_enum_frame_size,
>  	.enum_frame_interval	= mt9v111_enum_frame_interval,
> @@ -981,6 +980,10 @@ static const struct v4l2_subdev_ops mt9v111_ops = {
>  	.pad	= &mt9v111_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mt9v111_internal_ops = {
> +	.init_state		= mt9v111_init_state,
> +};
> +
>  static const struct media_entity_operations mt9v111_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1194,6 +1197,7 @@ static int mt9v111_probe(struct i2c_client *client)
>  	mt9v111->pending	= true;
>  
>  	v4l2_i2c_subdev_init(&mt9v111->sd, client, &mt9v111_ops);
> +	mt9v111->sd.internal_ops = &mt9v111_internal_ops;
>  
>  	mt9v111->sd.flags	|= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	mt9v111->sd.entity.ops	= &mt9v111_subdev_entity_ops;
> diff --git a/drivers/media/i2c/ov01a10.c b/drivers/media/i2c/ov01a10.c
> index ba295d1575f0..5606437f37d0 100644
> --- a/drivers/media/i2c/ov01a10.c
> +++ b/drivers/media/i2c/ov01a10.c
> @@ -729,8 +729,8 @@ static int ov01a10_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov01a10_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *state)
> +static int ov01a10_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -813,7 +813,6 @@ static const struct v4l2_subdev_video_ops ov01a10_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov01a10_pad_ops = {
> -	.init_cfg = ov01a10_init_cfg,
>  	.set_fmt = ov01a10_set_format,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.get_selection = ov01a10_get_selection,
> @@ -827,6 +826,10 @@ static const struct v4l2_subdev_ops ov01a10_subdev_ops = {
>  	.pad = &ov01a10_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov01a10_internal_ops = {
> +	.init_state = ov01a10_init_state,
> +};
> +
>  static const struct media_entity_operations ov01a10_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -873,6 +876,7 @@ static int ov01a10_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&ov01a10->sd, client, &ov01a10_subdev_ops);
> +	ov01a10->sd.internal_ops = &ov01a10_internal_ops;
>  
>  	ret = ov01a10_identify_module(ov01a10);
>  	if (ret)
> diff --git a/drivers/media/i2c/ov02a10.c b/drivers/media/i2c/ov02a10.c
> index 8454cb39a47b..6c30e1a0d814 100644
> --- a/drivers/media/i2c/ov02a10.c
> +++ b/drivers/media/i2c/ov02a10.c
> @@ -511,8 +511,8 @@ static int __ov02a10_stop_stream(struct ov02a10 *ov02a10)
>  					 SC_CTRL_MODE_STANDBY);
>  }
>  
> -static int ov02a10_entity_init_cfg(struct v4l2_subdev *sd,
> -				   struct v4l2_subdev_state *sd_state)
> +static int ov02a10_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_TRY,
> @@ -709,7 +709,6 @@ static const struct v4l2_subdev_video_ops ov02a10_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov02a10_pad_ops = {
> -	.init_cfg = ov02a10_entity_init_cfg,
>  	.enum_mbus_code = ov02a10_enum_mbus_code,
>  	.enum_frame_size = ov02a10_enum_frame_sizes,
>  	.get_fmt = ov02a10_get_fmt,
> @@ -721,6 +720,10 @@ static const struct v4l2_subdev_ops ov02a10_subdev_ops = {
>  	.pad	= &ov02a10_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov02a10_internal_ops = {
> +	.init_state = ov02a10_init_state,
> +};
> +
>  static const struct media_entity_operations ov02a10_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -869,6 +872,7 @@ static int ov02a10_probe(struct i2c_client *client)
>  				     "failed to check HW configuration\n");
>  
>  	v4l2_i2c_subdev_init(&ov02a10->subdev, client, &ov02a10_subdev_ops);
> +	ov02a10->subdev.internal_ops = &ov02a10_internal_ops;
>  
>  	ov02a10->mipi_clock_voltage = OV02A10_MIPI_TX_SPEED_DEFAULT;
>  	ov02a10->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10;
> diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
> index 28911d5169f7..67c4bd2916e8 100644
> --- a/drivers/media/i2c/ov2640.c
> +++ b/drivers/media/i2c/ov2640.c
> @@ -996,8 +996,8 @@ static int ov2640_set_fmt(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int ov2640_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov2640_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *try_fmt =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -1125,7 +1125,6 @@ static const struct v4l2_subdev_core_ops ov2640_subdev_core_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov2640_subdev_pad_ops = {
> -	.init_cfg	= ov2640_init_cfg,
>  	.enum_mbus_code = ov2640_enum_mbus_code,
>  	.get_selection	= ov2640_get_selection,
>  	.get_fmt	= ov2640_get_fmt,
> @@ -1142,6 +1141,10 @@ static const struct v4l2_subdev_ops ov2640_subdev_ops = {
>  	.video	= &ov2640_subdev_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov2640_internal_ops = {
> +	.init_state	= ov2640_init_state,
> +};
> +
>  static int ov2640_probe_dt(struct i2c_client *client,
>  		struct ov2640_priv *priv)
>  {
> @@ -1211,6 +1214,7 @@ static int ov2640_probe(struct i2c_client *client)
>  	priv->cfmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
>  
>  	v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
> +	priv->subdev.internal_ops = &ov2640_internal_ops;
>  	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			      V4L2_SUBDEV_FL_HAS_EVENTS;
>  	mutex_init(&priv->lock);
> diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c
> index 9b53ea9af45a..d34d1972dcd9 100644
> --- a/drivers/media/i2c/ov2680.c
> +++ b/drivers/media/i2c/ov2680.c
> @@ -755,8 +755,8 @@ static int ov2680_set_selection(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov2680_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov2680_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct ov2680_dev *sensor = to_ov2680_dev(sd);
>  
> @@ -876,7 +876,6 @@ static const struct v4l2_subdev_video_ops ov2680_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov2680_pad_ops = {
> -	.init_cfg		= ov2680_init_cfg,
>  	.enum_mbus_code		= ov2680_enum_mbus_code,
>  	.enum_frame_size	= ov2680_enum_frame_size,
>  	.enum_frame_interval	= ov2680_enum_frame_interval,
> @@ -891,6 +890,10 @@ static const struct v4l2_subdev_ops ov2680_subdev_ops = {
>  	.pad	= &ov2680_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov2680_internal_ops = {
> +	.init_state		= ov2680_init_state,
> +};
> +
>  static int ov2680_mode_init(struct ov2680_dev *sensor)
>  {
>  	/* set initial mode */
> @@ -915,6 +918,7 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor)
>  	int ret = 0;
>  
>  	v4l2_i2c_subdev_init(&sensor->sd, client, &ov2680_subdev_ops);
> +	sensor->sd.internal_ops = &ov2680_internal_ops;
>  
>  	sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
> diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
> index 23cbd8b7846e..f0be51b343a7 100644
> --- a/drivers/media/i2c/ov2740.c
> +++ b/drivers/media/i2c/ov2740.c
> @@ -879,8 +879,8 @@ static int ov2740_enum_frame_size(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov2740_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov2740_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	ov2740_update_pad_format(&supported_modes[0],
>  				 v4l2_subdev_state_get_format(sd_state, 0));
> @@ -897,7 +897,6 @@ static const struct v4l2_subdev_pad_ops ov2740_pad_ops = {
>  	.set_fmt = ov2740_set_format,
>  	.enum_mbus_code = ov2740_enum_mbus_code,
>  	.enum_frame_size = ov2740_enum_frame_size,
> -	.init_cfg = ov2740_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_ops ov2740_subdev_ops = {
> @@ -905,6 +904,10 @@ static const struct v4l2_subdev_ops ov2740_subdev_ops = {
>  	.pad = &ov2740_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov2740_internal_ops = {
> +	.init_state = ov2740_init_state,
> +};
> +
>  static const struct media_entity_operations ov2740_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1074,6 +1077,7 @@ static int ov2740_probe(struct i2c_client *client)
>  		return -ENOMEM;
>  
>  	v4l2_i2c_subdev_init(&ov2740->sd, client, &ov2740_subdev_ops);
> +	ov2740->sd.internal_ops = &ov2740_internal_ops;
>  	full_power = acpi_dev_state_d0(&client->dev);
>  	if (full_power) {
>  		ret = ov2740_identify_module(ov2740);
> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> index 3f79a3b77044..6fd98b8cb181 100644
> --- a/drivers/media/i2c/ov5640.c
> +++ b/drivers/media/i2c/ov5640.c
> @@ -3744,8 +3744,8 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int ov5640_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int ov5640_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct ov5640_dev *sensor = to_ov5640_dev(sd);
>  	struct v4l2_mbus_framefmt *fmt =
> @@ -3776,7 +3776,6 @@ static const struct v4l2_subdev_video_ops ov5640_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
> -	.init_cfg = ov5640_init_cfg,
>  	.enum_mbus_code = ov5640_enum_mbus_code,
>  	.get_fmt = ov5640_get_fmt,
>  	.set_fmt = ov5640_set_fmt,
> @@ -3791,6 +3790,10 @@ static const struct v4l2_subdev_ops ov5640_subdev_ops = {
>  	.pad = &ov5640_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov5640_internal_ops = {
> +	.init_state = ov5640_init_state,
> +};
> +
>  static int ov5640_get_regulators(struct ov5640_dev *sensor)
>  {
>  	int i;
> @@ -3905,6 +3908,7 @@ static int ov5640_probe(struct i2c_client *client)
>  		return PTR_ERR(sensor->reset_gpio);
>  
>  	v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
> +	sensor->sd.internal_ops = &ov5640_internal_ops;
>  
>  	sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			    V4L2_SUBDEV_FL_HAS_EVENTS;
> diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
> index 695f4f673536..a26ac11c989d 100644
> --- a/drivers/media/i2c/ov5645.c
> +++ b/drivers/media/i2c/ov5645.c
> @@ -934,8 +934,8 @@ static int ov5645_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov5645_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int ov5645_init_state(struct v4l2_subdev *subdev,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { 0 };
>  
> @@ -1023,7 +1023,6 @@ static const struct v4l2_subdev_video_ops ov5645_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov5645_subdev_pad_ops = {
> -	.init_cfg = ov5645_entity_init_cfg,
>  	.enum_mbus_code = ov5645_enum_mbus_code,
>  	.enum_frame_size = ov5645_enum_frame_size,
>  	.get_fmt = ov5645_get_format,
> @@ -1036,6 +1035,10 @@ static const struct v4l2_subdev_ops ov5645_subdev_ops = {
>  	.pad = &ov5645_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov5645_internal_ops = {
> +	.init_state = ov5645_init_state,
> +};
> +
>  static int ov5645_probe(struct i2c_client *client)
>  {
>  	struct device *dev = &client->dev;
> @@ -1162,6 +1165,7 @@ static int ov5645_probe(struct i2c_client *client)
>  	}
>  
>  	v4l2_i2c_subdev_init(&ov5645->sd, client, &ov5645_subdev_ops);
> +	ov5645->sd.internal_ops = &ov5645_internal_ops;
>  	ov5645->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	ov5645->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	ov5645->sd.dev = &client->dev;
> @@ -1220,7 +1224,7 @@ static int ov5645_probe(struct i2c_client *client)
>  	pm_runtime_get_noresume(dev);
>  	pm_runtime_enable(dev);
>  
> -	ov5645_entity_init_cfg(&ov5645->sd, NULL);
> +	ov5645_init_state(&ov5645->sd, NULL);
>  
>  	ret = v4l2_async_register_subdev(&ov5645->sd);
>  	if (ret < 0) {
> diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c
> index 470d848f40d8..2aee85965cf7 100644
> --- a/drivers/media/i2c/ov5670.c
> +++ b/drivers/media/i2c/ov5670.c
> @@ -2196,8 +2196,8 @@ static int ov5670_init_controls(struct ov5670 *ov5670)
>  	return ret;
>  }
>  
> -static int ov5670_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *state)
> +static int ov5670_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_mbus_framefmt *fmt =
>  				v4l2_subdev_state_get_format(state, 0);
> @@ -2592,7 +2592,6 @@ static const struct v4l2_subdev_video_ops ov5670_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov5670_pad_ops = {
> -	.init_cfg = ov5670_init_cfg,
>  	.enum_mbus_code = ov5670_enum_mbus_code,
>  	.get_fmt = ov5670_get_pad_format,
>  	.set_fmt = ov5670_set_pad_format,
> @@ -2612,6 +2611,10 @@ static const struct v4l2_subdev_ops ov5670_subdev_ops = {
>  	.sensor = &ov5670_sensor_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov5670_internal_ops = {
> +	.init_state = ov5670_init_state,
> +};
> +
>  static const struct media_entity_operations ov5670_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -2675,6 +2678,7 @@ static int ov5670_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&ov5670->sd, client, &ov5670_subdev_ops);
> +	ov5670->sd.internal_ops = &ov5670_internal_ops;
>  
>  	ret = ov5670_regulators_probe(ov5670);
>  	if (ret)
> diff --git a/drivers/media/i2c/ov7251.c b/drivers/media/i2c/ov7251.c
> index 774f5dfb8186..897a0763df4a 100644
> --- a/drivers/media/i2c/ov7251.c
> +++ b/drivers/media/i2c/ov7251.c
> @@ -1282,8 +1282,8 @@ static int ov7251_set_format(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int ov7251_entity_init_cfg(struct v4l2_subdev *subdev,
> -				  struct v4l2_subdev_state *sd_state)
> +static int ov7251_init_state(struct v4l2_subdev *subdev,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> @@ -1441,7 +1441,6 @@ static const struct v4l2_subdev_video_ops ov7251_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov7251_subdev_pad_ops = {
> -	.init_cfg = ov7251_entity_init_cfg,
>  	.enum_mbus_code = ov7251_enum_mbus_code,
>  	.enum_frame_size = ov7251_enum_frame_size,
>  	.enum_frame_interval = ov7251_enum_frame_ival,
> @@ -1455,6 +1454,10 @@ static const struct v4l2_subdev_ops ov7251_subdev_ops = {
>  	.pad = &ov7251_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov7251_internal_ops = {
> +	.init_state = ov7251_init_state,
> +};
> +
>  static int ov7251_check_hwcfg(struct ov7251 *ov7251)
>  {
>  	struct fwnode_handle *fwnode = dev_fwnode(ov7251->dev);
> @@ -1693,6 +1696,7 @@ static int ov7251_probe(struct i2c_client *client)
>  	}
>  
>  	v4l2_i2c_subdev_init(&ov7251->sd, client, &ov7251_subdev_ops);
> +	ov7251->sd.internal_ops = &ov7251_internal_ops;
>  	ov7251->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	ov7251->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	ov7251->sd.dev = &client->dev;
> @@ -1750,7 +1754,7 @@ static int ov7251_probe(struct i2c_client *client)
>  		goto free_entity;
>  	}
>  
> -	ov7251_entity_init_cfg(&ov7251->sd, NULL);
> +	ov7251_init_state(&ov7251->sd, NULL);
>  
>  	return 0;
>  
> diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c
> index 0e3776136136..174c65f76886 100644
> --- a/drivers/media/i2c/ov8858.c
> +++ b/drivers/media/i2c/ov8858.c
> @@ -1476,8 +1476,8 @@ static int ov8858_enum_mbus_code(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int ov8858_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov8858_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	const struct ov8858_mode *def_mode = &ov8858_modes[0];
>  	struct v4l2_subdev_format fmt = {
> @@ -1494,7 +1494,6 @@ static int ov8858_init_cfg(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops ov8858_pad_ops = {
> -	.init_cfg = ov8858_init_cfg,
>  	.enum_mbus_code = ov8858_enum_mbus_code,
>  	.enum_frame_size = ov8858_enum_frame_sizes,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1512,6 +1511,10 @@ static const struct v4l2_subdev_ops ov8858_subdev_ops = {
>  	.pad	= &ov8858_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov8858_internal_ops = {
> +	.init_state = ov8858_init_state,
> +};
> +
>  /* ----------------------------------------------------------------------------
>   * Controls handling
>   */
> @@ -1899,6 +1902,7 @@ static int ov8858_probe(struct i2c_client *client)
>  				     "Failed to get powerdown gpio\n");
>  
>  	v4l2_i2c_subdev_init(&ov8858->subdev, client, &ov8858_subdev_ops);
> +	ov8858->subdev.internal_ops = &ov8858_internal_ops;
>  
>  	ret = ov8858_configure_regulators(ov8858);
>  	if (ret)
> diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
> index 1707bc22ca91..251a4b534914 100644
> --- a/drivers/media/i2c/ov9282.c
> +++ b/drivers/media/i2c/ov9282.c
> @@ -876,14 +876,14 @@ static int ov9282_set_pad_format(struct v4l2_subdev *sd,
>  }
>  
>  /**
> - * ov9282_init_cfg() - Initialize sub-device state
> + * ov9282_init_state() - Initialize sub-device state
>   * @sd: pointer to ov9282 V4L2 sub-device structure
>   * @sd_state: V4L2 sub-device configuration
>   *
>   * Return: 0 if successful, error code otherwise.
>   */
> -static int ov9282_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int ov9282_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct ov9282 *ov9282 = to_ov9282(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -1192,7 +1192,6 @@ static const struct v4l2_subdev_video_ops ov9282_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops ov9282_pad_ops = {
> -	.init_cfg = ov9282_init_cfg,
>  	.enum_mbus_code = ov9282_enum_mbus_code,
>  	.enum_frame_size = ov9282_enum_frame_size,
>  	.get_fmt = ov9282_get_pad_format,
> @@ -1206,6 +1205,10 @@ static const struct v4l2_subdev_ops ov9282_subdev_ops = {
>  	.pad = &ov9282_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops ov9282_internal_ops = {
> +	.init_state = ov9282_init_state,
> +};
> +
>  /**
>   * ov9282_power_on() - Sensor power on sequence
>   * @dev: pointer to i2c device
> @@ -1394,6 +1397,7 @@ static int ov9282_probe(struct i2c_client *client)
>  
>  	/* Initialize subdev */
>  	v4l2_i2c_subdev_init(&ov9282->sd, client, &ov9282_subdev_ops);
> +	ov9282->sd.internal_ops = &ov9282_internal_ops;
>  	v4l2_i2c_subdev_set_name(&ov9282->sd, client,
>  				 device_get_match_data(ov9282->dev), NULL);
>  
> diff --git a/drivers/media/i2c/st-vgxy61.c b/drivers/media/i2c/st-vgxy61.c
> index 507cd9661e9d..98d8975dcd67 100644
> --- a/drivers/media/i2c/st-vgxy61.c
> +++ b/drivers/media/i2c/st-vgxy61.c
> @@ -1322,8 +1322,8 @@ static int vgxy61_set_fmt(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int vgxy61_init_cfg(struct v4l2_subdev *sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int vgxy61_init_state(struct v4l2_subdev *sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct vgxy61_dev *sensor = to_vgxy61_dev(sd);
>  	struct v4l2_subdev_format fmt = { 0 };
> @@ -1469,7 +1469,6 @@ static const struct v4l2_subdev_video_ops vgxy61_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops vgxy61_pad_ops = {
> -	.init_cfg = vgxy61_init_cfg,
>  	.enum_mbus_code = vgxy61_enum_mbus_code,
>  	.get_fmt = vgxy61_get_fmt,
>  	.set_fmt = vgxy61_set_fmt,
> @@ -1482,6 +1481,10 @@ static const struct v4l2_subdev_ops vgxy61_subdev_ops = {
>  	.pad = &vgxy61_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vgxy61_internal_ops = {
> +	.init_state = vgxy61_init_state,
> +};
> +
>  static const struct media_entity_operations vgxy61_subdev_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -1842,6 +1845,7 @@ static int vgxy61_probe(struct i2c_client *client)
>  		device_property_read_bool(dev, "st,strobe-gpios-polarity");
>  
>  	v4l2_i2c_subdev_init(&sensor->sd, client, &vgxy61_subdev_ops);
> +	sensor->sd.internal_ops = &vgxy61_internal_ops;
>  	sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	sensor->sd.entity.ops = &vgxy61_subdev_entity_ops;
> diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c
> index 8be9c0f293e0..106de4271d2e 100644
> --- a/drivers/media/i2c/tc358746.c
> +++ b/drivers/media/i2c/tc358746.c
> @@ -740,8 +740,8 @@ static int tc358746_s_stream(struct v4l2_subdev *sd, int enable)
>  	return v4l2_subdev_call(src, video, s_stream, 0);
>  }
>  
> -static int tc358746_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *state)
> +static int tc358746_init_state(struct v4l2_subdev *sd,
> +			       struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_mbus_framefmt *fmt;
>  
> @@ -1038,7 +1038,6 @@ static const struct v4l2_subdev_video_ops tc358746_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops tc358746_pad_ops = {
> -	.init_cfg = tc358746_init_cfg,
>  	.enum_mbus_code = tc358746_enum_mbus_code,
>  	.set_fmt = tc358746_set_fmt,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -1052,6 +1051,10 @@ static const struct v4l2_subdev_ops tc358746_ops = {
>  	.pad = &tc358746_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops tc358746_internal_ops = {
> +	.init_state = tc358746_init_state,
> +};
> +
>  static const struct media_entity_operations tc358746_entity_ops = {
>  	.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
>  	.link_validate = v4l2_subdev_link_validate,
> @@ -1282,6 +1285,7 @@ tc358746_init_subdev(struct tc358746 *tc358746, struct i2c_client *client)
>  	int err;
>  
>  	v4l2_i2c_subdev_init(sd, client, &tc358746_ops);
> +	sd->internal_ops = &tc358746_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	sd->entity.ops = &tc358746_entity_ops;
> diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c
> index 63c12b77ff1e..1ea703a9909f 100644
> --- a/drivers/media/i2c/tda1997x.c
> +++ b/drivers/media/i2c/tda1997x.c
> @@ -1734,8 +1734,8 @@ static const struct v4l2_subdev_video_ops tda1997x_video_ops = {
>   * v4l2_subdev_pad_ops
>   */
>  
> -static int tda1997x_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *sd_state)
> +static int tda1997x_init_state(struct v4l2_subdev *sd,
> +			       struct v4l2_subdev_state *sd_state)
>  {
>  	struct tda1997x_state *state = to_state(sd);
>  	struct v4l2_mbus_framefmt *mf;
> @@ -1925,7 +1925,6 @@ static int tda1997x_enum_dv_timings(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops tda1997x_pad_ops = {
> -	.init_cfg = tda1997x_init_cfg,
>  	.enum_mbus_code = tda1997x_enum_mbus_code,
>  	.get_fmt = tda1997x_get_format,
>  	.set_fmt = tda1997x_set_format,
> @@ -2047,6 +2046,10 @@ static const struct v4l2_subdev_ops tda1997x_subdev_ops = {
>  	.pad = &tda1997x_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops tda1997x_internal_ops = {
> +	.init_state = tda1997x_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * v4l2_controls
>   */
> @@ -2588,6 +2591,7 @@ static int tda1997x_probe(struct i2c_client *client)
>  	/* initialize subdev */
>  	sd = &state->sd;
>  	v4l2_i2c_subdev_init(sd, client, &tda1997x_subdev_ops);
> +	sd->internal_ops = &tda1997x_internal_ops;
>  	snprintf(sd->name, sizeof(sd->name), "%s %d-%04x",
>  		 id->name, i2c_adapter_id(client->adapter),
>  		 client->addr);
> diff --git a/drivers/media/i2c/thp7312.c b/drivers/media/i2c/thp7312.c
> index 8d818ce055de..04b78c1f8090 100644
> --- a/drivers/media/i2c/thp7312.c
> +++ b/drivers/media/i2c/thp7312.c
> @@ -837,8 +837,8 @@ static int thp7312_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int thp7312_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int thp7312_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	const struct thp7312_mode_info *default_mode = &thp7312_mode_info_data[0];
>  	struct v4l2_mbus_framefmt *fmt;
> @@ -875,7 +875,6 @@ static const struct v4l2_subdev_video_ops thp7312_video_ops = {
>  
>  static const struct v4l2_subdev_pad_ops thp7312_pad_ops = {
>  	.enum_mbus_code = thp7312_enum_mbus_code,
> -	.init_cfg = thp7312_init_cfg,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = thp7312_set_fmt,
>  	.enum_frame_size = thp7312_enum_frame_size,
> @@ -888,6 +887,10 @@ static const struct v4l2_subdev_ops thp7312_subdev_ops = {
>  	.pad = &thp7312_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops thp7312_internal_ops = {
> +	.init_state = thp7312_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * V4L2 Control Operations
>   */
> @@ -2103,6 +2106,7 @@ static int thp7312_probe(struct i2c_client *client)
>  		return thp7312_register_flash_mode(thp7312);
>  
>  	v4l2_i2c_subdev_init(&thp7312->sd, client, &thp7312_subdev_ops);
> +	thp7312->sd.internal_ops = &thp7312_internal_ops;
>  	thp7312->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	thp7312->pad.flags = MEDIA_PAD_FL_SOURCE;
>  	thp7312->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
> diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
> index 76a92bfb6fde..9fc586cfdcd8 100644
> --- a/drivers/media/i2c/tvp5150.c
> +++ b/drivers/media/i2c/tvp5150.c
> @@ -1209,8 +1209,8 @@ static int tvp5150_get_mbus_config(struct v4l2_subdev *sd,
>  /****************************************************************************
>  			V4L2 subdev pad ops
>   ****************************************************************************/
> -static int tvp5150_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int tvp5150_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct tvp5150 *decoder = to_tvp5150(sd);
>  	v4l2_std_id std;
> @@ -1722,7 +1722,6 @@ static const struct v4l2_subdev_vbi_ops tvp5150_vbi_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops tvp5150_pad_ops = {
> -	.init_cfg = tvp5150_init_cfg,
>  	.enum_mbus_code = tvp5150_enum_mbus_code,
>  	.enum_frame_size = tvp5150_enum_frame_size,
>  	.set_fmt = tvp5150_fill_fmt,
> @@ -1741,6 +1740,7 @@ static const struct v4l2_subdev_ops tvp5150_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops tvp5150_internal_ops = {
> +	.init_state = tvp5150_init_state,
>  	.registered = tvp5150_registered,
>  	.open = tvp5150_open,
>  	.close = tvp5150_close,
> diff --git a/drivers/media/pci/intel/ivsc/mei_csi.c b/drivers/media/pci/intel/ivsc/mei_csi.c
> index 8bf90e2bd856..15b905f66ab7 100644
> --- a/drivers/media/pci/intel/ivsc/mei_csi.c
> +++ b/drivers/media/pci/intel/ivsc/mei_csi.c
> @@ -346,8 +346,8 @@ mei_csi_get_pad_format(struct v4l2_subdev *sd,
>  	}
>  }
>  
> -static int mei_csi_init_cfg(struct v4l2_subdev *sd,
> -			    struct v4l2_subdev_state *sd_state)
> +static int mei_csi_init_state(struct v4l2_subdev *sd,
> +			      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *mbusformat;
>  	struct mei_csi *csi = sd_to_csi(sd);
> @@ -554,7 +554,6 @@ static const struct v4l2_subdev_video_ops mei_csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mei_csi_pad_ops = {
> -	.init_cfg = mei_csi_init_cfg,
>  	.get_fmt = mei_csi_get_fmt,
>  	.set_fmt = mei_csi_set_fmt,
>  };
> @@ -564,6 +563,10 @@ static const struct v4l2_subdev_ops mei_csi_subdev_ops = {
>  	.pad = &mei_csi_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mei_csi_internal_ops = {
> +	.init_state = mei_csi_init_state,
> +};
> +
>  static const struct media_entity_operations mei_csi_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -747,6 +750,7 @@ static int mei_csi_probe(struct mei_cl_device *cldev,
>  
>  	csi->subdev.dev = &cldev->dev;
>  	v4l2_subdev_init(&csi->subdev, &mei_csi_subdev_ops);
> +	csi->subdev.internal_ops = &mei_csi_internal_ops;
>  	v4l2_set_subdevdata(&csi->subdev, csi);
>  	csi->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
>  			    V4L2_SUBDEV_FL_HAS_EVENTS;
> diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
> index 0171ea7b834d..fead5426830e 100644
> --- a/drivers/media/platform/cadence/cdns-csi2rx.c
> +++ b/drivers/media/platform/cadence/cdns-csi2rx.c
> @@ -418,8 +418,8 @@ static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
>  	return 0;
>  }
>  
> -static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
> -			   struct v4l2_subdev_state *state)
> +static int csi2rx_init_state(struct v4l2_subdev *subdev,
> +			     struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format format = {
>  		.pad = CSI2RX_PAD_SINK,
> @@ -441,7 +441,6 @@ static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
>  static const struct v4l2_subdev_pad_ops csi2rx_pad_ops = {
>  	.get_fmt	= v4l2_subdev_get_fmt,
>  	.set_fmt	= csi2rx_set_fmt,
> -	.init_cfg	= csi2rx_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_video_ops csi2rx_video_ops = {
> @@ -453,6 +452,10 @@ static const struct v4l2_subdev_ops csi2rx_subdev_ops = {
>  	.pad		= &csi2rx_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops csi2rx_internal_ops = {
> +	.init_state	= csi2rx_init_state,
> +};
> +
>  static const struct media_entity_operations csi2rx_media_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -663,6 +666,7 @@ static int csi2rx_probe(struct platform_device *pdev)
>  	csi2rx->subdev.owner = THIS_MODULE;
>  	csi2rx->subdev.dev = &pdev->dev;
>  	v4l2_subdev_init(&csi2rx->subdev, &csi2rx_subdev_ops);
> +	csi2rx->subdev.internal_ops = &csi2rx_internal_ops;
>  	v4l2_set_subdevdata(&csi2rx->subdev, &pdev->dev);
>  	snprintf(csi2rx->subdev.name, sizeof(csi2rx->subdev.name),
>  		 "%s.%s", KBUILD_MODNAME, dev_name(&pdev->dev));
> diff --git a/drivers/media/platform/microchip/microchip-csi2dc.c b/drivers/media/platform/microchip/microchip-csi2dc.c
> index 87a2d092aad2..fee73260bb1e 100644
> --- a/drivers/media/platform/microchip/microchip-csi2dc.c
> +++ b/drivers/media/platform/microchip/microchip-csi2dc.c
> @@ -435,8 +435,8 @@ static int csi2dc_s_stream(struct v4l2_subdev *csi2dc_sd, int enable)
>  	return ret;
>  }
>  
> -static int csi2dc_init_cfg(struct v4l2_subdev *csi2dc_sd,
> -			   struct v4l2_subdev_state *sd_state)
> +static int csi2dc_init_state(struct v4l2_subdev *csi2dc_sd,
> +			     struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *v4l2_try_fmt =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -461,7 +461,6 @@ static const struct v4l2_subdev_pad_ops csi2dc_pad_ops = {
>  	.enum_mbus_code = csi2dc_enum_mbus_code,
>  	.set_fmt = csi2dc_set_fmt,
>  	.get_fmt = csi2dc_get_fmt,
> -	.init_cfg = csi2dc_init_cfg,
>  };
>  
>  static const struct v4l2_subdev_video_ops csi2dc_video_ops = {
> @@ -473,6 +472,10 @@ static const struct v4l2_subdev_ops csi2dc_subdev_ops = {
>  	.video = &csi2dc_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops csi2dc_internal_ops = {
> +	.init_state = csi2dc_init_state,
> +};
> +
>  static int csi2dc_async_bound(struct v4l2_async_notifier *notifier,
>  			      struct v4l2_subdev *subdev,
>  			      struct v4l2_async_connection *asd)
> @@ -677,6 +680,7 @@ static int csi2dc_probe(struct platform_device *pdev)
>  	}
>  
>  	v4l2_subdev_init(&csi2dc->csi2dc_sd, &csi2dc_subdev_ops);
> +	csi2dc->csi2dc_sd.internal_ops = &csi2dc_internal_ops;
>  
>  	csi2dc->csi2dc_sd.owner = THIS_MODULE;
>  	csi2dc->csi2dc_sd.dev = dev;
> diff --git a/drivers/media/platform/microchip/microchip-isc-scaler.c b/drivers/media/platform/microchip/microchip-isc-scaler.c
> index 58dffbc9fbcb..e83463543e21 100644
> --- a/drivers/media/platform/microchip/microchip-isc-scaler.c
> +++ b/drivers/media/platform/microchip/microchip-isc-scaler.c
> @@ -145,8 +145,8 @@ static int isc_scaler_g_sel(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int isc_scaler_init_cfg(struct v4l2_subdev *sd,
> -			       struct v4l2_subdev_state *sd_state)
> +static int isc_scaler_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *v4l2_try_fmt =
>  		v4l2_subdev_state_get_format(sd_state, 0);
> @@ -170,7 +170,6 @@ static const struct v4l2_subdev_pad_ops isc_scaler_pad_ops = {
>  	.set_fmt = isc_scaler_set_fmt,
>  	.get_fmt = isc_scaler_get_fmt,
>  	.get_selection = isc_scaler_g_sel,
> -	.init_cfg = isc_scaler_init_cfg,
>  };
>  
>  static const struct media_entity_operations isc_scaler_entity_ops = {
> @@ -181,11 +180,16 @@ static const struct v4l2_subdev_ops xisc_scaler_subdev_ops = {
>  	.pad = &isc_scaler_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops isc_scaler_internal_ops = {
> +	.init_state = isc_scaler_init_state,
> +};
> +
>  int isc_scaler_init(struct isc_device *isc)
>  {
>  	int ret;
>  
>  	v4l2_subdev_init(&isc->scaler_sd, &xisc_scaler_subdev_ops);
> +	isc->scaler_sd.internal_ops = &isc_scaler_internal_ops;
>  
>  	isc->scaler_sd.owner = THIS_MODULE;
>  	isc->scaler_sd.dev = isc->dev;
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index a2c748217376..b12e2435ef60 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -1122,8 +1122,8 @@ static int mipi_csis_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
>  	return 0;
>  }
>  
> -static int mipi_csis_init_cfg(struct v4l2_subdev *sd,
> -			      struct v4l2_subdev_state *sd_state)
> +static int mipi_csis_init_state(struct v4l2_subdev *sd,
> +				struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.pad = CSIS_PAD_SINK,
> @@ -1163,7 +1163,6 @@ static const struct v4l2_subdev_video_ops mipi_csis_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops mipi_csis_pad_ops = {
> -	.init_cfg		= mipi_csis_init_cfg,
>  	.enum_mbus_code		= mipi_csis_enum_mbus_code,
>  	.get_fmt		= v4l2_subdev_get_fmt,
>  	.set_fmt		= mipi_csis_set_fmt,
> @@ -1176,6 +1175,10 @@ static const struct v4l2_subdev_ops mipi_csis_subdev_ops = {
>  	.pad	= &mipi_csis_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mipi_csis_internal_ops = {
> +	.init_state		= mipi_csis_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media entity operations
>   */
> @@ -1350,6 +1353,7 @@ static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
>  	int ret;
>  
>  	v4l2_subdev_init(sd, &mipi_csis_subdev_ops);
> +	sd->internal_ops = &mipi_csis_internal_ops;
>  	sd->owner = THIS_MODULE;
>  	snprintf(sd->name, sizeof(sd->name), "csis-%s",
>  		 dev_name(csis->dev));
> diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c
> index 1d2464ca59b8..651151da3ab4 100644
> --- a/drivers/media/platform/nxp/imx7-media-csi.c
> +++ b/drivers/media/platform/nxp/imx7-media-csi.c
> @@ -1729,8 +1729,8 @@ static int imx7_csi_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int imx7_csi_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *sd_state)
> +static int imx7_csi_init_state(struct v4l2_subdev *sd,
> +			       struct v4l2_subdev_state *sd_state)
>  {
>  	const struct imx7_csi_pixfmt *cc;
>  	int i;
> @@ -2006,7 +2006,6 @@ static const struct v4l2_subdev_video_ops imx7_csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx7_csi_pad_ops = {
> -	.init_cfg	= imx7_csi_init_cfg,
>  	.enum_mbus_code	= imx7_csi_enum_mbus_code,
>  	.get_fmt	= v4l2_subdev_get_fmt,
>  	.set_fmt	= imx7_csi_set_fmt,
> @@ -2019,6 +2018,7 @@ static const struct v4l2_subdev_ops imx7_csi_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops imx7_csi_internal_ops = {
> +	.init_state	= imx7_csi_init_state,
>  	.registered	= imx7_csi_registered,
>  	.unregistered	= imx7_csi_unregistered,
>  };
> diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
> index 9401261eb239..575f17337388 100644
> --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
> +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
> @@ -176,8 +176,8 @@ mxc_isi_crossbar_xlate_streams(struct mxc_isi_crossbar *xbar,
>  	return sd;
>  }
>  
> -static int mxc_isi_crossbar_init_cfg(struct v4l2_subdev *sd,
> -				     struct v4l2_subdev_state *state)
> +static int mxc_isi_crossbar_init_state(struct v4l2_subdev *sd,
> +				       struct v4l2_subdev_state *state)
>  {
>  	struct mxc_isi_crossbar *xbar = to_isi_crossbar(sd);
>  	struct v4l2_subdev_krouting routing = { };
> @@ -404,7 +404,6 @@ static int mxc_isi_crossbar_disable_streams(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops mxc_isi_crossbar_subdev_pad_ops = {
> -	.init_cfg = mxc_isi_crossbar_init_cfg,
>  	.enum_mbus_code = mxc_isi_crossbar_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = mxc_isi_crossbar_set_fmt,
> @@ -417,6 +416,10 @@ static const struct v4l2_subdev_ops mxc_isi_crossbar_subdev_ops = {
>  	.pad = &mxc_isi_crossbar_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mxc_isi_crossbar_internal_ops = {
> +	.init_state = mxc_isi_crossbar_init_state,
> +};
> +
>  static const struct media_entity_operations mxc_isi_cross_entity_ops = {
>  	.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
>  	.link_validate	= v4l2_subdev_link_validate,
> @@ -438,6 +441,7 @@ int mxc_isi_crossbar_init(struct mxc_isi_dev *isi)
>  	xbar->isi = isi;
>  
>  	v4l2_subdev_init(sd, &mxc_isi_crossbar_subdev_ops);
> +	sd->internal_ops = &mxc_isi_crossbar_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
>  	strscpy(sd->name, "crossbar", sizeof(sd->name));
>  	sd->dev = isi->dev;
> diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
> index 14c6da392803..d76eb58deb09 100644
> --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
> +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
> @@ -341,8 +341,8 @@ mxc_isi_pipe_get_pad_compose(struct mxc_isi_pipe *pipe,
>  	return v4l2_subdev_state_get_compose(state, pad);
>  }
>  
> -static int mxc_isi_pipe_init_cfg(struct v4l2_subdev *sd,
> -				 struct v4l2_subdev_state *state)
> +static int mxc_isi_pipe_init_state(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_state *state)
>  {
>  	struct mxc_isi_pipe *pipe = to_isi_pipe(sd);
>  	struct v4l2_mbus_framefmt *fmt_source;
> @@ -682,7 +682,6 @@ static int mxc_isi_pipe_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops mxc_isi_pipe_subdev_pad_ops = {
> -	.init_cfg = mxc_isi_pipe_init_cfg,
>  	.enum_mbus_code = mxc_isi_pipe_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = mxc_isi_pipe_set_fmt,
> @@ -694,6 +693,10 @@ static const struct v4l2_subdev_ops mxc_isi_pipe_subdev_ops = {
>  	.pad = &mxc_isi_pipe_subdev_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops mxc_isi_pipe_internal_ops = {
> +	.init_state = mxc_isi_pipe_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * IRQ handling
>   */
> @@ -767,6 +770,7 @@ int mxc_isi_pipe_init(struct mxc_isi_dev *isi, unsigned int id)
>  
>  	sd = &pipe->sd;
>  	v4l2_subdev_init(sd, &mxc_isi_pipe_subdev_ops);
> +	sd->internal_ops = &mxc_isi_pipe_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	snprintf(sd->name, sizeof(sd->name), "mxc_isi.%d", pipe->id);
>  	sd->dev = isi->dev;
> diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> index 02a4c546a90a..ba2e81f24965 100644
> --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> @@ -437,8 +437,8 @@ static int imx8mq_mipi_csi_s_stream(struct v4l2_subdev *sd, int enable)
>  	return ret;
>  }
>  
> -static int imx8mq_mipi_csi_init_cfg(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *sd_state)
> +static int imx8mq_mipi_csi_init_state(struct v4l2_subdev *sd,
> +				      struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *fmt_sink;
>  	struct v4l2_mbus_framefmt *fmt_source;
> @@ -535,7 +535,6 @@ static const struct v4l2_subdev_video_ops imx8mq_mipi_csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops imx8mq_mipi_csi_pad_ops = {
> -	.init_cfg		= imx8mq_mipi_csi_init_cfg,
>  	.enum_mbus_code		= imx8mq_mipi_csi_enum_mbus_code,
>  	.get_fmt		= v4l2_subdev_get_fmt,
>  	.set_fmt		= imx8mq_mipi_csi_set_fmt,
> @@ -546,6 +545,10 @@ static const struct v4l2_subdev_ops imx8mq_mipi_csi_subdev_ops = {
>  	.pad	= &imx8mq_mipi_csi_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops imx8mq_mipi_csi_internal_ops = {
> +	.init_state		= imx8mq_mipi_csi_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media entity operations
>   */
> @@ -760,6 +763,7 @@ static int imx8mq_mipi_csi_subdev_init(struct csi_state *state)
>  	int ret;
>  
>  	v4l2_subdev_init(sd, &imx8mq_mipi_csi_subdev_ops);
> +	sd->internal_ops = &imx8mq_mipi_csi_internal_ops;
>  	sd->owner = THIS_MODULE;
>  	snprintf(sd->name, sizeof(sd->name), "%s %s",
>  		 MIPI_CSI2_SUBDEV_NAME, dev_name(state->dev));
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> index 04e61e783045..d20f4eff93a4 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
> @@ -530,8 +530,8 @@ static int rzg2l_csi2_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int rzg2l_csi2_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rzg2l_csi2_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { .pad = RZG2L_CSI2_SINK, };
>  
> @@ -582,7 +582,6 @@ static const struct v4l2_subdev_video_ops rzg2l_csi2_video_ops = {
>  
>  static const struct v4l2_subdev_pad_ops rzg2l_csi2_pad_ops = {
>  	.enum_mbus_code = rzg2l_csi2_enum_mbus_code,
> -	.init_cfg = rzg2l_csi2_init_config,
>  	.enum_frame_size = rzg2l_csi2_enum_frame_size,
>  	.set_fmt = rzg2l_csi2_set_format,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -593,6 +592,10 @@ static const struct v4l2_subdev_ops rzg2l_csi2_subdev_ops = {
>  	.pad	= &rzg2l_csi2_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rzg2l_csi2_internal_ops = {
> +	.init_state = rzg2l_csi2_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Async handling and registration of subdevices and links.
>   */
> @@ -777,6 +780,7 @@ static int rzg2l_csi2_probe(struct platform_device *pdev)
>  
>  	csi2->subdev.dev = &pdev->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);
>  	snprintf(csi2->subdev.name, sizeof(csi2->subdev.name),
>  		 "csi-%s", dev_name(&pdev->dev));
> diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
> index 17a59dfc8363..9f351a05893e 100644
> --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
> +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
> @@ -168,8 +168,8 @@ static int rzg2l_cru_ip_enum_frame_size(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int rzg2l_cru_ip_init_config(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *sd_state)
> +static int rzg2l_cru_ip_init_state(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_subdev_format fmt = { .pad = RZG2L_CRU_IP_SINK, };
>  
> @@ -192,7 +192,6 @@ static const struct v4l2_subdev_video_ops rzg2l_cru_ip_video_ops = {
>  static const struct v4l2_subdev_pad_ops rzg2l_cru_ip_pad_ops = {
>  	.enum_mbus_code = rzg2l_cru_ip_enum_mbus_code,
>  	.enum_frame_size = rzg2l_cru_ip_enum_frame_size,
> -	.init_cfg = rzg2l_cru_ip_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rzg2l_cru_ip_set_format,
>  };
> @@ -202,6 +201,10 @@ static const struct v4l2_subdev_ops rzg2l_cru_ip_subdev_ops = {
>  	.pad = &rzg2l_cru_ip_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rzg2l_cru_ip_internal_ops = {
> +	.init_state = rzg2l_cru_ip_init_state,
> +};
> +
>  static const struct media_entity_operations rzg2l_cru_ip_entity_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -213,6 +216,7 @@ int rzg2l_cru_ip_subdev_register(struct rzg2l_cru_dev *cru)
>  
>  	ip->subdev.dev = cru->dev;
>  	v4l2_subdev_init(&ip->subdev, &rzg2l_cru_ip_subdev_ops);
> +	ip->subdev.internal_ops = &rzg2l_cru_ip_internal_ops;
>  	v4l2_set_subdevdata(&ip->subdev, cru);
>  	snprintf(ip->subdev.name, sizeof(ip->subdev.name),
>  		 "cru-ip-%s", dev_name(cru->dev));
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_brx.c b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
> index 758525a03289..a8535c6e2c46 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_brx.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
> @@ -264,7 +264,6 @@ static int brx_set_selection(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops brx_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = brx_enum_mbus_code,
>  	.enum_frame_size = brx_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_clu.c b/drivers/media/platform/renesas/vsp1/vsp1_clu.c
> index 50a5c0dc0e86..625776a9bda4 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_clu.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_clu.c
> @@ -155,7 +155,6 @@ static int clu_set_format(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops clu_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = clu_enum_mbus_code,
>  	.enum_frame_size = clu_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> index 0280b8ff7ba9..0a5a7f9cc870 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> @@ -170,33 +170,6 @@ vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
>  	}
>  }
>  
> -/*
> - * vsp1_entity_init_cfg - Initialize formats on all pads
> - * @subdev: V4L2 subdevice
> - * @sd_state: V4L2 subdev state
> - *
> - * Initialize all pad formats with default values in the given subdev state.
> - * This function can be used as a handler for the subdev pad::init_cfg
> - * operation.
> - */
> -int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
> -			 struct v4l2_subdev_state *sd_state)
> -{
> -	unsigned int pad;
> -
> -	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> -		struct v4l2_subdev_format format = {
> -			.pad = pad,
> -			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> -			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> -		};
> -
> -		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> -	}
> -
> -	return 0;
> -}
> -
>  /*
>   * vsp1_subdev_get_pad_format - Subdev pad get_fmt handler
>   * @subdev: V4L2 subdevice
> @@ -424,6 +397,29 @@ int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
>  	return ret;
>  }
>  
> +static int vsp1_entity_init_state(struct v4l2_subdev *subdev,
> +				  struct v4l2_subdev_state *sd_state)
> +{
> +	unsigned int pad;
> +
> +	/* Initialize all pad formats with default values. */
> +	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> +		struct v4l2_subdev_format format = {
> +			.pad = pad,
> +			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> +			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> +		};
> +
> +		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct v4l2_subdev_internal_ops vsp1_entity_internal_ops = {
> +	.init_state = vsp1_entity_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media Operations
>   */
> @@ -658,6 +654,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
>  	/* Initialize the V4L2 subdev. */
>  	subdev = &entity->subdev;
>  	v4l2_subdev_init(subdev, ops);
> +	subdev->internal_ops = &vsp1_entity_internal_ops;
>  
>  	subdev->entity.function = function;
>  	subdev->entity.ops = &vsp1->media_ops;
> @@ -666,7 +663,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
>  	snprintf(subdev->name, sizeof(subdev->name), "%s %s",
>  		 dev_name(vsp1->dev), name);
>  
> -	vsp1_entity_init_cfg(subdev, NULL);
> +	vsp1_entity_init_state(subdev, NULL);
>  
>  	/*
>  	 * Allocate the subdev state to store formats and selection
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> index 8c737cadee81..735f32dde4b5 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> @@ -146,8 +146,6 @@ struct v4l2_rect *
>  vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
>  			      struct v4l2_subdev_state *sd_state,
>  			      unsigned int pad, unsigned int target);
> -int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
> -			 struct v4l2_subdev_state *sd_state);
>  
>  void vsp1_entity_route_setup(struct vsp1_entity *entity,
>  			     struct vsp1_pipeline *pipe,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_hsit.c b/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
> index 6342ac7bdf54..bc1299c29ac9 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
> @@ -113,7 +113,6 @@ static int hsit_set_format(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops hsit_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = hsit_enum_mbus_code,
>  	.enum_frame_size = hsit_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_lif.c b/drivers/media/platform/renesas/vsp1/vsp1_lif.c
> index 75c24df41a7a..b1d21a54837b 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_lif.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_lif.c
> @@ -68,7 +68,6 @@ static int lif_set_format(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops lif_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = lif_enum_mbus_code,
>  	.enum_frame_size = lif_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_lut.c b/drivers/media/platform/renesas/vsp1/vsp1_lut.c
> index ac6802a325f5..451d24ab0b56 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_lut.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_lut.c
> @@ -131,7 +131,6 @@ static int lut_set_format(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops lut_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = lut_enum_mbus_code,
>  	.enum_frame_size = lut_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> index 16941ff9dbdd..b2ff3c9a6322 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
> @@ -240,7 +240,6 @@ static int vsp1_rwpf_set_selection(struct v4l2_subdev *subdev,
>  }
>  
>  const struct v4l2_subdev_pad_ops vsp1_rwpf_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = vsp1_rwpf_enum_mbus_code,
>  	.enum_frame_size = vsp1_rwpf_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_sru.c b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> index 2dd6f8575614..11e008aa9f20 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> @@ -252,7 +252,6 @@ static int sru_set_format(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sru_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = sru_enum_mbus_code,
>  	.enum_frame_size = sru_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uds.c b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> index 59ff4ae46cea..d89f1197b86c 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> @@ -239,7 +239,6 @@ static int uds_set_format(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops uds_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = uds_enum_mbus_code,
>  	.enum_frame_size = uds_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uif.c b/drivers/media/platform/renesas/vsp1/vsp1_uif.c
> index d84d10f35090..f66936a28a2a 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_uif.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_uif.c
> @@ -174,7 +174,6 @@ static int uif_set_selection(struct v4l2_subdev *subdev,
>   */
>  
>  static const struct v4l2_subdev_pad_ops uif_pad_ops = {
> -	.init_cfg = vsp1_entity_init_cfg,
>  	.enum_mbus_code = uif_enum_mbus_code,
>  	.enum_frame_size = uif_enum_frame_size,
>  	.get_fmt = vsp1_subdev_get_pad_format,
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
> index 47f4353a1784..e6642a2167ef 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
> @@ -270,8 +270,8 @@ static int rkisp1_csi_enum_mbus_code(struct v4l2_subdev *sd,
>  	return -EINVAL;
>  }
>  
> -static int rkisp1_csi_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rkisp1_csi_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
>  
> @@ -405,7 +405,6 @@ static const struct v4l2_subdev_video_ops rkisp1_csi_video_ops = {
>  
>  static const struct v4l2_subdev_pad_ops rkisp1_csi_pad_ops = {
>  	.enum_mbus_code = rkisp1_csi_enum_mbus_code,
> -	.init_cfg = rkisp1_csi_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rkisp1_csi_set_fmt,
>  };
> @@ -415,6 +414,10 @@ static const struct v4l2_subdev_ops rkisp1_csi_ops = {
>  	.pad = &rkisp1_csi_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rkisp1_csi_internal_ops = {
> +	.init_state = rkisp1_csi_init_state,
> +};
> +
>  int rkisp1_csi_register(struct rkisp1_device *rkisp1)
>  {
>  	struct rkisp1_csi *csi = &rkisp1->csi;
> @@ -426,6 +429,7 @@ int rkisp1_csi_register(struct rkisp1_device *rkisp1)
>  
>  	sd = &csi->sd;
>  	v4l2_subdev_init(sd, &rkisp1_csi_ops);
> +	sd->internal_ops = &rkisp1_csi_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sd->entity.ops = &rkisp1_csi_media_ops;
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
> index 96353648c032..ca6703bfd27b 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
> @@ -409,8 +409,8 @@ static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rkisp1_isp_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
>  	struct v4l2_rect *sink_crop, *src_crop;
> @@ -769,7 +769,6 @@ static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
>  	.enum_frame_size = rkisp1_isp_enum_frame_size,
>  	.get_selection = rkisp1_isp_get_selection,
>  	.set_selection = rkisp1_isp_set_selection,
> -	.init_cfg = rkisp1_isp_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rkisp1_isp_set_fmt,
>  	.link_validate = v4l2_subdev_link_validate_default,
> @@ -880,6 +879,10 @@ static const struct v4l2_subdev_ops rkisp1_isp_ops = {
>  	.pad = &rkisp1_isp_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rkisp1_isp_internal_ops = {
> +	.init_state = rkisp1_isp_init_state,
> +};
> +
>  int rkisp1_isp_register(struct rkisp1_device *rkisp1)
>  {
>  	struct rkisp1_isp *isp = &rkisp1->isp;
> @@ -890,6 +893,7 @@ int rkisp1_isp_register(struct rkisp1_device *rkisp1)
>  	isp->rkisp1 = rkisp1;
>  
>  	v4l2_subdev_init(sd, &rkisp1_isp_ops);
> +	sd->internal_ops = &rkisp1_isp_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	sd->entity.ops = &rkisp1_isp_media_ops;
>  	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
> index 9f94b9f60c35..f7af360dcb28 100644
> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
> @@ -366,8 +366,8 @@ static int rkisp1_rsz_enum_mbus_code(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> -static int rkisp1_rsz_init_config(struct v4l2_subdev *sd,
> -				  struct v4l2_subdev_state *sd_state)
> +static int rkisp1_rsz_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
>  	struct v4l2_rect *sink_crop;
> @@ -605,7 +605,6 @@ static const struct v4l2_subdev_pad_ops rkisp1_rsz_pad_ops = {
>  	.enum_mbus_code = rkisp1_rsz_enum_mbus_code,
>  	.get_selection = rkisp1_rsz_get_selection,
>  	.set_selection = rkisp1_rsz_set_selection,
> -	.init_cfg = rkisp1_rsz_init_config,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = rkisp1_rsz_set_fmt,
>  	.link_validate = v4l2_subdev_link_validate_default,
> @@ -652,6 +651,10 @@ static const struct v4l2_subdev_ops rkisp1_rsz_ops = {
>  	.pad = &rkisp1_rsz_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops rkisp1_rsz_internal_ops = {
> +	.init_state = rkisp1_rsz_init_state,
> +};
> +
>  static void rkisp1_rsz_unregister(struct rkisp1_resizer *rsz)
>  {
>  	if (!rsz->rkisp1)
> @@ -681,6 +684,7 @@ static int rkisp1_rsz_register(struct rkisp1_resizer *rsz)
>  	}
>  
>  	v4l2_subdev_init(sd, &rkisp1_rsz_ops);
> +	sd->internal_ops = &rkisp1_rsz_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	sd->entity.ops = &rkisp1_rsz_media_ops;
>  	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_SCALER;
> diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
> index 0bc897d2d577..5a361ad6b023 100644
> --- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
> +++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
> @@ -159,8 +159,8 @@ static void dcmipp_byteproc_adjust_fmt(struct v4l2_mbus_framefmt *fmt)
>  	dcmipp_colorimetry_clamp(fmt);
>  }
>  
> -static int dcmipp_byteproc_init_cfg(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *sd_state)
> +static int dcmipp_byteproc_init_state(struct v4l2_subdev *sd,
> +				      struct v4l2_subdev_state *sd_state)
>  {
>  	unsigned int i;
>  
> @@ -383,7 +383,6 @@ static int dcmipp_byteproc_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops dcmipp_byteproc_pad_ops = {
> -	.init_cfg		= dcmipp_byteproc_init_cfg,
>  	.enum_mbus_code		= dcmipp_byteproc_enum_mbus_code,
>  	.enum_frame_size	= dcmipp_byteproc_enum_frame_size,
>  	.get_fmt		= v4l2_subdev_get_fmt,
> @@ -518,6 +517,7 @@ static void dcmipp_byteproc_release(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_internal_ops dcmipp_byteproc_int_ops = {
> +	.init_state = dcmipp_byteproc_init_state,
>  	.release = dcmipp_byteproc_release,
>  };
>  
> diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
> index 5571d2773026..62c5c3331cfe 100644
> --- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
> +++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
> @@ -143,8 +143,8 @@ static const struct v4l2_mbus_framefmt fmt_default = {
>  	.xfer_func = DCMIPP_XFER_FUNC_DEFAULT,
>  };
>  
> -static int dcmipp_par_init_cfg(struct v4l2_subdev *sd,
> -			       struct v4l2_subdev_state *sd_state)
> +static int dcmipp_par_init_state(struct v4l2_subdev *sd,
> +				 struct v4l2_subdev_state *sd_state)
>  {
>  	unsigned int i;
>  
> @@ -262,7 +262,6 @@ static int dcmipp_par_set_fmt(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops dcmipp_par_pad_ops = {
> -	.init_cfg		= dcmipp_par_init_cfg,
>  	.enum_mbus_code		= dcmipp_par_enum_mbus_code,
>  	.enum_frame_size	= dcmipp_par_enum_frame_size,
>  	.get_fmt		= v4l2_subdev_get_fmt,
> @@ -394,6 +393,7 @@ static void dcmipp_par_release(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_internal_ops dcmipp_par_int_ops = {
> +	.init_state = dcmipp_par_init_state,
>  	.release = dcmipp_par_release,
>  };
>  
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> index ad13d447d483..097a3a08ef7d 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> @@ -211,6 +211,7 @@ static int sun4i_csi_probe(struct platform_device *pdev)
>  
>  	/* Initialize subdev */
>  	v4l2_subdev_init(subdev, &sun4i_csi_subdev_ops);
> +	subdev->internal_ops = &sun4i_csi_subdev_internal_ops;
>  	subdev->flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
> index 8eeed87bfb13..4e0c2df45d4d 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
> @@ -89,6 +89,7 @@ enum csi_subdev_pads {
>  };
>  
>  extern const struct v4l2_subdev_ops sun4i_csi_subdev_ops;
> +extern const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops;
>  
>  struct sun4i_csi_format {
>  	u32			mbus;
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> index c37bb1d76ef6..744197b0fccb 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
> @@ -266,8 +266,8 @@ static const struct v4l2_mbus_framefmt sun4i_csi_pad_fmt_default = {
>  	.xfer_func = V4L2_XFER_FUNC_DEFAULT,
>  };
>  
> -static int sun4i_csi_subdev_init_cfg(struct v4l2_subdev *subdev,
> -				     struct v4l2_subdev_state *sd_state)
> +static int sun4i_csi_subdev_init_state(struct v4l2_subdev *subdev,
> +				       struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *fmt;
>  
> @@ -334,7 +334,6 @@ sun4i_csi_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
>  
>  static const struct v4l2_subdev_pad_ops sun4i_csi_subdev_pad_ops = {
>  	.link_validate	= v4l2_subdev_link_validate_default,
> -	.init_cfg	= sun4i_csi_subdev_init_cfg,
>  	.get_fmt	= sun4i_csi_subdev_get_fmt,
>  	.set_fmt	= sun4i_csi_subdev_set_fmt,
>  	.enum_mbus_code	= sun4i_csi_subdev_enum_mbus_code,
> @@ -344,6 +343,10 @@ const struct v4l2_subdev_ops sun4i_csi_subdev_ops = {
>  	.pad = &sun4i_csi_subdev_pad_ops,
>  };
>  
> +const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops = {
> +	.init_state	= sun4i_csi_subdev_init_state,
> +};
> +
>  int sun4i_csi_v4l2_register(struct sun4i_csi *csi)
>  {
>  	struct video_device *vdev = &csi->vdev;
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> index d57481feee05..d006d9dd0170 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
> @@ -501,8 +501,8 @@ sun6i_csi_bridge_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun6i_csi_bridge_init_cfg(struct v4l2_subdev *subdev,
> -				     struct v4l2_subdev_state *state)
> +static int sun6i_csi_bridge_init_state(struct v4l2_subdev *subdev,
> +				       struct v4l2_subdev_state *state)
>  {
>  	struct sun6i_csi_device *csi_dev = v4l2_get_subdevdata(subdev);
>  	unsigned int pad = SUN6I_CSI_BRIDGE_PAD_SINK;
> @@ -581,7 +581,6 @@ static int sun6i_csi_bridge_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun6i_csi_bridge_pad_ops = {
> -	.init_cfg	= sun6i_csi_bridge_init_cfg,
>  	.enum_mbus_code	= sun6i_csi_bridge_enum_mbus_code,
>  	.get_fmt	= sun6i_csi_bridge_get_fmt,
>  	.set_fmt	= sun6i_csi_bridge_set_fmt,
> @@ -592,6 +591,10 @@ static const struct v4l2_subdev_ops sun6i_csi_bridge_subdev_ops = {
>  	.pad	= &sun6i_csi_bridge_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun6i_csi_bridge_internal_ops = {
> +	.init_state	= sun6i_csi_bridge_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun6i_csi_bridge_entity_ops = {
> @@ -782,6 +785,7 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun6i_csi_bridge_subdev_ops);
> +	subdev->internal_ops = &sun6i_csi_bridge_internal_ops;
>  	strscpy(subdev->name, SUN6I_CSI_BRIDGE_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> index d2c9f5d20496..f9d4dc45b490 100644
> --- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> +++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
> @@ -305,8 +305,8 @@ sun6i_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun6i_mipi_csi2_init_cfg(struct v4l2_subdev *subdev,
> -				    struct v4l2_subdev_state *state)
> +static int sun6i_mipi_csi2_init_state(struct v4l2_subdev *subdev,
> +				      struct v4l2_subdev_state *state)
>  {
>  	struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
>  	unsigned int pad = SUN6I_MIPI_CSI2_PAD_SINK;
> @@ -385,7 +385,6 @@ static int sun6i_mipi_csi2_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun6i_mipi_csi2_pad_ops = {
> -	.init_cfg	= sun6i_mipi_csi2_init_cfg,
>  	.enum_mbus_code	= sun6i_mipi_csi2_enum_mbus_code,
>  	.get_fmt	= sun6i_mipi_csi2_get_fmt,
>  	.set_fmt	= sun6i_mipi_csi2_set_fmt,
> @@ -396,6 +395,10 @@ static const struct v4l2_subdev_ops sun6i_mipi_csi2_subdev_ops = {
>  	.pad	= &sun6i_mipi_csi2_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun6i_mipi_csi2_internal_ops = {
> +	.init_state	= sun6i_mipi_csi2_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun6i_mipi_csi2_entity_ops = {
> @@ -504,6 +507,7 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mipi_csi2_device *csi2_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun6i_mipi_csi2_subdev_ops);
> +	subdev->internal_ops = &sun6i_mipi_csi2_internal_ops;
>  	strscpy(subdev->name, SUN6I_MIPI_CSI2_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> index d6275954af98..4a5698eb12b7 100644
> --- a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> +++ b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
> @@ -338,8 +338,8 @@ sun8i_a83t_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun8i_a83t_mipi_csi2_init_cfg(struct v4l2_subdev *subdev,
> -					 struct v4l2_subdev_state *state)
> +static int sun8i_a83t_mipi_csi2_init_state(struct v4l2_subdev *subdev,
> +					   struct v4l2_subdev_state *state)
>  {
>  	struct sun8i_a83t_mipi_csi2_device *csi2_dev =
>  		v4l2_get_subdevdata(subdev);
> @@ -422,7 +422,6 @@ static int sun8i_a83t_mipi_csi2_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun8i_a83t_mipi_csi2_pad_ops = {
> -	.init_cfg	= sun8i_a83t_mipi_csi2_init_cfg,
>  	.enum_mbus_code	= sun8i_a83t_mipi_csi2_enum_mbus_code,
>  	.get_fmt	= sun8i_a83t_mipi_csi2_get_fmt,
>  	.set_fmt	= sun8i_a83t_mipi_csi2_set_fmt,
> @@ -433,6 +432,10 @@ static const struct v4l2_subdev_ops sun8i_a83t_mipi_csi2_subdev_ops = {
>  	.pad	= &sun8i_a83t_mipi_csi2_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun8i_a83t_mipi_csi2_internal_ops = {
> +	.init_state	= sun8i_a83t_mipi_csi2_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun8i_a83t_mipi_csi2_entity_ops = {
> @@ -542,6 +545,7 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun8i_a83t_mipi_csi2_subdev_ops);
> +	subdev->internal_ops = &sun8i_a83t_mipi_csi2_internal_ops;
>  	strscpy(subdev->name, SUN8I_A83T_MIPI_CSI2_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/drivers/media/platform/ti/cal/cal-camerarx.c b/drivers/media/platform/ti/cal/cal-camerarx.c
> index 61433744c6c4..4afc2ad00330 100644
> --- a/drivers/media/platform/ti/cal/cal-camerarx.c
> +++ b/drivers/media/platform/ti/cal/cal-camerarx.c
> @@ -721,8 +721,8 @@ static int cal_camerarx_sd_set_fmt(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int cal_camerarx_sd_init_cfg(struct v4l2_subdev *sd,
> -				    struct v4l2_subdev_state *state)
> +static int cal_camerarx_sd_init_state(struct v4l2_subdev *sd,
> +				      struct v4l2_subdev_state *state)
>  {
>  	struct v4l2_subdev_format format = {
>  		.which = state ? V4L2_SUBDEV_FORMAT_TRY
> @@ -782,7 +782,6 @@ static const struct v4l2_subdev_video_ops cal_camerarx_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops cal_camerarx_pad_ops = {
> -	.init_cfg = cal_camerarx_sd_init_cfg,
>  	.enum_mbus_code = cal_camerarx_sd_enum_mbus_code,
>  	.enum_frame_size = cal_camerarx_sd_enum_frame_size,
>  	.get_fmt = v4l2_subdev_get_fmt,
> @@ -795,6 +794,10 @@ static const struct v4l2_subdev_ops cal_camerarx_subdev_ops = {
>  	.pad = &cal_camerarx_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops cal_camerarx_internal_ops = {
> +	.init_state = cal_camerarx_sd_init_state,
> +};
> +
>  static struct media_entity_operations cal_camerarx_media_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -846,6 +849,7 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
>  	/* Initialize the V4L2 subdev and media entity. */
>  	sd = &phy->subdev;
>  	v4l2_subdev_init(sd, &cal_camerarx_subdev_ops);
> +	sd->internal_ops = &cal_camerarx_internal_ops;
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
>  	sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	snprintf(sd->name, sizeof(sd->name), "CAMERARX%u", instance);
> diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c
> index 06a28531ed02..31e9e92e723e 100644
> --- a/drivers/media/platform/video-mux.c
> +++ b/drivers/media/platform/video-mux.c
> @@ -282,8 +282,8 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
>  	return 0;
>  }
>  
> -static int video_mux_init_cfg(struct v4l2_subdev *sd,
> -			      struct v4l2_subdev_state *sd_state)
> +static int video_mux_init_state(struct v4l2_subdev *sd,
> +				struct v4l2_subdev_state *sd_state)
>  {
>  	struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
>  	struct v4l2_mbus_framefmt *mbusformat;
> @@ -302,7 +302,6 @@ static int video_mux_init_cfg(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops video_mux_pad_ops = {
> -	.init_cfg = video_mux_init_cfg,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = video_mux_set_format,
>  };
> @@ -312,6 +311,10 @@ static const struct v4l2_subdev_ops video_mux_subdev_ops = {
>  	.video = &video_mux_subdev_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops video_mux_internal_ops = {
> +	.init_state = video_mux_init_state,
> +};
> +
>  static int video_mux_notify_bound(struct v4l2_async_notifier *notifier,
>  				  struct v4l2_subdev *sd,
>  				  struct v4l2_async_connection *asd)
> @@ -400,6 +403,7 @@ static int video_mux_probe(struct platform_device *pdev)
>  	platform_set_drvdata(pdev, vmux);
>  
>  	v4l2_subdev_init(&vmux->subdev, &video_mux_subdev_ops);
> +	vmux->subdev.internal_ops = &video_mux_internal_ops;
>  	snprintf(vmux->subdev.name, sizeof(vmux->subdev.name), "%pOFn", np);
>  	vmux->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	vmux->subdev.dev = dev;
> diff --git a/drivers/media/platform/xilinx/xilinx-csi2rxss.c b/drivers/media/platform/xilinx/xilinx-csi2rxss.c
> index bca8ec94ee35..f953d5474ae0 100644
> --- a/drivers/media/platform/xilinx/xilinx-csi2rxss.c
> +++ b/drivers/media/platform/xilinx/xilinx-csi2rxss.c
> @@ -661,8 +661,8 @@ __xcsi2rxss_get_pad_format(struct xcsi2rxss_state *xcsi2rxss,
>  	}
>  }
>  
> -static int xcsi2rxss_init_cfg(struct v4l2_subdev *sd,
> -			      struct v4l2_subdev_state *sd_state)
> +static int xcsi2rxss_init_state(struct v4l2_subdev *sd,
> +				struct v4l2_subdev_state *sd_state)
>  {
>  	struct xcsi2rxss_state *xcsi2rxss = to_xcsi2rxssstate(sd);
>  	struct v4l2_mbus_framefmt *format;
> @@ -780,7 +780,6 @@ static const struct v4l2_subdev_video_ops xcsi2rxss_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops xcsi2rxss_pad_ops = {
> -	.init_cfg = xcsi2rxss_init_cfg,
>  	.get_fmt = xcsi2rxss_get_format,
>  	.set_fmt = xcsi2rxss_set_format,
>  	.enum_mbus_code = xcsi2rxss_enum_mbus_code,
> @@ -793,6 +792,10 @@ static const struct v4l2_subdev_ops xcsi2rxss_ops = {
>  	.pad = &xcsi2rxss_pad_ops
>  };
>  
> +static const struct v4l2_subdev_internal_ops xcsi2rxss_internal_ops = {
> +	.init_state = xcsi2rxss_init_state,
> +};
> +
>  static int xcsi2rxss_parse_of(struct xcsi2rxss_state *xcsi2rxss)
>  {
>  	struct device *dev = xcsi2rxss->dev;
> @@ -970,6 +973,7 @@ static int xcsi2rxss_probe(struct platform_device *pdev)
>  	/* Initialize V4L2 subdevice and media entity */
>  	subdev = &xcsi2rxss->subdev;
>  	v4l2_subdev_init(subdev, &xcsi2rxss_ops);
> +	subdev->internal_ops = &xcsi2rxss_internal_ops;
>  	subdev->dev = dev;
>  	strscpy(subdev->name, dev_name(dev), sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_HAS_DEVNODE;
> diff --git a/drivers/media/test-drivers/vimc/vimc-debayer.c b/drivers/media/test-drivers/vimc/vimc-debayer.c
> index a2fb32c97c84..d72ed086e00b 100644
> --- a/drivers/media/test-drivers/vimc/vimc-debayer.c
> +++ b/drivers/media/test-drivers/vimc/vimc-debayer.c
> @@ -150,8 +150,8 @@ static bool vimc_debayer_src_code_is_valid(u32 code)
>  	return false;
>  }
>  
> -static int vimc_debayer_init_cfg(struct v4l2_subdev *sd,
> -				 struct v4l2_subdev_state *sd_state)
> +static int vimc_debayer_init_state(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_state *sd_state)
>  {
>  	struct vimc_debayer_device *vdebayer = v4l2_get_subdevdata(sd);
>  	struct v4l2_mbus_framefmt *mf;
> @@ -307,7 +307,6 @@ static int vimc_debayer_set_fmt(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops vimc_debayer_pad_ops = {
> -	.init_cfg		= vimc_debayer_init_cfg,
>  	.enum_mbus_code		= vimc_debayer_enum_mbus_code,
>  	.enum_frame_size	= vimc_debayer_enum_frame_size,
>  	.get_fmt		= vimc_debayer_get_fmt,
> @@ -395,6 +394,10 @@ static const struct v4l2_subdev_ops vimc_debayer_ops = {
>  	.video = &vimc_debayer_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vimc_debayer_internal_ops = {
> +	.init_state = vimc_debayer_init_state,
> +};
> +
>  static unsigned int vimc_debayer_get_val(const u8 *bytes,
>  					 const unsigned int n_bytes)
>  {
> @@ -595,6 +598,8 @@ static struct vimc_ent_device *vimc_debayer_add(struct vimc_device *vimc,
>  	if (ret)
>  		goto err_free_hdl;
>  
> +	vdebayer->sd.internal_ops = &vimc_debayer_internal_ops;
> +
>  	vdebayer->ved.process_frame = vimc_debayer_process_frame;
>  	vdebayer->ved.dev = vimc->mdev.dev;
>  	vdebayer->mean_win_size = vimc_debayer_ctrl_mean_win_size.def;
> diff --git a/drivers/media/test-drivers/vimc/vimc-scaler.c b/drivers/media/test-drivers/vimc/vimc-scaler.c
> index f6592a789f1e..afe13d6af321 100644
> --- a/drivers/media/test-drivers/vimc/vimc-scaler.c
> +++ b/drivers/media/test-drivers/vimc/vimc-scaler.c
> @@ -70,8 +70,8 @@ vimc_scaler_get_crop_bound_sink(const struct v4l2_mbus_framefmt *sink_fmt)
>  	return r;
>  }
>  
> -static int vimc_scaler_init_cfg(struct v4l2_subdev *sd,
> -			     struct v4l2_subdev_state *sd_state)
> +static int vimc_scaler_init_state(struct v4l2_subdev *sd,
> +				  struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *mf;
>  	struct v4l2_rect *r;
> @@ -292,7 +292,6 @@ static int vimc_scaler_set_selection(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops vimc_scaler_pad_ops = {
> -	.init_cfg		= vimc_scaler_init_cfg,
>  	.enum_mbus_code		= vimc_scaler_enum_mbus_code,
>  	.enum_frame_size	= vimc_scaler_enum_frame_size,
>  	.get_fmt		= vimc_scaler_get_fmt,
> @@ -347,6 +346,10 @@ static const struct v4l2_subdev_ops vimc_scaler_ops = {
>  	.video = &vimc_scaler_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vimc_scaler_internal_ops = {
> +	.init_state = vimc_scaler_init_state,
> +};
> +
>  static void vimc_scaler_fill_src_frame(const struct vimc_scaler_device *const vscaler,
>  				    const u8 *const sink_frame)
>  {
> @@ -424,6 +427,8 @@ static struct vimc_ent_device *vimc_scaler_add(struct vimc_device *vimc,
>  		return ERR_PTR(ret);
>  	}
>  
> +	vscaler->sd.internal_ops = &vimc_scaler_internal_ops;
> +
>  	vscaler->ved.process_frame = vimc_scaler_process_frame;
>  	vscaler->ved.dev = vimc->mdev.dev;
>  
> diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
> index 676ab503f0ca..5e34b1aed95e 100644
> --- a/drivers/media/test-drivers/vimc/vimc-sensor.c
> +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
> @@ -41,8 +41,8 @@ static const struct v4l2_mbus_framefmt fmt_default = {
>  	.colorspace = V4L2_COLORSPACE_SRGB,
>  };
>  
> -static int vimc_sensor_init_cfg(struct v4l2_subdev *sd,
> -				struct v4l2_subdev_state *sd_state)
> +static int vimc_sensor_init_state(struct v4l2_subdev *sd,
> +				  struct v4l2_subdev_state *sd_state)
>  {
>  	unsigned int i;
>  
> @@ -183,7 +183,6 @@ static int vimc_sensor_set_fmt(struct v4l2_subdev *sd,
>  }
>  
>  static const struct v4l2_subdev_pad_ops vimc_sensor_pad_ops = {
> -	.init_cfg		= vimc_sensor_init_cfg,
>  	.enum_mbus_code		= vimc_sensor_enum_mbus_code,
>  	.enum_frame_size	= vimc_sensor_enum_frame_size,
>  	.get_fmt		= vimc_sensor_get_fmt,
> @@ -294,6 +293,10 @@ static const struct v4l2_subdev_ops vimc_sensor_ops = {
>  	.video = &vimc_sensor_video_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops vimc_sensor_internal_ops = {
> +	.init_state = vimc_sensor_init_state,
> +};
> +
>  static int vimc_sensor_s_ctrl(struct v4l2_ctrl *ctrl)
>  {
>  	struct vimc_sensor_device *vsensor =
> @@ -429,6 +432,8 @@ static struct vimc_ent_device *vimc_sensor_add(struct vimc_device *vimc,
>  	if (ret)
>  		goto err_free_tpg;
>  
> +	vsensor->sd.internal_ops = &vimc_sensor_internal_ops;
> +
>  	vsensor->ved.process_frame = vimc_sensor_process_frame;
>  	vsensor->ved.dev = vimc->mdev.dev;
>  
> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
> index 985873b7981e..4fbefe4cd714 100644
> --- a/drivers/media/v4l2-core/v4l2-subdev.c
> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
> @@ -1460,16 +1460,18 @@ __v4l2_subdev_state_alloc(struct v4l2_subdev *sd, const char *lock_name,
>  		}
>  	}
>  
> -	/*
> -	 * There can be no race at this point, but we lock the state anyway to
> -	 * satisfy lockdep checks.
> -	 */
> -	v4l2_subdev_lock_state(state);
> -	ret = v4l2_subdev_call(sd, pad, init_cfg, state);
> -	v4l2_subdev_unlock_state(state);
> +	if (sd->internal_ops && sd->internal_ops->init_state) {
> +		/*
> +		 * There can be no race at this point, but we lock the state
> +		 * anyway to satisfy lockdep checks.
> +		 */
> +		v4l2_subdev_lock_state(state);
> +		ret = sd->internal_ops->init_state(sd, state);
> +		v4l2_subdev_unlock_state(state);
>  
> -	if (ret < 0 && ret != -ENOIOCTLCMD)
> -		goto err;
> +		if (ret)
> +			goto err;
> +	}
>  
>  	return state;
>  
> diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media/imx/imx-ic-prp.c
> index 61d69f19657e..8bd9be49cc08 100644
> --- a/drivers/staging/media/imx/imx-ic-prp.c
> +++ b/drivers/staging/media/imx/imx-ic-prp.c
> @@ -448,7 +448,6 @@ static int prp_registered(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_pad_ops prp_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = prp_enum_mbus_code,
>  	.get_fmt = prp_get_fmt,
>  	.set_fmt = prp_set_fmt,
> @@ -472,6 +471,7 @@ static const struct v4l2_subdev_ops prp_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops prp_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = prp_registered,
>  };
>  
> diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c
> index ec73c901079e..04878f07eeba 100644
> --- a/drivers/staging/media/imx/imx-ic-prpencvf.c
> +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c
> @@ -1296,7 +1296,6 @@ static void prp_unregistered(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_pad_ops prp_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = prp_enum_mbus_code,
>  	.enum_frame_size = prp_enum_frame_size,
>  	.get_fmt = prp_get_fmt,
> @@ -1320,6 +1319,7 @@ static const struct v4l2_subdev_ops prp_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops prp_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = prp_registered,
>  	.unregistered = prp_unregistered,
>  };
> diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
> index 33902f5daf80..2fc94011fe4d 100644
> --- a/drivers/staging/media/imx/imx-media-csi.c
> +++ b/drivers/staging/media/imx/imx-media-csi.c
> @@ -1866,7 +1866,6 @@ static const struct v4l2_subdev_video_ops csi_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops csi_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = csi_enum_mbus_code,
>  	.enum_frame_size = csi_enum_frame_size,
>  	.enum_frame_interval = csi_enum_frame_interval,
> @@ -1884,6 +1883,7 @@ static const struct v4l2_subdev_ops csi_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops csi_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = csi_registered,
>  	.unregistered = csi_unregistered,
>  };
> diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c
> index ec4349ab48cd..1b5af8945e6b 100644
> --- a/drivers/staging/media/imx/imx-media-utils.c
> +++ b/drivers/staging/media/imx/imx-media-utils.c
> @@ -426,10 +426,10 @@ EXPORT_SYMBOL_GPL(imx_media_init_mbus_fmt);
>  
>  /*
>   * Initializes the TRY format to the ACTIVE format on all pads
> - * of a subdev. Can be used as the .init_cfg pad operation.
> + * of a subdev. Can be used as the .init_state internal operation.
>   */
> -int imx_media_init_cfg(struct v4l2_subdev *sd,
> -		       struct v4l2_subdev_state *sd_state)
> +int imx_media_init_state(struct v4l2_subdev *sd,
> +			 struct v4l2_subdev_state *sd_state)
>  {
>  	struct v4l2_mbus_framefmt *mf_try;
>  	unsigned int pad;
> @@ -451,7 +451,7 @@ int imx_media_init_cfg(struct v4l2_subdev *sd,
>  
>  	return 0;
>  }
> -EXPORT_SYMBOL_GPL(imx_media_init_cfg);
> +EXPORT_SYMBOL_GPL(imx_media_init_state);
>  
>  /*
>   * Default the colorspace in tryfmt to SRGB if set to an unsupported
> diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c
> index 792bca1d2d25..810b38ea3ab9 100644
> --- a/drivers/staging/media/imx/imx-media-vdic.c
> +++ b/drivers/staging/media/imx/imx-media-vdic.c
> @@ -882,7 +882,6 @@ static void vdic_unregistered(struct v4l2_subdev *sd)
>  }
>  
>  static const struct v4l2_subdev_pad_ops vdic_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.enum_mbus_code = vdic_enum_mbus_code,
>  	.get_fmt = vdic_get_fmt,
>  	.set_fmt = vdic_set_fmt,
> @@ -906,6 +905,7 @@ static const struct v4l2_subdev_ops vdic_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops vdic_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = vdic_registered,
>  	.unregistered = vdic_unregistered,
>  };
> diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h
> index 2640cd34dce2..f095d9134fee 100644
> --- a/drivers/staging/media/imx/imx-media.h
> +++ b/drivers/staging/media/imx/imx-media.h
> @@ -192,8 +192,8 @@ static inline int imx_media_enum_ipu_formats(u32 *code, u32 index,
>  int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
>  			    u32 width, u32 height, u32 code, u32 field,
>  			    const struct imx_media_pixfmt **cc);
> -int imx_media_init_cfg(struct v4l2_subdev *sd,
> -		       struct v4l2_subdev_state *sd_state);
> +int imx_media_init_state(struct v4l2_subdev *sd,
> +			 struct v4l2_subdev_state *sd_state);
>  void imx_media_try_colorimetry(struct v4l2_mbus_framefmt *tryfmt,
>  			       bool ic_route);
>  int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
> diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> index 6906220ee89e..0d8b42061623 100644
> --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> @@ -619,7 +619,6 @@ static const struct v4l2_subdev_video_ops csi2_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops csi2_pad_ops = {
> -	.init_cfg = imx_media_init_cfg,
>  	.get_fmt = csi2_get_fmt,
>  	.set_fmt = csi2_set_fmt,
>  };
> @@ -631,6 +630,7 @@ static const struct v4l2_subdev_ops csi2_subdev_ops = {
>  };
>  
>  static const struct v4l2_subdev_internal_ops csi2_internal_ops = {
> +	.init_state = imx_media_init_state,
>  	.registered = csi2_registered,
>  };
>  
> diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
> index 893dbd8cddc8..6bffffb2b20c 100644
> --- a/drivers/staging/media/starfive/camss/stf-isp.c
> +++ b/drivers/staging/media/starfive/camss/stf-isp.c
> @@ -311,7 +311,6 @@ static const struct v4l2_subdev_video_ops isp_video_ops = {
>  };
>  
>  static const struct v4l2_subdev_pad_ops isp_pad_ops = {
> -	.init_cfg = isp_init_formats,
>  	.enum_mbus_code = isp_enum_mbus_code,
>  	.get_fmt = v4l2_subdev_get_fmt,
>  	.set_fmt = isp_set_format,
> @@ -324,6 +323,10 @@ static const struct v4l2_subdev_ops isp_v4l2_ops = {
>  	.pad = &isp_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops isp_internal_ops = {
> +	.init_state = isp_init_formats,
> +};
> +
>  static const struct media_entity_operations isp_media_ops = {
>  	.link_validate = v4l2_subdev_link_validate,
>  };
> @@ -335,6 +338,7 @@ int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev)
>  	int ret;
>  
>  	v4l2_subdev_init(sd, &isp_v4l2_ops);
> +	sd->internal_ops = &isp_internal_ops;
>  	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	snprintf(sd->name, ARRAY_SIZE(sd->name), "stf_isp");
>  	v4l2_set_subdevdata(sd, isp_dev);
> diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> index b2ce0d4fae95..46a334b602f1 100644
> --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
> @@ -256,8 +256,8 @@ sun6i_isp_proc_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
>  	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
>  }
>  
> -static int sun6i_isp_proc_init_cfg(struct v4l2_subdev *subdev,
> -				   struct v4l2_subdev_state *state)
> +static int sun6i_isp_proc_init_state(struct v4l2_subdev *subdev,
> +				     struct v4l2_subdev_state *state)
>  {
>  	struct sun6i_isp_device *isp_dev = v4l2_get_subdevdata(subdev);
>  	unsigned int pad = SUN6I_ISP_PROC_PAD_SINK_CSI;
> @@ -336,7 +336,6 @@ static int sun6i_isp_proc_set_fmt(struct v4l2_subdev *subdev,
>  }
>  
>  static const struct v4l2_subdev_pad_ops sun6i_isp_proc_pad_ops = {
> -	.init_cfg	= sun6i_isp_proc_init_cfg,
>  	.enum_mbus_code	= sun6i_isp_proc_enum_mbus_code,
>  	.get_fmt	= sun6i_isp_proc_get_fmt,
>  	.set_fmt	= sun6i_isp_proc_set_fmt,
> @@ -347,6 +346,10 @@ static const struct v4l2_subdev_ops sun6i_isp_proc_subdev_ops = {
>  	.pad	= &sun6i_isp_proc_pad_ops,
>  };
>  
> +static const struct v4l2_subdev_internal_ops sun6i_isp_proc_internal_ops = {
> +	.init_state = sun6i_isp_proc_init_state,
> +};
> +
>  /* Media Entity */
>  
>  static const struct media_entity_operations sun6i_isp_proc_entity_ops = {
> @@ -501,6 +504,7 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_dev)
>  	/* V4L2 Subdev */
>  
>  	v4l2_subdev_init(subdev, &sun6i_isp_proc_subdev_ops);
> +	subdev->internal_ops = &sun6i_isp_proc_internal_ops;
>  	strscpy(subdev->name, SUN6I_ISP_PROC_NAME, sizeof(subdev->name));
>  	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  	subdev->owner = THIS_MODULE;
> diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
> index 2a438e516095..8b08f6640dee 100644
> --- a/include/media/v4l2-subdev.h
> +++ b/include/media/v4l2-subdev.h
> @@ -771,7 +771,6 @@ struct v4l2_subdev_state {
>  /**
>   * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
>   *
> - * @init_cfg: initialize the subdev state to default values
>   * @enum_mbus_code: callback for VIDIOC_SUBDEV_ENUM_MBUS_CODE() ioctl handler
>   *		    code.
>   * @enum_frame_size: callback for VIDIOC_SUBDEV_ENUM_FRAME_SIZE() ioctl handler
> @@ -836,8 +835,6 @@ struct v4l2_subdev_state {
>   *	directly, use v4l2_subdev_disable_streams() instead.
>   */
>  struct v4l2_subdev_pad_ops {
> -	int (*init_cfg)(struct v4l2_subdev *sd,
> -			struct v4l2_subdev_state *state);
>  	int (*enum_mbus_code)(struct v4l2_subdev *sd,
>  			      struct v4l2_subdev_state *state,
>  			      struct v4l2_subdev_mbus_code_enum *code);
> @@ -914,6 +911,8 @@ struct v4l2_subdev_ops {
>  /**
>   * struct v4l2_subdev_internal_ops - V4L2 subdev internal ops
>   *
> + * @init_state: initialize the subdev state to default values
> + *
>   * @registered: called when this subdev is registered. When called the v4l2_dev
>   *	field is set to the correct v4l2_device.
>   *
> @@ -939,6 +938,8 @@ struct v4l2_subdev_ops {
>   *	these ops.
>   */
>  struct v4l2_subdev_internal_ops {
> +	int (*init_state)(struct v4l2_subdev *sd,
> +			  struct v4l2_subdev_state *state);
>  	int (*registered)(struct v4l2_subdev *sd);
>  	void (*unregistered)(struct v4l2_subdev *sd);
>  	int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
> -- 
> Regards,
> 
> Laurent Pinchart
> 
>
Laurent Pinchart Nov. 27, 2023, 11:33 a.m. UTC | #5
Hi Tommaso,

On Mon, Nov 27, 2023 at 12:27:37PM +0100, Tommaso Merciai wrote:
> Hi Laurent,
> Patch looks good to me.
> 
> Some clarification:
> 
> I'm working as you know on alvium driver actually v14 sent.
> Need to wait for a feedback on this or I can send v15 with the following
> missing stuff:
> 
> diff --git a/drivers/media/i2c/alvium-csi2.c b/drivers/media/i2c/alvium-csi2.c
> index 1c6450c9b994..3f4104ab3094 100644
> --- a/drivers/media/i2c/alvium-csi2.c
> +++ b/drivers/media/i2c/alvium-csi2.c
> @@ -1850,8 +1850,8 @@ static int alvium_s_stream(struct v4l2_subdev *sd, int enable)
>         return ret;
>  }
> 
> -static int alvium_init_cfg(struct v4l2_subdev *sd,
> -                          struct v4l2_subdev_state *state)
> +static int alvium_init_state(struct v4l2_subdev *sd,
> +                            struct v4l2_subdev_state *state)
>  {
>         struct alvium_dev *alvium = sd_to_alvium(sd);
>         struct alvium_mode *mode = &alvium->mode;
> @@ -2233,7 +2233,6 @@ static const struct v4l2_subdev_video_ops alvium_video_ops = {
>  };
> 
>  static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
> -       .init_cfg = alvium_init_cfg,
>         .enum_mbus_code = alvium_enum_mbus_code,
>         .get_fmt = v4l2_subdev_get_fmt,
>         .set_fmt = alvium_set_fmt,
> @@ -2241,6 +2240,10 @@ static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
>         .set_selection = alvium_set_selection,
>  };
> 
> +static const struct v4l2_subdev_internal_ops alvium_internal_ops = {
> +       .init_state = alvium_init_state,
> +};
> +
>  static const struct v4l2_subdev_ops alvium_subdev_ops = {
>         .core   = &alvium_core_ops,
>         .pad    = &alvium_pad_ops,
> @@ -2271,6 +2274,7 @@ static int alvium_subdev_init(struct alvium_dev *alvium)
>         /* init alvium sd */
>         v4l2_i2c_subdev_init(sd, client, &alvium_subdev_ops);
> 
> +       sd->internal_ops = &alvium_internal_ops;
>         sd->flags |= V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_HAS_DEVNODE;
>         alvium->pad.flags = MEDIA_PAD_FL_SOURCE;
>         sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
> 
> Rebased this morning on top of Sakari master branch :)

As far as I understand, Sakari will send a pull request that will
include this patch in a few days. I think you can already base the next
version of the Alvium driver on top of his master branch. Sakari, please
let us know if this is not correct.

By the way, I forgot to CC you, but I have posted the next version of
the .[gs]_frame_interval rework ([1]). I don't mind rebasing on top of
your driver in case it gets merged first.

[1] https://lore.kernel.org/linux-media/20231127111359.30315-1-laurent.pinchart@ideasonboard.com/T/#t

> On Mon, Nov 27, 2023 at 11:07:44AM +0200, Laurent Pinchart wrote:
> > The subdev .init_cfg() operation is affected by two issues:
> > 
> > - It has long been extended to initialize a whole v4l2_subdev_state
> >   instead of just a v4l2_subdev_pad_config, but its name has stuck
> >   around.
> > 
> > - Despite operating on a whole subdev state and not being directly
> >   exposed to the subdev users (either in-kernel or through the userspace
> >   API), .init_cfg() is categorized as a subdev pad operation.
> > 
> > This participates in making the subdev API confusing for new developers.
> > Fix it by renaming the operation to .init_state(), and make it a subdev
> > internal operation.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> > Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
> > ---
> > Changes since v3:
> > 
> > - Rebase on top of the new stm32-dcmipp driver
> > - Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
> >   rebase
> > 
> > Changes since v2:
> > 
> > - Rebase on top of the latest media tree
> > 
> > Changes since v1:
> > 
> > - Fix compilation of the vsp1 driver
> > ---
> >  drivers/media/i2c/adv7180.c                   | 10 ++--
> >  drivers/media/i2c/ccs/ccs-core.c              |  6 +--
> >  drivers/media/i2c/ds90ub913.c                 | 10 ++--
> >  drivers/media/i2c/ds90ub953.c                 | 10 ++--
> >  drivers/media/i2c/ds90ub960.c                 | 11 ++--
> >  drivers/media/i2c/gc2145.c                    | 10 ++--
> >  drivers/media/i2c/hi846.c                     | 10 ++--
> >  drivers/media/i2c/imx214.c                    | 12 +++--
> >  drivers/media/i2c/imx219.c                    |  9 ++--
> >  drivers/media/i2c/imx290.c                    | 10 ++--
> >  drivers/media/i2c/imx296.c                    | 10 ++--
> >  drivers/media/i2c/imx334.c                    | 12 +++--
> >  drivers/media/i2c/imx335.c                    | 12 +++--
> >  drivers/media/i2c/imx412.c                    | 12 +++--
> >  drivers/media/i2c/imx415.c                    | 10 ++--
> >  drivers/media/i2c/mt9m001.c                   | 10 ++--
> >  drivers/media/i2c/mt9m111.c                   | 10 ++--
> >  drivers/media/i2c/mt9m114.c                   | 16 +++---
> >  drivers/media/i2c/mt9p031.c                   |  8 +--
> >  drivers/media/i2c/mt9v111.c                   | 10 ++--
> >  drivers/media/i2c/ov01a10.c                   | 10 ++--
> >  drivers/media/i2c/ov02a10.c                   | 10 ++--
> >  drivers/media/i2c/ov2640.c                    | 10 ++--
> >  drivers/media/i2c/ov2680.c                    | 10 ++--
> >  drivers/media/i2c/ov2740.c                    | 10 ++--
> >  drivers/media/i2c/ov5640.c                    | 10 ++--
> >  drivers/media/i2c/ov5645.c                    | 12 +++--
> >  drivers/media/i2c/ov5670.c                    | 10 ++--
> >  drivers/media/i2c/ov7251.c                    | 12 +++--
> >  drivers/media/i2c/ov8858.c                    | 10 ++--
> >  drivers/media/i2c/ov9282.c                    | 12 +++--
> >  drivers/media/i2c/st-vgxy61.c                 | 10 ++--
> >  drivers/media/i2c/tc358746.c                  | 10 ++--
> >  drivers/media/i2c/tda1997x.c                  | 10 ++--
> >  drivers/media/i2c/thp7312.c                   | 10 ++--
> >  drivers/media/i2c/tvp5150.c                   |  6 +--
> >  drivers/media/pci/intel/ivsc/mei_csi.c        | 10 ++--
> >  drivers/media/platform/cadence/cdns-csi2rx.c  | 10 ++--
> >  .../platform/microchip/microchip-csi2dc.c     | 10 ++--
> >  .../platform/microchip/microchip-isc-scaler.c | 10 ++--
> >  drivers/media/platform/nxp/imx-mipi-csis.c    | 10 ++--
> >  drivers/media/platform/nxp/imx7-media-csi.c   |  6 +--
> >  .../platform/nxp/imx8-isi/imx8-isi-crossbar.c | 10 ++--
> >  .../platform/nxp/imx8-isi/imx8-isi-pipe.c     | 10 ++--
> >  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 10 ++--
> >  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 10 ++--
> >  .../platform/renesas/rzg2l-cru/rzg2l-ip.c     | 10 ++--
> >  .../media/platform/renesas/vsp1/vsp1_brx.c    |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_clu.c    |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_entity.c | 53 +++++++++----------
> >  .../media/platform/renesas/vsp1/vsp1_entity.h |  2 -
> >  .../media/platform/renesas/vsp1/vsp1_hsit.c   |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_lif.c    |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_lut.c    |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_rwpf.c   |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_sru.c    |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_uds.c    |  1 -
> >  .../media/platform/renesas/vsp1/vsp1_uif.c    |  1 -
> >  .../platform/rockchip/rkisp1/rkisp1-csi.c     | 10 ++--
> >  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 10 ++--
> >  .../platform/rockchip/rkisp1/rkisp1-resizer.c | 10 ++--
> >  .../st/stm32/stm32-dcmipp/dcmipp-byteproc.c   |  6 +--
> >  .../st/stm32/stm32-dcmipp/dcmipp-parallel.c   |  6 +--
> >  .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  1 +
> >  .../platform/sunxi/sun4i-csi/sun4i_csi.h      |  1 +
> >  .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  9 ++--
> >  .../sunxi/sun6i-csi/sun6i_csi_bridge.c        | 10 ++--
> >  .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c   | 10 ++--
> >  .../sun8i_a83t_mipi_csi2.c                    | 10 ++--
> >  drivers/media/platform/ti/cal/cal-camerarx.c  | 10 ++--
> >  drivers/media/platform/video-mux.c            | 10 ++--
> >  .../media/platform/xilinx/xilinx-csi2rxss.c   | 10 ++--
> >  .../media/test-drivers/vimc/vimc-debayer.c    | 11 ++--
> >  drivers/media/test-drivers/vimc/vimc-scaler.c | 11 ++--
> >  drivers/media/test-drivers/vimc/vimc-sensor.c | 11 ++--
> >  drivers/media/v4l2-core/v4l2-subdev.c         | 20 +++----
> >  drivers/staging/media/imx/imx-ic-prp.c        |  2 +-
> >  drivers/staging/media/imx/imx-ic-prpencvf.c   |  2 +-
> >  drivers/staging/media/imx/imx-media-csi.c     |  2 +-
> >  drivers/staging/media/imx/imx-media-utils.c   |  8 +--
> >  drivers/staging/media/imx/imx-media-vdic.c    |  2 +-
> >  drivers/staging/media/imx/imx-media.h         |  4 +-
> >  drivers/staging/media/imx/imx6-mipi-csi2.c    |  2 +-
> >  .../staging/media/starfive/camss/stf-isp.c    |  6 ++-
> >  .../media/sunxi/sun6i-isp/sun6i_isp_proc.c    | 10 ++--
> >  include/media/v4l2-subdev.h                   |  7 +--
> >  86 files changed, 487 insertions(+), 264 deletions(-)

[snip]
Tommaso Merciai Nov. 27, 2023, 11:48 a.m. UTC | #6
Hi Laurent,

On Mon, Nov 27, 2023 at 01:33:14PM +0200, Laurent Pinchart wrote:
> Hi Tommaso,
> 
> On Mon, Nov 27, 2023 at 12:27:37PM +0100, Tommaso Merciai wrote:
> > Hi Laurent,
> > Patch looks good to me.
> > 
> > Some clarification:
> > 
> > I'm working as you know on alvium driver actually v14 sent.
> > Need to wait for a feedback on this or I can send v15 with the following
> > missing stuff:
> > 
> > diff --git a/drivers/media/i2c/alvium-csi2.c b/drivers/media/i2c/alvium-csi2.c
> > index 1c6450c9b994..3f4104ab3094 100644
> > --- a/drivers/media/i2c/alvium-csi2.c
> > +++ b/drivers/media/i2c/alvium-csi2.c
> > @@ -1850,8 +1850,8 @@ static int alvium_s_stream(struct v4l2_subdev *sd, int enable)
> >         return ret;
> >  }
> > 
> > -static int alvium_init_cfg(struct v4l2_subdev *sd,
> > -                          struct v4l2_subdev_state *state)
> > +static int alvium_init_state(struct v4l2_subdev *sd,
> > +                            struct v4l2_subdev_state *state)
> >  {
> >         struct alvium_dev *alvium = sd_to_alvium(sd);
> >         struct alvium_mode *mode = &alvium->mode;
> > @@ -2233,7 +2233,6 @@ static const struct v4l2_subdev_video_ops alvium_video_ops = {
> >  };
> > 
> >  static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
> > -       .init_cfg = alvium_init_cfg,
> >         .enum_mbus_code = alvium_enum_mbus_code,
> >         .get_fmt = v4l2_subdev_get_fmt,
> >         .set_fmt = alvium_set_fmt,
> > @@ -2241,6 +2240,10 @@ static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
> >         .set_selection = alvium_set_selection,
> >  };
> > 
> > +static const struct v4l2_subdev_internal_ops alvium_internal_ops = {
> > +       .init_state = alvium_init_state,
> > +};
> > +
> >  static const struct v4l2_subdev_ops alvium_subdev_ops = {
> >         .core   = &alvium_core_ops,
> >         .pad    = &alvium_pad_ops,
> > @@ -2271,6 +2274,7 @@ static int alvium_subdev_init(struct alvium_dev *alvium)
> >         /* init alvium sd */
> >         v4l2_i2c_subdev_init(sd, client, &alvium_subdev_ops);
> > 
> > +       sd->internal_ops = &alvium_internal_ops;
> >         sd->flags |= V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_HAS_DEVNODE;
> >         alvium->pad.flags = MEDIA_PAD_FL_SOURCE;
> >         sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
> > 
> > Rebased this morning on top of Sakari master branch :)
> 
> As far as I understand, Sakari will send a pull request that will
> include this patch in a few days. I think you can already base the next
> version of the Alvium driver on top of his master branch. 

Done: https://github.com/avs-sas/linux/blob/tm/media_stage/v6.7.0-rc2/alvium_drv/v15/drivers/media/i2c/alvium-csi2.c

> Sakari, please let us know if this is not correct.
> 
> By the way, I forgot to CC you, but I have posted the next version of
> the .[gs]_frame_interval rework ([1]). I don't mind rebasing on top of
> your driver in case it gets merged first.
> 
> [1] https://lore.kernel.org/linux-media/20231127111359.30315-1-laurent.pinchart@ideasonboard.com/T/#t

No problem.
Thanks for sharing.

Regards,
Tommaso
 
> > On Mon, Nov 27, 2023 at 11:07:44AM +0200, Laurent Pinchart wrote:
> > > The subdev .init_cfg() operation is affected by two issues:
> > > 
> > > - It has long been extended to initialize a whole v4l2_subdev_state
> > >   instead of just a v4l2_subdev_pad_config, but its name has stuck
> > >   around.
> > > 
> > > - Despite operating on a whole subdev state and not being directly
> > >   exposed to the subdev users (either in-kernel or through the userspace
> > >   API), .init_cfg() is categorized as a subdev pad operation.
> > > 
> > > This participates in making the subdev API confusing for new developers.
> > > Fix it by renaming the operation to .init_state(), and make it a subdev
> > > internal operation.
> > > 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> > > Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
> > > ---
> > > Changes since v3:
> > > 
> > > - Rebase on top of the new stm32-dcmipp driver
> > > - Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
> > >   rebase
> > > 
> > > Changes since v2:
> > > 
> > > - Rebase on top of the latest media tree
> > > 
> > > Changes since v1:
> > > 
> > > - Fix compilation of the vsp1 driver
> > > ---
> > >  drivers/media/i2c/adv7180.c                   | 10 ++--
> > >  drivers/media/i2c/ccs/ccs-core.c              |  6 +--
> > >  drivers/media/i2c/ds90ub913.c                 | 10 ++--
> > >  drivers/media/i2c/ds90ub953.c                 | 10 ++--
> > >  drivers/media/i2c/ds90ub960.c                 | 11 ++--
> > >  drivers/media/i2c/gc2145.c                    | 10 ++--
> > >  drivers/media/i2c/hi846.c                     | 10 ++--
> > >  drivers/media/i2c/imx214.c                    | 12 +++--
> > >  drivers/media/i2c/imx219.c                    |  9 ++--
> > >  drivers/media/i2c/imx290.c                    | 10 ++--
> > >  drivers/media/i2c/imx296.c                    | 10 ++--
> > >  drivers/media/i2c/imx334.c                    | 12 +++--
> > >  drivers/media/i2c/imx335.c                    | 12 +++--
> > >  drivers/media/i2c/imx412.c                    | 12 +++--
> > >  drivers/media/i2c/imx415.c                    | 10 ++--
> > >  drivers/media/i2c/mt9m001.c                   | 10 ++--
> > >  drivers/media/i2c/mt9m111.c                   | 10 ++--
> > >  drivers/media/i2c/mt9m114.c                   | 16 +++---
> > >  drivers/media/i2c/mt9p031.c                   |  8 +--
> > >  drivers/media/i2c/mt9v111.c                   | 10 ++--
> > >  drivers/media/i2c/ov01a10.c                   | 10 ++--
> > >  drivers/media/i2c/ov02a10.c                   | 10 ++--
> > >  drivers/media/i2c/ov2640.c                    | 10 ++--
> > >  drivers/media/i2c/ov2680.c                    | 10 ++--
> > >  drivers/media/i2c/ov2740.c                    | 10 ++--
> > >  drivers/media/i2c/ov5640.c                    | 10 ++--
> > >  drivers/media/i2c/ov5645.c                    | 12 +++--
> > >  drivers/media/i2c/ov5670.c                    | 10 ++--
> > >  drivers/media/i2c/ov7251.c                    | 12 +++--
> > >  drivers/media/i2c/ov8858.c                    | 10 ++--
> > >  drivers/media/i2c/ov9282.c                    | 12 +++--
> > >  drivers/media/i2c/st-vgxy61.c                 | 10 ++--
> > >  drivers/media/i2c/tc358746.c                  | 10 ++--
> > >  drivers/media/i2c/tda1997x.c                  | 10 ++--
> > >  drivers/media/i2c/thp7312.c                   | 10 ++--
> > >  drivers/media/i2c/tvp5150.c                   |  6 +--
> > >  drivers/media/pci/intel/ivsc/mei_csi.c        | 10 ++--
> > >  drivers/media/platform/cadence/cdns-csi2rx.c  | 10 ++--
> > >  .../platform/microchip/microchip-csi2dc.c     | 10 ++--
> > >  .../platform/microchip/microchip-isc-scaler.c | 10 ++--
> > >  drivers/media/platform/nxp/imx-mipi-csis.c    | 10 ++--
> > >  drivers/media/platform/nxp/imx7-media-csi.c   |  6 +--
> > >  .../platform/nxp/imx8-isi/imx8-isi-crossbar.c | 10 ++--
> > >  .../platform/nxp/imx8-isi/imx8-isi-pipe.c     | 10 ++--
> > >  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 10 ++--
> > >  .../platform/renesas/rzg2l-cru/rzg2l-csi2.c   | 10 ++--
> > >  .../platform/renesas/rzg2l-cru/rzg2l-ip.c     | 10 ++--
> > >  .../media/platform/renesas/vsp1/vsp1_brx.c    |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_clu.c    |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_entity.c | 53 +++++++++----------
> > >  .../media/platform/renesas/vsp1/vsp1_entity.h |  2 -
> > >  .../media/platform/renesas/vsp1/vsp1_hsit.c   |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_lif.c    |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_lut.c    |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_rwpf.c   |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_sru.c    |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_uds.c    |  1 -
> > >  .../media/platform/renesas/vsp1/vsp1_uif.c    |  1 -
> > >  .../platform/rockchip/rkisp1/rkisp1-csi.c     | 10 ++--
> > >  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 10 ++--
> > >  .../platform/rockchip/rkisp1/rkisp1-resizer.c | 10 ++--
> > >  .../st/stm32/stm32-dcmipp/dcmipp-byteproc.c   |  6 +--
> > >  .../st/stm32/stm32-dcmipp/dcmipp-parallel.c   |  6 +--
> > >  .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  1 +
> > >  .../platform/sunxi/sun4i-csi/sun4i_csi.h      |  1 +
> > >  .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  9 ++--
> > >  .../sunxi/sun6i-csi/sun6i_csi_bridge.c        | 10 ++--
> > >  .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c   | 10 ++--
> > >  .../sun8i_a83t_mipi_csi2.c                    | 10 ++--
> > >  drivers/media/platform/ti/cal/cal-camerarx.c  | 10 ++--
> > >  drivers/media/platform/video-mux.c            | 10 ++--
> > >  .../media/platform/xilinx/xilinx-csi2rxss.c   | 10 ++--
> > >  .../media/test-drivers/vimc/vimc-debayer.c    | 11 ++--
> > >  drivers/media/test-drivers/vimc/vimc-scaler.c | 11 ++--
> > >  drivers/media/test-drivers/vimc/vimc-sensor.c | 11 ++--
> > >  drivers/media/v4l2-core/v4l2-subdev.c         | 20 +++----
> > >  drivers/staging/media/imx/imx-ic-prp.c        |  2 +-
> > >  drivers/staging/media/imx/imx-ic-prpencvf.c   |  2 +-
> > >  drivers/staging/media/imx/imx-media-csi.c     |  2 +-
> > >  drivers/staging/media/imx/imx-media-utils.c   |  8 +--
> > >  drivers/staging/media/imx/imx-media-vdic.c    |  2 +-
> > >  drivers/staging/media/imx/imx-media.h         |  4 +-
> > >  drivers/staging/media/imx/imx6-mipi-csi2.c    |  2 +-
> > >  .../staging/media/starfive/camss/stf-isp.c    |  6 ++-
> > >  .../media/sunxi/sun6i-isp/sun6i_isp_proc.c    | 10 ++--
> > >  include/media/v4l2-subdev.h                   |  7 +--
> > >  86 files changed, 487 insertions(+), 264 deletions(-)
> 
> [snip]
> 
> -- 
> Regards,
> 
> Laurent Pinchart
Hans Verkuil Nov. 28, 2023, 8:55 a.m. UTC | #7
Hi Laurent,

On 27/11/2023 10:07, Laurent Pinchart wrote:
> The subdev .init_cfg() operation is affected by two issues:
> 
> - It has long been extended to initialize a whole v4l2_subdev_state
>   instead of just a v4l2_subdev_pad_config, but its name has stuck
>   around.
> 
> - Despite operating on a whole subdev state and not being directly
>   exposed to the subdev users (either in-kernel or through the userspace
>   API), .init_cfg() is categorized as a subdev pad operation.
> 
> This participates in making the subdev API confusing for new developers.
> Fix it by renaming the operation to .init_state(), and make it a subdev
> internal operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
> ---
> Changes since v3:
> 
> - Rebase on top of the new stm32-dcmipp driver
> - Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
>   rebase
> 
> Changes since v2:
> 
> - Rebase on top of the latest media tree
> 
> Changes since v1:
> 
> - Fix compilation of the vsp1 driver
> ---

<snip>

> diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> index 0280b8ff7ba9..0a5a7f9cc870 100644
> --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> @@ -170,33 +170,6 @@ vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
>  	}
>  }
>  
> -/*
> - * vsp1_entity_init_cfg - Initialize formats on all pads
> - * @subdev: V4L2 subdevice
> - * @sd_state: V4L2 subdev state
> - *
> - * Initialize all pad formats with default values in the given subdev state.
> - * This function can be used as a handler for the subdev pad::init_cfg
> - * operation.
> - */
> -int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
> -			 struct v4l2_subdev_state *sd_state)
> -{
> -	unsigned int pad;
> -
> -	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> -		struct v4l2_subdev_format format = {
> -			.pad = pad,
> -			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> -			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> -		};
> -
> -		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> -	}
> -
> -	return 0;
> -}
> -
>  /*
>   * vsp1_subdev_get_pad_format - Subdev pad get_fmt handler
>   * @subdev: V4L2 subdevice
> @@ -424,6 +397,29 @@ int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
>  	return ret;
>  }
>  
> +static int vsp1_entity_init_state(struct v4l2_subdev *subdev,
> +				  struct v4l2_subdev_state *sd_state)
> +{
> +	unsigned int pad;
> +
> +	/* Initialize all pad formats with default values. */
> +	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> +		struct v4l2_subdev_format format = {
> +			.pad = pad,
> +			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> +			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> +		};
> +
> +		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct v4l2_subdev_internal_ops vsp1_entity_internal_ops = {
> +	.init_state = vsp1_entity_init_state,
> +};
> +
>  /* -----------------------------------------------------------------------------
>   * Media Operations
>   */
> @@ -658,6 +654,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
>  	/* Initialize the V4L2 subdev. */
>  	subdev = &entity->subdev;
>  	v4l2_subdev_init(subdev, ops);
> +	subdev->internal_ops = &vsp1_entity_internal_ops;
>  
>  	subdev->entity.function = function;
>  	subdev->entity.ops = &vsp1->media_ops;
> @@ -666,7 +663,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
>  	snprintf(subdev->name, sizeof(subdev->name), "%s %s",
>  		 dev_name(vsp1->dev), name);
>  
> -	vsp1_entity_init_cfg(subdev, NULL);
> +	vsp1_entity_init_state(subdev, NULL);

This is the only media driver that calls init_cfg/state directly.
That's a bit unexpected, and perhaps this could use a comment. That
can be a follow-up patch as well.

>  
>  	/*
>  	 * Allocate the subdev state to store formats and selection

In any case, you can add my:

Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>

to this patch.

Regards,

	Hans
Paul Kocialkowski Nov. 29, 2023, 1:51 p.m. UTC | #8
Hi Laurent,

On Mon 27 Nov 23, 11:07, Laurent Pinchart wrote:
> The subdev .init_cfg() operation is affected by two issues:
> 
> - It has long been extended to initialize a whole v4l2_subdev_state
>   instead of just a v4l2_subdev_pad_config, but its name has stuck
>   around.
> 
> - Despite operating on a whole subdev state and not being directly
>   exposed to the subdev users (either in-kernel or through the userspace
>   API), .init_cfg() is categorized as a subdev pad operation.
> 
> This participates in making the subdev API confusing for new developers.
> Fix it by renaming the operation to .init_state(), and make it a subdev
> internal operation.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc

For the sun6i-csi, sun6i-isp, sun6i-mipi-csi2 and sun8i-a83t-mipi-csi2 drivers:
Acked-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>

I might submit some cosmetic patch later to reorder things but this can wait.

Thanks for working on this, it's much cleaner this way :)

Cheers,

Paul
Laurent Pinchart Nov. 29, 2023, 2:01 p.m. UTC | #9
Hi Hans,

On Tue, Nov 28, 2023 at 09:55:06AM +0100, Hans Verkuil wrote:
> On 27/11/2023 10:07, Laurent Pinchart wrote:
> > The subdev .init_cfg() operation is affected by two issues:
> > 
> > - It has long been extended to initialize a whole v4l2_subdev_state
> >   instead of just a v4l2_subdev_pad_config, but its name has stuck
> >   around.
> > 
> > - Despite operating on a whole subdev state and not being directly
> >   exposed to the subdev users (either in-kernel or through the userspace
> >   API), .init_cfg() is categorized as a subdev pad operation.
> > 
> > This participates in making the subdev API confusing for new developers.
> > Fix it by renaming the operation to .init_state(), and make it a subdev
> > internal operation.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > Acked-by: Michael Riesch <michael.riesch@wolfvision.net> # for imx415
> > Acked-by: Shuah Khan <skhan@linuxfoundation.org> # for vimc
> > ---
> > Changes since v3:
> > 
> > - Rebase on top of the new stm32-dcmipp driver
> > - Fix uninitialized variable in __v4l2_subdev_state_alloc() due to bad
> >   rebase
> > 
> > Changes since v2:
> > 
> > - Rebase on top of the latest media tree
> > 
> > Changes since v1:
> > 
> > - Fix compilation of the vsp1 driver
> > ---
> 
> <snip>
> 
> > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> > index 0280b8ff7ba9..0a5a7f9cc870 100644
> > --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> > +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
> > @@ -170,33 +170,6 @@ vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
> >  	}
> >  }
> >  
> > -/*
> > - * vsp1_entity_init_cfg - Initialize formats on all pads
> > - * @subdev: V4L2 subdevice
> > - * @sd_state: V4L2 subdev state
> > - *
> > - * Initialize all pad formats with default values in the given subdev state.
> > - * This function can be used as a handler for the subdev pad::init_cfg
> > - * operation.
> > - */
> > -int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
> > -			 struct v4l2_subdev_state *sd_state)
> > -{
> > -	unsigned int pad;
> > -
> > -	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> > -		struct v4l2_subdev_format format = {
> > -			.pad = pad,
> > -			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> > -			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> > -		};
> > -
> > -		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> >  /*
> >   * vsp1_subdev_get_pad_format - Subdev pad get_fmt handler
> >   * @subdev: V4L2 subdevice
> > @@ -424,6 +397,29 @@ int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
> >  	return ret;
> >  }
> >  
> > +static int vsp1_entity_init_state(struct v4l2_subdev *subdev,
> > +				  struct v4l2_subdev_state *sd_state)
> > +{
> > +	unsigned int pad;
> > +
> > +	/* Initialize all pad formats with default values. */
> > +	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
> > +		struct v4l2_subdev_format format = {
> > +			.pad = pad,
> > +			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
> > +			       : V4L2_SUBDEV_FORMAT_ACTIVE,
> > +		};
> > +
> > +		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static const struct v4l2_subdev_internal_ops vsp1_entity_internal_ops = {
> > +	.init_state = vsp1_entity_init_state,
> > +};
> > +
> >  /* -----------------------------------------------------------------------------
> >   * Media Operations
> >   */
> > @@ -658,6 +654,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
> >  	/* Initialize the V4L2 subdev. */
> >  	subdev = &entity->subdev;
> >  	v4l2_subdev_init(subdev, ops);
> > +	subdev->internal_ops = &vsp1_entity_internal_ops;
> >  
> >  	subdev->entity.function = function;
> >  	subdev->entity.ops = &vsp1->media_ops;
> > @@ -666,7 +663,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
> >  	snprintf(subdev->name, sizeof(subdev->name), "%s %s",
> >  		 dev_name(vsp1->dev), name);
> >  
> > -	vsp1_entity_init_cfg(subdev, NULL);
> > +	vsp1_entity_init_state(subdev, NULL);
> 
> This is the only media driver that calls init_cfg/state directly.
> That's a bit unexpected, and perhaps this could use a comment. That
> can be a follow-up patch as well.

I have already posted a patch series to drop all this and use the V4L2
subdev active state API. That is hopefully better than a comment :-)

There are actually quite a few sensor drivers that don't use the active
state, and call the .init_cfg() handler at probe time to initialize
their private copy of the active state. All this should eventually go
away as drivers are converter. I try to keep an eye when reviewing new
code and push all new drivers to use the subdev active state.

> >  
> >  	/*
> >  	 * Allocate the subdev state to store formats and selection
> 
> In any case, you can add my:
> 
> Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> 
> to this patch.
diff mbox series

Patch

diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c
index 444c322d756a..e10811cce801 100644
--- a/drivers/media/i2c/adv7180.c
+++ b/drivers/media/i2c/adv7180.c
@@ -813,8 +813,8 @@  static int adv7180_set_pad_format(struct v4l2_subdev *sd,
 	return ret;
 }
 
-static int adv7180_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *sd_state)
+static int adv7180_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = {
 		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
@@ -929,7 +929,6 @@  static const struct v4l2_subdev_core_ops adv7180_core_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops adv7180_pad_ops = {
-	.init_cfg = adv7180_init_cfg,
 	.enum_mbus_code = adv7180_enum_mbus_code,
 	.set_fmt = adv7180_set_pad_format,
 	.get_fmt = adv7180_get_pad_format,
@@ -947,6 +946,10 @@  static const struct v4l2_subdev_ops adv7180_ops = {
 	.sensor = &adv7180_sensor_ops,
 };
 
+static const struct v4l2_subdev_internal_ops adv7180_internal_ops = {
+	.init_state = adv7180_init_state,
+};
+
 static irqreturn_t adv7180_irq(int irq, void *devid)
 {
 	struct adv7180_state *state = devid;
@@ -1458,6 +1461,7 @@  static int adv7180_probe(struct i2c_client *client)
 	state->input = 0;
 	sd = &state->sd;
 	v4l2_i2c_subdev_init(sd, client, &adv7180_ops);
+	sd->internal_ops = &adv7180_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
 
 	ret = adv7180_init_controls(state);
diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
index fb713b03ad4a..92ef98a2b951 100644
--- a/drivers/media/i2c/ccs/ccs-core.c
+++ b/drivers/media/i2c/ccs/ccs-core.c
@@ -3006,8 +3006,8 @@  static int ccs_init_subdev(struct ccs_sensor *sensor,
 	return 0;
 }
 
-static int ccs_init_cfg(struct v4l2_subdev *sd,
-			struct v4l2_subdev_state *sd_state)
+static int ccs_init_state(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_state *sd_state)
 {
 	struct ccs_subdev *ssd = to_ccs_subdev(sd);
 	struct ccs_sensor *sensor = ssd->sensor;
@@ -3055,7 +3055,6 @@  static const struct v4l2_subdev_video_ops ccs_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ccs_pad_ops = {
-	.init_cfg = ccs_init_cfg,
 	.enum_mbus_code = ccs_enum_mbus_code,
 	.get_fmt = ccs_get_format,
 	.set_fmt = ccs_set_format,
@@ -3079,6 +3078,7 @@  static const struct media_entity_operations ccs_entity_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops ccs_internal_src_ops = {
+	.init_state = ccs_init_state,
 	.registered = ccs_registered,
 	.unregistered = ccs_unregistered,
 };
diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c
index 8bb6be956780..ca9bb29dab89 100644
--- a/drivers/media/i2c/ds90ub913.c
+++ b/drivers/media/i2c/ds90ub913.c
@@ -443,8 +443,8 @@  static int ub913_set_fmt(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ub913_init_cfg(struct v4l2_subdev *sd,
-			  struct v4l2_subdev_state *state)
+static int ub913_init_state(struct v4l2_subdev *sd,
+			    struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_route routes[] = {
 		{
@@ -503,7 +503,6 @@  static const struct v4l2_subdev_pad_ops ub913_pad_ops = {
 	.get_frame_desc = ub913_get_frame_desc,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = ub913_set_fmt,
-	.init_cfg = ub913_init_cfg,
 };
 
 static const struct v4l2_subdev_ops ub913_subdev_ops = {
@@ -511,6 +510,10 @@  static const struct v4l2_subdev_ops ub913_subdev_ops = {
 	.pad = &ub913_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ub913_internal_ops = {
+	.init_state = ub913_init_state,
+};
+
 static const struct media_entity_operations ub913_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -744,6 +747,7 @@  static int ub913_subdev_init(struct ub913_data *priv)
 	int ret;
 
 	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub913_subdev_ops);
+	priv->sd.internal_ops = &ub913_internal_ops;
 	priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
 	priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
 	priv->sd.entity.ops = &ub913_entity_ops;
diff --git a/drivers/media/i2c/ds90ub953.c b/drivers/media/i2c/ds90ub953.c
index 4eb08e3a31c7..16f88db14981 100644
--- a/drivers/media/i2c/ds90ub953.c
+++ b/drivers/media/i2c/ds90ub953.c
@@ -575,8 +575,8 @@  static int ub953_set_fmt(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ub953_init_cfg(struct v4l2_subdev *sd,
-			  struct v4l2_subdev_state *state)
+static int ub953_init_state(struct v4l2_subdev *sd,
+			    struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_route routes[] = {
 		{
@@ -713,7 +713,6 @@  static const struct v4l2_subdev_pad_ops ub953_pad_ops = {
 	.get_frame_desc = ub953_get_frame_desc,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = ub953_set_fmt,
-	.init_cfg = ub953_init_cfg,
 };
 
 static const struct v4l2_subdev_core_ops ub953_subdev_core_ops = {
@@ -727,6 +726,10 @@  static const struct v4l2_subdev_ops ub953_subdev_ops = {
 	.pad = &ub953_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ub953_internal_ops = {
+	.init_state = ub953_init_state,
+};
+
 static const struct media_entity_operations ub953_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -1240,6 +1243,7 @@  static int ub953_subdev_init(struct ub953_data *priv)
 	int ret;
 
 	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub953_subdev_ops);
+	priv->sd.internal_ops = &ub953_internal_ops;
 
 	priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 			  V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_STREAMS;
diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
index 1d1476098c92..ffe5f25f8647 100644
--- a/drivers/media/i2c/ds90ub960.c
+++ b/drivers/media/i2c/ds90ub960.c
@@ -2906,8 +2906,8 @@  static int ub960_set_fmt(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ub960_init_cfg(struct v4l2_subdev *sd,
-			  struct v4l2_subdev_state *state)
+static int ub960_init_state(struct v4l2_subdev *sd,
+			    struct v4l2_subdev_state *state)
 {
 	struct ub960_data *priv = sd_to_ub960(sd);
 
@@ -2938,8 +2938,6 @@  static const struct v4l2_subdev_pad_ops ub960_pad_ops = {
 
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = ub960_set_fmt,
-
-	.init_cfg = ub960_init_cfg,
 };
 
 static int ub960_log_status(struct v4l2_subdev *sd)
@@ -3091,6 +3089,10 @@  static const struct v4l2_subdev_core_ops ub960_subdev_core_ops = {
 	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
 };
 
+static const struct v4l2_subdev_internal_ops ub960_internal_ops = {
+	.init_state = ub960_init_state,
+};
+
 static const struct v4l2_subdev_ops ub960_subdev_ops = {
 	.core = &ub960_subdev_core_ops,
 	.pad = &ub960_pad_ops,
@@ -3650,6 +3652,7 @@  static int ub960_create_subdev(struct ub960_data *priv)
 	int ret;
 
 	v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub960_subdev_ops);
+	priv->sd.internal_ops = &ub960_internal_ops;
 
 	v4l2_ctrl_handler_init(&priv->ctrl_handler, 1);
 	priv->sd.ctrl_handler = &priv->ctrl_handler;
diff --git a/drivers/media/i2c/gc2145.c b/drivers/media/i2c/gc2145.c
index 12d3780b5548..bef7b0e056a8 100644
--- a/drivers/media/i2c/gc2145.c
+++ b/drivers/media/i2c/gc2145.c
@@ -653,8 +653,8 @@  static void gc2145_update_pad_format(struct gc2145 *gc2145,
 	fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT;
 }
 
-static int gc2145_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *state)
+static int gc2145_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *state)
 {
 	struct gc2145 *gc2145 = to_gc2145(sd);
 	struct v4l2_mbus_framefmt *format;
@@ -1079,7 +1079,6 @@  static const struct v4l2_subdev_video_ops gc2145_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops gc2145_pad_ops = {
-	.init_cfg = gc2145_init_cfg,
 	.enum_mbus_code = gc2145_enum_mbus_code,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = gc2145_set_pad_format,
@@ -1093,6 +1092,10 @@  static const struct v4l2_subdev_ops gc2145_subdev_ops = {
 	.pad = &gc2145_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops gc2145_subdev_internal_ops = {
+	.init_state = gc2145_init_state,
+};
+
 static int gc2145_set_ctrl_test_pattern(struct gc2145 *gc2145, int value)
 {
 	int ret = 0;
@@ -1286,6 +1289,7 @@  static int gc2145_probe(struct i2c_client *client)
 		return -ENOMEM;
 
 	v4l2_i2c_subdev_init(&gc2145->sd, client, &gc2145_subdev_ops);
+	gc2145->sd.internal_ops = &gc2145_subdev_internal_ops;
 
 	/* Check the hardware configuration in device tree */
 	if (gc2145_check_hwcfg(dev))
diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c
index 0595080c2211..9c565ec033d4 100644
--- a/drivers/media/i2c/hi846.c
+++ b/drivers/media/i2c/hi846.c
@@ -1871,8 +1871,8 @@  static int hi846_get_selection(struct v4l2_subdev *sd,
 	}
 }
 
-static int hi846_init_cfg(struct v4l2_subdev *sd,
-			  struct v4l2_subdev_state *sd_state)
+static int hi846_init_state(struct v4l2_subdev *sd,
+			    struct v4l2_subdev_state *sd_state)
 {
 	struct hi846 *hi846 = to_hi846(sd);
 	struct v4l2_mbus_framefmt *mf;
@@ -1895,7 +1895,6 @@  static const struct v4l2_subdev_video_ops hi846_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops hi846_pad_ops = {
-	.init_cfg = hi846_init_cfg,
 	.enum_frame_size = hi846_enum_frame_size,
 	.enum_mbus_code = hi846_enum_mbus_code,
 	.set_fmt = hi846_set_format,
@@ -1908,6 +1907,10 @@  static const struct v4l2_subdev_ops hi846_subdev_ops = {
 	.pad = &hi846_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops hi846_internal_ops = {
+	.init_state = hi846_init_state,
+};
+
 static const struct media_entity_operations hi846_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -2071,6 +2074,7 @@  static int hi846_probe(struct i2c_client *client)
 		return ret;
 
 	v4l2_i2c_subdev_init(&hi846->sd, client, &hi846_subdev_ops);
+	hi846->sd.internal_ops = &hi846_internal_ops;
 
 	mutex_init(&hi846->mutex);
 
diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c
index 8bc7b114c57d..474c95572bf6 100644
--- a/drivers/media/i2c/imx214.c
+++ b/drivers/media/i2c/imx214.c
@@ -633,8 +633,8 @@  static int imx214_get_selection(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int imx214_entity_init_cfg(struct v4l2_subdev *subdev,
-				  struct v4l2_subdev_state *sd_state)
+static int imx214_entity_init_state(struct v4l2_subdev *subdev,
+				    struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = { };
 
@@ -839,7 +839,6 @@  static const struct v4l2_subdev_pad_ops imx214_subdev_pad_ops = {
 	.get_fmt = imx214_get_format,
 	.set_fmt = imx214_set_format,
 	.get_selection = imx214_get_selection,
-	.init_cfg = imx214_entity_init_cfg,
 };
 
 static const struct v4l2_subdev_ops imx214_subdev_ops = {
@@ -848,6 +847,10 @@  static const struct v4l2_subdev_ops imx214_subdev_ops = {
 	.pad = &imx214_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx214_internal_ops = {
+	.init_state = imx214_entity_init_state,
+};
+
 static const struct regmap_config sensor_regmap_config = {
 	.reg_bits = 16,
 	.val_bits = 8,
@@ -957,6 +960,7 @@  static int imx214_probe(struct i2c_client *client)
 	}
 
 	v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops);
+	imx214->sd.internal_ops = &imx214_internal_ops;
 
 	/*
 	 * Enable power initially, to avoid warnings
@@ -1021,7 +1025,7 @@  static int imx214_probe(struct i2c_client *client)
 		goto free_ctrl;
 	}
 
-	imx214_entity_init_cfg(&imx214->sd, NULL);
+	imx214_entity_init_state(&imx214->sd, NULL);
 
 	ret = v4l2_async_register_subdev_sensor(&imx214->sd);
 	if (ret < 0) {
diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c
index 675795ac2e83..e17ef2e9d9d0 100644
--- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c
@@ -905,8 +905,8 @@  static int imx219_get_selection(struct v4l2_subdev *sd,
 	return -EINVAL;
 }
 
-static int imx219_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *state)
+static int imx219_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_format fmt = {
 		.which = V4L2_SUBDEV_FORMAT_TRY,
@@ -933,7 +933,6 @@  static const struct v4l2_subdev_video_ops imx219_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx219_pad_ops = {
-	.init_cfg = imx219_init_cfg,
 	.enum_mbus_code = imx219_enum_mbus_code,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = imx219_set_pad_format,
@@ -947,6 +946,9 @@  static const struct v4l2_subdev_ops imx219_subdev_ops = {
 	.pad = &imx219_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx219_internal_ops = {
+	.init_state = imx219_init_state,
+};
 
 /* -----------------------------------------------------------------------------
  * Power management
@@ -1098,6 +1100,7 @@  static int imx219_probe(struct i2c_client *client)
 		return -ENOMEM;
 
 	v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops);
+	imx219->sd.internal_ops = &imx219_internal_ops;
 
 	/* Check the hardware configuration in device tree */
 	if (imx219_check_hwcfg(dev, imx219))
diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
index aa8cfbcd40aa..52ba6188911b 100644
--- a/drivers/media/i2c/imx290.c
+++ b/drivers/media/i2c/imx290.c
@@ -1195,8 +1195,8 @@  static int imx290_get_selection(struct v4l2_subdev *sd,
 	}
 }
 
-static int imx290_entity_init_cfg(struct v4l2_subdev *subdev,
-				  struct v4l2_subdev_state *sd_state)
+static int imx290_entity_init_state(struct v4l2_subdev *subdev,
+				    struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = {
 		.which = V4L2_SUBDEV_FORMAT_TRY,
@@ -1221,7 +1221,6 @@  static const struct v4l2_subdev_video_ops imx290_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx290_pad_ops = {
-	.init_cfg = imx290_entity_init_cfg,
 	.enum_mbus_code = imx290_enum_mbus_code,
 	.enum_frame_size = imx290_enum_frame_size,
 	.get_fmt = v4l2_subdev_get_fmt,
@@ -1235,6 +1234,10 @@  static const struct v4l2_subdev_ops imx290_subdev_ops = {
 	.pad = &imx290_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx290_internal_ops = {
+	.init_state = imx290_entity_init_state,
+};
+
 static const struct media_entity_operations imx290_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -1248,6 +1251,7 @@  static int imx290_subdev_init(struct imx290 *imx290)
 	imx290->current_mode = &imx290_modes_ptr(imx290)[0];
 
 	v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
+	imx290->sd.internal_ops = &imx290_internal_ops;
 	imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 			    V4L2_SUBDEV_FL_HAS_EVENTS;
 	imx290->sd.dev = imx290->dev;
diff --git a/drivers/media/i2c/imx296.c b/drivers/media/i2c/imx296.c
index 8399cca496a7..83149fa729c4 100644
--- a/drivers/media/i2c/imx296.c
+++ b/drivers/media/i2c/imx296.c
@@ -798,8 +798,8 @@  static int imx296_set_selection(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int imx296_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *state)
+static int imx296_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_selection sel = {
 		.target = V4L2_SEL_TGT_CROP,
@@ -830,7 +830,6 @@  static const struct v4l2_subdev_pad_ops imx296_subdev_pad_ops = {
 	.set_fmt = imx296_set_format,
 	.get_selection = imx296_get_selection,
 	.set_selection = imx296_set_selection,
-	.init_cfg = imx296_init_cfg,
 };
 
 static const struct v4l2_subdev_ops imx296_subdev_ops = {
@@ -838,12 +837,17 @@  static const struct v4l2_subdev_ops imx296_subdev_ops = {
 	.pad = &imx296_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx296_internal_ops = {
+	.init_state = imx296_init_state,
+};
+
 static int imx296_subdev_init(struct imx296 *sensor)
 {
 	struct i2c_client *client = to_i2c_client(sensor->dev);
 	int ret;
 
 	v4l2_i2c_subdev_init(&sensor->subdev, client, &imx296_subdev_ops);
+	sensor->subdev.internal_ops = &imx296_internal_ops;
 
 	ret = imx296_ctrls_init(sensor);
 	if (ret < 0)
diff --git a/drivers/media/i2c/imx334.c b/drivers/media/i2c/imx334.c
index 42cf71c1f6fd..6725b3e2a73e 100644
--- a/drivers/media/i2c/imx334.c
+++ b/drivers/media/i2c/imx334.c
@@ -935,14 +935,14 @@  static int imx334_set_pad_format(struct v4l2_subdev *sd,
 }
 
 /**
- * imx334_init_cfg() - Initialize sub-device state
+ * imx334_init_state() - Initialize sub-device state
  * @sd: pointer to imx334 V4L2 sub-device structure
  * @sd_state: V4L2 sub-device state
  *
  * Return: 0 if successful, error code otherwise.
  */
-static int imx334_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int imx334_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct imx334 *imx334 = to_imx334(sd);
 	struct v4l2_subdev_format fmt = { 0 };
@@ -1190,7 +1190,6 @@  static const struct v4l2_subdev_video_ops imx334_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx334_pad_ops = {
-	.init_cfg = imx334_init_cfg,
 	.enum_mbus_code = imx334_enum_mbus_code,
 	.enum_frame_size = imx334_enum_frame_size,
 	.get_fmt = imx334_get_pad_format,
@@ -1202,6 +1201,10 @@  static const struct v4l2_subdev_ops imx334_subdev_ops = {
 	.pad = &imx334_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx334_internal_ops = {
+	.init_state = imx334_init_state,
+};
+
 /**
  * imx334_power_on() - Sensor power on sequence
  * @dev: pointer to i2c device
@@ -1359,6 +1362,7 @@  static int imx334_probe(struct i2c_client *client)
 
 	/* Initialize subdev */
 	v4l2_i2c_subdev_init(&imx334->sd, client, &imx334_subdev_ops);
+	imx334->sd.internal_ops = &imx334_internal_ops;
 
 	ret = imx334_parse_hw_config(imx334);
 	if (ret) {
diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
index 0432f059e913..205a150971b7 100644
--- a/drivers/media/i2c/imx335.c
+++ b/drivers/media/i2c/imx335.c
@@ -618,14 +618,14 @@  static int imx335_set_pad_format(struct v4l2_subdev *sd,
 }
 
 /**
- * imx335_init_cfg() - Initialize sub-device state
+ * imx335_init_state() - Initialize sub-device state
  * @sd: pointer to imx335 V4L2 sub-device structure
  * @sd_state: V4L2 sub-device configuration
  *
  * Return: 0 if successful, error code otherwise.
  */
-static int imx335_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int imx335_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct imx335 *imx335 = to_imx335(sd);
 	struct v4l2_subdev_format fmt = { 0 };
@@ -835,7 +835,6 @@  static const struct v4l2_subdev_video_ops imx335_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx335_pad_ops = {
-	.init_cfg = imx335_init_cfg,
 	.enum_mbus_code = imx335_enum_mbus_code,
 	.enum_frame_size = imx335_enum_frame_size,
 	.get_fmt = imx335_get_pad_format,
@@ -847,6 +846,10 @@  static const struct v4l2_subdev_ops imx335_subdev_ops = {
 	.pad = &imx335_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx335_internal_ops = {
+	.init_state = imx335_init_state,
+};
+
 /**
  * imx335_power_on() - Sensor power on sequence
  * @dev: pointer to i2c device
@@ -999,6 +1002,7 @@  static int imx335_probe(struct i2c_client *client)
 
 	/* Initialize subdev */
 	v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
+	imx335->sd.internal_ops = &imx335_internal_ops;
 
 	ret = imx335_parse_hw_config(imx335);
 	if (ret) {
diff --git a/drivers/media/i2c/imx412.c b/drivers/media/i2c/imx412.c
index 41d756a20f3c..0efce329525e 100644
--- a/drivers/media/i2c/imx412.c
+++ b/drivers/media/i2c/imx412.c
@@ -770,14 +770,14 @@  static int imx412_set_pad_format(struct v4l2_subdev *sd,
 }
 
 /**
- * imx412_init_cfg() - Initialize sub-device state
+ * imx412_init_state() - Initialize sub-device state
  * @sd: pointer to imx412 V4L2 sub-device structure
  * @sd_state: V4L2 sub-device configuration
  *
  * Return: 0 if successful, error code otherwise.
  */
-static int imx412_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int imx412_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct imx412 *imx412 = to_imx412(sd);
 	struct v4l2_subdev_format fmt = { 0 };
@@ -997,7 +997,6 @@  static const struct v4l2_subdev_video_ops imx412_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx412_pad_ops = {
-	.init_cfg = imx412_init_cfg,
 	.enum_mbus_code = imx412_enum_mbus_code,
 	.enum_frame_size = imx412_enum_frame_size,
 	.get_fmt = imx412_get_pad_format,
@@ -1009,6 +1008,10 @@  static const struct v4l2_subdev_ops imx412_subdev_ops = {
 	.pad = &imx412_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx412_internal_ops = {
+	.init_state = imx412_init_state,
+};
+
 /**
  * imx412_power_on() - Sensor power on sequence
  * @dev: pointer to i2c device
@@ -1177,6 +1180,7 @@  static int imx412_probe(struct i2c_client *client)
 
 	/* Initialize subdev */
 	v4l2_i2c_subdev_init(&imx412->sd, client, &imx412_subdev_ops);
+	imx412->sd.internal_ops = &imx412_internal_ops;
 
 	ret = imx412_parse_hw_config(imx412);
 	if (ret) {
diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
index 6436a32c4025..1e5f20c3ed82 100644
--- a/drivers/media/i2c/imx415.c
+++ b/drivers/media/i2c/imx415.c
@@ -880,8 +880,8 @@  static int imx415_get_selection(struct v4l2_subdev *sd,
 	return -EINVAL;
 }
 
-static int imx415_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *state)
+static int imx415_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_format format = {
 		.format = {
@@ -905,7 +905,6 @@  static const struct v4l2_subdev_pad_ops imx415_subdev_pad_ops = {
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = imx415_set_format,
 	.get_selection = imx415_get_selection,
-	.init_cfg = imx415_init_cfg,
 };
 
 static const struct v4l2_subdev_ops imx415_subdev_ops = {
@@ -913,12 +912,17 @@  static const struct v4l2_subdev_ops imx415_subdev_ops = {
 	.pad = &imx415_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx415_internal_ops = {
+	.init_state = imx415_init_state,
+};
+
 static int imx415_subdev_init(struct imx415 *sensor)
 {
 	struct i2c_client *client = to_i2c_client(sensor->dev);
 	int ret;
 
 	v4l2_i2c_subdev_init(&sensor->subdev, client, &imx415_subdev_ops);
+	sensor->subdev.internal_ops = &imx415_internal_ops;
 
 	ret = imx415_ctrls_init(sensor);
 	if (ret)
diff --git a/drivers/media/i2c/mt9m001.c b/drivers/media/i2c/mt9m001.c
index 4c897bb07fed..ad1a3ab77411 100644
--- a/drivers/media/i2c/mt9m001.c
+++ b/drivers/media/i2c/mt9m001.c
@@ -650,8 +650,8 @@  static const struct v4l2_subdev_core_ops mt9m001_subdev_core_ops = {
 #endif
 };
 
-static int mt9m001_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *sd_state)
+static int mt9m001_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct i2c_client *client = v4l2_get_subdevdata(sd);
 	struct mt9m001 *mt9m001 = to_mt9m001(client);
@@ -708,7 +708,6 @@  static const struct v4l2_subdev_sensor_ops mt9m001_subdev_sensor_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mt9m001_subdev_pad_ops = {
-	.init_cfg	= mt9m001_init_cfg,
 	.enum_mbus_code = mt9m001_enum_mbus_code,
 	.get_selection	= mt9m001_get_selection,
 	.set_selection	= mt9m001_set_selection,
@@ -724,6 +723,10 @@  static const struct v4l2_subdev_ops mt9m001_subdev_ops = {
 	.pad	= &mt9m001_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mt9m001_internal_ops = {
+	.init_state	= mt9m001_init_state,
+};
+
 static int mt9m001_probe(struct i2c_client *client)
 {
 	struct mt9m001 *mt9m001;
@@ -755,6 +758,7 @@  static int mt9m001_probe(struct i2c_client *client)
 		return PTR_ERR(mt9m001->reset_gpio);
 
 	v4l2_i2c_subdev_init(&mt9m001->subdev, client, &mt9m001_subdev_ops);
+	mt9m001->subdev.internal_ops = &mt9m001_internal_ops;
 	mt9m001->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 				 V4L2_SUBDEV_FL_HAS_EVENTS;
 	v4l2_ctrl_handler_init(&mt9m001->hdl, 4);
diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
index 17ca92810b58..54a7a4c623ea 100644
--- a/drivers/media/i2c/mt9m111.c
+++ b/drivers/media/i2c/mt9m111.c
@@ -1111,8 +1111,8 @@  static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
 	return 0;
 }
 
-static int mt9m111_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *sd_state)
+static int mt9m111_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *format =
 		v4l2_subdev_state_get_format(sd_state, 0);
@@ -1156,7 +1156,6 @@  static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
-	.init_cfg	= mt9m111_init_cfg,
 	.enum_mbus_code = mt9m111_enum_mbus_code,
 	.get_selection	= mt9m111_get_selection,
 	.set_selection	= mt9m111_set_selection,
@@ -1171,6 +1170,10 @@  static const struct v4l2_subdev_ops mt9m111_subdev_ops = {
 	.pad	= &mt9m111_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mt9m111_internal_ops = {
+	.init_state	= mt9m111_init_state,
+};
+
 /*
  * Interface active, can use i2c. If it fails, it can indeed mean, that
  * this wasn't our capture interface, so, we wait for the right one
@@ -1275,6 +1278,7 @@  static int mt9m111_probe(struct i2c_client *client)
 	mt9m111->ctx = &context_b;
 
 	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
+	mt9m111->subdev.internal_ops = &mt9m111_internal_ops;
 	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 				 V4L2_SUBDEV_FL_HAS_EVENTS;
 
diff --git a/drivers/media/i2c/mt9m114.c b/drivers/media/i2c/mt9m114.c
index 23cf84f1a746..0a22f328981d 100644
--- a/drivers/media/i2c/mt9m114.c
+++ b/drivers/media/i2c/mt9m114.c
@@ -1152,8 +1152,8 @@  static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd)
 	return container_of(sd, struct mt9m114, pa.sd);
 }
 
-static int mt9m114_pa_init_cfg(struct v4l2_subdev *sd,
-			       struct v4l2_subdev_state *state)
+static int mt9m114_pa_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *state)
 {
 	struct v4l2_mbus_framefmt *format;
 	struct v4l2_rect *crop;
@@ -1304,7 +1304,6 @@  static int mt9m114_pa_set_selection(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = {
-	.init_cfg = mt9m114_pa_init_cfg,
 	.enum_mbus_code = mt9m114_pa_enum_mbus_code,
 	.enum_frame_size = mt9m114_pa_enum_framesizes,
 	.get_fmt = v4l2_subdev_get_fmt,
@@ -1317,6 +1316,10 @@  static const struct v4l2_subdev_ops mt9m114_pa_ops = {
 	.pad = &mt9m114_pa_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = {
+	.init_state = mt9m114_pa_init_state,
+};
+
 static int mt9m114_pa_init(struct mt9m114 *sensor)
 {
 	struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl;
@@ -1329,6 +1332,7 @@  static int mt9m114_pa_init(struct mt9m114 *sensor)
 
 	/* Initialize the subdev. */
 	v4l2_subdev_init(sd, &mt9m114_pa_ops);
+	sd->internal_ops = &mt9m114_pa_internal_ops;
 	v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array");
 
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
@@ -1624,8 +1628,8 @@  static int mt9m114_ifp_s_frame_interval(struct v4l2_subdev *sd,
 	return ret;
 }
 
-static int mt9m114_ifp_init_cfg(struct v4l2_subdev *sd,
-				struct v4l2_subdev_state *state)
+static int mt9m114_ifp_init_state(struct v4l2_subdev *sd,
+				  struct v4l2_subdev_state *state)
 {
 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
 	struct v4l2_mbus_framefmt *format;
@@ -1968,7 +1972,6 @@  static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = {
-	.init_cfg = mt9m114_ifp_init_cfg,
 	.enum_mbus_code = mt9m114_ifp_enum_mbus_code,
 	.enum_frame_size = mt9m114_ifp_enum_framesizes,
 	.enum_frame_interval = mt9m114_ifp_enum_frameintervals,
@@ -1984,6 +1987,7 @@  static const struct v4l2_subdev_ops mt9m114_ifp_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = {
+	.init_state = mt9m114_ifp_init_state,
 	.registered = mt9m114_ifp_registered,
 	.unregistered = mt9m114_ifp_unregistered,
 };
diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
index 89bcd48748b9..596200d0248c 100644
--- a/drivers/media/i2c/mt9p031.c
+++ b/drivers/media/i2c/mt9p031.c
@@ -696,8 +696,8 @@  static int mt9p031_set_selection(struct v4l2_subdev *subdev,
 	return 0;
 }
 
-static int mt9p031_init_cfg(struct v4l2_subdev *subdev,
-			    struct v4l2_subdev_state *sd_state)
+static int mt9p031_init_state(struct v4l2_subdev *subdev,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 	struct v4l2_mbus_framefmt *format;
@@ -1041,7 +1041,6 @@  static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
-	.init_cfg = mt9p031_init_cfg,
 	.enum_mbus_code = mt9p031_enum_mbus_code,
 	.enum_frame_size = mt9p031_enum_frame_size,
 	.get_fmt = mt9p031_get_format,
@@ -1057,6 +1056,7 @@  static const struct v4l2_subdev_ops mt9p031_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
+	.init_state = mt9p031_init_state,
 	.registered = mt9p031_registered,
 	.open = mt9p031_open,
 	.close = mt9p031_close,
@@ -1189,7 +1189,7 @@  static int mt9p031_probe(struct i2c_client *client)
 
 	mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 
-	ret = mt9p031_init_cfg(&mt9p031->subdev, NULL);
+	ret = mt9p031_init_state(&mt9p031->subdev, NULL);
 	if (ret)
 		goto done;
 
diff --git a/drivers/media/i2c/mt9v111.c b/drivers/media/i2c/mt9v111.c
index 6752582cb2c7..b186e9160d94 100644
--- a/drivers/media/i2c/mt9v111.c
+++ b/drivers/media/i2c/mt9v111.c
@@ -948,8 +948,8 @@  static int mt9v111_set_format(struct v4l2_subdev *subdev,
 	return 0;
 }
 
-static int mt9v111_init_cfg(struct v4l2_subdev *subdev,
-			    struct v4l2_subdev_state *sd_state)
+static int mt9v111_init_state(struct v4l2_subdev *subdev,
+			      struct v4l2_subdev_state *sd_state)
 {
 	*v4l2_subdev_state_get_format(sd_state, 0) = mt9v111_def_fmt;
 
@@ -967,7 +967,6 @@  static const struct v4l2_subdev_video_ops mt9v111_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mt9v111_pad_ops = {
-	.init_cfg		= mt9v111_init_cfg,
 	.enum_mbus_code		= mt9v111_enum_mbus_code,
 	.enum_frame_size	= mt9v111_enum_frame_size,
 	.enum_frame_interval	= mt9v111_enum_frame_interval,
@@ -981,6 +980,10 @@  static const struct v4l2_subdev_ops mt9v111_ops = {
 	.pad	= &mt9v111_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mt9v111_internal_ops = {
+	.init_state		= mt9v111_init_state,
+};
+
 static const struct media_entity_operations mt9v111_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -1194,6 +1197,7 @@  static int mt9v111_probe(struct i2c_client *client)
 	mt9v111->pending	= true;
 
 	v4l2_i2c_subdev_init(&mt9v111->sd, client, &mt9v111_ops);
+	mt9v111->sd.internal_ops = &mt9v111_internal_ops;
 
 	mt9v111->sd.flags	|= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	mt9v111->sd.entity.ops	= &mt9v111_subdev_entity_ops;
diff --git a/drivers/media/i2c/ov01a10.c b/drivers/media/i2c/ov01a10.c
index ba295d1575f0..5606437f37d0 100644
--- a/drivers/media/i2c/ov01a10.c
+++ b/drivers/media/i2c/ov01a10.c
@@ -729,8 +729,8 @@  static int ov01a10_set_format(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ov01a10_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *state)
+static int ov01a10_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_format fmt = {
 		.which = V4L2_SUBDEV_FORMAT_TRY,
@@ -813,7 +813,6 @@  static const struct v4l2_subdev_video_ops ov01a10_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov01a10_pad_ops = {
-	.init_cfg = ov01a10_init_cfg,
 	.set_fmt = ov01a10_set_format,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.get_selection = ov01a10_get_selection,
@@ -827,6 +826,10 @@  static const struct v4l2_subdev_ops ov01a10_subdev_ops = {
 	.pad = &ov01a10_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov01a10_internal_ops = {
+	.init_state = ov01a10_init_state,
+};
+
 static const struct media_entity_operations ov01a10_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -873,6 +876,7 @@  static int ov01a10_probe(struct i2c_client *client)
 		return -ENOMEM;
 
 	v4l2_i2c_subdev_init(&ov01a10->sd, client, &ov01a10_subdev_ops);
+	ov01a10->sd.internal_ops = &ov01a10_internal_ops;
 
 	ret = ov01a10_identify_module(ov01a10);
 	if (ret)
diff --git a/drivers/media/i2c/ov02a10.c b/drivers/media/i2c/ov02a10.c
index 8454cb39a47b..6c30e1a0d814 100644
--- a/drivers/media/i2c/ov02a10.c
+++ b/drivers/media/i2c/ov02a10.c
@@ -511,8 +511,8 @@  static int __ov02a10_stop_stream(struct ov02a10 *ov02a10)
 					 SC_CTRL_MODE_STANDBY);
 }
 
-static int ov02a10_entity_init_cfg(struct v4l2_subdev *sd,
-				   struct v4l2_subdev_state *sd_state)
+static int ov02a10_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = {
 		.which = V4L2_SUBDEV_FORMAT_TRY,
@@ -709,7 +709,6 @@  static const struct v4l2_subdev_video_ops ov02a10_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov02a10_pad_ops = {
-	.init_cfg = ov02a10_entity_init_cfg,
 	.enum_mbus_code = ov02a10_enum_mbus_code,
 	.enum_frame_size = ov02a10_enum_frame_sizes,
 	.get_fmt = ov02a10_get_fmt,
@@ -721,6 +720,10 @@  static const struct v4l2_subdev_ops ov02a10_subdev_ops = {
 	.pad	= &ov02a10_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov02a10_internal_ops = {
+	.init_state = ov02a10_init_state,
+};
+
 static const struct media_entity_operations ov02a10_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -869,6 +872,7 @@  static int ov02a10_probe(struct i2c_client *client)
 				     "failed to check HW configuration\n");
 
 	v4l2_i2c_subdev_init(&ov02a10->subdev, client, &ov02a10_subdev_ops);
+	ov02a10->subdev.internal_ops = &ov02a10_internal_ops;
 
 	ov02a10->mipi_clock_voltage = OV02A10_MIPI_TX_SPEED_DEFAULT;
 	ov02a10->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10;
diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
index 28911d5169f7..67c4bd2916e8 100644
--- a/drivers/media/i2c/ov2640.c
+++ b/drivers/media/i2c/ov2640.c
@@ -996,8 +996,8 @@  static int ov2640_set_fmt(struct v4l2_subdev *sd,
 	return ret;
 }
 
-static int ov2640_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int ov2640_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *try_fmt =
 		v4l2_subdev_state_get_format(sd_state, 0);
@@ -1125,7 +1125,6 @@  static const struct v4l2_subdev_core_ops ov2640_subdev_core_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov2640_subdev_pad_ops = {
-	.init_cfg	= ov2640_init_cfg,
 	.enum_mbus_code = ov2640_enum_mbus_code,
 	.get_selection	= ov2640_get_selection,
 	.get_fmt	= ov2640_get_fmt,
@@ -1142,6 +1141,10 @@  static const struct v4l2_subdev_ops ov2640_subdev_ops = {
 	.video	= &ov2640_subdev_video_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov2640_internal_ops = {
+	.init_state	= ov2640_init_state,
+};
+
 static int ov2640_probe_dt(struct i2c_client *client,
 		struct ov2640_priv *priv)
 {
@@ -1211,6 +1214,7 @@  static int ov2640_probe(struct i2c_client *client)
 	priv->cfmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
 
 	v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
+	priv->subdev.internal_ops = &ov2640_internal_ops;
 	priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 			      V4L2_SUBDEV_FL_HAS_EVENTS;
 	mutex_init(&priv->lock);
diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c
index 9b53ea9af45a..d34d1972dcd9 100644
--- a/drivers/media/i2c/ov2680.c
+++ b/drivers/media/i2c/ov2680.c
@@ -755,8 +755,8 @@  static int ov2680_set_selection(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ov2680_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int ov2680_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct ov2680_dev *sensor = to_ov2680_dev(sd);
 
@@ -876,7 +876,6 @@  static const struct v4l2_subdev_video_ops ov2680_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov2680_pad_ops = {
-	.init_cfg		= ov2680_init_cfg,
 	.enum_mbus_code		= ov2680_enum_mbus_code,
 	.enum_frame_size	= ov2680_enum_frame_size,
 	.enum_frame_interval	= ov2680_enum_frame_interval,
@@ -891,6 +890,10 @@  static const struct v4l2_subdev_ops ov2680_subdev_ops = {
 	.pad	= &ov2680_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov2680_internal_ops = {
+	.init_state		= ov2680_init_state,
+};
+
 static int ov2680_mode_init(struct ov2680_dev *sensor)
 {
 	/* set initial mode */
@@ -915,6 +918,7 @@  static int ov2680_v4l2_register(struct ov2680_dev *sensor)
 	int ret = 0;
 
 	v4l2_i2c_subdev_init(&sensor->sd, client, &ov2680_subdev_ops);
+	sensor->sd.internal_ops = &ov2680_internal_ops;
 
 	sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
 	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
index 23cbd8b7846e..f0be51b343a7 100644
--- a/drivers/media/i2c/ov2740.c
+++ b/drivers/media/i2c/ov2740.c
@@ -879,8 +879,8 @@  static int ov2740_enum_frame_size(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ov2740_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int ov2740_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	ov2740_update_pad_format(&supported_modes[0],
 				 v4l2_subdev_state_get_format(sd_state, 0));
@@ -897,7 +897,6 @@  static const struct v4l2_subdev_pad_ops ov2740_pad_ops = {
 	.set_fmt = ov2740_set_format,
 	.enum_mbus_code = ov2740_enum_mbus_code,
 	.enum_frame_size = ov2740_enum_frame_size,
-	.init_cfg = ov2740_init_cfg,
 };
 
 static const struct v4l2_subdev_ops ov2740_subdev_ops = {
@@ -905,6 +904,10 @@  static const struct v4l2_subdev_ops ov2740_subdev_ops = {
 	.pad = &ov2740_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov2740_internal_ops = {
+	.init_state = ov2740_init_state,
+};
+
 static const struct media_entity_operations ov2740_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -1074,6 +1077,7 @@  static int ov2740_probe(struct i2c_client *client)
 		return -ENOMEM;
 
 	v4l2_i2c_subdev_init(&ov2740->sd, client, &ov2740_subdev_ops);
+	ov2740->sd.internal_ops = &ov2740_internal_ops;
 	full_power = acpi_dev_state_d0(&client->dev);
 	if (full_power) {
 		ret = ov2740_identify_module(ov2740);
diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 3f79a3b77044..6fd98b8cb181 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -3744,8 +3744,8 @@  static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
 	return ret;
 }
 
-static int ov5640_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *state)
+static int ov5640_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *state)
 {
 	struct ov5640_dev *sensor = to_ov5640_dev(sd);
 	struct v4l2_mbus_framefmt *fmt =
@@ -3776,7 +3776,6 @@  static const struct v4l2_subdev_video_ops ov5640_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
-	.init_cfg = ov5640_init_cfg,
 	.enum_mbus_code = ov5640_enum_mbus_code,
 	.get_fmt = ov5640_get_fmt,
 	.set_fmt = ov5640_set_fmt,
@@ -3791,6 +3790,10 @@  static const struct v4l2_subdev_ops ov5640_subdev_ops = {
 	.pad = &ov5640_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov5640_internal_ops = {
+	.init_state = ov5640_init_state,
+};
+
 static int ov5640_get_regulators(struct ov5640_dev *sensor)
 {
 	int i;
@@ -3905,6 +3908,7 @@  static int ov5640_probe(struct i2c_client *client)
 		return PTR_ERR(sensor->reset_gpio);
 
 	v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
+	sensor->sd.internal_ops = &ov5640_internal_ops;
 
 	sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 			    V4L2_SUBDEV_FL_HAS_EVENTS;
diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
index 695f4f673536..a26ac11c989d 100644
--- a/drivers/media/i2c/ov5645.c
+++ b/drivers/media/i2c/ov5645.c
@@ -934,8 +934,8 @@  static int ov5645_set_format(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ov5645_entity_init_cfg(struct v4l2_subdev *subdev,
-				  struct v4l2_subdev_state *sd_state)
+static int ov5645_init_state(struct v4l2_subdev *subdev,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = { 0 };
 
@@ -1023,7 +1023,6 @@  static const struct v4l2_subdev_video_ops ov5645_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov5645_subdev_pad_ops = {
-	.init_cfg = ov5645_entity_init_cfg,
 	.enum_mbus_code = ov5645_enum_mbus_code,
 	.enum_frame_size = ov5645_enum_frame_size,
 	.get_fmt = ov5645_get_format,
@@ -1036,6 +1035,10 @@  static const struct v4l2_subdev_ops ov5645_subdev_ops = {
 	.pad = &ov5645_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov5645_internal_ops = {
+	.init_state = ov5645_init_state,
+};
+
 static int ov5645_probe(struct i2c_client *client)
 {
 	struct device *dev = &client->dev;
@@ -1162,6 +1165,7 @@  static int ov5645_probe(struct i2c_client *client)
 	}
 
 	v4l2_i2c_subdev_init(&ov5645->sd, client, &ov5645_subdev_ops);
+	ov5645->sd.internal_ops = &ov5645_internal_ops;
 	ov5645->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	ov5645->pad.flags = MEDIA_PAD_FL_SOURCE;
 	ov5645->sd.dev = &client->dev;
@@ -1220,7 +1224,7 @@  static int ov5645_probe(struct i2c_client *client)
 	pm_runtime_get_noresume(dev);
 	pm_runtime_enable(dev);
 
-	ov5645_entity_init_cfg(&ov5645->sd, NULL);
+	ov5645_init_state(&ov5645->sd, NULL);
 
 	ret = v4l2_async_register_subdev(&ov5645->sd);
 	if (ret < 0) {
diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c
index 470d848f40d8..2aee85965cf7 100644
--- a/drivers/media/i2c/ov5670.c
+++ b/drivers/media/i2c/ov5670.c
@@ -2196,8 +2196,8 @@  static int ov5670_init_controls(struct ov5670 *ov5670)
 	return ret;
 }
 
-static int ov5670_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *state)
+static int ov5670_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *state)
 {
 	struct v4l2_mbus_framefmt *fmt =
 				v4l2_subdev_state_get_format(state, 0);
@@ -2592,7 +2592,6 @@  static const struct v4l2_subdev_video_ops ov5670_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov5670_pad_ops = {
-	.init_cfg = ov5670_init_cfg,
 	.enum_mbus_code = ov5670_enum_mbus_code,
 	.get_fmt = ov5670_get_pad_format,
 	.set_fmt = ov5670_set_pad_format,
@@ -2612,6 +2611,10 @@  static const struct v4l2_subdev_ops ov5670_subdev_ops = {
 	.sensor = &ov5670_sensor_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov5670_internal_ops = {
+	.init_state = ov5670_init_state,
+};
+
 static const struct media_entity_operations ov5670_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -2675,6 +2678,7 @@  static int ov5670_probe(struct i2c_client *client)
 
 	/* Initialize subdev */
 	v4l2_i2c_subdev_init(&ov5670->sd, client, &ov5670_subdev_ops);
+	ov5670->sd.internal_ops = &ov5670_internal_ops;
 
 	ret = ov5670_regulators_probe(ov5670);
 	if (ret)
diff --git a/drivers/media/i2c/ov7251.c b/drivers/media/i2c/ov7251.c
index 774f5dfb8186..897a0763df4a 100644
--- a/drivers/media/i2c/ov7251.c
+++ b/drivers/media/i2c/ov7251.c
@@ -1282,8 +1282,8 @@  static int ov7251_set_format(struct v4l2_subdev *sd,
 	return ret;
 }
 
-static int ov7251_entity_init_cfg(struct v4l2_subdev *subdev,
-				  struct v4l2_subdev_state *sd_state)
+static int ov7251_init_state(struct v4l2_subdev *subdev,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = {
 		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
@@ -1441,7 +1441,6 @@  static const struct v4l2_subdev_video_ops ov7251_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov7251_subdev_pad_ops = {
-	.init_cfg = ov7251_entity_init_cfg,
 	.enum_mbus_code = ov7251_enum_mbus_code,
 	.enum_frame_size = ov7251_enum_frame_size,
 	.enum_frame_interval = ov7251_enum_frame_ival,
@@ -1455,6 +1454,10 @@  static const struct v4l2_subdev_ops ov7251_subdev_ops = {
 	.pad = &ov7251_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov7251_internal_ops = {
+	.init_state = ov7251_init_state,
+};
+
 static int ov7251_check_hwcfg(struct ov7251 *ov7251)
 {
 	struct fwnode_handle *fwnode = dev_fwnode(ov7251->dev);
@@ -1693,6 +1696,7 @@  static int ov7251_probe(struct i2c_client *client)
 	}
 
 	v4l2_i2c_subdev_init(&ov7251->sd, client, &ov7251_subdev_ops);
+	ov7251->sd.internal_ops = &ov7251_internal_ops;
 	ov7251->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	ov7251->pad.flags = MEDIA_PAD_FL_SOURCE;
 	ov7251->sd.dev = &client->dev;
@@ -1750,7 +1754,7 @@  static int ov7251_probe(struct i2c_client *client)
 		goto free_entity;
 	}
 
-	ov7251_entity_init_cfg(&ov7251->sd, NULL);
+	ov7251_init_state(&ov7251->sd, NULL);
 
 	return 0;
 
diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c
index 0e3776136136..174c65f76886 100644
--- a/drivers/media/i2c/ov8858.c
+++ b/drivers/media/i2c/ov8858.c
@@ -1476,8 +1476,8 @@  static int ov8858_enum_mbus_code(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int ov8858_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int ov8858_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	const struct ov8858_mode *def_mode = &ov8858_modes[0];
 	struct v4l2_subdev_format fmt = {
@@ -1494,7 +1494,6 @@  static int ov8858_init_cfg(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops ov8858_pad_ops = {
-	.init_cfg = ov8858_init_cfg,
 	.enum_mbus_code = ov8858_enum_mbus_code,
 	.enum_frame_size = ov8858_enum_frame_sizes,
 	.get_fmt = v4l2_subdev_get_fmt,
@@ -1512,6 +1511,10 @@  static const struct v4l2_subdev_ops ov8858_subdev_ops = {
 	.pad	= &ov8858_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov8858_internal_ops = {
+	.init_state = ov8858_init_state,
+};
+
 /* ----------------------------------------------------------------------------
  * Controls handling
  */
@@ -1899,6 +1902,7 @@  static int ov8858_probe(struct i2c_client *client)
 				     "Failed to get powerdown gpio\n");
 
 	v4l2_i2c_subdev_init(&ov8858->subdev, client, &ov8858_subdev_ops);
+	ov8858->subdev.internal_ops = &ov8858_internal_ops;
 
 	ret = ov8858_configure_regulators(ov8858);
 	if (ret)
diff --git a/drivers/media/i2c/ov9282.c b/drivers/media/i2c/ov9282.c
index 1707bc22ca91..251a4b534914 100644
--- a/drivers/media/i2c/ov9282.c
+++ b/drivers/media/i2c/ov9282.c
@@ -876,14 +876,14 @@  static int ov9282_set_pad_format(struct v4l2_subdev *sd,
 }
 
 /**
- * ov9282_init_cfg() - Initialize sub-device state
+ * ov9282_init_state() - Initialize sub-device state
  * @sd: pointer to ov9282 V4L2 sub-device structure
  * @sd_state: V4L2 sub-device configuration
  *
  * Return: 0 if successful, error code otherwise.
  */
-static int ov9282_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int ov9282_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct ov9282 *ov9282 = to_ov9282(sd);
 	struct v4l2_subdev_format fmt = { 0 };
@@ -1192,7 +1192,6 @@  static const struct v4l2_subdev_video_ops ov9282_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov9282_pad_ops = {
-	.init_cfg = ov9282_init_cfg,
 	.enum_mbus_code = ov9282_enum_mbus_code,
 	.enum_frame_size = ov9282_enum_frame_size,
 	.get_fmt = ov9282_get_pad_format,
@@ -1206,6 +1205,10 @@  static const struct v4l2_subdev_ops ov9282_subdev_ops = {
 	.pad = &ov9282_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops ov9282_internal_ops = {
+	.init_state = ov9282_init_state,
+};
+
 /**
  * ov9282_power_on() - Sensor power on sequence
  * @dev: pointer to i2c device
@@ -1394,6 +1397,7 @@  static int ov9282_probe(struct i2c_client *client)
 
 	/* Initialize subdev */
 	v4l2_i2c_subdev_init(&ov9282->sd, client, &ov9282_subdev_ops);
+	ov9282->sd.internal_ops = &ov9282_internal_ops;
 	v4l2_i2c_subdev_set_name(&ov9282->sd, client,
 				 device_get_match_data(ov9282->dev), NULL);
 
diff --git a/drivers/media/i2c/st-vgxy61.c b/drivers/media/i2c/st-vgxy61.c
index 507cd9661e9d..98d8975dcd67 100644
--- a/drivers/media/i2c/st-vgxy61.c
+++ b/drivers/media/i2c/st-vgxy61.c
@@ -1322,8 +1322,8 @@  static int vgxy61_set_fmt(struct v4l2_subdev *sd,
 	return ret;
 }
 
-static int vgxy61_init_cfg(struct v4l2_subdev *sd,
-			   struct v4l2_subdev_state *sd_state)
+static int vgxy61_init_state(struct v4l2_subdev *sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct vgxy61_dev *sensor = to_vgxy61_dev(sd);
 	struct v4l2_subdev_format fmt = { 0 };
@@ -1469,7 +1469,6 @@  static const struct v4l2_subdev_video_ops vgxy61_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops vgxy61_pad_ops = {
-	.init_cfg = vgxy61_init_cfg,
 	.enum_mbus_code = vgxy61_enum_mbus_code,
 	.get_fmt = vgxy61_get_fmt,
 	.set_fmt = vgxy61_set_fmt,
@@ -1482,6 +1481,10 @@  static const struct v4l2_subdev_ops vgxy61_subdev_ops = {
 	.pad = &vgxy61_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops vgxy61_internal_ops = {
+	.init_state = vgxy61_init_state,
+};
+
 static const struct media_entity_operations vgxy61_subdev_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -1842,6 +1845,7 @@  static int vgxy61_probe(struct i2c_client *client)
 		device_property_read_bool(dev, "st,strobe-gpios-polarity");
 
 	v4l2_i2c_subdev_init(&sensor->sd, client, &vgxy61_subdev_ops);
+	sensor->sd.internal_ops = &vgxy61_internal_ops;
 	sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
 	sensor->sd.entity.ops = &vgxy61_subdev_entity_ops;
diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c
index 8be9c0f293e0..106de4271d2e 100644
--- a/drivers/media/i2c/tc358746.c
+++ b/drivers/media/i2c/tc358746.c
@@ -740,8 +740,8 @@  static int tc358746_s_stream(struct v4l2_subdev *sd, int enable)
 	return v4l2_subdev_call(src, video, s_stream, 0);
 }
 
-static int tc358746_init_cfg(struct v4l2_subdev *sd,
-			     struct v4l2_subdev_state *state)
+static int tc358746_init_state(struct v4l2_subdev *sd,
+			       struct v4l2_subdev_state *state)
 {
 	struct v4l2_mbus_framefmt *fmt;
 
@@ -1038,7 +1038,6 @@  static const struct v4l2_subdev_video_ops tc358746_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops tc358746_pad_ops = {
-	.init_cfg = tc358746_init_cfg,
 	.enum_mbus_code = tc358746_enum_mbus_code,
 	.set_fmt = tc358746_set_fmt,
 	.get_fmt = v4l2_subdev_get_fmt,
@@ -1052,6 +1051,10 @@  static const struct v4l2_subdev_ops tc358746_ops = {
 	.pad = &tc358746_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops tc358746_internal_ops = {
+	.init_state = tc358746_init_state,
+};
+
 static const struct media_entity_operations tc358746_entity_ops = {
 	.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
 	.link_validate = v4l2_subdev_link_validate,
@@ -1282,6 +1285,7 @@  tc358746_init_subdev(struct tc358746 *tc358746, struct i2c_client *client)
 	int err;
 
 	v4l2_i2c_subdev_init(sd, client, &tc358746_ops);
+	sd->internal_ops = &tc358746_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
 	sd->entity.ops = &tc358746_entity_ops;
diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c
index 63c12b77ff1e..1ea703a9909f 100644
--- a/drivers/media/i2c/tda1997x.c
+++ b/drivers/media/i2c/tda1997x.c
@@ -1734,8 +1734,8 @@  static const struct v4l2_subdev_video_ops tda1997x_video_ops = {
  * v4l2_subdev_pad_ops
  */
 
-static int tda1997x_init_cfg(struct v4l2_subdev *sd,
-			     struct v4l2_subdev_state *sd_state)
+static int tda1997x_init_state(struct v4l2_subdev *sd,
+			       struct v4l2_subdev_state *sd_state)
 {
 	struct tda1997x_state *state = to_state(sd);
 	struct v4l2_mbus_framefmt *mf;
@@ -1925,7 +1925,6 @@  static int tda1997x_enum_dv_timings(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops tda1997x_pad_ops = {
-	.init_cfg = tda1997x_init_cfg,
 	.enum_mbus_code = tda1997x_enum_mbus_code,
 	.get_fmt = tda1997x_get_format,
 	.set_fmt = tda1997x_set_format,
@@ -2047,6 +2046,10 @@  static const struct v4l2_subdev_ops tda1997x_subdev_ops = {
 	.pad = &tda1997x_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops tda1997x_internal_ops = {
+	.init_state = tda1997x_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * v4l2_controls
  */
@@ -2588,6 +2591,7 @@  static int tda1997x_probe(struct i2c_client *client)
 	/* initialize subdev */
 	sd = &state->sd;
 	v4l2_i2c_subdev_init(sd, client, &tda1997x_subdev_ops);
+	sd->internal_ops = &tda1997x_internal_ops;
 	snprintf(sd->name, sizeof(sd->name), "%s %d-%04x",
 		 id->name, i2c_adapter_id(client->adapter),
 		 client->addr);
diff --git a/drivers/media/i2c/thp7312.c b/drivers/media/i2c/thp7312.c
index 8d818ce055de..04b78c1f8090 100644
--- a/drivers/media/i2c/thp7312.c
+++ b/drivers/media/i2c/thp7312.c
@@ -837,8 +837,8 @@  static int thp7312_s_stream(struct v4l2_subdev *sd, int enable)
 	return ret;
 }
 
-static int thp7312_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *sd_state)
+static int thp7312_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	const struct thp7312_mode_info *default_mode = &thp7312_mode_info_data[0];
 	struct v4l2_mbus_framefmt *fmt;
@@ -875,7 +875,6 @@  static const struct v4l2_subdev_video_ops thp7312_video_ops = {
 
 static const struct v4l2_subdev_pad_ops thp7312_pad_ops = {
 	.enum_mbus_code = thp7312_enum_mbus_code,
-	.init_cfg = thp7312_init_cfg,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = thp7312_set_fmt,
 	.enum_frame_size = thp7312_enum_frame_size,
@@ -888,6 +887,10 @@  static const struct v4l2_subdev_ops thp7312_subdev_ops = {
 	.pad = &thp7312_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops thp7312_internal_ops = {
+	.init_state = thp7312_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * V4L2 Control Operations
  */
@@ -2103,6 +2106,7 @@  static int thp7312_probe(struct i2c_client *client)
 		return thp7312_register_flash_mode(thp7312);
 
 	v4l2_i2c_subdev_init(&thp7312->sd, client, &thp7312_subdev_ops);
+	thp7312->sd.internal_ops = &thp7312_internal_ops;
 	thp7312->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
 	thp7312->pad.flags = MEDIA_PAD_FL_SOURCE;
 	thp7312->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
index 76a92bfb6fde..9fc586cfdcd8 100644
--- a/drivers/media/i2c/tvp5150.c
+++ b/drivers/media/i2c/tvp5150.c
@@ -1209,8 +1209,8 @@  static int tvp5150_get_mbus_config(struct v4l2_subdev *sd,
 /****************************************************************************
 			V4L2 subdev pad ops
  ****************************************************************************/
-static int tvp5150_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *sd_state)
+static int tvp5150_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct tvp5150 *decoder = to_tvp5150(sd);
 	v4l2_std_id std;
@@ -1722,7 +1722,6 @@  static const struct v4l2_subdev_vbi_ops tvp5150_vbi_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops tvp5150_pad_ops = {
-	.init_cfg = tvp5150_init_cfg,
 	.enum_mbus_code = tvp5150_enum_mbus_code,
 	.enum_frame_size = tvp5150_enum_frame_size,
 	.set_fmt = tvp5150_fill_fmt,
@@ -1741,6 +1740,7 @@  static const struct v4l2_subdev_ops tvp5150_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops tvp5150_internal_ops = {
+	.init_state = tvp5150_init_state,
 	.registered = tvp5150_registered,
 	.open = tvp5150_open,
 	.close = tvp5150_close,
diff --git a/drivers/media/pci/intel/ivsc/mei_csi.c b/drivers/media/pci/intel/ivsc/mei_csi.c
index 8bf90e2bd856..15b905f66ab7 100644
--- a/drivers/media/pci/intel/ivsc/mei_csi.c
+++ b/drivers/media/pci/intel/ivsc/mei_csi.c
@@ -346,8 +346,8 @@  mei_csi_get_pad_format(struct v4l2_subdev *sd,
 	}
 }
 
-static int mei_csi_init_cfg(struct v4l2_subdev *sd,
-			    struct v4l2_subdev_state *sd_state)
+static int mei_csi_init_state(struct v4l2_subdev *sd,
+			      struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *mbusformat;
 	struct mei_csi *csi = sd_to_csi(sd);
@@ -554,7 +554,6 @@  static const struct v4l2_subdev_video_ops mei_csi_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mei_csi_pad_ops = {
-	.init_cfg = mei_csi_init_cfg,
 	.get_fmt = mei_csi_get_fmt,
 	.set_fmt = mei_csi_set_fmt,
 };
@@ -564,6 +563,10 @@  static const struct v4l2_subdev_ops mei_csi_subdev_ops = {
 	.pad = &mei_csi_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mei_csi_internal_ops = {
+	.init_state = mei_csi_init_state,
+};
+
 static const struct media_entity_operations mei_csi_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -747,6 +750,7 @@  static int mei_csi_probe(struct mei_cl_device *cldev,
 
 	csi->subdev.dev = &cldev->dev;
 	v4l2_subdev_init(&csi->subdev, &mei_csi_subdev_ops);
+	csi->subdev.internal_ops = &mei_csi_internal_ops;
 	v4l2_set_subdevdata(&csi->subdev, csi);
 	csi->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
 			    V4L2_SUBDEV_FL_HAS_EVENTS;
diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
index 0171ea7b834d..fead5426830e 100644
--- a/drivers/media/platform/cadence/cdns-csi2rx.c
+++ b/drivers/media/platform/cadence/cdns-csi2rx.c
@@ -418,8 +418,8 @@  static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
 	return 0;
 }
 
-static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
-			   struct v4l2_subdev_state *state)
+static int csi2rx_init_state(struct v4l2_subdev *subdev,
+			     struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_format format = {
 		.pad = CSI2RX_PAD_SINK,
@@ -441,7 +441,6 @@  static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
 static const struct v4l2_subdev_pad_ops csi2rx_pad_ops = {
 	.get_fmt	= v4l2_subdev_get_fmt,
 	.set_fmt	= csi2rx_set_fmt,
-	.init_cfg	= csi2rx_init_cfg,
 };
 
 static const struct v4l2_subdev_video_ops csi2rx_video_ops = {
@@ -453,6 +452,10 @@  static const struct v4l2_subdev_ops csi2rx_subdev_ops = {
 	.pad		= &csi2rx_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops csi2rx_internal_ops = {
+	.init_state	= csi2rx_init_state,
+};
+
 static const struct media_entity_operations csi2rx_media_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -663,6 +666,7 @@  static int csi2rx_probe(struct platform_device *pdev)
 	csi2rx->subdev.owner = THIS_MODULE;
 	csi2rx->subdev.dev = &pdev->dev;
 	v4l2_subdev_init(&csi2rx->subdev, &csi2rx_subdev_ops);
+	csi2rx->subdev.internal_ops = &csi2rx_internal_ops;
 	v4l2_set_subdevdata(&csi2rx->subdev, &pdev->dev);
 	snprintf(csi2rx->subdev.name, sizeof(csi2rx->subdev.name),
 		 "%s.%s", KBUILD_MODNAME, dev_name(&pdev->dev));
diff --git a/drivers/media/platform/microchip/microchip-csi2dc.c b/drivers/media/platform/microchip/microchip-csi2dc.c
index 87a2d092aad2..fee73260bb1e 100644
--- a/drivers/media/platform/microchip/microchip-csi2dc.c
+++ b/drivers/media/platform/microchip/microchip-csi2dc.c
@@ -435,8 +435,8 @@  static int csi2dc_s_stream(struct v4l2_subdev *csi2dc_sd, int enable)
 	return ret;
 }
 
-static int csi2dc_init_cfg(struct v4l2_subdev *csi2dc_sd,
-			   struct v4l2_subdev_state *sd_state)
+static int csi2dc_init_state(struct v4l2_subdev *csi2dc_sd,
+			     struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *v4l2_try_fmt =
 		v4l2_subdev_state_get_format(sd_state, 0);
@@ -461,7 +461,6 @@  static const struct v4l2_subdev_pad_ops csi2dc_pad_ops = {
 	.enum_mbus_code = csi2dc_enum_mbus_code,
 	.set_fmt = csi2dc_set_fmt,
 	.get_fmt = csi2dc_get_fmt,
-	.init_cfg = csi2dc_init_cfg,
 };
 
 static const struct v4l2_subdev_video_ops csi2dc_video_ops = {
@@ -473,6 +472,10 @@  static const struct v4l2_subdev_ops csi2dc_subdev_ops = {
 	.video = &csi2dc_video_ops,
 };
 
+static const struct v4l2_subdev_internal_ops csi2dc_internal_ops = {
+	.init_state = csi2dc_init_state,
+};
+
 static int csi2dc_async_bound(struct v4l2_async_notifier *notifier,
 			      struct v4l2_subdev *subdev,
 			      struct v4l2_async_connection *asd)
@@ -677,6 +680,7 @@  static int csi2dc_probe(struct platform_device *pdev)
 	}
 
 	v4l2_subdev_init(&csi2dc->csi2dc_sd, &csi2dc_subdev_ops);
+	csi2dc->csi2dc_sd.internal_ops = &csi2dc_internal_ops;
 
 	csi2dc->csi2dc_sd.owner = THIS_MODULE;
 	csi2dc->csi2dc_sd.dev = dev;
diff --git a/drivers/media/platform/microchip/microchip-isc-scaler.c b/drivers/media/platform/microchip/microchip-isc-scaler.c
index 58dffbc9fbcb..e83463543e21 100644
--- a/drivers/media/platform/microchip/microchip-isc-scaler.c
+++ b/drivers/media/platform/microchip/microchip-isc-scaler.c
@@ -145,8 +145,8 @@  static int isc_scaler_g_sel(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int isc_scaler_init_cfg(struct v4l2_subdev *sd,
-			       struct v4l2_subdev_state *sd_state)
+static int isc_scaler_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *v4l2_try_fmt =
 		v4l2_subdev_state_get_format(sd_state, 0);
@@ -170,7 +170,6 @@  static const struct v4l2_subdev_pad_ops isc_scaler_pad_ops = {
 	.set_fmt = isc_scaler_set_fmt,
 	.get_fmt = isc_scaler_get_fmt,
 	.get_selection = isc_scaler_g_sel,
-	.init_cfg = isc_scaler_init_cfg,
 };
 
 static const struct media_entity_operations isc_scaler_entity_ops = {
@@ -181,11 +180,16 @@  static const struct v4l2_subdev_ops xisc_scaler_subdev_ops = {
 	.pad = &isc_scaler_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops isc_scaler_internal_ops = {
+	.init_state = isc_scaler_init_state,
+};
+
 int isc_scaler_init(struct isc_device *isc)
 {
 	int ret;
 
 	v4l2_subdev_init(&isc->scaler_sd, &xisc_scaler_subdev_ops);
+	isc->scaler_sd.internal_ops = &isc_scaler_internal_ops;
 
 	isc->scaler_sd.owner = THIS_MODULE;
 	isc->scaler_sd.dev = isc->dev;
diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
index a2c748217376..b12e2435ef60 100644
--- a/drivers/media/platform/nxp/imx-mipi-csis.c
+++ b/drivers/media/platform/nxp/imx-mipi-csis.c
@@ -1122,8 +1122,8 @@  static int mipi_csis_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
 	return 0;
 }
 
-static int mipi_csis_init_cfg(struct v4l2_subdev *sd,
-			      struct v4l2_subdev_state *sd_state)
+static int mipi_csis_init_state(struct v4l2_subdev *sd,
+				struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = {
 		.pad = CSIS_PAD_SINK,
@@ -1163,7 +1163,6 @@  static const struct v4l2_subdev_video_ops mipi_csis_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops mipi_csis_pad_ops = {
-	.init_cfg		= mipi_csis_init_cfg,
 	.enum_mbus_code		= mipi_csis_enum_mbus_code,
 	.get_fmt		= v4l2_subdev_get_fmt,
 	.set_fmt		= mipi_csis_set_fmt,
@@ -1176,6 +1175,10 @@  static const struct v4l2_subdev_ops mipi_csis_subdev_ops = {
 	.pad	= &mipi_csis_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mipi_csis_internal_ops = {
+	.init_state		= mipi_csis_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * Media entity operations
  */
@@ -1350,6 +1353,7 @@  static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
 	int ret;
 
 	v4l2_subdev_init(sd, &mipi_csis_subdev_ops);
+	sd->internal_ops = &mipi_csis_internal_ops;
 	sd->owner = THIS_MODULE;
 	snprintf(sd->name, sizeof(sd->name), "csis-%s",
 		 dev_name(csis->dev));
diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c
index 1d2464ca59b8..651151da3ab4 100644
--- a/drivers/media/platform/nxp/imx7-media-csi.c
+++ b/drivers/media/platform/nxp/imx7-media-csi.c
@@ -1729,8 +1729,8 @@  static int imx7_csi_s_stream(struct v4l2_subdev *sd, int enable)
 	return ret;
 }
 
-static int imx7_csi_init_cfg(struct v4l2_subdev *sd,
-			     struct v4l2_subdev_state *sd_state)
+static int imx7_csi_init_state(struct v4l2_subdev *sd,
+			       struct v4l2_subdev_state *sd_state)
 {
 	const struct imx7_csi_pixfmt *cc;
 	int i;
@@ -2006,7 +2006,6 @@  static const struct v4l2_subdev_video_ops imx7_csi_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx7_csi_pad_ops = {
-	.init_cfg	= imx7_csi_init_cfg,
 	.enum_mbus_code	= imx7_csi_enum_mbus_code,
 	.get_fmt	= v4l2_subdev_get_fmt,
 	.set_fmt	= imx7_csi_set_fmt,
@@ -2019,6 +2018,7 @@  static const struct v4l2_subdev_ops imx7_csi_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops imx7_csi_internal_ops = {
+	.init_state	= imx7_csi_init_state,
 	.registered	= imx7_csi_registered,
 	.unregistered	= imx7_csi_unregistered,
 };
diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
index 9401261eb239..575f17337388 100644
--- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
+++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
@@ -176,8 +176,8 @@  mxc_isi_crossbar_xlate_streams(struct mxc_isi_crossbar *xbar,
 	return sd;
 }
 
-static int mxc_isi_crossbar_init_cfg(struct v4l2_subdev *sd,
-				     struct v4l2_subdev_state *state)
+static int mxc_isi_crossbar_init_state(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_state *state)
 {
 	struct mxc_isi_crossbar *xbar = to_isi_crossbar(sd);
 	struct v4l2_subdev_krouting routing = { };
@@ -404,7 +404,6 @@  static int mxc_isi_crossbar_disable_streams(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops mxc_isi_crossbar_subdev_pad_ops = {
-	.init_cfg = mxc_isi_crossbar_init_cfg,
 	.enum_mbus_code = mxc_isi_crossbar_enum_mbus_code,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = mxc_isi_crossbar_set_fmt,
@@ -417,6 +416,10 @@  static const struct v4l2_subdev_ops mxc_isi_crossbar_subdev_ops = {
 	.pad = &mxc_isi_crossbar_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mxc_isi_crossbar_internal_ops = {
+	.init_state = mxc_isi_crossbar_init_state,
+};
+
 static const struct media_entity_operations mxc_isi_cross_entity_ops = {
 	.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
 	.link_validate	= v4l2_subdev_link_validate,
@@ -438,6 +441,7 @@  int mxc_isi_crossbar_init(struct mxc_isi_dev *isi)
 	xbar->isi = isi;
 
 	v4l2_subdev_init(sd, &mxc_isi_crossbar_subdev_ops);
+	sd->internal_ops = &mxc_isi_crossbar_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
 	strscpy(sd->name, "crossbar", sizeof(sd->name));
 	sd->dev = isi->dev;
diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
index 14c6da392803..d76eb58deb09 100644
--- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
+++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c
@@ -341,8 +341,8 @@  mxc_isi_pipe_get_pad_compose(struct mxc_isi_pipe *pipe,
 	return v4l2_subdev_state_get_compose(state, pad);
 }
 
-static int mxc_isi_pipe_init_cfg(struct v4l2_subdev *sd,
-				 struct v4l2_subdev_state *state)
+static int mxc_isi_pipe_init_state(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_state *state)
 {
 	struct mxc_isi_pipe *pipe = to_isi_pipe(sd);
 	struct v4l2_mbus_framefmt *fmt_source;
@@ -682,7 +682,6 @@  static int mxc_isi_pipe_set_selection(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops mxc_isi_pipe_subdev_pad_ops = {
-	.init_cfg = mxc_isi_pipe_init_cfg,
 	.enum_mbus_code = mxc_isi_pipe_enum_mbus_code,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = mxc_isi_pipe_set_fmt,
@@ -694,6 +693,10 @@  static const struct v4l2_subdev_ops mxc_isi_pipe_subdev_ops = {
 	.pad = &mxc_isi_pipe_subdev_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops mxc_isi_pipe_internal_ops = {
+	.init_state = mxc_isi_pipe_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * IRQ handling
  */
@@ -767,6 +770,7 @@  int mxc_isi_pipe_init(struct mxc_isi_dev *isi, unsigned int id)
 
 	sd = &pipe->sd;
 	v4l2_subdev_init(sd, &mxc_isi_pipe_subdev_ops);
+	sd->internal_ops = &mxc_isi_pipe_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	snprintf(sd->name, sizeof(sd->name), "mxc_isi.%d", pipe->id);
 	sd->dev = isi->dev;
diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
index 02a4c546a90a..ba2e81f24965 100644
--- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
+++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
@@ -437,8 +437,8 @@  static int imx8mq_mipi_csi_s_stream(struct v4l2_subdev *sd, int enable)
 	return ret;
 }
 
-static int imx8mq_mipi_csi_init_cfg(struct v4l2_subdev *sd,
-				    struct v4l2_subdev_state *sd_state)
+static int imx8mq_mipi_csi_init_state(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *fmt_sink;
 	struct v4l2_mbus_framefmt *fmt_source;
@@ -535,7 +535,6 @@  static const struct v4l2_subdev_video_ops imx8mq_mipi_csi_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops imx8mq_mipi_csi_pad_ops = {
-	.init_cfg		= imx8mq_mipi_csi_init_cfg,
 	.enum_mbus_code		= imx8mq_mipi_csi_enum_mbus_code,
 	.get_fmt		= v4l2_subdev_get_fmt,
 	.set_fmt		= imx8mq_mipi_csi_set_fmt,
@@ -546,6 +545,10 @@  static const struct v4l2_subdev_ops imx8mq_mipi_csi_subdev_ops = {
 	.pad	= &imx8mq_mipi_csi_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops imx8mq_mipi_csi_internal_ops = {
+	.init_state		= imx8mq_mipi_csi_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * Media entity operations
  */
@@ -760,6 +763,7 @@  static int imx8mq_mipi_csi_subdev_init(struct csi_state *state)
 	int ret;
 
 	v4l2_subdev_init(sd, &imx8mq_mipi_csi_subdev_ops);
+	sd->internal_ops = &imx8mq_mipi_csi_internal_ops;
 	sd->owner = THIS_MODULE;
 	snprintf(sd->name, sizeof(sd->name), "%s %s",
 		 MIPI_CSI2_SUBDEV_NAME, dev_name(state->dev));
diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
index 04e61e783045..d20f4eff93a4 100644
--- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
+++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
@@ -530,8 +530,8 @@  static int rzg2l_csi2_set_format(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int rzg2l_csi2_init_config(struct v4l2_subdev *sd,
-				  struct v4l2_subdev_state *sd_state)
+static int rzg2l_csi2_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = { .pad = RZG2L_CSI2_SINK, };
 
@@ -582,7 +582,6 @@  static const struct v4l2_subdev_video_ops rzg2l_csi2_video_ops = {
 
 static const struct v4l2_subdev_pad_ops rzg2l_csi2_pad_ops = {
 	.enum_mbus_code = rzg2l_csi2_enum_mbus_code,
-	.init_cfg = rzg2l_csi2_init_config,
 	.enum_frame_size = rzg2l_csi2_enum_frame_size,
 	.set_fmt = rzg2l_csi2_set_format,
 	.get_fmt = v4l2_subdev_get_fmt,
@@ -593,6 +592,10 @@  static const struct v4l2_subdev_ops rzg2l_csi2_subdev_ops = {
 	.pad	= &rzg2l_csi2_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops rzg2l_csi2_internal_ops = {
+	.init_state = rzg2l_csi2_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * Async handling and registration of subdevices and links.
  */
@@ -777,6 +780,7 @@  static int rzg2l_csi2_probe(struct platform_device *pdev)
 
 	csi2->subdev.dev = &pdev->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);
 	snprintf(csi2->subdev.name, sizeof(csi2->subdev.name),
 		 "csi-%s", dev_name(&pdev->dev));
diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
index 17a59dfc8363..9f351a05893e 100644
--- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
+++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c
@@ -168,8 +168,8 @@  static int rzg2l_cru_ip_enum_frame_size(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int rzg2l_cru_ip_init_config(struct v4l2_subdev *sd,
-				    struct v4l2_subdev_state *sd_state)
+static int rzg2l_cru_ip_init_state(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_subdev_format fmt = { .pad = RZG2L_CRU_IP_SINK, };
 
@@ -192,7 +192,6 @@  static const struct v4l2_subdev_video_ops rzg2l_cru_ip_video_ops = {
 static const struct v4l2_subdev_pad_ops rzg2l_cru_ip_pad_ops = {
 	.enum_mbus_code = rzg2l_cru_ip_enum_mbus_code,
 	.enum_frame_size = rzg2l_cru_ip_enum_frame_size,
-	.init_cfg = rzg2l_cru_ip_init_config,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = rzg2l_cru_ip_set_format,
 };
@@ -202,6 +201,10 @@  static const struct v4l2_subdev_ops rzg2l_cru_ip_subdev_ops = {
 	.pad = &rzg2l_cru_ip_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops rzg2l_cru_ip_internal_ops = {
+	.init_state = rzg2l_cru_ip_init_state,
+};
+
 static const struct media_entity_operations rzg2l_cru_ip_entity_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -213,6 +216,7 @@  int rzg2l_cru_ip_subdev_register(struct rzg2l_cru_dev *cru)
 
 	ip->subdev.dev = cru->dev;
 	v4l2_subdev_init(&ip->subdev, &rzg2l_cru_ip_subdev_ops);
+	ip->subdev.internal_ops = &rzg2l_cru_ip_internal_ops;
 	v4l2_set_subdevdata(&ip->subdev, cru);
 	snprintf(ip->subdev.name, sizeof(ip->subdev.name),
 		 "cru-ip-%s", dev_name(cru->dev));
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_brx.c b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
index 758525a03289..a8535c6e2c46 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_brx.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
@@ -264,7 +264,6 @@  static int brx_set_selection(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops brx_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = brx_enum_mbus_code,
 	.enum_frame_size = brx_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_clu.c b/drivers/media/platform/renesas/vsp1/vsp1_clu.c
index 50a5c0dc0e86..625776a9bda4 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_clu.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_clu.c
@@ -155,7 +155,6 @@  static int clu_set_format(struct v4l2_subdev *subdev,
  */
 
 static const struct v4l2_subdev_pad_ops clu_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = clu_enum_mbus_code,
 	.enum_frame_size = clu_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
index 0280b8ff7ba9..0a5a7f9cc870 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
@@ -170,33 +170,6 @@  vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
 	}
 }
 
-/*
- * vsp1_entity_init_cfg - Initialize formats on all pads
- * @subdev: V4L2 subdevice
- * @sd_state: V4L2 subdev state
- *
- * Initialize all pad formats with default values in the given subdev state.
- * This function can be used as a handler for the subdev pad::init_cfg
- * operation.
- */
-int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
-			 struct v4l2_subdev_state *sd_state)
-{
-	unsigned int pad;
-
-	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
-		struct v4l2_subdev_format format = {
-			.pad = pad,
-			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
-			       : V4L2_SUBDEV_FORMAT_ACTIVE,
-		};
-
-		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
-	}
-
-	return 0;
-}
-
 /*
  * vsp1_subdev_get_pad_format - Subdev pad get_fmt handler
  * @subdev: V4L2 subdevice
@@ -424,6 +397,29 @@  int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
 	return ret;
 }
 
+static int vsp1_entity_init_state(struct v4l2_subdev *subdev,
+				  struct v4l2_subdev_state *sd_state)
+{
+	unsigned int pad;
+
+	/* Initialize all pad formats with default values. */
+	for (pad = 0; pad < subdev->entity.num_pads - 1; ++pad) {
+		struct v4l2_subdev_format format = {
+			.pad = pad,
+			.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
+			       : V4L2_SUBDEV_FORMAT_ACTIVE,
+		};
+
+		v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &format);
+	}
+
+	return 0;
+}
+
+static const struct v4l2_subdev_internal_ops vsp1_entity_internal_ops = {
+	.init_state = vsp1_entity_init_state,
+};
+
 /* -----------------------------------------------------------------------------
  * Media Operations
  */
@@ -658,6 +654,7 @@  int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
 	/* Initialize the V4L2 subdev. */
 	subdev = &entity->subdev;
 	v4l2_subdev_init(subdev, ops);
+	subdev->internal_ops = &vsp1_entity_internal_ops;
 
 	subdev->entity.function = function;
 	subdev->entity.ops = &vsp1->media_ops;
@@ -666,7 +663,7 @@  int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
 	snprintf(subdev->name, sizeof(subdev->name), "%s %s",
 		 dev_name(vsp1->dev), name);
 
-	vsp1_entity_init_cfg(subdev, NULL);
+	vsp1_entity_init_state(subdev, NULL);
 
 	/*
 	 * Allocate the subdev state to store formats and selection
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
index 8c737cadee81..735f32dde4b5 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
+++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
@@ -146,8 +146,6 @@  struct v4l2_rect *
 vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
 			      struct v4l2_subdev_state *sd_state,
 			      unsigned int pad, unsigned int target);
-int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
-			 struct v4l2_subdev_state *sd_state);
 
 void vsp1_entity_route_setup(struct vsp1_entity *entity,
 			     struct vsp1_pipeline *pipe,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_hsit.c b/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
index 6342ac7bdf54..bc1299c29ac9 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_hsit.c
@@ -113,7 +113,6 @@  static int hsit_set_format(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops hsit_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = hsit_enum_mbus_code,
 	.enum_frame_size = hsit_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_lif.c b/drivers/media/platform/renesas/vsp1/vsp1_lif.c
index 75c24df41a7a..b1d21a54837b 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_lif.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_lif.c
@@ -68,7 +68,6 @@  static int lif_set_format(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops lif_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = lif_enum_mbus_code,
 	.enum_frame_size = lif_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_lut.c b/drivers/media/platform/renesas/vsp1/vsp1_lut.c
index ac6802a325f5..451d24ab0b56 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_lut.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_lut.c
@@ -131,7 +131,6 @@  static int lut_set_format(struct v4l2_subdev *subdev,
  */
 
 static const struct v4l2_subdev_pad_ops lut_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = lut_enum_mbus_code,
 	.enum_frame_size = lut_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
index 16941ff9dbdd..b2ff3c9a6322 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_rwpf.c
@@ -240,7 +240,6 @@  static int vsp1_rwpf_set_selection(struct v4l2_subdev *subdev,
 }
 
 const struct v4l2_subdev_pad_ops vsp1_rwpf_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = vsp1_rwpf_enum_mbus_code,
 	.enum_frame_size = vsp1_rwpf_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_sru.c b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
index 2dd6f8575614..11e008aa9f20 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_sru.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
@@ -252,7 +252,6 @@  static int sru_set_format(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops sru_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = sru_enum_mbus_code,
 	.enum_frame_size = sru_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uds.c b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
index 59ff4ae46cea..d89f1197b86c 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_uds.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
@@ -239,7 +239,6 @@  static int uds_set_format(struct v4l2_subdev *subdev,
  */
 
 static const struct v4l2_subdev_pad_ops uds_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = uds_enum_mbus_code,
 	.enum_frame_size = uds_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uif.c b/drivers/media/platform/renesas/vsp1/vsp1_uif.c
index d84d10f35090..f66936a28a2a 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_uif.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_uif.c
@@ -174,7 +174,6 @@  static int uif_set_selection(struct v4l2_subdev *subdev,
  */
 
 static const struct v4l2_subdev_pad_ops uif_pad_ops = {
-	.init_cfg = vsp1_entity_init_cfg,
 	.enum_mbus_code = uif_enum_mbus_code,
 	.enum_frame_size = uif_enum_frame_size,
 	.get_fmt = vsp1_subdev_get_pad_format,
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
index 47f4353a1784..e6642a2167ef 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
@@ -270,8 +270,8 @@  static int rkisp1_csi_enum_mbus_code(struct v4l2_subdev *sd,
 	return -EINVAL;
 }
 
-static int rkisp1_csi_init_config(struct v4l2_subdev *sd,
-				  struct v4l2_subdev_state *sd_state)
+static int rkisp1_csi_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
 
@@ -405,7 +405,6 @@  static const struct v4l2_subdev_video_ops rkisp1_csi_video_ops = {
 
 static const struct v4l2_subdev_pad_ops rkisp1_csi_pad_ops = {
 	.enum_mbus_code = rkisp1_csi_enum_mbus_code,
-	.init_cfg = rkisp1_csi_init_config,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = rkisp1_csi_set_fmt,
 };
@@ -415,6 +414,10 @@  static const struct v4l2_subdev_ops rkisp1_csi_ops = {
 	.pad = &rkisp1_csi_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops rkisp1_csi_internal_ops = {
+	.init_state = rkisp1_csi_init_state,
+};
+
 int rkisp1_csi_register(struct rkisp1_device *rkisp1)
 {
 	struct rkisp1_csi *csi = &rkisp1->csi;
@@ -426,6 +429,7 @@  int rkisp1_csi_register(struct rkisp1_device *rkisp1)
 
 	sd = &csi->sd;
 	v4l2_subdev_init(sd, &rkisp1_csi_ops);
+	sd->internal_ops = &rkisp1_csi_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	sd->entity.ops = &rkisp1_csi_media_ops;
 	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
index 96353648c032..ca6703bfd27b 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
@@ -409,8 +409,8 @@  static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
-				  struct v4l2_subdev_state *sd_state)
+static int rkisp1_isp_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
 	struct v4l2_rect *sink_crop, *src_crop;
@@ -769,7 +769,6 @@  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
 	.enum_frame_size = rkisp1_isp_enum_frame_size,
 	.get_selection = rkisp1_isp_get_selection,
 	.set_selection = rkisp1_isp_set_selection,
-	.init_cfg = rkisp1_isp_init_config,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = rkisp1_isp_set_fmt,
 	.link_validate = v4l2_subdev_link_validate_default,
@@ -880,6 +879,10 @@  static const struct v4l2_subdev_ops rkisp1_isp_ops = {
 	.pad = &rkisp1_isp_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops rkisp1_isp_internal_ops = {
+	.init_state = rkisp1_isp_init_state,
+};
+
 int rkisp1_isp_register(struct rkisp1_device *rkisp1)
 {
 	struct rkisp1_isp *isp = &rkisp1->isp;
@@ -890,6 +893,7 @@  int rkisp1_isp_register(struct rkisp1_device *rkisp1)
 	isp->rkisp1 = rkisp1;
 
 	v4l2_subdev_init(sd, &rkisp1_isp_ops);
+	sd->internal_ops = &rkisp1_isp_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
 	sd->entity.ops = &rkisp1_isp_media_ops;
 	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
index 9f94b9f60c35..f7af360dcb28 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
@@ -366,8 +366,8 @@  static int rkisp1_rsz_enum_mbus_code(struct v4l2_subdev *sd,
 	return ret;
 }
 
-static int rkisp1_rsz_init_config(struct v4l2_subdev *sd,
-				  struct v4l2_subdev_state *sd_state)
+static int rkisp1_rsz_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
 	struct v4l2_rect *sink_crop;
@@ -605,7 +605,6 @@  static const struct v4l2_subdev_pad_ops rkisp1_rsz_pad_ops = {
 	.enum_mbus_code = rkisp1_rsz_enum_mbus_code,
 	.get_selection = rkisp1_rsz_get_selection,
 	.set_selection = rkisp1_rsz_set_selection,
-	.init_cfg = rkisp1_rsz_init_config,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = rkisp1_rsz_set_fmt,
 	.link_validate = v4l2_subdev_link_validate_default,
@@ -652,6 +651,10 @@  static const struct v4l2_subdev_ops rkisp1_rsz_ops = {
 	.pad = &rkisp1_rsz_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops rkisp1_rsz_internal_ops = {
+	.init_state = rkisp1_rsz_init_state,
+};
+
 static void rkisp1_rsz_unregister(struct rkisp1_resizer *rsz)
 {
 	if (!rsz->rkisp1)
@@ -681,6 +684,7 @@  static int rkisp1_rsz_register(struct rkisp1_resizer *rsz)
 	}
 
 	v4l2_subdev_init(sd, &rkisp1_rsz_ops);
+	sd->internal_ops = &rkisp1_rsz_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	sd->entity.ops = &rkisp1_rsz_media_ops;
 	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_SCALER;
diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
index 0bc897d2d577..5a361ad6b023 100644
--- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
+++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c
@@ -159,8 +159,8 @@  static void dcmipp_byteproc_adjust_fmt(struct v4l2_mbus_framefmt *fmt)
 	dcmipp_colorimetry_clamp(fmt);
 }
 
-static int dcmipp_byteproc_init_cfg(struct v4l2_subdev *sd,
-				    struct v4l2_subdev_state *sd_state)
+static int dcmipp_byteproc_init_state(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_state *sd_state)
 {
 	unsigned int i;
 
@@ -383,7 +383,6 @@  static int dcmipp_byteproc_set_selection(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops dcmipp_byteproc_pad_ops = {
-	.init_cfg		= dcmipp_byteproc_init_cfg,
 	.enum_mbus_code		= dcmipp_byteproc_enum_mbus_code,
 	.enum_frame_size	= dcmipp_byteproc_enum_frame_size,
 	.get_fmt		= v4l2_subdev_get_fmt,
@@ -518,6 +517,7 @@  static void dcmipp_byteproc_release(struct v4l2_subdev *sd)
 }
 
 static const struct v4l2_subdev_internal_ops dcmipp_byteproc_int_ops = {
+	.init_state = dcmipp_byteproc_init_state,
 	.release = dcmipp_byteproc_release,
 };
 
diff --git a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
index 5571d2773026..62c5c3331cfe 100644
--- a/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
+++ b/drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-parallel.c
@@ -143,8 +143,8 @@  static const struct v4l2_mbus_framefmt fmt_default = {
 	.xfer_func = DCMIPP_XFER_FUNC_DEFAULT,
 };
 
-static int dcmipp_par_init_cfg(struct v4l2_subdev *sd,
-			       struct v4l2_subdev_state *sd_state)
+static int dcmipp_par_init_state(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_state *sd_state)
 {
 	unsigned int i;
 
@@ -262,7 +262,6 @@  static int dcmipp_par_set_fmt(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops dcmipp_par_pad_ops = {
-	.init_cfg		= dcmipp_par_init_cfg,
 	.enum_mbus_code		= dcmipp_par_enum_mbus_code,
 	.enum_frame_size	= dcmipp_par_enum_frame_size,
 	.get_fmt		= v4l2_subdev_get_fmt,
@@ -394,6 +393,7 @@  static void dcmipp_par_release(struct v4l2_subdev *sd)
 }
 
 static const struct v4l2_subdev_internal_ops dcmipp_par_int_ops = {
+	.init_state = dcmipp_par_init_state,
 	.release = dcmipp_par_release,
 };
 
diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
index ad13d447d483..097a3a08ef7d 100644
--- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
+++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
@@ -211,6 +211,7 @@  static int sun4i_csi_probe(struct platform_device *pdev)
 
 	/* Initialize subdev */
 	v4l2_subdev_init(subdev, &sun4i_csi_subdev_ops);
+	subdev->internal_ops = &sun4i_csi_subdev_internal_ops;
 	subdev->flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
 	subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
 	subdev->owner = THIS_MODULE;
diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
index 8eeed87bfb13..4e0c2df45d4d 100644
--- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
+++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
@@ -89,6 +89,7 @@  enum csi_subdev_pads {
 };
 
 extern const struct v4l2_subdev_ops sun4i_csi_subdev_ops;
+extern const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops;
 
 struct sun4i_csi_format {
 	u32			mbus;
diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
index c37bb1d76ef6..744197b0fccb 100644
--- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
+++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c
@@ -266,8 +266,8 @@  static const struct v4l2_mbus_framefmt sun4i_csi_pad_fmt_default = {
 	.xfer_func = V4L2_XFER_FUNC_DEFAULT,
 };
 
-static int sun4i_csi_subdev_init_cfg(struct v4l2_subdev *subdev,
-				     struct v4l2_subdev_state *sd_state)
+static int sun4i_csi_subdev_init_state(struct v4l2_subdev *subdev,
+				       struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *fmt;
 
@@ -334,7 +334,6 @@  sun4i_csi_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
 
 static const struct v4l2_subdev_pad_ops sun4i_csi_subdev_pad_ops = {
 	.link_validate	= v4l2_subdev_link_validate_default,
-	.init_cfg	= sun4i_csi_subdev_init_cfg,
 	.get_fmt	= sun4i_csi_subdev_get_fmt,
 	.set_fmt	= sun4i_csi_subdev_set_fmt,
 	.enum_mbus_code	= sun4i_csi_subdev_enum_mbus_code,
@@ -344,6 +343,10 @@  const struct v4l2_subdev_ops sun4i_csi_subdev_ops = {
 	.pad = &sun4i_csi_subdev_pad_ops,
 };
 
+const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops = {
+	.init_state	= sun4i_csi_subdev_init_state,
+};
+
 int sun4i_csi_v4l2_register(struct sun4i_csi *csi)
 {
 	struct video_device *vdev = &csi->vdev;
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
index d57481feee05..d006d9dd0170 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
@@ -501,8 +501,8 @@  sun6i_csi_bridge_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
 	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
 }
 
-static int sun6i_csi_bridge_init_cfg(struct v4l2_subdev *subdev,
-				     struct v4l2_subdev_state *state)
+static int sun6i_csi_bridge_init_state(struct v4l2_subdev *subdev,
+				       struct v4l2_subdev_state *state)
 {
 	struct sun6i_csi_device *csi_dev = v4l2_get_subdevdata(subdev);
 	unsigned int pad = SUN6I_CSI_BRIDGE_PAD_SINK;
@@ -581,7 +581,6 @@  static int sun6i_csi_bridge_set_fmt(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops sun6i_csi_bridge_pad_ops = {
-	.init_cfg	= sun6i_csi_bridge_init_cfg,
 	.enum_mbus_code	= sun6i_csi_bridge_enum_mbus_code,
 	.get_fmt	= sun6i_csi_bridge_get_fmt,
 	.set_fmt	= sun6i_csi_bridge_set_fmt,
@@ -592,6 +591,10 @@  static const struct v4l2_subdev_ops sun6i_csi_bridge_subdev_ops = {
 	.pad	= &sun6i_csi_bridge_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops sun6i_csi_bridge_internal_ops = {
+	.init_state	= sun6i_csi_bridge_init_state,
+};
+
 /* Media Entity */
 
 static const struct media_entity_operations sun6i_csi_bridge_entity_ops = {
@@ -782,6 +785,7 @@  int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev)
 	/* V4L2 Subdev */
 
 	v4l2_subdev_init(subdev, &sun6i_csi_bridge_subdev_ops);
+	subdev->internal_ops = &sun6i_csi_bridge_internal_ops;
 	strscpy(subdev->name, SUN6I_CSI_BRIDGE_NAME, sizeof(subdev->name));
 	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	subdev->owner = THIS_MODULE;
diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
index d2c9f5d20496..f9d4dc45b490 100644
--- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
+++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c
@@ -305,8 +305,8 @@  sun6i_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
 	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
 }
 
-static int sun6i_mipi_csi2_init_cfg(struct v4l2_subdev *subdev,
-				    struct v4l2_subdev_state *state)
+static int sun6i_mipi_csi2_init_state(struct v4l2_subdev *subdev,
+				      struct v4l2_subdev_state *state)
 {
 	struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
 	unsigned int pad = SUN6I_MIPI_CSI2_PAD_SINK;
@@ -385,7 +385,6 @@  static int sun6i_mipi_csi2_set_fmt(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops sun6i_mipi_csi2_pad_ops = {
-	.init_cfg	= sun6i_mipi_csi2_init_cfg,
 	.enum_mbus_code	= sun6i_mipi_csi2_enum_mbus_code,
 	.get_fmt	= sun6i_mipi_csi2_get_fmt,
 	.set_fmt	= sun6i_mipi_csi2_set_fmt,
@@ -396,6 +395,10 @@  static const struct v4l2_subdev_ops sun6i_mipi_csi2_subdev_ops = {
 	.pad	= &sun6i_mipi_csi2_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops sun6i_mipi_csi2_internal_ops = {
+	.init_state	= sun6i_mipi_csi2_init_state,
+};
+
 /* Media Entity */
 
 static const struct media_entity_operations sun6i_mipi_csi2_entity_ops = {
@@ -504,6 +507,7 @@  static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mipi_csi2_device *csi2_dev)
 	/* V4L2 Subdev */
 
 	v4l2_subdev_init(subdev, &sun6i_mipi_csi2_subdev_ops);
+	subdev->internal_ops = &sun6i_mipi_csi2_internal_ops;
 	strscpy(subdev->name, SUN6I_MIPI_CSI2_NAME, sizeof(subdev->name));
 	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	subdev->owner = THIS_MODULE;
diff --git a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
index d6275954af98..4a5698eb12b7 100644
--- a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
+++ b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c
@@ -338,8 +338,8 @@  sun8i_a83t_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
 	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
 }
 
-static int sun8i_a83t_mipi_csi2_init_cfg(struct v4l2_subdev *subdev,
-					 struct v4l2_subdev_state *state)
+static int sun8i_a83t_mipi_csi2_init_state(struct v4l2_subdev *subdev,
+					   struct v4l2_subdev_state *state)
 {
 	struct sun8i_a83t_mipi_csi2_device *csi2_dev =
 		v4l2_get_subdevdata(subdev);
@@ -422,7 +422,6 @@  static int sun8i_a83t_mipi_csi2_set_fmt(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops sun8i_a83t_mipi_csi2_pad_ops = {
-	.init_cfg	= sun8i_a83t_mipi_csi2_init_cfg,
 	.enum_mbus_code	= sun8i_a83t_mipi_csi2_enum_mbus_code,
 	.get_fmt	= sun8i_a83t_mipi_csi2_get_fmt,
 	.set_fmt	= sun8i_a83t_mipi_csi2_set_fmt,
@@ -433,6 +432,10 @@  static const struct v4l2_subdev_ops sun8i_a83t_mipi_csi2_subdev_ops = {
 	.pad	= &sun8i_a83t_mipi_csi2_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops sun8i_a83t_mipi_csi2_internal_ops = {
+	.init_state	= sun8i_a83t_mipi_csi2_init_state,
+};
+
 /* Media Entity */
 
 static const struct media_entity_operations sun8i_a83t_mipi_csi2_entity_ops = {
@@ -542,6 +545,7 @@  sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
 	/* V4L2 Subdev */
 
 	v4l2_subdev_init(subdev, &sun8i_a83t_mipi_csi2_subdev_ops);
+	subdev->internal_ops = &sun8i_a83t_mipi_csi2_internal_ops;
 	strscpy(subdev->name, SUN8I_A83T_MIPI_CSI2_NAME, sizeof(subdev->name));
 	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	subdev->owner = THIS_MODULE;
diff --git a/drivers/media/platform/ti/cal/cal-camerarx.c b/drivers/media/platform/ti/cal/cal-camerarx.c
index 61433744c6c4..4afc2ad00330 100644
--- a/drivers/media/platform/ti/cal/cal-camerarx.c
+++ b/drivers/media/platform/ti/cal/cal-camerarx.c
@@ -721,8 +721,8 @@  static int cal_camerarx_sd_set_fmt(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int cal_camerarx_sd_init_cfg(struct v4l2_subdev *sd,
-				    struct v4l2_subdev_state *state)
+static int cal_camerarx_sd_init_state(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_state *state)
 {
 	struct v4l2_subdev_format format = {
 		.which = state ? V4L2_SUBDEV_FORMAT_TRY
@@ -782,7 +782,6 @@  static const struct v4l2_subdev_video_ops cal_camerarx_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops cal_camerarx_pad_ops = {
-	.init_cfg = cal_camerarx_sd_init_cfg,
 	.enum_mbus_code = cal_camerarx_sd_enum_mbus_code,
 	.enum_frame_size = cal_camerarx_sd_enum_frame_size,
 	.get_fmt = v4l2_subdev_get_fmt,
@@ -795,6 +794,10 @@  static const struct v4l2_subdev_ops cal_camerarx_subdev_ops = {
 	.pad = &cal_camerarx_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops cal_camerarx_internal_ops = {
+	.init_state = cal_camerarx_sd_init_state,
+};
+
 static struct media_entity_operations cal_camerarx_media_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -846,6 +849,7 @@  struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
 	/* Initialize the V4L2 subdev and media entity. */
 	sd = &phy->subdev;
 	v4l2_subdev_init(sd, &cal_camerarx_subdev_ops);
+	sd->internal_ops = &cal_camerarx_internal_ops;
 	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
 	sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
 	snprintf(sd->name, sizeof(sd->name), "CAMERARX%u", instance);
diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c
index 06a28531ed02..31e9e92e723e 100644
--- a/drivers/media/platform/video-mux.c
+++ b/drivers/media/platform/video-mux.c
@@ -282,8 +282,8 @@  static int video_mux_set_format(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int video_mux_init_cfg(struct v4l2_subdev *sd,
-			      struct v4l2_subdev_state *sd_state)
+static int video_mux_init_state(struct v4l2_subdev *sd,
+				struct v4l2_subdev_state *sd_state)
 {
 	struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
 	struct v4l2_mbus_framefmt *mbusformat;
@@ -302,7 +302,6 @@  static int video_mux_init_cfg(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops video_mux_pad_ops = {
-	.init_cfg = video_mux_init_cfg,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = video_mux_set_format,
 };
@@ -312,6 +311,10 @@  static const struct v4l2_subdev_ops video_mux_subdev_ops = {
 	.video = &video_mux_subdev_video_ops,
 };
 
+static const struct v4l2_subdev_internal_ops video_mux_internal_ops = {
+	.init_state = video_mux_init_state,
+};
+
 static int video_mux_notify_bound(struct v4l2_async_notifier *notifier,
 				  struct v4l2_subdev *sd,
 				  struct v4l2_async_connection *asd)
@@ -400,6 +403,7 @@  static int video_mux_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, vmux);
 
 	v4l2_subdev_init(&vmux->subdev, &video_mux_subdev_ops);
+	vmux->subdev.internal_ops = &video_mux_internal_ops;
 	snprintf(vmux->subdev.name, sizeof(vmux->subdev.name), "%pOFn", np);
 	vmux->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	vmux->subdev.dev = dev;
diff --git a/drivers/media/platform/xilinx/xilinx-csi2rxss.c b/drivers/media/platform/xilinx/xilinx-csi2rxss.c
index bca8ec94ee35..f953d5474ae0 100644
--- a/drivers/media/platform/xilinx/xilinx-csi2rxss.c
+++ b/drivers/media/platform/xilinx/xilinx-csi2rxss.c
@@ -661,8 +661,8 @@  __xcsi2rxss_get_pad_format(struct xcsi2rxss_state *xcsi2rxss,
 	}
 }
 
-static int xcsi2rxss_init_cfg(struct v4l2_subdev *sd,
-			      struct v4l2_subdev_state *sd_state)
+static int xcsi2rxss_init_state(struct v4l2_subdev *sd,
+				struct v4l2_subdev_state *sd_state)
 {
 	struct xcsi2rxss_state *xcsi2rxss = to_xcsi2rxssstate(sd);
 	struct v4l2_mbus_framefmt *format;
@@ -780,7 +780,6 @@  static const struct v4l2_subdev_video_ops xcsi2rxss_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops xcsi2rxss_pad_ops = {
-	.init_cfg = xcsi2rxss_init_cfg,
 	.get_fmt = xcsi2rxss_get_format,
 	.set_fmt = xcsi2rxss_set_format,
 	.enum_mbus_code = xcsi2rxss_enum_mbus_code,
@@ -793,6 +792,10 @@  static const struct v4l2_subdev_ops xcsi2rxss_ops = {
 	.pad = &xcsi2rxss_pad_ops
 };
 
+static const struct v4l2_subdev_internal_ops xcsi2rxss_internal_ops = {
+	.init_state = xcsi2rxss_init_state,
+};
+
 static int xcsi2rxss_parse_of(struct xcsi2rxss_state *xcsi2rxss)
 {
 	struct device *dev = xcsi2rxss->dev;
@@ -970,6 +973,7 @@  static int xcsi2rxss_probe(struct platform_device *pdev)
 	/* Initialize V4L2 subdevice and media entity */
 	subdev = &xcsi2rxss->subdev;
 	v4l2_subdev_init(subdev, &xcsi2rxss_ops);
+	subdev->internal_ops = &xcsi2rxss_internal_ops;
 	subdev->dev = dev;
 	strscpy(subdev->name, dev_name(dev), sizeof(subdev->name));
 	subdev->flags |= V4L2_SUBDEV_FL_HAS_EVENTS | V4L2_SUBDEV_FL_HAS_DEVNODE;
diff --git a/drivers/media/test-drivers/vimc/vimc-debayer.c b/drivers/media/test-drivers/vimc/vimc-debayer.c
index a2fb32c97c84..d72ed086e00b 100644
--- a/drivers/media/test-drivers/vimc/vimc-debayer.c
+++ b/drivers/media/test-drivers/vimc/vimc-debayer.c
@@ -150,8 +150,8 @@  static bool vimc_debayer_src_code_is_valid(u32 code)
 	return false;
 }
 
-static int vimc_debayer_init_cfg(struct v4l2_subdev *sd,
-				 struct v4l2_subdev_state *sd_state)
+static int vimc_debayer_init_state(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_state *sd_state)
 {
 	struct vimc_debayer_device *vdebayer = v4l2_get_subdevdata(sd);
 	struct v4l2_mbus_framefmt *mf;
@@ -307,7 +307,6 @@  static int vimc_debayer_set_fmt(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops vimc_debayer_pad_ops = {
-	.init_cfg		= vimc_debayer_init_cfg,
 	.enum_mbus_code		= vimc_debayer_enum_mbus_code,
 	.enum_frame_size	= vimc_debayer_enum_frame_size,
 	.get_fmt		= vimc_debayer_get_fmt,
@@ -395,6 +394,10 @@  static const struct v4l2_subdev_ops vimc_debayer_ops = {
 	.video = &vimc_debayer_video_ops,
 };
 
+static const struct v4l2_subdev_internal_ops vimc_debayer_internal_ops = {
+	.init_state = vimc_debayer_init_state,
+};
+
 static unsigned int vimc_debayer_get_val(const u8 *bytes,
 					 const unsigned int n_bytes)
 {
@@ -595,6 +598,8 @@  static struct vimc_ent_device *vimc_debayer_add(struct vimc_device *vimc,
 	if (ret)
 		goto err_free_hdl;
 
+	vdebayer->sd.internal_ops = &vimc_debayer_internal_ops;
+
 	vdebayer->ved.process_frame = vimc_debayer_process_frame;
 	vdebayer->ved.dev = vimc->mdev.dev;
 	vdebayer->mean_win_size = vimc_debayer_ctrl_mean_win_size.def;
diff --git a/drivers/media/test-drivers/vimc/vimc-scaler.c b/drivers/media/test-drivers/vimc/vimc-scaler.c
index f6592a789f1e..afe13d6af321 100644
--- a/drivers/media/test-drivers/vimc/vimc-scaler.c
+++ b/drivers/media/test-drivers/vimc/vimc-scaler.c
@@ -70,8 +70,8 @@  vimc_scaler_get_crop_bound_sink(const struct v4l2_mbus_framefmt *sink_fmt)
 	return r;
 }
 
-static int vimc_scaler_init_cfg(struct v4l2_subdev *sd,
-			     struct v4l2_subdev_state *sd_state)
+static int vimc_scaler_init_state(struct v4l2_subdev *sd,
+				  struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *mf;
 	struct v4l2_rect *r;
@@ -292,7 +292,6 @@  static int vimc_scaler_set_selection(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops vimc_scaler_pad_ops = {
-	.init_cfg		= vimc_scaler_init_cfg,
 	.enum_mbus_code		= vimc_scaler_enum_mbus_code,
 	.enum_frame_size	= vimc_scaler_enum_frame_size,
 	.get_fmt		= vimc_scaler_get_fmt,
@@ -347,6 +346,10 @@  static const struct v4l2_subdev_ops vimc_scaler_ops = {
 	.video = &vimc_scaler_video_ops,
 };
 
+static const struct v4l2_subdev_internal_ops vimc_scaler_internal_ops = {
+	.init_state = vimc_scaler_init_state,
+};
+
 static void vimc_scaler_fill_src_frame(const struct vimc_scaler_device *const vscaler,
 				    const u8 *const sink_frame)
 {
@@ -424,6 +427,8 @@  static struct vimc_ent_device *vimc_scaler_add(struct vimc_device *vimc,
 		return ERR_PTR(ret);
 	}
 
+	vscaler->sd.internal_ops = &vimc_scaler_internal_ops;
+
 	vscaler->ved.process_frame = vimc_scaler_process_frame;
 	vscaler->ved.dev = vimc->mdev.dev;
 
diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
index 676ab503f0ca..5e34b1aed95e 100644
--- a/drivers/media/test-drivers/vimc/vimc-sensor.c
+++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
@@ -41,8 +41,8 @@  static const struct v4l2_mbus_framefmt fmt_default = {
 	.colorspace = V4L2_COLORSPACE_SRGB,
 };
 
-static int vimc_sensor_init_cfg(struct v4l2_subdev *sd,
-				struct v4l2_subdev_state *sd_state)
+static int vimc_sensor_init_state(struct v4l2_subdev *sd,
+				  struct v4l2_subdev_state *sd_state)
 {
 	unsigned int i;
 
@@ -183,7 +183,6 @@  static int vimc_sensor_set_fmt(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_pad_ops vimc_sensor_pad_ops = {
-	.init_cfg		= vimc_sensor_init_cfg,
 	.enum_mbus_code		= vimc_sensor_enum_mbus_code,
 	.enum_frame_size	= vimc_sensor_enum_frame_size,
 	.get_fmt		= vimc_sensor_get_fmt,
@@ -294,6 +293,10 @@  static const struct v4l2_subdev_ops vimc_sensor_ops = {
 	.video = &vimc_sensor_video_ops,
 };
 
+static const struct v4l2_subdev_internal_ops vimc_sensor_internal_ops = {
+	.init_state = vimc_sensor_init_state,
+};
+
 static int vimc_sensor_s_ctrl(struct v4l2_ctrl *ctrl)
 {
 	struct vimc_sensor_device *vsensor =
@@ -429,6 +432,8 @@  static struct vimc_ent_device *vimc_sensor_add(struct vimc_device *vimc,
 	if (ret)
 		goto err_free_tpg;
 
+	vsensor->sd.internal_ops = &vimc_sensor_internal_ops;
+
 	vsensor->ved.process_frame = vimc_sensor_process_frame;
 	vsensor->ved.dev = vimc->mdev.dev;
 
diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
index 985873b7981e..4fbefe4cd714 100644
--- a/drivers/media/v4l2-core/v4l2-subdev.c
+++ b/drivers/media/v4l2-core/v4l2-subdev.c
@@ -1460,16 +1460,18 @@  __v4l2_subdev_state_alloc(struct v4l2_subdev *sd, const char *lock_name,
 		}
 	}
 
-	/*
-	 * There can be no race at this point, but we lock the state anyway to
-	 * satisfy lockdep checks.
-	 */
-	v4l2_subdev_lock_state(state);
-	ret = v4l2_subdev_call(sd, pad, init_cfg, state);
-	v4l2_subdev_unlock_state(state);
+	if (sd->internal_ops && sd->internal_ops->init_state) {
+		/*
+		 * There can be no race at this point, but we lock the state
+		 * anyway to satisfy lockdep checks.
+		 */
+		v4l2_subdev_lock_state(state);
+		ret = sd->internal_ops->init_state(sd, state);
+		v4l2_subdev_unlock_state(state);
 
-	if (ret < 0 && ret != -ENOIOCTLCMD)
-		goto err;
+		if (ret)
+			goto err;
+	}
 
 	return state;
 
diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media/imx/imx-ic-prp.c
index 61d69f19657e..8bd9be49cc08 100644
--- a/drivers/staging/media/imx/imx-ic-prp.c
+++ b/drivers/staging/media/imx/imx-ic-prp.c
@@ -448,7 +448,6 @@  static int prp_registered(struct v4l2_subdev *sd)
 }
 
 static const struct v4l2_subdev_pad_ops prp_pad_ops = {
-	.init_cfg = imx_media_init_cfg,
 	.enum_mbus_code = prp_enum_mbus_code,
 	.get_fmt = prp_get_fmt,
 	.set_fmt = prp_set_fmt,
@@ -472,6 +471,7 @@  static const struct v4l2_subdev_ops prp_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops prp_internal_ops = {
+	.init_state = imx_media_init_state,
 	.registered = prp_registered,
 };
 
diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c
index ec73c901079e..04878f07eeba 100644
--- a/drivers/staging/media/imx/imx-ic-prpencvf.c
+++ b/drivers/staging/media/imx/imx-ic-prpencvf.c
@@ -1296,7 +1296,6 @@  static void prp_unregistered(struct v4l2_subdev *sd)
 }
 
 static const struct v4l2_subdev_pad_ops prp_pad_ops = {
-	.init_cfg = imx_media_init_cfg,
 	.enum_mbus_code = prp_enum_mbus_code,
 	.enum_frame_size = prp_enum_frame_size,
 	.get_fmt = prp_get_fmt,
@@ -1320,6 +1319,7 @@  static const struct v4l2_subdev_ops prp_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops prp_internal_ops = {
+	.init_state = imx_media_init_state,
 	.registered = prp_registered,
 	.unregistered = prp_unregistered,
 };
diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
index 33902f5daf80..2fc94011fe4d 100644
--- a/drivers/staging/media/imx/imx-media-csi.c
+++ b/drivers/staging/media/imx/imx-media-csi.c
@@ -1866,7 +1866,6 @@  static const struct v4l2_subdev_video_ops csi_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops csi_pad_ops = {
-	.init_cfg = imx_media_init_cfg,
 	.enum_mbus_code = csi_enum_mbus_code,
 	.enum_frame_size = csi_enum_frame_size,
 	.enum_frame_interval = csi_enum_frame_interval,
@@ -1884,6 +1883,7 @@  static const struct v4l2_subdev_ops csi_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops csi_internal_ops = {
+	.init_state = imx_media_init_state,
 	.registered = csi_registered,
 	.unregistered = csi_unregistered,
 };
diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c
index ec4349ab48cd..1b5af8945e6b 100644
--- a/drivers/staging/media/imx/imx-media-utils.c
+++ b/drivers/staging/media/imx/imx-media-utils.c
@@ -426,10 +426,10 @@  EXPORT_SYMBOL_GPL(imx_media_init_mbus_fmt);
 
 /*
  * Initializes the TRY format to the ACTIVE format on all pads
- * of a subdev. Can be used as the .init_cfg pad operation.
+ * of a subdev. Can be used as the .init_state internal operation.
  */
-int imx_media_init_cfg(struct v4l2_subdev *sd,
-		       struct v4l2_subdev_state *sd_state)
+int imx_media_init_state(struct v4l2_subdev *sd,
+			 struct v4l2_subdev_state *sd_state)
 {
 	struct v4l2_mbus_framefmt *mf_try;
 	unsigned int pad;
@@ -451,7 +451,7 @@  int imx_media_init_cfg(struct v4l2_subdev *sd,
 
 	return 0;
 }
-EXPORT_SYMBOL_GPL(imx_media_init_cfg);
+EXPORT_SYMBOL_GPL(imx_media_init_state);
 
 /*
  * Default the colorspace in tryfmt to SRGB if set to an unsupported
diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c
index 792bca1d2d25..810b38ea3ab9 100644
--- a/drivers/staging/media/imx/imx-media-vdic.c
+++ b/drivers/staging/media/imx/imx-media-vdic.c
@@ -882,7 +882,6 @@  static void vdic_unregistered(struct v4l2_subdev *sd)
 }
 
 static const struct v4l2_subdev_pad_ops vdic_pad_ops = {
-	.init_cfg = imx_media_init_cfg,
 	.enum_mbus_code = vdic_enum_mbus_code,
 	.get_fmt = vdic_get_fmt,
 	.set_fmt = vdic_set_fmt,
@@ -906,6 +905,7 @@  static const struct v4l2_subdev_ops vdic_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops vdic_internal_ops = {
+	.init_state = imx_media_init_state,
 	.registered = vdic_registered,
 	.unregistered = vdic_unregistered,
 };
diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h
index 2640cd34dce2..f095d9134fee 100644
--- a/drivers/staging/media/imx/imx-media.h
+++ b/drivers/staging/media/imx/imx-media.h
@@ -192,8 +192,8 @@  static inline int imx_media_enum_ipu_formats(u32 *code, u32 index,
 int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
 			    u32 width, u32 height, u32 code, u32 field,
 			    const struct imx_media_pixfmt **cc);
-int imx_media_init_cfg(struct v4l2_subdev *sd,
-		       struct v4l2_subdev_state *sd_state);
+int imx_media_init_state(struct v4l2_subdev *sd,
+			 struct v4l2_subdev_state *sd_state);
 void imx_media_try_colorimetry(struct v4l2_mbus_framefmt *tryfmt,
 			       bool ic_route);
 int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index 6906220ee89e..0d8b42061623 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -619,7 +619,6 @@  static const struct v4l2_subdev_video_ops csi2_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops csi2_pad_ops = {
-	.init_cfg = imx_media_init_cfg,
 	.get_fmt = csi2_get_fmt,
 	.set_fmt = csi2_set_fmt,
 };
@@ -631,6 +630,7 @@  static const struct v4l2_subdev_ops csi2_subdev_ops = {
 };
 
 static const struct v4l2_subdev_internal_ops csi2_internal_ops = {
+	.init_state = imx_media_init_state,
 	.registered = csi2_registered,
 };
 
diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
index 893dbd8cddc8..6bffffb2b20c 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.c
+++ b/drivers/staging/media/starfive/camss/stf-isp.c
@@ -311,7 +311,6 @@  static const struct v4l2_subdev_video_ops isp_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops isp_pad_ops = {
-	.init_cfg = isp_init_formats,
 	.enum_mbus_code = isp_enum_mbus_code,
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = isp_set_format,
@@ -324,6 +323,10 @@  static const struct v4l2_subdev_ops isp_v4l2_ops = {
 	.pad = &isp_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops isp_internal_ops = {
+	.init_state = isp_init_formats,
+};
+
 static const struct media_entity_operations isp_media_ops = {
 	.link_validate = v4l2_subdev_link_validate,
 };
@@ -335,6 +338,7 @@  int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev)
 	int ret;
 
 	v4l2_subdev_init(sd, &isp_v4l2_ops);
+	sd->internal_ops = &isp_internal_ops;
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	snprintf(sd->name, ARRAY_SIZE(sd->name), "stf_isp");
 	v4l2_set_subdevdata(sd, isp_dev);
diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
index b2ce0d4fae95..46a334b602f1 100644
--- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
+++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c
@@ -256,8 +256,8 @@  sun6i_isp_proc_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format)
 	mbus_format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
 }
 
-static int sun6i_isp_proc_init_cfg(struct v4l2_subdev *subdev,
-				   struct v4l2_subdev_state *state)
+static int sun6i_isp_proc_init_state(struct v4l2_subdev *subdev,
+				     struct v4l2_subdev_state *state)
 {
 	struct sun6i_isp_device *isp_dev = v4l2_get_subdevdata(subdev);
 	unsigned int pad = SUN6I_ISP_PROC_PAD_SINK_CSI;
@@ -336,7 +336,6 @@  static int sun6i_isp_proc_set_fmt(struct v4l2_subdev *subdev,
 }
 
 static const struct v4l2_subdev_pad_ops sun6i_isp_proc_pad_ops = {
-	.init_cfg	= sun6i_isp_proc_init_cfg,
 	.enum_mbus_code	= sun6i_isp_proc_enum_mbus_code,
 	.get_fmt	= sun6i_isp_proc_get_fmt,
 	.set_fmt	= sun6i_isp_proc_set_fmt,
@@ -347,6 +346,10 @@  static const struct v4l2_subdev_ops sun6i_isp_proc_subdev_ops = {
 	.pad	= &sun6i_isp_proc_pad_ops,
 };
 
+static const struct v4l2_subdev_internal_ops sun6i_isp_proc_internal_ops = {
+	.init_state = sun6i_isp_proc_init_state,
+};
+
 /* Media Entity */
 
 static const struct media_entity_operations sun6i_isp_proc_entity_ops = {
@@ -501,6 +504,7 @@  int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_dev)
 	/* V4L2 Subdev */
 
 	v4l2_subdev_init(subdev, &sun6i_isp_proc_subdev_ops);
+	subdev->internal_ops = &sun6i_isp_proc_internal_ops;
 	strscpy(subdev->name, SUN6I_ISP_PROC_NAME, sizeof(subdev->name));
 	subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	subdev->owner = THIS_MODULE;
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 2a438e516095..8b08f6640dee 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -771,7 +771,6 @@  struct v4l2_subdev_state {
 /**
  * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
  *
- * @init_cfg: initialize the subdev state to default values
  * @enum_mbus_code: callback for VIDIOC_SUBDEV_ENUM_MBUS_CODE() ioctl handler
  *		    code.
  * @enum_frame_size: callback for VIDIOC_SUBDEV_ENUM_FRAME_SIZE() ioctl handler
@@ -836,8 +835,6 @@  struct v4l2_subdev_state {
  *	directly, use v4l2_subdev_disable_streams() instead.
  */
 struct v4l2_subdev_pad_ops {
-	int (*init_cfg)(struct v4l2_subdev *sd,
-			struct v4l2_subdev_state *state);
 	int (*enum_mbus_code)(struct v4l2_subdev *sd,
 			      struct v4l2_subdev_state *state,
 			      struct v4l2_subdev_mbus_code_enum *code);
@@ -914,6 +911,8 @@  struct v4l2_subdev_ops {
 /**
  * struct v4l2_subdev_internal_ops - V4L2 subdev internal ops
  *
+ * @init_state: initialize the subdev state to default values
+ *
  * @registered: called when this subdev is registered. When called the v4l2_dev
  *	field is set to the correct v4l2_device.
  *
@@ -939,6 +938,8 @@  struct v4l2_subdev_ops {
  *	these ops.
  */
 struct v4l2_subdev_internal_ops {
+	int (*init_state)(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_state *state);
 	int (*registered)(struct v4l2_subdev *sd);
 	void (*unregistered)(struct v4l2_subdev *sd);
 	int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);