From patchwork Tue Apr 16 09:30:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stu Hsieh X-Patchwork-Id: 10902561 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id ECB7F1669 for ; Tue, 16 Apr 2019 09:59:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D9BDC2882E for ; Tue, 16 Apr 2019 09:59:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CDD8F28989; Tue, 16 Apr 2019 09:59:26 +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=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.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 3D50C2882E for ; Tue, 16 Apr 2019 09:59:26 +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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version: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=pqjmcKTL4eNhNuOtMFyOkkxQNfcehAib5HWkGwIuNfc=; b=gi1oXK2f8skBGp HKbGaec0d3psYcLigkszkr23ZGiWPdCts7GloHnB1Ldp7SVi/NDPnbwmA1TvmT8wu4rvD4+LMvhyY Y1jVWAxNrUGSqvssVVsJQ6xhUdpBYBQjZVjRU32v6j/pB2SNV/Raa3rNjjklx03wWRbW4xBDBe4c6 2rLcHpUbOEeD2wetqsb6uBRheTxFoua2+OrRum8/DsjewDiDE8WnzKYEmGlKlPbcccqG5vpUxnRd9 mOvqvtFSqV9u1+ODU6SvFE6x5I1iQpuQRg6OjwBSgaAhz23eSbaBGUZbpnKF6TnatJeIhtIKJxIhO BAnEp2OaJ87xs500UA+w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hGKs9-0003eQ-Dp; Tue, 16 Apr 2019 09:59:25 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hGKdV-0004C5-Os; Tue, 16 Apr 2019 09:44:17 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:CC:To:From:Sender:Reply-To: 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=MyLDZxfWTrdFs4QuhJ7zU/j0cmGzcpTqIte/Ez6Kujw=; b=hnO0IQTxyYBamD2OnWCm3Xjo9 yTyvZpKx0PZetDykqhhTD8hN7paEeVbmeKyD3lq5ncanG048iEf6su52OA7i24+9EBxSZpecOKJN9 3N0UfOxx6KrlgiNbtHAsspuS+6KQCPCBbBtfxYK8+kL7jFEyII7mnGVh3ZiAMWGMfJmPyLDGWzPKA D7AvjAyV4EMadGZBpAv7W20o9cQovk3kDm4GMnbqU673vSniCtE0RBEAzbwXcxwiohKmrTGQTRjYm 194bApS7WlT7PDIIkZDGyGXDH2HFnm0Vj2GeIfr6Br4LRPCxyvTpZDBuB817Ah66RkWMpGWBg6HSK 7Cbn0cUwA==; Received: from mailgw02.mediatek.com ([216.200.240.185]) by casper.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hGKQN-0002lY-WB; Tue, 16 Apr 2019 09:30:46 +0000 X-UUID: 4baf8a5b595c465fb4b46889c0c761ec-20190416 X-UUID: 4baf8a5b595c465fb4b46889c0c761ec-20190416 Received: from mtkcas68.mediatek.inc [(172.29.94.19)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1618035411; Tue, 16 Apr 2019 01:30:23 -0800 Received: from MTKMBS01N1.mediatek.inc (172.21.101.68) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 16 Apr 2019 02:30:21 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 16 Apr 2019 17:30:19 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Tue, 16 Apr 2019 17:30:18 +0800 From: Stu Hsieh To: Mauro Carvalho Chehab , Rob Herring , CK Hu Subject: [PATCH v2 12/15] [media] mtk-mipicsi: add function to get the format Date: Tue, 16 Apr 2019 17:30:12 +0800 Message-ID: <1555407015-18130-13-git-send-email-stu.hsieh@mediatek.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1555407015-18130-1-git-send-email-stu.hsieh@mediatek.com> References: <1555407015-18130-1-git-send-email-stu.hsieh@mediatek.com> MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190416_103044_329970_2E8AD1A3 X-CRM114-Status: GOOD ( 22.43 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, srv_heupstream@mediatek.com, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, Stu Hsieh , Matthias Brugger , linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+patchwork-linux-mediatek=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP This patch add function to get the format This function can get the subdev format and host format. Calculate the number of format which intersection of subdev and host. Signed-off-by: Stu Hsieh --- .../media/platform/mtk-mipicsi/mtk_mipicsi.c | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c index 4027ed9c94f3..5e4028d0d5e1 100644 --- a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c +++ b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c @@ -163,6 +163,50 @@ struct mtk_mipicsi_dev { u32 bytesperline; }; +static const struct soc_mbus_lookup mtk_mipicsi_formats[] = { +{ + .code = MEDIA_BUS_FMT_YUYV8_2X8, + .fmt = { + .fourcc = V4L2_PIX_FMT_YUYV, + .name = "YUYV", + .bits_per_sample = 8, + .packing = SOC_MBUS_PACKING_2X8_PADHI, + .order = SOC_MBUS_ORDER_LE, + .layout = SOC_MBUS_LAYOUT_PACKED, + }, +}, { + .code = MEDIA_BUS_FMT_YVYU8_2X8, + .fmt = { + .fourcc = V4L2_PIX_FMT_YVYU, + .name = "YVYU", + .bits_per_sample = 8, + .packing = SOC_MBUS_PACKING_2X8_PADHI, + .order = SOC_MBUS_ORDER_LE, + .layout = SOC_MBUS_LAYOUT_PACKED, + }, +}, { + .code = MEDIA_BUS_FMT_UYVY8_2X8, + .fmt = { + .fourcc = V4L2_PIX_FMT_UYVY, + .name = "UYVY", + .bits_per_sample = 8, + .packing = SOC_MBUS_PACKING_2X8_PADHI, + .order = SOC_MBUS_ORDER_LE, + .layout = SOC_MBUS_LAYOUT_PACKED, + }, +}, { + .code = MEDIA_BUS_FMT_VYUY8_2X8, + .fmt = { + .fourcc = V4L2_PIX_FMT_VYUY, + .name = "VYUY", + .bits_per_sample = 8, + .packing = SOC_MBUS_PACKING_2X8_PADHI, + .order = SOC_MBUS_ORDER_LE, + .layout = SOC_MBUS_LAYOUT_PACKED, + }, +}, +}; + #define MTK_MIPICSI_BUS_PARAM (V4L2_MBUS_MASTER | \ V4L2_MBUS_HSYNC_ACTIVE_HIGH | \ V4L2_MBUS_HSYNC_ACTIVE_LOW | \ @@ -207,6 +251,43 @@ static void mtk_mipicsi_ana_clk_enable(void __iomem *base, bool enable) } } +static int mtk_mipicsi_try_bus_param(struct soc_camera_device *icd, + unsigned char buswidth) +{ + struct v4l2_subdev *sd = soc_camera_to_subdev(icd); + struct soc_camera_host *ici = to_soc_camera_host(icd->parent); + struct mtk_mipicsi_dev *mipicsi = ici->priv; + struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_CSI2_DPHY,}; + unsigned long common_flags = 0; + int ret = 0; + + ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg); + if (ret == 0) { + common_flags = soc_mbus_config_compatible(&cfg, + MTK_MIPICSI_BUS_PARAM); + if (common_flags == 0U) { + dev_warn(icd->parent, "Flags incompatible: camera 0x%x\n", + cfg.flags); + return -EINVAL; + } + } else { + if (ret != -ENOIOCTLCMD) + return ret; + } + + if ((((u16)1U << (buswidth - 1U)) & mipicsi->width_flags) != 0U) + return 0; + + return -EINVAL; +} + +static bool mtk_mipicsi_packing_supported(const struct soc_mbus_pixelfmt *fmt) +{ + return fmt->packing == SOC_MBUS_PACKING_NONE || + (fmt->bits_per_sample == 8U && + fmt->packing == SOC_MBUS_PACKING_2X8_PADHI); +} + static int get_subdev_register(const struct soc_camera_device *icd, struct v4l2_dbg_register *reg) { @@ -330,6 +411,72 @@ static void mtk_mipicsi_remove_device(struct soc_camera_device *icd) (void)pm_runtime_put_sync(icd->parent); } +static int mtk_mipicsi_get_formats(struct soc_camera_device *icd, + unsigned int idx, struct soc_camera_format_xlate *xlate) +{ + struct v4l2_subdev *sd = soc_camera_to_subdev(icd); + int formats = 0, ret, i; + int n = ARRAY_SIZE(mtk_mipicsi_formats); + + struct v4l2_subdev_mbus_code_enum mbus_code = { + .which = V4L2_SUBDEV_FORMAT_ACTIVE, + .index = idx, + }; + /* subdev format */ + const struct soc_mbus_pixelfmt *fmt; + + ret = v4l2_subdev_call(sd, pad, enum_mbus_code, NULL, &mbus_code); + if (ret < 0) + /* No more formats */ + return 0; + + /* get subdev support format */ + fmt = soc_mbus_get_fmtdesc(mbus_code.code); + if (fmt == NULL) { + dev_err(icd->parent, "Invalid format code #%u: %d", + idx, mbus_code.code); + return 0; + } + + /* This also checks support for the requested bits-per-sample */ + ret = mtk_mipicsi_try_bus_param(icd, fmt->bits_per_sample); + if (ret < 0) { + dev_err(icd->parent, "Fail to try the bus parameters.\n"); + return 0; + } + + switch (mbus_code.code) { + case MEDIA_BUS_FMT_UYVY8_2X8: + case MEDIA_BUS_FMT_VYUY8_2X8: + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_YVYU8_2X8: + dev_dbg(icd->parent, "Providing format %s using code %d\n", + fmt->name, mbus_code.code); + break; + default: + if (!mtk_mipicsi_packing_supported(fmt)) + return 0; + if (xlate != NULL) + dev_dbg(icd->parent, + "Providing format %s in pass-through mode\n", + fmt->name); + break; + } + + /* get camera host and subdev format intersection */ + for (i = 0; i < n; ++i) + if (mtk_mipicsi_formats[i].fmt.fourcc == fmt->fourcc) { + ++formats; + if (xlate != NULL) { + xlate->host_fmt = &mtk_mipicsi_formats[i].fmt; + xlate->code = mbus_code.code; + xlate++; + } + } + + return formats; +} + static bool is_supported(const u32 pixformat) { switch (pixformat) { @@ -730,6 +877,7 @@ static struct soc_camera_host_ops mtk_soc_camera_host_ops = { .owner = THIS_MODULE, .add = mtk_mipicsi_add_device, .remove = mtk_mipicsi_remove_device, + .get_formats = mtk_mipicsi_get_formats, .set_fmt = mtk_mipicsi_set_fmt, .try_fmt = mtk_mipicsi_try_fmt, .init_videobuf2 = mtk_mipicsi_init_videobuf2,