From patchwork Wed Apr 26 21:19:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Machek X-Patchwork-Id: 9702039 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 04AF960245 for ; Wed, 26 Apr 2017 21:19:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E708228404 for ; Wed, 26 Apr 2017 21:19:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DB5A528470; Wed, 26 Apr 2017 21:19:39 +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=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E8A4E28404 for ; Wed, 26 Apr 2017 21:19:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030397AbdDZVTh (ORCPT ); Wed, 26 Apr 2017 17:19:37 -0400 Received: from atrey.karlin.mff.cuni.cz ([195.113.26.193]:51054 "EHLO atrey.karlin.mff.cuni.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030384AbdDZVTg (ORCPT ); Wed, 26 Apr 2017 17:19:36 -0400 Received: by atrey.karlin.mff.cuni.cz (Postfix, from userid 512) id 4345D82411; Wed, 26 Apr 2017 23:19:34 +0200 (CEST) Date: Wed, 26 Apr 2017 23:19:33 +0200 From: Pavel Machek To: Laurent Pinchart Cc: Sakari Ailus , mchehab@kernel.org, kernel list , ivo.g.dimitrov.75@gmail.com, sre@kernel.org, pali.rohar@gmail.com, linux-media@vger.kernel.org Subject: [bug] omap3isp: missing support for ENUM_FMT Message-ID: <20170426211933.GA13593@amd> References: <20161228183036.GA13139@amd> <20170304130318.GU3220@valkosipuli.retiisi.org.uk> <20170304153946.GA3220@valkosipuli.retiisi.org.uk> <2578197.Jc2St0chTa@avalon> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <2578197.Jc2St0chTa@avalon> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi! Currently, ispvideo.c does not support enum_format. This causes problems for example for libv4l2. Now, I'm pretty sure patch below is not the right fix. But it fixes libv4l2 problem for me. Pointer to right solution welcome. Regards, Pavel On Sat 2017-03-04 20:44:50, Laurent Pinchart wrote: > Hi Sakari, > > On Saturday 04 Mar 2017 17:39:46 Sakari Ailus wrote: > > On Sat, Mar 04, 2017 at 03:03:18PM +0200, Sakari Ailus wrote: > > > On Thu, Mar 02, 2017 at 01:38:48PM +0100, Pavel Machek wrote: > > >> > > >>>> Ok, how about this one? > > >>>> omap3isp: add rest of CSI1 support > > >>>> > > >>>> CSI1 needs one more bit to be set up. Do just that. > > >>>> > > >>>> It is not as straightforward as I'd like, see the comments in the > > >>>> code for explanation. > > >> > > >> ... > > >> > > >>>> + if (isp->phy_type == ISP_PHY_TYPE_3430) { > > >>>> + struct media_pad *pad; > > >>>> + struct v4l2_subdev *sensor; > > >>>> + const struct isp_ccp2_cfg *buscfg; > > >>>> + > > >>>> + pad = media_entity_remote_pad(&ccp2 > > >>>> ->pads[CCP2_PAD_SINK]); > > >>>> + sensor = media_entity_to_v4l2_subdev(pad->entity); > > >>>> + /* Struct isp_bus_cfg has union inside */ > > >>>> + buscfg = &((struct isp_bus_cfg *)sensor->host_priv) > > >>>> ->bus.ccp2; > > >>>> + > > >>>> + csiphy_routing_cfg_3430(&isp->isp_csiphy2, > > >>>> + ISP_INTERFACE_CCP2B_PHY1, > > >>> > + enable, !!buscfg->phy_layer, > > >>> > + buscfg->strobe_clk_pol); > > >>> > > >>> You should do this through omap3isp_csiphy_acquire(), and not call > > >>> csiphy_routing_cfg_3430() directly from here. > > >> > > >> Well, unfortunately omap3isp_csiphy_acquire() does have csi2 > > >> assumptions hard-coded :-(. > > >> > > >> This will probably fail. > > >> > > >> rval = omap3isp_csi2_reset(phy->csi2); > > >> if (rval < 0) > > >> goto done; > > > > > > Could you try to two patches I've applied on the ccp2 branch (I'll remove > > > them if there are issues). > > > > > > That's compile tested for now only. > > > > One more thing. What's needed for configuring the PHY for CCP2? > > > > For instance, is the CSI-2 PHY regulator still needed in > > omap3isp_csiphy_acquire()? One way to do this might go to see the original > > driver for N900; I don't have the TRM at hand right now. > > The OMAP34xx TRM and data manual both mention separate VDDS power supplies for > the CSIb and CSI2 I/O complexes. > > vdds_csi2 CSI2 Complex I/O > vdds_csib CSIb Complex I/O > > On OMAP36xx, we instead have > > vdda_csiphy1 Input power for camera PHY buffer > vdda_csiphy2 Input power for camera PHY buffer > > We need to enable the vds_csib regulator to operate the CSI1/CCP2 PHY, but > that regulator gets enabled in ispccp2.c as that module is powered by the > vdds_csib supply on OMAP34xx. However, it won't hurt to do so, and the code > could be simpler if we manage the regulators the same way on OMAP34xx and > OMAP36xx. > diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index 218e6d7..2ce0327 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -772,6 +772,44 @@ isp_video_try_format(struct file *file, void *fh, struct v4l2_format *format) } static int +isp_video_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *format) +{ + struct isp_video *video = video_drvdata(file); + struct v4l2_subdev_format fmt; + struct v4l2_subdev *subdev; + u32 pad; + int ret; + + printk("ispvideo: enum_fmt\n"); + + subdev = isp_video_remote_subdev(video, &pad); + if (subdev == NULL) { + printk("No subdev\n"); + //return -EINVAL; + } + + //isp_video_pix_to_mbus(&format->fmt.pix, &fmt.format); + if (format->index) + return -EINVAL; + format->type = video->type; + format->flags = 0; + strcpy(format->description, "subdev description"); + format->pixelformat = V4L2_PIX_FMT_SGRBG10; + + printk("Returning SRGBG10\n"); +#if 0 + fmt.pad = pad; + fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; + ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt); + if (ret) + return ret == -ENOIOCTLCMD ? -ENOTTY : ret; + + isp_video_mbus_to_pix(video, &fmt.format, &format->fmt.pix); +#endif + return 0; +} + +static int isp_video_get_selection(struct file *file, void *fh, struct v4l2_selection *sel) { struct isp_video *video = video_drvdata(file); @@ -1276,6 +1314,7 @@ static const struct v4l2_ioctl_ops isp_video_ioctl_ops = { .vidioc_g_fmt_vid_cap = isp_video_get_format, .vidioc_s_fmt_vid_cap = isp_video_set_format, .vidioc_try_fmt_vid_cap = isp_video_try_format, + .vidioc_enum_fmt_vid_cap = isp_video_enum_format, .vidioc_g_fmt_vid_out = isp_video_get_format, .vidioc_s_fmt_vid_out = isp_video_set_format, .vidioc_try_fmt_vid_out = isp_video_try_format,