Commit cf5153e4 authored by Sowjanya Komatineni's avatar Sowjanya Komatineni Committed by Mauro Carvalho Chehab

media: gpu: host1x: mipi: Keep MIPI clock enabled and mutex locked till calibration done

With the split of MIPI calibration into tegra_mipi_calibrate() and
tegra_mipi_wait(), MIPI clock is not kept enabled and mutex is not locked
till the calibration is done.

So, this patch keeps MIPI clock enabled and mutex locked after triggering
start of calibration till its done.

To let calibration process go through its finite sequence codes before
calibration logic waiting for pads idle state added wait time of 75usec
to make sure it sees idle state to apply the results.

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.
Reviewed-by: default avatarDmitry Osipenko <digetx@gmail.com>
Signed-off-by: default avatarSowjanya Komatineni <skomatineni@nvidia.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent bdcad5ce
...@@ -694,11 +694,11 @@ static int tegra_dsi_pad_calibrate(struct tegra_dsi *dsi) ...@@ -694,11 +694,11 @@ static int tegra_dsi_pad_calibrate(struct tegra_dsi *dsi)
DSI_PAD_PREEMP_PD(0x03) | DSI_PAD_PREEMP_PU(0x3); DSI_PAD_PREEMP_PD(0x03) | DSI_PAD_PREEMP_PU(0x3);
tegra_dsi_writel(dsi, value, DSI_PAD_CONTROL_3); 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) if (err < 0)
return err; 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, static void tegra_dsi_set_timeout(struct tegra_dsi *dsi, unsigned long bclk,
......
...@@ -293,19 +293,13 @@ int tegra_mipi_disable(struct tegra_mipi_device *dev) ...@@ -293,19 +293,13 @@ int tegra_mipi_disable(struct tegra_mipi_device *dev)
} }
EXPORT_SYMBOL(tegra_mipi_disable); EXPORT_SYMBOL(tegra_mipi_disable);
int tegra_mipi_wait(struct tegra_mipi_device *device) int tegra_mipi_finish_calibration(struct tegra_mipi_device *device)
{ {
struct tegra_mipi *mipi = device->mipi; struct tegra_mipi *mipi = device->mipi;
void __iomem *status_reg = mipi->regs + (MIPI_CAL_STATUS << 2); void __iomem *status_reg = mipi->regs + (MIPI_CAL_STATUS << 2);
u32 value; u32 value;
int err; int err;
err = clk_enable(device->mipi->clk);
if (err < 0)
return err;
mutex_lock(&device->mipi->lock);
err = readl_relaxed_poll_timeout(status_reg, value, err = readl_relaxed_poll_timeout(status_reg, value,
!(value & MIPI_CAL_STATUS_ACTIVE) && !(value & MIPI_CAL_STATUS_ACTIVE) &&
(value & MIPI_CAL_STATUS_DONE), 50, (value & MIPI_CAL_STATUS_DONE), 50,
...@@ -315,9 +309,9 @@ int tegra_mipi_wait(struct tegra_mipi_device *device) ...@@ -315,9 +309,9 @@ int tegra_mipi_wait(struct tegra_mipi_device *device)
return err; return err;
} }
EXPORT_SYMBOL(tegra_mipi_wait); EXPORT_SYMBOL(tegra_mipi_finish_calibration);
int tegra_mipi_calibrate(struct tegra_mipi_device *device) int tegra_mipi_start_calibration(struct tegra_mipi_device *device)
{ {
const struct tegra_mipi_soc *soc = device->mipi->soc; const struct tegra_mipi_soc *soc = device->mipi->soc;
unsigned int i; unsigned int i;
...@@ -381,12 +375,16 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device) ...@@ -381,12 +375,16 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device)
value |= MIPI_CAL_CTRL_START; value |= MIPI_CAL_CTRL_START;
tegra_mipi_writel(device->mipi, value, MIPI_CAL_CTRL); tegra_mipi_writel(device->mipi, value, MIPI_CAL_CTRL);
mutex_unlock(&device->mipi->lock); /*
clk_disable(device->mipi->clk); * Wait for min 72uS to let calibration logic finish calibration
* sequence codes before waiting for pads idle state to apply the
* results.
*/
usleep_range(75, 80);
return 0; return 0;
} }
EXPORT_SYMBOL(tegra_mipi_calibrate); EXPORT_SYMBOL(tegra_mipi_start_calibration);
static const struct tegra_mipi_pad tegra114_mipi_pads[] = { static const struct tegra_mipi_pad tegra114_mipi_pads[] = {
{ .data = MIPI_CAL_CONFIG_CSIA }, { .data = MIPI_CAL_CONFIG_CSIA },
......
...@@ -333,7 +333,7 @@ struct tegra_mipi_device *tegra_mipi_request(struct device *device, ...@@ -333,7 +333,7 @@ struct tegra_mipi_device *tegra_mipi_request(struct device *device,
void tegra_mipi_free(struct tegra_mipi_device *device); void tegra_mipi_free(struct tegra_mipi_device *device);
int tegra_mipi_enable(struct tegra_mipi_device *device); int tegra_mipi_enable(struct tegra_mipi_device *device);
int tegra_mipi_disable(struct tegra_mipi_device *device); int tegra_mipi_disable(struct tegra_mipi_device *device);
int tegra_mipi_calibrate(struct tegra_mipi_device *device); int tegra_mipi_start_calibration(struct tegra_mipi_device *device);
int tegra_mipi_wait(struct tegra_mipi_device *device); int tegra_mipi_finish_calibration(struct tegra_mipi_device *device);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment