int err = 0;
if (enable) {
+ tegra_mipi_bias_pad_enable();
err = csi->fops->csi_power_on(csi);
if (!err)
atomic_inc(&csi->power_ref);
} else {
err = csi->fops->csi_power_off(csi);
+ tegra_mipi_bias_pad_disable();
if (!err)
atomic_dec(&csi->power_ref);
}
ret = update_video_source(csi, enable, chan->pg_mode);
if (ret)
return ret;
- if (!chan->pg_mode) {
- if (enable) {
- tegra_mipi_bias_pad_enable();
+ if (!chan->pg_mode)
+ if (enable)
csi->fops->mipical(chan);
- } else
- tegra_mipi_bias_pad_disable();
- }
+
if (tegra_chan->bypass) {
atomic_set(&chan->is_streaming, enable);
return 0;
update_video_source(csi, 0, chan->pg_mode);
for (i = 0; i < tegra_chan->valid_ports; i++)
tegra_csi_stop_streaming(chan, i);
- tegra_mipi_bias_pad_disable();
return ret;
}
{
int num_sd;
int ret = 0;
+ int err = 0;
+ struct v4l2_subdev *sd;
if (atomic_read(&chan->is_streaming) == on)
return 0;
- for (num_sd = chan->num_subdevs - 1; num_sd >= 0; num_sd--) {
- struct v4l2_subdev *sd = chan->subdev[num_sd];
- int err = 0;
+ if (on) {
+ /* Enable CSI before sensor. Reason is as follows:
+ * CSI is able to catch the very first clk transition.
+ * Ensure mipi calibration is done before transmission/first frame data.
+ * TODO:Ensure deskew is setup properly before first deskew sync signal.
+ */
+ for (num_sd = 0; num_sd < chan->num_subdevs; num_sd++) {
+ sd = chan->subdev[num_sd];
- err = v4l2_subdev_call(sd, video, s_stream, on);
- if (!ret && err < 0 && err != -ENOIOCTLCMD)
- ret = err;
+ err = v4l2_subdev_call(sd, video, s_stream, on);
+ if (!ret && err < 0 && err != -ENOIOCTLCMD)
+ ret = err;
+ }
+ } else {
+ for (num_sd = chan->num_subdevs - 1; num_sd >= 0; num_sd--) {
+ sd = chan->subdev[num_sd];
+
+ err = v4l2_subdev_call(sd, video, s_stream, on);
+ if (!ret && err < 0 && err != -ENOIOCTLCMD)
+ ret = err;
+ }
}
atomic_set(&chan->is_streaming, on);
-
return ret;
}
{
int num_sd;
int ret = 0;
+ int err = 0;
+ struct v4l2_subdev *sd;
- for (num_sd = 0; num_sd < chan->num_subdevs; num_sd++) {
- struct v4l2_subdev *sd = chan->subdev[num_sd];
- int err = 0;
+ if (on) {
+ for (num_sd = 0; num_sd < chan->num_subdevs; num_sd++) {
+ sd = chan->subdev[num_sd];
- err = v4l2_subdev_call(sd, core, s_power, on);
- if (!ret && err < 0 && err != -ENOIOCTLCMD)
- ret = err;
+ err = v4l2_subdev_call(sd, core, s_power, on);
+ if (!ret && err < 0 && err != -ENOIOCTLCMD)
+ ret = err;
+ }
+ } else {
+ for (num_sd = chan->num_subdevs - 1; num_sd >= 0; num_sd--) {
+ sd = chan->subdev[num_sd];
+
+ err = v4l2_subdev_call(sd, core, s_power, on);
+ if (!ret && err < 0 && err != -ENOIOCTLCMD)
+ ret = err;
+ }
}
return ret;