Re: [RFC PATCH v3 16/18] gpu: host1x: mipi: Split tegra_mipi_calibrate and tegra_mipi_wait

From: Sowjanya Komatineni
Date: Fri Jul 17 2020 - 11:38:38 EST



On 7/17/20 8:01 AM, Dmitry Osipenko wrote:
17.07.2020 07:46, Sowjanya Komatineni ÐÐÑÐÑ:
...
Looks like sequence posted in TRM need to be updated clearly for proper
MIPI CAL start and wait.

Correct steps should be like below

1. Set up CSI registers for use case such as number of lanes, virtual
channel, etc.
2. Initialize and power up CSI CIL interface
3. Program MIPI CAL bias pads, cal configs, cal control registers and
enable calibration start
4. Power up camera through the I2C interface and start sensor streaming
through the I2C

Note: All sensors might not leave pads in LP-11 state as sensor may be
power down when not in use.

So start streaming prior to checking for calibration done status as
LP-11 -> HS transition happens during sensor stream and calibration
logic can apply results to pads and update done status,

5. Wait for done signal from calibration logic

6. perform frame capture thru VI
7. Frame done, CSI goes back to stop state, LP11

Will work internally to correct sequence in TRM ...
Will be nice to have an updated TRM, thank you!

Also, what about the auto-calibration? Isn't it needed to be enabled for
CSI?
STARTCAL does one time calibration and with AUTOCAL calibration will be triggered periodically.

For pads PULLUP/PULLDN/TERM impedance calibration, we only need one-time calibration on pads power up.

We always use one time pads calibration for CSI.


In mipi driver will update as below to have mipi clk enabled till
calibration status check is done.

Always tegra_mipi_wait() followes tegra_mipi_calibrate() in both DSI and
CSI. So below sequence should work good.

tegra_mipi_calibrate()

- clk_enable mipi cal
- program mipi cal registers (bias pads cfgs, mipi cal ctrl and trigger
calibration start)

tegra_mipi_wait()
- read mipi cal status and wait for active and done bits
- clk_disable mipi cal

Maybe then it should be better to rename the functions like this:

tegra_mipi_calibrate() -> tegra_mipi_start_calibration()
tegra_mipi_wait() -> tegra_mipi_finish_calibration().

and there also should be tegra_mipi_cancel_calibration().


Example:

tegra_mipi_start_calibration();

ret = v4l2_subdev_call(subdev, video, s_stream, on);
if (ret < 0) {
tegra_mipi_cancel_calibration();
goto err;
}

tegra_mipi_finish_calibration();