From 69c58b5620410e11242481b91367e76dc281d3c3 Mon Sep 17 00:00:00 2001 From: David Bang Date: Mon, 18 Dec 2017 12:54:12 -0500 Subject: [PATCH] drivers: camera: Fix Mipi Calibration sequence MIPI calibration can happen irrespective of sensor state by keeping CSI CIL in reset state. This change adds calibration to complete when the CSI is powered ON and based on the sensor settings. By this approach the mipi lanes are calibrated and are ready as soon as sensor is turned ON. Bug 200324656 Change-Id: Id2cd6336395d3a0f0b2637207eb4fdfe6edc3d63 Signed-off-by: David Bang Reviewed-on: https://git-master.nvidia.com/r/1560331 Reviewed-on: https://git-master.nvidia.com/r/1620523 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Bhanu Murthy V Reviewed-by: Jihoon Bang Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/media/platform/tegra/camera/csi/csi.c | 31 ++++++++++++++++--- drivers/media/platform/tegra/camera/csi/csi.h | 2 ++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/tegra/camera/csi/csi.c b/drivers/media/platform/tegra/camera/csi/csi.c index f2bcff1eb086..febccc2f8faf 100644 --- a/drivers/media/platform/tegra/camera/csi/csi.c +++ b/drivers/media/platform/tegra/camera/csi/csi.c @@ -85,15 +85,11 @@ static int tegra_csi_power(struct tegra_csi_device *csi, int err = 0; if (enable) { - tegra_mipi_bias_pad_enable(); err = csi->fops->csi_power_on(csi); if (!err) atomic_inc(&csi->power_ref); - if (!chan->pg_mode) - csi->fops->mipical(chan); } else { err = csi->fops->csi_power_off(csi); - tegra_mipi_bias_pad_disable(); if (!err) atomic_dec(&csi->power_ref); } @@ -817,6 +813,33 @@ void tpg_csi_media_controller_cleanup(struct tegra_csi_device *csi) csi->tpg_start = NULL; } EXPORT_SYMBOL(tpg_csi_media_controller_cleanup); + +int tegra_csi_mipi_calibrate(struct tegra_csi_device *csi, + bool on) +{ + struct tegra_csi_channel *chan; + + if (!on) { + tegra_mipi_bias_pad_disable(); + return 0; + } + + tegra_mipi_bias_pad_enable(); + list_for_each_entry(chan, &csi->csi_chans, list) { + int ret = 0; + + if (chan->pg_mode) + continue; + + ret = csi->fops->mipical(chan); + if (ret) + dev_err(csi->dev, + "calibration failed with %d error\n", ret); + } + + return 0; +} + int tegra_csi_media_controller_init(struct tegra_csi_device *csi, struct platform_device *pdev) { diff --git a/drivers/media/platform/tegra/camera/csi/csi.h b/drivers/media/platform/tegra/camera/csi/csi.h index a7c313f65d42..4611a99d6cdb 100644 --- a/drivers/media/platform/tegra/camera/csi/csi.h +++ b/drivers/media/platform/tegra/camera/csi/csi.h @@ -151,6 +151,8 @@ void tegra_csi_stop_streaming(struct tegra_csi_channel *chan, enum tegra_csi_port_num port_num); void tegra_csi_error_recover(struct tegra_csi_channel *chan, enum tegra_csi_port_num port_num); +int tegra_csi_mipi_calibrate(struct tegra_csi_device *csi, + bool on); int tegra_csi_init(struct tegra_csi_device *csi, struct platform_device *pdev); int tegra_csi_media_controller_init(struct tegra_csi_device *csi, -- 2.39.2