From patchwork Thu Feb 16 02:19:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Longerbeam X-Patchwork-Id: 9576408 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 66208600C5 for ; Thu, 16 Feb 2017 02:42:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 52F171FF8E for ; Thu, 16 Feb 2017 02:42:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 474B92018F; Thu, 16 Feb 2017 02:42:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A96071FF8E for ; Thu, 16 Feb 2017 02:42:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=AWWmwjWczdAW5CwgACn6Oekoh6g/DvNpumGbQc6S+2g=; b=S/ZPzEA/pOBT8aPEwjjMrUBJ8u Bo3woN440Yurl2cne1oUbR7xw1ZiGb9hUDyA+Wf2KzW1qxB4EmYLnyfPogqXg76xIYCYd4j0nm7LZ +gQ/wb8fv+QCwis1HYOIvWAT2FU+VbnMa7N0w4mWoWezF9MOP2OyhBGwvoe1BHScg+l1H4GBIlKwz JWi6JeSjlUK94G4d3oC65A+rc/kWrt+GV4WIDACAXtSY37xQ2hmsfRT1/ZywLGUotS6b7dkohTUd+ RfeHqZmPA19QIRuHh5UXwKirBmCNw+UsoMmbCjDK11KDDG4USsz/69rPYd8B5eAZC6OQj8s7tIbDI 7WGOAW4A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1ceC1K-0002kn-6A; Thu, 16 Feb 2017 02:42:10 +0000 Received: from casper.infradead.org ([2001:770:15f::2]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1ceBoZ-00018b-JP for linux-arm-kernel@bombadil.infradead.org; Thu, 16 Feb 2017 02:28:59 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=FW2mmBUeB3/f8Jq+DCbnef8EHczcc0N4NYT8CHSMlfQ=; b=BigOSBLiEh1exxiNdFs2egXC9 g5HWBCJMO5qLbTbT2ugQZ6RyqzDKY5DG2j01znnkfaHpTAALMywLi0wfXc0vCd5b/L5wuzSSEHcNR ly4JFBPfM7z6hnZJsgxCFix11/NOAz8ddTRxmlibwzWGprOH3Ag9eR3JmfPUg8VFUWXi06nYza/rf 508NYf/+3Y1+FxsqYp8N/3RNCplUkSYFawpSjxRwa5J9qWNkPXtLRGxcJynpbGKbTd6HuuCbmxCLk 71xLkmv5jbUCfS7/10Oxsf/Q5KiYppZ02W/zM4/bNbloGel1Bp/hzEtCzQEvFJEK/8qV5zbRwl9E1 wsMafWChw==; Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]) by casper.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1ceBhT-0000mA-NO for linux-arm-kernel@lists.infradead.org; Thu, 16 Feb 2017 02:21:41 +0000 Received: by mail-pf0-x242.google.com with SMTP id o64so369594pfb.1 for ; Wed, 15 Feb 2017 18:21:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FW2mmBUeB3/f8Jq+DCbnef8EHczcc0N4NYT8CHSMlfQ=; b=jUnXt8bJaOLijRZb0tNxr4gth+wvy++eMhsqoYag2/m9NJZpOqpvaVGmRDlsueJE2x lucl1kAg7DSP7TzWlMOvmVDCzqFJFY30My+F9X7ut6qsjXHUsg0ylqsrbE3z3GpXSR8x mYip67y1fPtutm+LL5nzdrdfw0iYtTaJQ501vVTyfCJMdVpWH3DIGAe6syIcpB1t2/N4 SZwASfxMMW4M8ChlGGLlo/fltz55/5YxdmvDn/6ZpnFEICm/zMLVVIXBJ/YrOhn1Qa/W Pb5e22C+z/wdr9ZICTwRHI7+gdECfBWpNcAMzrT6qv637tYrBqAGyItsnLVKHCR0imwC 8Bjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FW2mmBUeB3/f8Jq+DCbnef8EHczcc0N4NYT8CHSMlfQ=; b=poTAu5ZcB5W7HYu9m76YzQ/G+plDfoNN3lOgvkY0AzEXfYy7fh03NjVBxAV32u210M 9syeBKNGTw2tcBjTjlO5ZqFufFHOeSoputu1ScTsmlLL5jgkJenVuM685y4/a6JF1xnX 3DTrUG38ZVBfbNZ4lfWR/Ghpzm/Yoj5PV3u7sNgoh07b8q4u/5fCYYeWGYYIOc7Qq0rU hPdUSON/JviIpH+2bTa1fIU/cGwzApZvFxCmDoEv5tvVxvRHBsr8W5mQPeyOu+sTKp/I +tFkMiBWAaZQGKsLJNJP0xezIy9bJ3sDsuYGzv1CQA5TmASfJIuZ1qdWKm3zrj6P04Go rKbQ== X-Gm-Message-State: AMke39nk2ztrInMC7P/peFsIto1ow/dANzoG8TAwKJHcqtyjPRPBbNTHWon/WXUriLU5Sg== X-Received: by 10.99.113.82 with SMTP id b18mr42604216pgn.118.1487211677807; Wed, 15 Feb 2017 18:21:17 -0800 (PST) Received: from majic.sklembedded.com (c-98-210-181-167.hsd1.ca.comcast.net. [98.210.181.167]) by smtp.googlemail.com with ESMTPSA id t6sm9869352pgt.8.2017.02.15.18.21.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 15 Feb 2017 18:21:16 -0800 (PST) From: Steve Longerbeam X-Google-Original-From: Steve Longerbeam To: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, kernel@pengutronix.de, fabio.estevam@nxp.com, linux@armlinux.org.uk, mchehab@kernel.org, hverkuil@xs4all.nl, nick@shmanahar.org, markus.heiser@darmarIT.de, p.zabel@pengutronix.de, laurent.pinchart+renesas@ideasonboard.com, bparrot@ti.com, geert@linux-m68k.org, arnd@arndb.de, sudipm.mukherjee@gmail.com, minghsiu.tsai@mediatek.com, tiffany.lin@mediatek.com, jean-christophe.trotin@st.com, horms+renesas@verge.net.au, niklas.soderlund+renesas@ragnatech.se, robert.jarzmik@free.fr, songjun.wu@microchip.com, andrew-ct.chen@mediatek.com, gregkh@linuxfoundation.org, shuah@kernel.org, sakari.ailus@linux.intel.com, pavel@ucw.cz Subject: [PATCH v4 32/36] media: imx: csi/fim: add support for frame intervals Date: Wed, 15 Feb 2017 18:19:34 -0800 Message-Id: <1487211578-11360-33-git-send-email-steve_longerbeam@mentor.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1487211578-11360-1-git-send-email-steve_longerbeam@mentor.com> References: <1487211578-11360-1-git-send-email-steve_longerbeam@mentor.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170216_022139_939992_470CCDE9 X-CRM114-Status: GOOD ( 19.24 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, devicetree@vger.kernel.org, Steve Longerbeam , linux-kernel@vger.kernel.org, Russell King , linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Add support to CSI for negotiation of frame intervals, and use this information to configure the frame interval monitor. Signed-off-by: Russell King Signed-off-by: Steve Longerbeam --- drivers/staging/media/imx/imx-media-csi.c | 36 ++++++++++++++++++++++++++++--- drivers/staging/media/imx/imx-media-fim.c | 28 +++++++++--------------- drivers/staging/media/imx/imx-media.h | 2 +- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c index b0aac82..040cca6 100644 --- a/drivers/staging/media/imx/imx-media-csi.c +++ b/drivers/staging/media/imx/imx-media-csi.c @@ -56,6 +56,7 @@ struct csi_priv { struct v4l2_mbus_framefmt format_mbus[CSI_NUM_PADS]; const struct imx_media_pixfmt *cc[CSI_NUM_PADS]; + struct v4l2_fract frame_interval; struct v4l2_rect crop; /* the video device at IDMAC output pad */ @@ -565,7 +566,8 @@ static int csi_start(struct csi_priv *priv) /* start the frame interval monitor */ if (priv->fim) { - ret = imx_media_fim_set_stream(priv->fim, priv->sensor, true); + ret = imx_media_fim_set_stream(priv->fim, + &priv->frame_interval, true); if (ret) goto idmac_stop; } @@ -580,7 +582,8 @@ static int csi_start(struct csi_priv *priv) fim_off: if (priv->fim) - imx_media_fim_set_stream(priv->fim, priv->sensor, false); + imx_media_fim_set_stream(priv->fim, + &priv->frame_interval, false); idmac_stop: if (priv->dest == IPU_CSI_DEST_IDMAC) csi_idmac_stop(priv); @@ -594,11 +597,36 @@ static void csi_stop(struct csi_priv *priv) /* stop the frame interval monitor */ if (priv->fim) - imx_media_fim_set_stream(priv->fim, priv->sensor, false); + imx_media_fim_set_stream(priv->fim, + &priv->frame_interval, false); ipu_csi_disable(priv->csi); } +static int csi_g_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *fi) +{ + struct csi_priv *priv = v4l2_get_subdevdata(sd); + + fi->interval = priv->frame_interval; + + return 0; +} + +static int csi_s_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *fi) +{ + struct csi_priv *priv = v4l2_get_subdevdata(sd); + + /* Output pads mirror active input pad, no limits on input pads */ + if (fi->pad == CSI_SRC_PAD_IDMAC || fi->pad == CSI_SRC_PAD_DIRECT) + fi->interval = priv->frame_interval; + + priv->frame_interval = fi->interval; + + return 0; +} + static int csi_s_stream(struct v4l2_subdev *sd, int enable) { struct csi_priv *priv = v4l2_get_subdevdata(sd); @@ -1187,6 +1215,8 @@ static struct v4l2_subdev_core_ops csi_core_ops = { }; static struct v4l2_subdev_video_ops csi_video_ops = { + .g_frame_interval = csi_g_frame_interval, + .s_frame_interval = csi_s_frame_interval, .s_stream = csi_s_stream, }; diff --git a/drivers/staging/media/imx/imx-media-fim.c b/drivers/staging/media/imx/imx-media-fim.c index acc7e39..a6ed57e 100644 --- a/drivers/staging/media/imx/imx-media-fim.c +++ b/drivers/staging/media/imx/imx-media-fim.c @@ -67,26 +67,18 @@ struct imx_media_fim { }; static void update_fim_nominal(struct imx_media_fim *fim, - struct imx_media_subdev *sensor) + const struct v4l2_fract *fi) { - struct v4l2_streamparm parm; - struct v4l2_fract tpf; - int ret; - - parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - ret = v4l2_subdev_call(sensor->sd, video, g_parm, &parm); - tpf = parm.parm.capture.timeperframe; - - if (ret || tpf.denominator == 0) { - dev_dbg(fim->sd->dev, "no tpf from sensor, FIM disabled\n"); + if (fi->denominator == 0) { + dev_dbg(fim->sd->dev, "no frame interval, FIM disabled\n"); fim->enabled = false; return; } - fim->nominal = DIV_ROUND_CLOSEST(1000 * 1000 * tpf.numerator, - tpf.denominator); + fim->nominal = DIV_ROUND_CLOSEST_ULL(1000000ULL * (u64)fi->numerator, + fi->denominator); - dev_dbg(fim->sd->dev, "sensor FI=%lu usec\n", fim->nominal); + dev_dbg(fim->sd->dev, "FI=%lu usec\n", fim->nominal); } static void reset_fim(struct imx_media_fim *fim, bool curval) @@ -130,8 +122,8 @@ static void send_fim_event(struct imx_media_fim *fim, unsigned long error) /* * Monitor an averaged frame interval. If the average deviates too much - * from the sensor's nominal frame rate, send the frame interval error - * event. The frame intervals are averaged in order to quiet noise from + * from the nominal frame rate, send the frame interval error event. The + * frame intervals are averaged in order to quiet noise from * (presumably random) interrupt latency. */ static void frame_interval_monitor(struct imx_media_fim *fim, @@ -422,12 +414,12 @@ EXPORT_SYMBOL_GPL(imx_media_fim_set_power); /* Called by the subdev in its s_stream callback */ int imx_media_fim_set_stream(struct imx_media_fim *fim, - struct imx_media_subdev *sensor, + const struct v4l2_fract *fi, bool on) { if (on) { reset_fim(fim, true); - update_fim_nominal(fim, sensor); + update_fim_nominal(fim, fi); if (fim->icap_channel >= 0) fim_acquire_first_ts(fim); diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h index ae3af0d..7f19739 100644 --- a/drivers/staging/media/imx/imx-media.h +++ b/drivers/staging/media/imx/imx-media.h @@ -259,7 +259,7 @@ struct imx_media_fim; void imx_media_fim_eof_monitor(struct imx_media_fim *fim, struct timespec *ts); int imx_media_fim_set_power(struct imx_media_fim *fim, bool on); int imx_media_fim_set_stream(struct imx_media_fim *fim, - struct imx_media_subdev *sensor, + const struct v4l2_fract *frame_interval, bool on); struct imx_media_fim *imx_media_fim_init(struct v4l2_subdev *sd); void imx_media_fim_free(struct imx_media_fim *fim);