05.08.2020 19:33, Sowjanya Komatineni пишет: > > On 8/5/20 7:19 AM, Dmitry Osipenko wrote: >> 05.08.2020 17:05, Dmitry Osipenko пишет: >>> 05.08.2020 16:46, Thierry Reding пишет: >>>> On Mon, Aug 03, 2020 at 08:42:24AM -0700, Sowjanya Komatineni wrote: >>>>> With the split of MIPI calibration into tegra_mipi_calibrate() and >>>>> tegra_mipi_wait(), MIPI clock is not kept enabled till the calibration >>>>> is done. >>>>> >>>>> So, this patch skips disabling MIPI clock after triggering start of >>>>> calibration and disables it only after waiting for done status from >>>>> the calibration logic. >>>>> >>>>> This patch renames tegra_mipi_calibrate() as >>>>> tegra_mipi_start_calibration() >>>>> and tegra_mipi_wait() as tegra_mipi_finish_calibration() to be inline >>>>> with their usage. >>>>> >>>>> As MIPI clock is left enabled and in case of any failures with CSI >>>>> input >>>>> streaming tegra_mipi_finish_calibration() will not get invoked. >>>>> So added new API tegra_mipi_cancel_calibration() which disables >>>>> MIPI clock >>>>> and consumer drivers can call this in such cases. >>>>> >>>>> Reviewed-by: Dmitry Osipenko <digetx@xxxxxxxxx> >>>>> Signed-off-by: Sowjanya Komatineni <skomatineni@xxxxxxxxxx> >>>>> --- >>>>> drivers/gpu/drm/tegra/dsi.c | 4 ++-- >>>>> drivers/gpu/host1x/mipi.c | 19 ++++++++++--------- >>>>> include/linux/host1x.h | 5 +++-- >>>>> 3 files changed, 15 insertions(+), 13 deletions(-) >>>>> >>>>> diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c >>>>> index 3820e8d..a7864e9 100644 >>>>> --- a/drivers/gpu/drm/tegra/dsi.c >>>>> +++ b/drivers/gpu/drm/tegra/dsi.c >>>>> @@ -694,11 +694,11 @@ static int tegra_dsi_pad_calibrate(struct >>>>> tegra_dsi *dsi) >>>>> DSI_PAD_PREEMP_PD(0x03) | DSI_PAD_PREEMP_PU(0x3); >>>>> tegra_dsi_writel(dsi, value, DSI_PAD_CONTROL_3); >>>>> - err = tegra_mipi_calibrate(dsi->mipi); >>>>> + err = tegra_mipi_start_calibration(dsi->mipi); >>>>> if (err < 0) >>>>> return err; >>>>> - return tegra_mipi_wait(dsi->mipi); >>>>> + return tegra_mipi_finish_calibration(dsi->mipi); >>>>> } >>>>> static void tegra_dsi_set_timeout(struct tegra_dsi *dsi, >>>>> unsigned long bclk, >>>>> diff --git a/drivers/gpu/host1x/mipi.c b/drivers/gpu/host1x/mipi.c >>>>> index e606464..b15ab6e 100644 >>>>> --- a/drivers/gpu/host1x/mipi.c >>>>> +++ b/drivers/gpu/host1x/mipi.c >>>>> @@ -293,17 +293,19 @@ int tegra_mipi_disable(struct >>>>> tegra_mipi_device *dev) >>>>> } >>>>> EXPORT_SYMBOL(tegra_mipi_disable); >>>>> -int tegra_mipi_wait(struct tegra_mipi_device *device) >>>>> +void tegra_mipi_cancel_calibration(struct tegra_mipi_device *device) >>>>> +{ >>>>> + clk_disable(device->mipi->clk); >>>> Do we need to do anything with the MIPI_CAL_CTRL and MIPI_CAL_STATUS >>>> registers here? We don't clear the START bit in the former when the >>>> calibration has successfully finished, but I suspect that's because >>>> the bit is self-clearing. But I wonder if we still need to clear it >>>> upon cancellation to make sure the calibration does indeed stop. >>> Apparently there is no way to explicitly stop calibration other than to >>> reset MIPI calibration block, but Sowjanya says this is unnecessary. >>> >>> Perhaps having a fixed delay before disabling clock could be enough to >>> ensure that calibration is stopped before the clock is disabled? >>> >> Actually, there is a MIPI_CAL_ACTIVE bit in the status register. Maybe >> it needs to be polled until it's unset? > > Confirmed with HW design team during this patch update. > > SW does not need to clear START bit and only write 1 takes effect to > that bit. > > Also, no need to have delay or do any other register settings unclear as > its FSM and there's nothing to get stuck. > > Also it goes thru small finite set of codes and by the time sensor > programming happens for enabling streaming FSM will finish its > calibration sequence much early and it will only wait for pads LP-11. > > So, during cancel we only need disable MIPI clock. > But there is no guarantee that cancel_calibration() couldn't be invoked in the middle of the calibration process, hence FSM could freeze in an intermediate state if it's running on the disabled MIPI clock, this doesn't sound good.