From patchwork Wed Oct 11 11:23:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Lothar_Wa=C3=9Fmann?= X-Patchwork-Id: 824357 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=devicetree-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yBsbl6Pxdz9sNr for ; Wed, 11 Oct 2017 22:45:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755556AbdJKLoj (ORCPT ); Wed, 11 Oct 2017 07:44:39 -0400 Received: from smtprelay08.ispgateway.de ([134.119.228.98]:48001 "EHLO smtprelay08.ispgateway.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752846AbdJKLnF (ORCPT ); Wed, 11 Oct 2017 07:43:05 -0400 Received: from [89.1.81.74] (helo=ipc1.ka-ro) by smtprelay08.ispgateway.de with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.89) (envelope-from ) id 1e2FPh-0002ok-Uv; Wed, 11 Oct 2017 13:43:01 +0200 Received: from lothar by ipc1.ka-ro with local (Exim 4.84_2 #2 (Debian)) id 1e2FPh-0007u6-G1; Wed, 11 Oct 2017 13:43:01 +0200 From: =?utf-8?q?Lothar_Wa=C3=9Fmann?= To: David Airlie , Mark Rutland , Rob Herring , Thierry Reding , devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: =?utf-8?q?Lothar_Wa=C3=9Fmann?= Subject: [PATCH 3/9] drm/panel: simple: make it possible to override LCD bus format Date: Wed, 11 Oct 2017 13:23:35 +0200 Message-Id: <1507721021-28174-4-git-send-email-LW@KARO-electronics.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1507721021-28174-1-git-send-email-LW@KARO-electronics.de> References: <1507721021-28174-1-git-send-email-LW@KARO-electronics.de> MIME-Version: 1.0 X-Df-Sender: bHdAa2Fyby1lbGVjdHJvbmljcy5kZQ== Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org The baseboards for the Ka-Ro electronics series of i.MX modules use a 24bit LCD interface, no matter what LCD bus width the SoC on the module provides and what the LCD panel expects. LCDs with 6bit per color will ignore the 2 LSBs of each color lane, and modules using a SoC that provides only 6bit per color, drive the display information on the 6 MSBs of each color lane and tie the 2 LSBs of each color lane to GND. Thus, no matter what combination of LCD and SoC is used, the LCD port can be used without shuffling bit lanes by always configuring the LCD output to 24bit mode. Add a function to handle certain quirks of the LCD interface to the panel driver to be able to override the bus format specified in a panel's display_mode. Signed-off-by: Lothar Waßmann --- .../bindings/display/panel/simple-panel.txt | 2 ++ drivers/gpu/drm/panel/panel-simple.c | 40 +++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/display/panel/simple-panel.txt b/Documentation/devicetree/bindings/display/panel/simple-panel.txt index 1341bbf..e2308c3 100644 --- a/Documentation/devicetree/bindings/display/panel/simple-panel.txt +++ b/Documentation/devicetree/bindings/display/panel/simple-panel.txt @@ -7,6 +7,8 @@ Optional properties: - ddc-i2c-bus: phandle of an I2C controller used for DDC EDID probing - enable-gpios: GPIO pin to enable or disable the panel - backlight: phandle of the backlight device attached to the panel +- bus-format-override: override the bus_format setting of the panel's + display_mode settings Example: diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index fde9c41..f356a7b 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -87,6 +87,8 @@ struct panel_simple { struct i2c_adapter *ddc; struct gpio_desc *enable_gpio; + + u32 bus_fmt_override; }; #define SP_DISPLAY_MODE(freq, ha, hfp, hs, hbp, va, vfp, vs, vbp, vr, flgs) { \ @@ -165,7 +167,11 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel) connector->display_info.bpc = panel->desc->bpc; connector->display_info.width_mm = panel->desc->size.width; connector->display_info.height_mm = panel->desc->size.height; - if (panel->desc->bus_format) + + if (panel->bus_fmt_override) + drm_display_info_set_bus_formats(&connector->display_info, + &panel->bus_fmt_override, 1); + else if (panel->desc->bus_format) drm_display_info_set_bus_formats(&connector->display_info, &panel->desc->bus_format, 1); connector->display_info.bus_flags = panel->desc->bus_flags; @@ -298,6 +304,34 @@ static int panel_simple_get_timings(struct drm_panel *panel, return p->desc->num_timings; } +static inline int panel_simple_check_quirks(struct device *dev, + struct panel_simple *p) +{ + const char *bus_fmt; + + if (of_property_read_string(dev->of_node, "bus-format-override", + &bus_fmt) == 0) { + if (strcmp(bus_fmt, "rgb24") == 0) + p->bus_fmt_override = MEDIA_BUS_FMT_RGB888_1X24; + else if (strcmp(bus_fmt, "rgb666") == 0) + p->bus_fmt_override = MEDIA_BUS_FMT_RGB666_1X18; + else if (strcmp(bus_fmt, "rgb565") == 0) + p->bus_fmt_override = MEDIA_BUS_FMT_RGB565_1X16; + else if (strcmp(bus_fmt, "spwg-18") == 0) + p->bus_fmt_override = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG; + else if (strcmp(bus_fmt, "spwg-24") == 0) + p->bus_fmt_override = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG; + else if (strcmp(bus_fmt, "jeida-24") == 0) + p->bus_fmt_override = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA; + else + dev_err(dev, + "Unsupported bus-format-override value: '%s'\n", + bus_fmt); + return p->bus_fmt_override ? 0 : -EINVAL; + } + return 0; +} + static const struct drm_panel_funcs panel_simple_funcs = { .disable = panel_simple_disable, .unprepare = panel_simple_unprepare, @@ -353,6 +387,10 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) } } + err = panel_simple_check_quirks(dev, panel); + if (err) + goto free_ddc; + drm_panel_init(&panel->base); panel->base.dev = dev; panel->base.funcs = &panel_simple_funcs;