summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2019-08-13 14:37:06 +0100
committerRussell King <rmk+kernel@armlinux.org.uk>2020-10-18 23:30:34 +0100
commit8c8d55ac08320e4348ea869d1bb11ef26aac2f06 (patch)
tree285ed0abf6533363bde0f4cdcfbed40689c17155
parent7f51d0ccf73bac2e3e4b1c184b13564ace3908e1 (diff)
media: i2c: imx219: debugging
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--drivers/media/i2c/imx219-rmk.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/media/i2c/imx219-rmk.c b/drivers/media/i2c/imx219-rmk.c
index 50ded5dca67d..191e1828c791 100644
--- a/drivers/media/i2c/imx219-rmk.c
+++ b/drivers/media/i2c/imx219-rmk.c
@@ -1373,6 +1373,43 @@ static int imx219_s_frame_interval(struct v4l2_subdev *sd,
return 0;
}
+static void debug(struct imx219_private *priv)
+{
+ struct device *dev = priv->root.sd.dev;
+ unsigned long vt_pixclk = imx219_get_vt_pixclk(priv);
+ unsigned int op_sysclk;
+ unsigned int vt_line_clk, vt_line_period_ns, frame_clk;
+ unsigned int coarse_integration_time, line_length, frame_length;
+ unsigned int lane_bits, lane_bits_ns;
+
+ coarse_integration_time = priv->pixel.ctrls[CTRL_P_EXPOSURE]->cur.val;
+ line_length = be16_to_cpu(priv->params.line_length);
+ frame_length = be16_to_cpu(priv->params.frame_length);
+ frame_length = max(frame_length, coarse_integration_time +
+ priv->coarse_integration_time_max_margin);
+
+ vt_line_clk = 2 * vt_pixclk / line_length;
+ frame_clk = vt_line_clk * 10 / frame_length;
+
+ vt_line_period_ns = DIV_ROUND_CLOSEST(1000000000, vt_line_clk);
+
+ dev_info(dev, "VT: pixclk %luHz line %uHz frame %u.%uHz\n",
+ vt_pixclk, vt_line_clk,
+ frame_clk / 10, frame_clk % 10);
+ dev_info(dev, "VT: line period %uns\n", vt_line_period_ns);
+
+ op_sysclk = priv->pll_ip_freq * priv->op_mpy / priv->op_sys_div;
+
+ lane_bits = imx219_calc_lane_active_line_bits(priv);
+ lane_bits_ns = div_u64(1000000000ULL * lane_bits, op_sysclk);
+
+ dev_info(dev, "OP: pixclk %uHz, %u lanes, %uMbps peak each\n",
+ op_sysclk / priv->bits_per_pixel,
+ priv->mipi_lanes, DIV_ROUND_CLOSEST(op_sysclk, 1000000));
+ dev_info(dev, "OP: %u bits/line/lane act=%uns lp/idle=%dns\n",
+ lane_bits, lane_bits_ns, vt_line_period_ns - lane_bits_ns);
+}
+
static int imx219_prepare_stream(struct v4l2_subdev *sd)
{
struct imx219_private *priv = imx219_get_priv(sd);
@@ -1380,6 +1417,8 @@ static int imx219_prepare_stream(struct v4l2_subdev *sd)
mutex_lock(&priv->mutex);
+ debug(priv);
+
/* Initialise the sensor to place the outputs in LP-11 state. */
/* Select MIPI virtual channel */