Received: by 10.192.165.156 with SMTP id m28csp494193imm; Thu, 19 Apr 2018 02:37:15 -0700 (PDT) X-Google-Smtp-Source: AIpwx48q0uwvf1P8GpcpHhmw/J4OAkF/xdfWhPNlZH7MF74KrB7S7Y0liufzWdGO+I79HpxXSfJC X-Received: by 10.101.82.194 with SMTP id z2mr4610030pgp.69.1524130635039; Thu, 19 Apr 2018 02:37:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524130635; cv=none; d=google.com; s=arc-20160816; b=E6xqCgeMI87IVWO4MrjD4vCm+Epdd4ZbeTA2kjs7h+kEeHMzPEwPDLaRTaZBzO72Of d8N84JZZoEkKicCJ1/FU26AM1qq/XOucF3ww6NA/HEF4zYfI4l0dHvxSEX8/euUEVJYH 0g5V7A05GPe+0gYAM9Oho/kUPwpzg/Vb7p8ukfu9nnmQ8QZ9RJ0lOTe6PQNnc/+PcPe9 go9A8NIpCRkpvBLB8Qx5X2o6Xmoy10Gp777/MF5L2T4VfNAW2skiY6V/dD2djNXn8Q1h GxwMv1FnC7SqnYlqsOzfUm3jhVyT8p/vanuKbLIL7YYvckPdDIlnnSSQ9u+pcsMyzBiZ Vy2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=HOEU9uEMITwLUIEsKj96o1geLu0oE/Uq9MM4uB3li3g=; b=nvHRPUWrNSc/462lMI+aKm3kRf0hwQ9WrIBY3F3EkLzdDieddgkO4gamWVSO2WIbpb 9tcyzbv/PTJkF0vjyZvNPkCfTbqV20BcUXCqIg+e1DAMz4Znr0/c0HDwKe+76dFyL7vn 578j5q2Co60eeCJg/jD1bdwg8ed0Fb2lvoevJD79TXGgqsUoYTYAxVrMb2FhQNGg/CmN 6X2KiGzjrKp+3EZVLPlr0g3GP/AGGhDFuZjy9+J41VnAOTYM73ChwziGcSOqd4cSpug7 hGjXUQA91SWL9kC1YRlPLu+/5uxFY/ZZof3tJKZT2vkqU9DbE4ToZhcCiuBQNwWeL3H+ Mv7g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o18si2736187pgd.442.2018.04.19.02.37.01; Thu, 19 Apr 2018 02:37:15 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753160AbeDSJfZ (ORCPT + 99 others); Thu, 19 Apr 2018 05:35:25 -0400 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:58531 "EHLO relay3-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752489AbeDSJbj (ORCPT ); Thu, 19 Apr 2018 05:31:39 -0400 X-Originating-IP: 2.224.242.101 Received: from w540.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 96A8260028; Thu, 19 Apr 2018 11:31:35 +0200 (CEST) From: Jacopo Mondi To: architt@codeaurora.org, a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com, airlied@linux.ie Cc: Jacopo Mondi , daniel@ffwll.ch, peda@axentia.se, linux-renesas-soc@vger.kernel.org, linux-media@vger.kernel.org, devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/8] drm: rcar-du: rcar-lvds: Add bridge format support Date: Thu, 19 Apr 2018 11:31:07 +0200 Message-Id: <1524130269-32688-7-git-send-email-jacopo+renesas@jmondi.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524130269-32688-1-git-send-email-jacopo+renesas@jmondi.org> References: <1524130269-32688-1-git-send-email-jacopo+renesas@jmondi.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With the introduction of static input image format enumeration in DRM bridges, add support to retrieve the format in rcar-lvds LVDS encoder from both panel or bridge, to set the desired LVDS mode. Do not rely on 'DRM_BUS_FLAG_DATA_LSB_TO_MSB' flag to mirror the LVDS format, as it is only defined for drm connectors, but use the newly introduced _LE version of LVDS mbus image formats. Signed-off-by: Jacopo Mondi --- drivers/gpu/drm/rcar-du/rcar_lvds.c | 64 +++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c index 3d2d3bb..2fa875f 100644 --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c @@ -280,41 +280,65 @@ static bool rcar_lvds_mode_fixup(struct drm_bridge *bridge, return true; } -static void rcar_lvds_get_lvds_mode(struct rcar_lvds *lvds) +static int rcar_lvds_get_lvds_mode_from_connector(struct rcar_lvds *lvds, + unsigned int *bus_fmt) { struct drm_display_info *info = &lvds->connector.display_info; - enum rcar_lvds_mode mode; - - /* - * There is no API yet to retrieve LVDS mode from a bridge, only panels - * are supported. - */ - if (!lvds->panel) - return; if (!info->num_bus_formats || !info->bus_formats) { dev_err(lvds->dev, "no LVDS bus format reported\n"); - return; + return -EINVAL; + } + + *bus_fmt = info->bus_formats[0]; + + return 0; +} + +static int rcar_lvds_get_lvds_mode_from_bridge(struct rcar_lvds *lvds, + unsigned int *bus_fmt) +{ + if (!lvds->next_bridge->num_bus_formats || + !lvds->next_bridge->bus_formats) { + dev_err(lvds->dev, "no LVDS bus format reported\n"); + return -EINVAL; } - switch (info->bus_formats[0]) { + *bus_fmt = lvds->next_bridge->bus_formats[0]; + + return 0; +} + +static void rcar_lvds_get_lvds_mode(struct rcar_lvds *lvds) +{ + unsigned int bus_fmt; + int ret; + + if (lvds->panel) + ret = rcar_lvds_get_lvds_mode_from_connector(lvds, &bus_fmt); + else + ret = rcar_lvds_get_lvds_mode_from_bridge(lvds, &bus_fmt); + if (ret) + return; + + switch (bus_fmt) { + case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG_LE: + case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA_LE: + lvds->mode |= RCAR_LVDS_MODE_MIRROR; case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: - mode = RCAR_LVDS_MODE_JEIDA; + lvds->mode = RCAR_LVDS_MODE_JEIDA; break; + + case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG_LE: + lvds->mode |= RCAR_LVDS_MODE_MIRROR; case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: - mode = RCAR_LVDS_MODE_VESA; + lvds->mode = RCAR_LVDS_MODE_VESA; break; default: dev_err(lvds->dev, "unsupported LVDS bus format 0x%04x\n", - info->bus_formats[0]); - return; + bus_fmt); } - - if (info->bus_flags & DRM_BUS_FLAG_DATA_LSB_TO_MSB) - mode |= RCAR_LVDS_MODE_MIRROR; - - lvds->mode = mode; } static void rcar_lvds_mode_set(struct drm_bridge *bridge, -- 2.7.4