diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index d355c30f2638..de984c1b0b9d 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -2173,7 +2173,9 @@ int rkcif_update_sensor_info(struct rkcif_stream *stream) sensor = sd_to_sensor(stream->cifdev, sensor_sd); if (!sensor) { - v4l2_err(&stream->cifdev->v4l2_dev, "get sensor for updating failed!\n"); + v4l2_err(&stream->cifdev->v4l2_dev, + "%s: stream[%d] get remote sensor failed!\n", + __func__, stream->id); return -ENODEV; } ret = v4l2_subdev_call(sensor->sd, video, g_mbus_config, @@ -2205,6 +2207,10 @@ int rkcif_update_sensor_info(struct rkcif_stream *stream) terminal_sensor->lanes = 4; break; default: + v4l2_err(&stream->cifdev->v4l2_dev, "%s:get sd:%s lane num failed!\n", + __func__, + terminal_sensor->sd ? + terminal_sensor->sd->name : "null"); return -EINVAL; } diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index 63dd9bb32f58..eedf767dc5e7 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -542,6 +542,16 @@ static int _set_pipeline_default_fmt(struct rkcif_device *dev) return 0; } +static void subdev_itf_register_work(struct work_struct *work) +{ + struct rkcif_device *dev = container_of(work, + struct rkcif_device, + async_register_work); + + if (dev->chip_id >= CHIP_RK1808_CIF) + platform_driver_register(&rkcif_subdev_driver); +} + static int subdev_notifier_complete(struct v4l2_async_notifier *notifier) { struct rkcif_device *dev; @@ -586,6 +596,14 @@ static int subdev_notifier_complete(struct v4l2_async_notifier *notifier) if (ret < 0) goto unregister_lvds; + INIT_WORK(&dev->async_register_work, subdev_itf_register_work); + if (schedule_work(&dev->async_register_work)) + v4l2_info(&dev->v4l2_dev, + "async register subdev itf successfully\n"); + else + v4l2_info(&dev->v4l2_dev, + "async register subdev itf failed\n"); + v4l2_info(&dev->v4l2_dev, "Async subdev notifier completed\n"); return ret; diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index 4c2d36be8a57..045282ad485e 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -503,6 +503,7 @@ struct rkcif_device { struct notifier_block reset_notifier; /* reset for mipi csi crc err */ struct rkcif_work_struct reset_work; struct rkcif_timer reset_watchdog_timer; + struct work_struct async_register_work; unsigned int buf_wake_up_cnt; bool iommu_en; diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c index 6e8cfda5ae6b..cffdb7e45a1e 100644 --- a/drivers/media/platform/rockchip/cif/hw.c +++ b/drivers/media/platform/rockchip/cif/hw.c @@ -930,10 +930,8 @@ static int rkcif_plat_hw_probe(struct platform_device *pdev) if (data->chip_id == CHIP_RK1808_CIF || data->chip_id == CHIP_RV1126_CIF || - data->chip_id == CHIP_RK3568_CIF) { + data->chip_id == CHIP_RK3568_CIF) platform_driver_register(&rkcif_plat_drv); - platform_driver_register(&rkcif_subdev_driver); - } return 0; } diff --git a/drivers/media/platform/rockchip/cif/version.h b/drivers/media/platform/rockchip/cif/version.h index bf7c3923fda9..10e34d363367 100644 --- a/drivers/media/platform/rockchip/cif/version.h +++ b/drivers/media/platform/rockchip/cif/version.h @@ -56,6 +56,7 @@ *4. add extended lines to out image for normal & hdr short frame *5. modify reset mechanism drivered by real-time frame rate *6. support rk356x iommu uses vb2 sg type + *7. register cif sd itf when pipeline completed */ #define RKCIF_DRIVER_VERSION RKCIF_API_VERSION