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);
}
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)
{
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,