From 712498786b178e77c00f2196e0da01b50b8ebf3b Mon Sep 17 00:00:00 2001 From: Jason Chen Date: Fri, 10 May 2024 19:41:00 +0800 Subject: [PATCH] ipu7: Fix compilation with kernels v6.8 kernel 6.8 has some changes for v4l2 asynchronize notifier, stream-aware state functions, and mm/gup changes. --- drivers/media/pci/intel/cio2-bridge.c | 1 + .../media/pci/intel/ipu7/ipu-isys-subdev.c | 12 +++---- drivers/media/pci/intel/ipu7/ipu-isys.c | 32 +++---------------- drivers/media/pci/intel/ipu7/ipu-psys.c | 2 +- include/media/ipu-isys.h | 2 +- 5 files changed, 13 insertions(+), 36 deletions(-) diff --git a/drivers/media/pci/intel/cio2-bridge.c b/drivers/media/pci/intel/cio2-bridge.c index f3808d3..f0f8016 100644 --- a/drivers/media/pci/intel/cio2-bridge.c +++ b/drivers/media/pci/intel/cio2-bridge.c @@ -461,6 +461,7 @@ static int cio2_bridge_sensors_are_ready(void) return ready; } +int cio2_bridge_init(struct pci_dev *cio2); int cio2_bridge_init(struct pci_dev *cio2) { diff --git a/drivers/media/pci/intel/ipu7/ipu-isys-subdev.c b/drivers/media/pci/intel/ipu7/ipu-isys-subdev.c index 3d826e7..9352c3a 100644 --- a/drivers/media/pci/intel/ipu7/ipu-isys-subdev.c +++ b/drivers/media/pci/intel/ipu7/ipu-isys-subdev.c @@ -143,7 +143,7 @@ struct v4l2_mbus_framefmt *__ipu_isys_get_ffmt(struct v4l2_subdev *sd, if (which == V4L2_SUBDEV_FORMAT_ACTIVE) return &asd->ffmt[pad]; else - return v4l2_subdev_get_try_format(sd, state, pad); + return v4l2_subdev_state_get_format(state, pad); } struct v4l2_rect *__ipu_isys_get_selection(struct v4l2_subdev *sd, @@ -163,9 +163,9 @@ struct v4l2_rect *__ipu_isys_get_selection(struct v4l2_subdev *sd, } else { switch (target) { case V4L2_SEL_TGT_CROP: - return v4l2_subdev_get_try_crop(sd, state, pad); + return v4l2_subdev_state_get_crop(state, pad); case V4L2_SEL_TGT_COMPOSE: - return v4l2_subdev_get_try_compose(sd, state, pad); + return v4l2_subdev_state_get_compose(state, pad); } } WARN_ON(1); @@ -551,11 +551,11 @@ int ipu_isys_subdev_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) for (i = 0; i < asd->sd.entity.num_pads; i++) { struct v4l2_mbus_framefmt *try_fmt = - v4l2_subdev_get_try_format(sd, fh->state, i); + v4l2_subdev_state_get_format(fh->state, i); struct v4l2_rect *try_crop = - v4l2_subdev_get_try_crop(sd, fh->state, i); + v4l2_subdev_state_get_crop(fh->state, i); struct v4l2_rect *try_compose = - v4l2_subdev_get_try_compose(sd, fh->state, i); + v4l2_subdev_state_get_compose(fh->state, i); *try_fmt = asd->ffmt[i]; *try_crop = asd->crop[i]; diff --git a/drivers/media/pci/intel/ipu7/ipu-isys.c b/drivers/media/pci/intel/ipu7/ipu-isys.c index 04e788c..c74c796 100644 --- a/drivers/media/pci/intel/ipu7/ipu-isys.c +++ b/drivers/media/pci/intel/ipu7/ipu-isys.c @@ -247,7 +247,7 @@ static int isys_fw_log_init(struct ipu_isys *isys) /* The .bound() notifier callback when a match is found */ static int isys_notifier_bound(struct v4l2_async_notifier *notifier, struct v4l2_subdev *sd, - struct v4l2_async_subdev *asd) + struct v4l2_async_connection *asd) { struct ipu_isys *isys = container_of(notifier, struct ipu_isys, notifier); @@ -276,43 +276,19 @@ static const struct v4l2_async_notifier_operations isys_async_ops = { .complete = isys_notifier_complete, }; -static int isys_fwnode_parse(struct device *dev, - struct v4l2_fwnode_endpoint *vep, - struct v4l2_async_subdev *asd) -{ - struct sensor_async_subdev *s_asd = - container_of(asd, struct sensor_async_subdev, asd); - - s_asd->csi2.port = vep->base.port; - s_asd->csi2.nlanes = vep->bus.mipi_csi2.num_data_lanes; - - return 0; -} - static int isys_notifier_init(struct ipu_isys *isys) { - struct ipu_device *isp = isys->adev->isp; - size_t asd_struct_size = sizeof(struct sensor_async_subdev); int ret; - v4l2_async_nf_init(&isys->notifier); - ret = v4l2_async_nf_parse_fwnode_endpoints(&isp->pdev->dev, - &isys->notifier, - asd_struct_size, - isys_fwnode_parse); - if (ret < 0) { - dev_err(&isys->adev->dev, - "v4l2 parse_fwnode_endpoints() failed: %d\n", ret); - return ret; - } - if (list_empty(&isys->notifier.asd_list)) { + v4l2_async_nf_init(&isys->notifier, &isys->v4l2_dev); + if (list_empty(&isys->notifier.waiting_list)) { /* isys probe could continue with async subdevs missing */ dev_warn(&isys->adev->dev, "no subdev found in graph\n"); return 0; } isys->notifier.ops = &isys_async_ops; - ret = v4l2_async_nf_register(&isys->v4l2_dev, &isys->notifier); + ret = v4l2_async_nf_register(&isys->notifier); if (ret) { dev_err(&isys->adev->dev, "failed to register async notifier : %d\n", ret); diff --git a/drivers/media/pci/intel/ipu7/ipu-psys.c b/drivers/media/pci/intel/ipu7/ipu-psys.c index 8e81b42..0da040d 100644 --- a/drivers/media/pci/intel/ipu7/ipu-psys.c +++ b/drivers/media/pci/intel/ipu7/ipu-psys.c @@ -106,7 +106,7 @@ static int ipu_psys_get_userpages(struct ipu_dma_buf_attach *attach) } nr = get_user_pages(start & PAGE_MASK, npages, - FOLL_WRITE, pages, NULL); + FOLL_WRITE, pages); if (nr < npages) goto error_up_read; diff --git a/include/media/ipu-isys.h b/include/media/ipu-isys.h index b75febf..484ea51 100644 --- a/include/media/ipu-isys.h +++ b/include/media/ipu-isys.h @@ -37,7 +37,7 @@ struct ipu_isys_subdev_pdata { }; struct sensor_async_subdev { - struct v4l2_async_subdev asd; + struct v4l2_async_connection asd; struct ipu_isys_csi2_config csi2; };