From patchwork Thu Oct 4 20:04:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 10626589 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 84FF6174A for ; Thu, 4 Oct 2018 20:05:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 790A229633 for ; Thu, 4 Oct 2018 20:05:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6D387296B2; Thu, 4 Oct 2018 20:05:28 +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=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=unavailable 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 198F429633 for ; Thu, 4 Oct 2018 20:05:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727519AbeJEDAP (ORCPT ); Thu, 4 Oct 2018 23:00:15 -0400 Received: from vsp-unauthed02.binero.net ([195.74.38.227]:56421 "EHLO vsp-unauthed02.binero.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727526AbeJEDAO (ORCPT ); Thu, 4 Oct 2018 23:00:14 -0400 X-Halon-ID: c8a23265-c810-11e8-ab18-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id c8a23265-c810-11e8-ab18-005056917a89; Thu, 04 Oct 2018 22:05:04 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: Laurent Pinchart , linux-media@vger.kernel.org Cc: linux-renesas-soc@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= Subject: [PATCH v2 1/3] rcar-vin: align width before stream start Date: Thu, 4 Oct 2018 22:04:00 +0200 Message-Id: <20181004200402.15113-2-niklas.soderlund+renesas@ragnatech.se> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181004200402.15113-1-niklas.soderlund+renesas@ragnatech.se> References: <20181004200402.15113-1-niklas.soderlund+renesas@ragnatech.se> MIME-Version: 1.0 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 Instead of aligning the image width to match the image stride at stream start time do so when configuring the format. This allows the format width to strictly match the image stride which is useful when enabling scaling on Gen3. Signed-off-by: Niklas Söderlund --- drivers/media/platform/rcar-vin/rcar-dma.c | 5 +---- drivers/media/platform/rcar-vin/rcar-v4l2.c | 9 +++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c index 92323310f7352147..e752bc86e40153b1 100644 --- a/drivers/media/platform/rcar-vin/rcar-dma.c +++ b/drivers/media/platform/rcar-vin/rcar-dma.c @@ -597,10 +597,7 @@ void rvin_crop_scale_comp(struct rvin_dev *vin) if (vin->info->model != RCAR_GEN3) rvin_crop_scale_comp_gen2(vin); - if (vin->format.pixelformat == V4L2_PIX_FMT_NV16) - rvin_write(vin, ALIGN(vin->format.width, 0x20), VNIS_REG); - else - rvin_write(vin, ALIGN(vin->format.width, 0x10), VNIS_REG); + rvin_write(vin, vin->format.width, VNIS_REG); } /* ----------------------------------------------------------------------------- diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c index dc77682b47857c97..94bc559a0cb1e47a 100644 --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c @@ -96,6 +96,15 @@ static void rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format *pix) pix->pixelformat == V4L2_PIX_FMT_XBGR32)) pix->pixelformat = RVIN_DEFAULT_FORMAT; + switch (pix->pixelformat) { + case V4L2_PIX_FMT_NV16: + pix->width = ALIGN(pix->width, 0x20); + break; + default: + pix->width = ALIGN(pix->width, 0x10); + break; + } + switch (pix->field) { case V4L2_FIELD_TOP: case V4L2_FIELD_BOTTOM: From patchwork Thu Oct 4 20:04:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 10626593 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 EE39917E0 for ; Thu, 4 Oct 2018 20:05:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DD76529633 for ; Thu, 4 Oct 2018 20:05:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D1889296A2; Thu, 4 Oct 2018 20:05:29 +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=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=unavailable 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 3B3EE296B2 for ; Thu, 4 Oct 2018 20:05:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727581AbeJEDAQ (ORCPT ); Thu, 4 Oct 2018 23:00:16 -0400 Received: from vsp-unauthed02.binero.net ([195.74.38.227]:59118 "EHLO vsp-unauthed02.binero.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727526AbeJEDAQ (ORCPT ); Thu, 4 Oct 2018 23:00:16 -0400 X-Halon-ID: c8f9f835-c810-11e8-ab18-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id c8f9f835-c810-11e8-ab18-005056917a89; Thu, 04 Oct 2018 22:05:05 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: Laurent Pinchart , linux-media@vger.kernel.org Cc: linux-renesas-soc@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= Subject: [PATCH v2 2/3] rcar-vin: add support for UDS (Up Down Scaler) Date: Thu, 4 Oct 2018 22:04:01 +0200 Message-Id: <20181004200402.15113-3-niklas.soderlund+renesas@ragnatech.se> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181004200402.15113-1-niklas.soderlund+renesas@ragnatech.se> References: <20181004200402.15113-1-niklas.soderlund+renesas@ragnatech.se> MIME-Version: 1.0 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 Some VIN instances have access to a Up Down Scaler (UDS). The UDS are on most SoCs shared between two VINs, the UDS can of course only be used by one VIN at a time. Add support to configure the UDS registers which are mapped to both VINs sharing the UDS address-space. While validations the format at stream start make sure the companion VIN is not already using the scaler. If the scaler already is in use return -EBUSY. Signed-off-by: Niklas Söderlund --- drivers/media/platform/rcar-vin/rcar-dma.c | 134 ++++++++++++++++++++- drivers/media/platform/rcar-vin/rcar-vin.h | 24 ++++ 2 files changed, 152 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c index e752bc86e40153b1..f33146bda9300c21 100644 --- a/drivers/media/platform/rcar-vin/rcar-dma.c +++ b/drivers/media/platform/rcar-vin/rcar-dma.c @@ -74,6 +74,10 @@ /* Register offsets specific for Gen3 */ #define VNCSI_IFMD_REG 0x20 /* Video n CSI2 Interface Mode Register */ +#define VNUDS_CTRL_REG 0x80 /* Video n scaling control register */ +#define VNUDS_SCALE_REG 0x84 /* Video n scaling factor register */ +#define VNUDS_PASS_BWIDTH_REG 0x90 /* Video n passband register */ +#define VNUDS_CLIP_SIZE_REG 0xa4 /* Video n UDS output size clipping reg */ /* Register bit fields for R-Car VIN */ /* Video n Main Control Register bits */ @@ -129,6 +133,9 @@ #define VNCSI_IFMD_CSI_CHSEL(n) (((n) & 0xf) << 0) #define VNCSI_IFMD_CSI_CHSEL_MASK 0xf +/* Video n scaling control register (Gen3) */ +#define VNUDS_CTRL_AMD (1 << 30) + struct rvin_buffer { struct vb2_v4l2_buffer vb; struct list_head list; @@ -572,6 +579,78 @@ static void rvin_crop_scale_comp_gen2(struct rvin_dev *vin) 0, 0); } +static unsigned int rvin_scale_ratio(unsigned int in, unsigned int out) +{ + unsigned int ratio; + + ratio = in * 4096 / out; + return ratio >= 0x10000 ? 0xffff : ratio; +} + +static unsigned int rvin_ratio_to_bwidth(unsigned int ratio) +{ + unsigned int mant, frac; + + mant = (ratio & 0xF000) >> 12; + frac = ratio & 0x0FFF; + if (mant) + return 64 * 4096 * mant / (4096 * mant + frac); + + return 64; +} + +static bool rvin_gen3_need_scaling(struct rvin_dev *vin) +{ + if (vin->info->model != RCAR_GEN3) + return false; + + return vin->crop.width != vin->format.width || + vin->crop.height != vin->format.height; +} + +static void rvin_crop_scale_comp_gen3(struct rvin_dev *vin) +{ + unsigned int ratio_h, ratio_v; + unsigned int bwidth_h, bwidth_v; + u32 vnmc, clip_size; + + if (!rvin_gen3_need_scaling(vin)) + return; + + ratio_h = rvin_scale_ratio(vin->crop.width, vin->format.width); + bwidth_h = rvin_ratio_to_bwidth(ratio_h); + + ratio_v = rvin_scale_ratio(vin->crop.height, vin->format.height); + bwidth_v = rvin_ratio_to_bwidth(ratio_v); + + clip_size = vin->format.width << 16; + + switch (vin->format.field) { + case V4L2_FIELD_INTERLACED_TB: + case V4L2_FIELD_INTERLACED_BT: + case V4L2_FIELD_INTERLACED: + case V4L2_FIELD_SEQ_TB: + case V4L2_FIELD_SEQ_BT: + clip_size |= vin->format.height / 2; + break; + default: + clip_size |= vin->format.height; + break; + } + + vnmc = rvin_read(vin, VNMC_REG); + rvin_write(vin, (vnmc & ~VNMC_VUP) | VNMC_SCLE, VNMC_REG); + rvin_write(vin, VNUDS_CTRL_AMD, VNUDS_CTRL_REG); + rvin_write(vin, (ratio_h << 16) | ratio_v, VNUDS_SCALE_REG); + rvin_write(vin, (bwidth_h << 16) | bwidth_v, VNUDS_PASS_BWIDTH_REG); + rvin_write(vin, clip_size, VNUDS_CLIP_SIZE_REG); + rvin_write(vin, vnmc, VNMC_REG); + + vin_dbg(vin, "Pre-Clip: %ux%u@%u:%u Post-Clip: %ux%u@%u:%u\n", + vin->crop.width, vin->crop.height, vin->crop.left, + vin->crop.top, vin->format.width, vin->format.height, 0, 0); +} + void rvin_crop_scale_comp(struct rvin_dev *vin) { /* Set Start/End Pixel/Line Pre-Clip */ @@ -593,8 +672,9 @@ void rvin_crop_scale_comp(struct rvin_dev *vin) break; } - /* TODO: Add support for the UDS scaler. */ - if (vin->info->model != RCAR_GEN3) + if (vin->info->model == RCAR_GEN3) + rvin_crop_scale_comp_gen3(vin); + else rvin_crop_scale_comp_gen2(vin); rvin_write(vin, vin->format.width, VNIS_REG); @@ -748,6 +828,9 @@ static int rvin_setup(struct rvin_dev *vin) vnmc |= VNMC_DPINE; } + if (rvin_gen3_need_scaling(vin)) + vnmc |= VNMC_SCLE; + /* Progressive or interlaced mode */ interrupts = progressive ? VNIE_FIE : VNIE_EFE; @@ -1078,10 +1161,42 @@ static int rvin_mc_validate_format(struct rvin_dev *vin, struct v4l2_subdev *sd, return -EPIPE; } - if (fmt.format.width != vin->format.width || - fmt.format.height != vin->format.height || - fmt.format.code != vin->mbus_code) - return -EPIPE; + vin->crop.width = fmt.format.width; + vin->crop.height = fmt.format.height; + + if (rvin_gen3_need_scaling(vin)) { + const struct rvin_group_scaler *scaler; + struct rvin_dev *companion; + + if (fmt.format.code != vin->mbus_code) + return -EPIPE; + + if (!vin->info->scalers) + return -EPIPE; + + for (scaler = vin->info->scalers; + scaler->vin || scaler->companion; scaler++) + if (scaler->vin == vin->id) + break; + + /* No scaler found for VIN. */ + if (!scaler->vin && !scaler->companion) + return -EPIPE; + + /* Make sure companion not using scaler. */ + if (scaler->companion != -1) { + companion = vin->group->vin[scaler->companion]; + if (companion && + companion->state != STOPPED && + rvin_gen3_need_scaling(companion)) + return -EBUSY; + } + } else { + if (fmt.format.width != vin->format.width || + fmt.format.height != vin->format.height || + fmt.format.code != vin->mbus_code) + return -EPIPE; + } return 0; } @@ -1189,6 +1304,7 @@ static void rvin_stop_streaming(struct vb2_queue *vq) struct rvin_dev *vin = vb2_get_drv_priv(vq); unsigned long flags; int retries = 0; + u32 vnmc; spin_lock_irqsave(&vin->qlock, flags); @@ -1220,6 +1336,12 @@ static void rvin_stop_streaming(struct vb2_queue *vq) vin->state = STOPPED; } + /* Clear UDS usage after we have stopped */ + if (vin->info->model == RCAR_GEN3) { + vnmc = rvin_read(vin, VNMC_REG) & ~(VNMC_SCLE | VNMC_VUP); + rvin_write(vin, vnmc, VNMC_REG); + } + /* Release all active buffers */ return_all_buffers(vin, VB2_BUF_STATE_ERROR); diff --git a/drivers/media/platform/rcar-vin/rcar-vin.h b/drivers/media/platform/rcar-vin/rcar-vin.h index 0b13b34d03e3dce4..5a617a30ba8c9a5a 100644 --- a/drivers/media/platform/rcar-vin/rcar-vin.h +++ b/drivers/media/platform/rcar-vin/rcar-vin.h @@ -122,6 +122,28 @@ struct rvin_group_route { unsigned int mask; }; +/** + * struct rvin_group_scaler - describes a scaler attached to a VIN + * + * @vin: Numerical VIN id that have access to a UDS. + * @companion: Numerical VIN id that @vin share the UDS with. + * + * -- note:: + * Some R-Car VIN instances have access to a Up Down Scaler (UDS). + * If a VIN have a UDS attached it's almost always shared between + * two VIN instances. The UDS can only be used by one VIN at a time, + * so the companion relationship needs to be described as well. + * + * There are at most two VINs sharing a UDS. For each UDS shared + * between two VINs there needs to be two instances of struct + * rvin_group_scaler describing each of the VINs individually. If + * a VIN do not share its UDS set companion to -1. + */ +struct rvin_group_scaler { + int vin; + int companion; +}; + /** * struct rvin_info - Information about the particular VIN implementation * @model: VIN model @@ -130,6 +152,7 @@ struct rvin_group_route { * @max_height: max input height the VIN supports * @routes: list of possible routes from the CSI-2 recivers to * all VINs. The list mush be NULL terminated. + * @scalers: List of available scalers, must be NULL terminated. */ struct rvin_info { enum model_id model; @@ -138,6 +161,7 @@ struct rvin_info { unsigned int max_width; unsigned int max_height; const struct rvin_group_route *routes; + const struct rvin_group_scaler *scalers; }; /** From patchwork Thu Oct 4 20:04:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 10626595 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 5F48414BD for ; Thu, 4 Oct 2018 20:05:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 51D8D296A2 for ; Thu, 4 Oct 2018 20:05:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 463DC296B2; Thu, 4 Oct 2018 20:05:30 +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=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, 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 E1E23296B8 for ; Thu, 4 Oct 2018 20:05:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727663AbeJEDAR (ORCPT ); Thu, 4 Oct 2018 23:00:17 -0400 Received: from vsp-unauthed02.binero.net ([195.74.38.227]:49405 "EHLO vsp-unauthed02.binero.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727646AbeJEDAQ (ORCPT ); Thu, 4 Oct 2018 23:00:16 -0400 X-Halon-ID: ca1092b0-c810-11e8-ab18-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id ca1092b0-c810-11e8-ab18-005056917a89; Thu, 04 Oct 2018 22:05:07 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: Laurent Pinchart , linux-media@vger.kernel.org Cc: linux-renesas-soc@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= Subject: [PATCH v2 3/3] rcar-vin: declare which VINs can use a Up Down Scaler (UDS) Date: Thu, 4 Oct 2018 22:04:02 +0200 Message-Id: <20181004200402.15113-4-niklas.soderlund+renesas@ragnatech.se> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181004200402.15113-1-niklas.soderlund+renesas@ragnatech.se> References: <20181004200402.15113-1-niklas.soderlund+renesas@ragnatech.se> MIME-Version: 1.0 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 Add information about which VINs on which SoC have access to a UDS scaler. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- drivers/media/platform/rcar-vin/rcar-core.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c index 01e418c2d4c6792e..337ae8bbe1e0b14c 100644 --- a/drivers/media/platform/rcar-vin/rcar-core.c +++ b/drivers/media/platform/rcar-vin/rcar-core.c @@ -919,12 +919,21 @@ static const struct rvin_group_route rcar_info_r8a7795_routes[] = { { /* Sentinel */ } }; +static const struct rvin_group_scaler rcar_info_h3_m3w_m3n_scalers[] = { + { .vin = 0, .companion = 1 }, + { .vin = 1, .companion = 0 }, + { .vin = 4, .companion = 5 }, + { .vin = 5, .companion = 4 }, + { /* Sentinel */ } +}; + static const struct rvin_info rcar_info_r8a7795 = { .model = RCAR_GEN3, .use_mc = true, .max_width = 4096, .max_height = 4096, .routes = rcar_info_r8a7795_routes, + .scalers = rcar_info_h3_m3w_m3n_scalers, }; static const struct rvin_group_route rcar_info_r8a7795es1_routes[] = { @@ -979,6 +988,7 @@ static const struct rvin_info rcar_info_r8a7795es1 = { .max_width = 4096, .max_height = 4096, .routes = rcar_info_r8a7795es1_routes, + .scalers = rcar_info_h3_m3w_m3n_scalers, }; static const struct rvin_group_route rcar_info_r8a7796_routes[] = { @@ -1019,6 +1029,7 @@ static const struct rvin_info rcar_info_r8a7796 = { .max_width = 4096, .max_height = 4096, .routes = rcar_info_r8a7796_routes, + .scalers = rcar_info_h3_m3w_m3n_scalers, }; static const struct rvin_group_route rcar_info_r8a77965_routes[] = { @@ -1063,6 +1074,7 @@ static const struct rvin_info rcar_info_r8a77965 = { .max_width = 4096, .max_height = 4096, .routes = rcar_info_r8a77965_routes, + .scalers = rcar_info_h3_m3w_m3n_scalers, }; static const struct rvin_group_route rcar_info_r8a77970_routes[] = { @@ -1088,12 +1100,18 @@ static const struct rvin_group_route rcar_info_r8a77995_routes[] = { { /* Sentinel */ } }; +static const struct rvin_group_scaler rcar_info_r8a77995_scalers[] = { + { .vin = 4, .companion = -1 }, + { /* Sentinel */ } +}; + static const struct rvin_info rcar_info_r8a77995 = { .model = RCAR_GEN3, .use_mc = true, .max_width = 4096, .max_height = 4096, .routes = rcar_info_r8a77995_routes, + .scalers = rcar_info_r8a77995_scalers, }; static const struct of_device_id rvin_of_id_table[] = {