From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.6 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,T_MIXED_ES,URIBL_BLOCKED, USER_AGENT_MUTT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F1E0C65BAE for ; Thu, 13 Dec 2018 15:07:54 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2E92520851 for ; Thu, 13 Dec 2018 15:07:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="YEDJEb/Y"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=poorly.run header.i=@poorly.run header.b="QZ3p7vsc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2E92520851 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=poorly.run Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=zANWKgvfQ34FnOWeUz8Yqt4dZ8Rw6AHAPz+8F8nNg1E=; b=YEDJEb/YxRH4+5 D1pfMk70X+IIbhY1l9rcwKJcrmAkBKso4SLOe8BQ6x0HBmqE0wpda7ummpbUyUK+RFj/3AKUbadWx sC5Os75IUOgBgsaZXhYLj33oAsAZXsJhxWf0n2AlQpz7cvKaL0YigXhzK5gYKwY+BnmnuYrRqo3XH +znVUkPtcy7Yf3l7KQdgCrwppVwFOZ+1+c8LEfxK5qCIbgAX9OqGEsE31lDMis6nluiVM9yJGE31T 5lSESQcej0CGsXUAudLoQH9HUOgNzCkKQjR2EhoqImeS9tNzp7MfyqzgajedD7nh/3iSRUWsHjZk4 nK7PcBitP9ZAt16kWh5g==; 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 1gXSae-0005gw-W6; Thu, 13 Dec 2018 15:07:53 +0000 Received: from mail-yb1-xb42.google.com ([2607:f8b0:4864:20::b42]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gXSab-0005ff-EI for linux-arm-kernel@lists.infradead.org; Thu, 13 Dec 2018 15:07:51 +0000 Received: by mail-yb1-xb42.google.com with SMTP id c67so928922ybf.0 for ; Thu, 13 Dec 2018 07:07:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poorly.run; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=SM57eTi17ZbBz501UB6FxCz2N+F7k/h3+LBNpkRqm2U=; b=QZ3p7vsc3gOJ2kGwGorQ9XPsAOzW6VZrEqCO4gvG4gxv4FHt2eX8qtJFodVY3kBr0B jK5ADggAMR4DiinzYFuM8jFGrOEsNMP5d0wNEPDnb4NsXzhn/xfKQcKLCZpAjeR4hmas 9JfLWMcYaXPZVwuM3ftp1BQsoUAAYeR7pF8vjo2UvIvX7RF2ti8rc5mwtELxRsGhzAVN dy8UchxRkLGvXmn6WZzp9uLIHrLzesWABi+yEKEF6IXMmblni2/O6Ssx7puape0G7JlJ U+hU898qT3/DZ0D9wY1YDArIpz9Hms50LddctDLi4hvdC/nvD+NNs7OR3rJSkyb/WNKH qCzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=SM57eTi17ZbBz501UB6FxCz2N+F7k/h3+LBNpkRqm2U=; b=FDY14Kgk2ETUIbuGsflSQqaO7Eb1EyDBnKZSc/yrw2X9+NDbZnZ7sVTJnJFm31ssu5 lvflamsHA82hzkRa8re9Y8jXuHehPyTAkDlhfN5Eu6JxsY9NLAeJ6f9schTE+W4CvOFU aBYXjBRNZsVQ3zMd5TPIQlgg66zjQ2Otb3OZPFCAHzB9x1GL2f5hnPpv/nXSEHhHc/W8 e0vdxY8LbvWsv4eV368lUpSxYk69jmPJN6BzCtiWlm5OhgvMQvy+szIwzGttEV0tbuqN oNdrBBBlpEwWHz4u0cqBY9FV40QTbkmGWNHxlIjxzS4P/XJ63Yl6lE5WF8jbeRPEEp6T hGkg== X-Gm-Message-State: AA+aEWZd19+GRzPPK9cDdNyjiCd/wpvNuC9PmESD479f7iDi62yQqY7L EysdVQ3iqPs7SDstQN0ND3WSMw== X-Google-Smtp-Source: AFSGD/VRTULlafrlKNKn4LNBkZLrl9w6Lqnhyv9sT5QWC0wP7niqSTQCIhy6hLrgsRLt+uWmHKspEw== X-Received: by 2002:a25:9106:: with SMTP id v6mr5401534ybl.386.1544713657640; Thu, 13 Dec 2018 07:07:37 -0800 (PST) Received: from localhost ([2620:0:1013:11:ad55:b1db:adfe:3b9f]) by smtp.gmail.com with ESMTPSA id b129sm677289ywc.106.2018.12.13.07.07.36 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 13 Dec 2018 07:07:36 -0800 (PST) Date: Thu, 13 Dec 2018 10:07:36 -0500 From: Sean Paul To: Jagan Teki Subject: Re: [PATCH v2 11/12] drm/panel: Add Feiyang FY07024DI26A30-D MIPI-DSI LCD panel Message-ID: <20181213150736.GL154160@art_vandelay> References: <20181116163916.29621-1-jagan@amarulasolutions.com> <20181116163916.29621-12-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20181116163916.29621-12-jagan@amarulasolutions.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181213_070749_480969_55B2DB52 X-CRM114-Status: GOOD ( 27.55 ) X-BeenThere: linux-arm-kernel@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, Jernej Skrabec , Maxime Ripard , linux-amarula@amarulasolutions.com, linux-sunxi@googlegroups.com, Maarten Lankhorst , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Vasily Khoruzhick , David Airlie , Chen-Yu Tsai , Rob Herring , Thierry Reding , TL Lim , Michael Trimarchi , Sean Paul , linux-arm-kernel@lists.infradead.org, Icenowy Zheng Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Nov 16, 2018 at 10:09:15PM +0530, Jagan Teki wrote: > Feiyang FY07024DI26A30-D is 1024x600, 4-lane MIPI-DSI LCD panel. > > Add panel driver for it. > > Signed-off-by: Jagan Teki > --- > MAINTAINERS | 6 + > drivers/gpu/drm/panel/Kconfig | 9 + > drivers/gpu/drm/panel/Makefile | 1 + > .../drm/panel/panel-feiyang-fy07024di26a30d.c | 286 ++++++++++++++++++ > 4 files changed, 302 insertions(+) > create mode 100644 drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 3dac08d0b3cb..40c8bfc974f4 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -4620,6 +4620,12 @@ T: git git://anongit.freedesktop.org/drm/drm-misc > S: Maintained > F: drivers/gpu/drm/tve200/ > > +DRM DRIVER FOR FEIYANG FY07024DI26A30-D MIPI-DSI LCD PANELS > +M: Jagan Teki > +S: Maintained > +F: drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > +F: Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.txt > + > DRM DRIVER FOR ILITEK ILI9225 PANELS > M: David Lechner > S: Maintained > diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig > index d0d4e60f5153..bc70896fe43c 100644 > --- a/drivers/gpu/drm/panel/Kconfig > +++ b/drivers/gpu/drm/panel/Kconfig > @@ -47,6 +47,15 @@ config DRM_PANEL_SIMPLE > that it can be automatically turned off when the panel goes into a > low power state. > > +config DRM_PANEL_FEIYANG_FY07024DI26A30D > + tristate "Feiyang FY07024DI26A30-D MIPI-DSI LCD panel" > + depends on OF > + depends on DRM_MIPI_DSI > + depends on BACKLIGHT_CLASS_DEVICE > + help > + Say Y if you want to enable support for panels based on the > + Feiyang FY07024DI26A30-D MIPI-DSI interface. > + > config DRM_PANEL_ILITEK_IL9322 > tristate "Ilitek ILI9322 320x240 QVGA panels" > depends on OF && SPI > diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile > index 88011f06edb8..e23c017639c7 100644 > --- a/drivers/gpu/drm/panel/Makefile > +++ b/drivers/gpu/drm/panel/Makefile > @@ -3,6 +3,7 @@ obj-$(CONFIG_DRM_PANEL_ARM_VERSATILE) += panel-arm-versatile.o > obj-$(CONFIG_DRM_PANEL_BANANAPI_S070WV20_ICN6211) += panel-bananapi-s070wv20-icn6211.o > obj-$(CONFIG_DRM_PANEL_LVDS) += panel-lvds.o > obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o > +obj-$(CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D) += panel-feiyang-fy07024di26a30d.o > obj-$(CONFIG_DRM_PANEL_ILITEK_IL9322) += panel-ilitek-ili9322.o > obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9881C) += panel-ilitek-ili9881c.o > obj-$(CONFIG_DRM_PANEL_INNOLUX_P079ZCA) += panel-innolux-p079zca.o > diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > new file mode 100644 > index 000000000000..a4b46bd8fdbe > --- /dev/null > +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > @@ -0,0 +1,286 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Copyright (C) 2018 Amarula Solutions > + * Author: Jagan Teki > + */ > + > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +#include > +#include > +#include > + > +struct feiyang { > + struct drm_panel panel; > + struct mipi_dsi_device *dsi; > + > + struct backlight_device *backlight; > + struct regulator *dvdd; > + struct regulator *avdd; > + struct gpio_desc *reset; > +}; > + > +static inline struct feiyang *panel_to_feiyang(struct drm_panel *panel) > +{ > + return container_of(panel, struct feiyang, panel); > +} > + > +struct feiyang_init_cmd { > + size_t len; > + const char *data; > +}; > + > +#define FY07024DI26A30D(...) { \ > + .len = sizeof((char[]){__VA_ARGS__}), \ > + .data = (char[]){__VA_ARGS__} } > + > +static const struct feiyang_init_cmd feiyang_init_cmds[] = { > + FY07024DI26A30D(0x80, 0x58), > + FY07024DI26A30D(0x81, 0x47), > + FY07024DI26A30D(0x82, 0xD4), > + FY07024DI26A30D(0x83, 0x88), > + FY07024DI26A30D(0x84, 0xA9), > + FY07024DI26A30D(0x85, 0xC3), > + FY07024DI26A30D(0x86, 0x82), > +}; These init cmds don't have to be so complicated. You've only got len == 2, so just hardcode it in and avoid the macro: #define FEIYANG_INIT_CMD_LEN 2 struct feiyang_init_cmd { u8 data[FEIYANG_INIT_CMD]; }; static const struct feiyang_init_cmd feiyang_init_cmds[] = { { .data = { 0x80, 0x58 } }, ... }; > + > +static int feiyang_prepare(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + struct mipi_dsi_device *dsi = ctx->dsi; > + unsigned int i; > + int ret; > + > + ret = regulator_enable(ctx->dvdd); > + if (ret) > + return ret; > + > + msleep(100); nit: You should do your best to correlate the sleeps with the timing parameters from the datasheet with a comment. ie: /* T1: > 100ms */ msleep(100); > + > + ret = regulator_enable(ctx->avdd); > + if (ret) > + return ret; > + > + msleep(20); > + > + gpiod_set_value(ctx->reset, 1); > + msleep(50); > + > + gpiod_set_value(ctx->reset, 0); > + msleep(20); > + > + gpiod_set_value(ctx->reset, 1); > + msleep(200); > + > + for (i = 0; i < ARRAY_SIZE(feiyang_init_cmds); i++) { > + const struct feiyang_init_cmd *cmd = > + &feiyang_init_cmds[i]; > + > + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, cmd->len); ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, FEIYANG_INIT_CMD_LEN); > + if (ret < 0) > + return ret; > + } > + > + return 0; > +} > + > +static int feiyang_enable(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + > + msleep(120); > + > + mipi_dsi_dcs_set_display_on(ctx->dsi); > + backlight_enable(ctx->backlight); > + > + return 0; > +} > + > +static int feiyang_disable(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + > + backlight_disable(ctx->backlight); > + return mipi_dsi_dcs_set_display_on(ctx->dsi); set_display_on? You probably want set_display_off here :) > +} > + > +static int feiyang_unprepare(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + int ret; > + > + ret = mipi_dsi_dcs_set_display_off(ctx->dsi); > + if (ret < 0) > + DRM_DEV_ERROR(panel->dev, "failed to set display off: %d\n", > + ret); > + > + ret = mipi_dsi_dcs_enter_sleep_mode(ctx->dsi); > + if (ret < 0) > + DRM_DEV_ERROR(panel->dev, "failed to enter sleep mode: %d\n", > + ret); > + > + msleep(100); > + > + regulator_disable(ctx->avdd); > + > + regulator_disable(ctx->dvdd); > + > + gpiod_set_value(ctx->reset, 0); > + > + gpiod_set_value(ctx->reset, 1); > + > + gpiod_set_value(ctx->reset, 0); Presumably this reset line toggle isn't needed since the rails are already disabled? > + > + return 0; > +} > + > +static const struct drm_display_mode feiyang_default_mode = { > + .clock = 55000, > + .vrefresh = 60, This doesn't add up correctly. The pixel clock should be equal to: (htotal * vtotal * vrefresh) / 1000 For this reason, we usually don't specify the refresh rate since it can be misleading. Your actual refresh rate with the pixel clock you specified is actually going to be 56.2Hz instead of the 60 you want. If you can only generate a 55MHz pixel clock, consider reducing your blanking periods so the calculation above matches. > + > + .hdisplay = 1024, > + .hsync_start = 1024 + 396, > + .hsync_end = 1024 + 396 + 20, > + .htotal = 1024 + 396 + 20 + 100, > + > + .vdisplay = 600, > + .vsync_start = 600 + 12, > + .vsync_end = 600 + 12 + 2, > + .vtotal = 600 + 12 + 2 + 21, > +}; > + > +static int feiyang_get_modes(struct drm_panel *panel) > +{ > + struct drm_connector *connector = panel->connector; > + struct feiyang *ctx = panel_to_feiyang(panel); > + struct drm_display_mode *mode; > + > + mode = drm_mode_duplicate(panel->drm, &feiyang_default_mode); > + if (!mode) { > + DRM_DEV_ERROR(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n", > + feiyang_default_mode.hdisplay, > + feiyang_default_mode.vdisplay, > + feiyang_default_mode.vrefresh); > + return -ENOMEM; > + } > + > + drm_mode_set_name(mode); > + > + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; Just set these above. > + drm_mode_probed_add(connector, mode); > + > + return 1; > +} > + > +static const struct drm_panel_funcs feiyang_funcs = { > + .disable = feiyang_disable, > + .unprepare = feiyang_unprepare, > + .prepare = feiyang_prepare, > + .enable = feiyang_enable, > + .get_modes = feiyang_get_modes, > +}; > + > +static int feiyang_dsi_probe(struct mipi_dsi_device *dsi) > +{ > + struct device_node *np; > + struct feiyang *ctx; > + int ret; > + > + ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return -ENOMEM; > + mipi_dsi_set_drvdata(dsi, ctx); > + ctx->dsi = dsi; > + > + drm_panel_init(&ctx->panel); > + ctx->panel.dev = &dsi->dev; > + ctx->panel.funcs = &feiyang_funcs; > + > + ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd"); > + if (IS_ERR(ctx->dvdd)) { > + DRM_DEV_ERROR(&dsi->dev, "Couldn't get dvdd regulator\n"); > + return PTR_ERR(ctx->dvdd); > + } > + > + ctx->avdd = devm_regulator_get(&dsi->dev, "avdd"); > + if (IS_ERR(ctx->avdd)) { > + DRM_DEV_ERROR(&dsi->dev, "Couldn't get avdd regulator\n"); > + return PTR_ERR(ctx->avdd); > + } > + > + ctx->reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); > + if (IS_ERR(ctx->reset)) { > + DRM_DEV_ERROR(&dsi->dev, "Couldn't get our reset GPIO\n"); > + return PTR_ERR(ctx->reset); > + } > + > + np = of_parse_phandle(dsi->dev.of_node, "backlight", 0); > + if (np) { > + ctx->backlight = of_find_backlight_by_node(np); > + of_node_put(np); > + > + if (!ctx->backlight) > + return -EPROBE_DEFER; > + } > + > + ret = drm_panel_add(&ctx->panel); > + if (ret < 0) > + goto put_backlight; > + > + dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST; > + dsi->format = MIPI_DSI_FMT_RGB888; > + dsi->lanes = 4; > + > + ret = mipi_dsi_attach(dsi); > + if (ret < 0) > + goto panel_remove; > + > + return ret; > + > +panel_remove: > + drm_panel_remove(&ctx->panel); > +put_backlight: > + if (ctx->backlight) > + put_device(&ctx->backlight->dev); > + > + return ret; > +} > + > +static int feiyang_dsi_remove(struct mipi_dsi_device *dsi) > +{ > + struct feiyang *ctx = mipi_dsi_get_drvdata(dsi); > + > + mipi_dsi_detach(dsi); > + drm_panel_remove(&ctx->panel); > + > + if (ctx->backlight) > + put_device(&ctx->backlight->dev); > + > + return 0; > +} > + > +static const struct of_device_id feiyang_of_match[] = { > + { .compatible = "feiyang,fy07024di26a30d", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, feiyang_of_match); > + > +static struct mipi_dsi_driver feiyang_driver = { > + .probe = feiyang_dsi_probe, > + .remove = feiyang_dsi_remove, > + .driver = { > + .name = "feiyang-fy07024di26a30d", > + .of_match_table = feiyang_of_match, > + }, > +}; > +module_mipi_dsi_driver(feiyang_driver); > + > +MODULE_AUTHOR("Jagan Teki "); > +MODULE_DESCRIPTION("Feiyang FY07024DI26A30-D MIPI-DSI LCD panel"); > +MODULE_LICENSE("GPL"); > -- > 2.18.0.321.gffc6fa0e3 > -- Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v2 11/12] drm/panel: Add Feiyang FY07024DI26A30-D MIPI-DSI LCD panel Date: Thu, 13 Dec 2018 10:07:36 -0500 Message-ID: <20181213150736.GL154160@art_vandelay> References: <20181116163916.29621-1-jagan@amarulasolutions.com> <20181116163916.29621-12-jagan@amarulasolutions.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20181116163916.29621-12-jagan@amarulasolutions.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jagan Teki Cc: Mark Rutland , devicetree@vger.kernel.org, Jernej Skrabec , Maxime Ripard , linux-amarula@amarulasolutions.com, linux-sunxi@googlegroups.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Vasily Khoruzhick , David Airlie , Chen-Yu Tsai , Rob Herring , Thierry Reding , TL Lim , Michael Trimarchi , Sean Paul , linux-arm-kernel@lists.infradead.org, Icenowy Zheng List-Id: devicetree@vger.kernel.org T24gRnJpLCBOb3YgMTYsIDIwMTggYXQgMTA6MDk6MTVQTSArMDUzMCwgSmFnYW4gVGVraSB3cm90 ZToKPiBGZWl5YW5nIEZZMDcwMjRESTI2QTMwLUQgaXMgMTAyNHg2MDAsIDQtbGFuZSBNSVBJLURT SSBMQ0QgcGFuZWwuCj4gCj4gQWRkIHBhbmVsIGRyaXZlciBmb3IgaXQuCj4gCj4gU2lnbmVkLW9m Zi1ieTogSmFnYW4gVGVraSA8amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+Cj4gLS0tCj4gIE1B SU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNiArCj4gIGRy aXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAgOSArCj4gIGRy aXZlcnMvZ3B1L2RybS9wYW5lbC9NYWtlZmlsZSAgICAgICAgICAgICAgICB8ICAgMSArCj4gIC4u Li9kcm0vcGFuZWwvcGFuZWwtZmVpeWFuZy1meTA3MDI0ZGkyNmEzMGQuYyB8IDI4NiArKysrKysr KysrKysrKysrKysKPiAgNCBmaWxlcyBjaGFuZ2VkLCAzMDIgaW5zZXJ0aW9ucygrKQo+ICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLWZlaXlhbmctZnkwNzAy NGRpMjZhMzBkLmMKPiAKPiBkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwo+ IGluZGV4IDNkYWMwOGQwYjNjYi4uNDBjOGJmYzk3NGY0IDEwMDY0NAo+IC0tLSBhL01BSU5UQUlO RVJTCj4gKysrIGIvTUFJTlRBSU5FUlMKPiBAQCAtNDYyMCw2ICs0NjIwLDEyIEBAIFQ6CWdpdCBn aXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9kcm0vZHJtLW1pc2MKPiAgUzoJTWFpbnRhaW5l ZAo+ICBGOglkcml2ZXJzL2dwdS9kcm0vdHZlMjAwLwo+ICAKPiArRFJNIERSSVZFUiBGT1IgRkVJ WUFORyBGWTA3MDI0REkyNkEzMC1EIE1JUEktRFNJIExDRCBQQU5FTFMKPiArTToJSmFnYW4gVGVr aSA8amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+Cj4gK1M6CU1haW50YWluZWQKPiArRjoJZHJp dmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLWZlaXlhbmctZnkwNzAyNGRpMjZhMzBkLmMKPiArRjoJ RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvcGFuZWwvZmVpeWFuZyxm eTA3MDI0ZGkyNmEzMGQudHh0Cj4gKwo+ICBEUk0gRFJJVkVSIEZPUiBJTElURUsgSUxJOTIyNSBQ QU5FTFMKPiAgTToJRGF2aWQgTGVjaG5lciA8ZGF2aWRAbGVjaG5vbG9neS5jb20+Cj4gIFM6CU1h aW50YWluZWQKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL0tjb25maWcgYi9k cml2ZXJzL2dwdS9kcm0vcGFuZWwvS2NvbmZpZwo+IGluZGV4IGQwZDRlNjBmNTE1My4uYmM3MDg5 NmZlNDNjIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL3BhbmVsL0tjb25maWcKPiBAQCAtNDcsNiArNDcsMTUgQEAgY29u ZmlnIERSTV9QQU5FTF9TSU1QTEUKPiAgCSAgdGhhdCBpdCBjYW4gYmUgYXV0b21hdGljYWxseSB0 dXJuZWQgb2ZmIHdoZW4gdGhlIHBhbmVsIGdvZXMgaW50byBhCj4gIAkgIGxvdyBwb3dlciBzdGF0 ZS4KPiAgCj4gK2NvbmZpZyBEUk1fUEFORUxfRkVJWUFOR19GWTA3MDI0REkyNkEzMEQKPiArCXRy aXN0YXRlICJGZWl5YW5nIEZZMDcwMjRESTI2QTMwLUQgTUlQSS1EU0kgTENEIHBhbmVsIgo+ICsJ ZGVwZW5kcyBvbiBPRgo+ICsJZGVwZW5kcyBvbiBEUk1fTUlQSV9EU0kKPiArCWRlcGVuZHMgb24g QkFDS0xJR0hUX0NMQVNTX0RFVklDRQo+ICsJaGVscAo+ICsJICBTYXkgWSBpZiB5b3Ugd2FudCB0 byBlbmFibGUgc3VwcG9ydCBmb3IgcGFuZWxzIGJhc2VkIG9uIHRoZQo+ICsJICBGZWl5YW5nIEZZ MDcwMjRESTI2QTMwLUQgTUlQSS1EU0kgaW50ZXJmYWNlLgo+ICsKPiAgY29uZmlnIERSTV9QQU5F TF9JTElURUtfSUw5MzIyCj4gIAl0cmlzdGF0ZSAiSWxpdGVrIElMSTkzMjIgMzIweDI0MCBRVkdB IHBhbmVscyIKPiAgCWRlcGVuZHMgb24gT0YgJiYgU1BJCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9wYW5lbC9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9NYWtlZmlsZQo+ IGluZGV4IDg4MDExZjA2ZWRiOC4uZTIzYzAxNzYzOWM3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9wYW5lbC9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9NYWtl ZmlsZQo+IEBAIC0zLDYgKzMsNyBAQCBvYmotJChDT05GSUdfRFJNX1BBTkVMX0FSTV9WRVJTQVRJ TEUpICs9IHBhbmVsLWFybS12ZXJzYXRpbGUubwo+ICBvYmotJChDT05GSUdfRFJNX1BBTkVMX0JB TkFOQVBJX1MwNzBXVjIwX0lDTjYyMTEpICs9IHBhbmVsLWJhbmFuYXBpLXMwNzB3djIwLWljbjYy MTEubwo+ICBvYmotJChDT05GSUdfRFJNX1BBTkVMX0xWRFMpICs9IHBhbmVsLWx2ZHMubwo+ICBv YmotJChDT05GSUdfRFJNX1BBTkVMX1NJTVBMRSkgKz0gcGFuZWwtc2ltcGxlLm8KPiArb2JqLSQo Q09ORklHX0RSTV9QQU5FTF9GRUlZQU5HX0ZZMDcwMjRESTI2QTMwRCkgKz0gcGFuZWwtZmVpeWFu Zy1meTA3MDI0ZGkyNmEzMGQubwo+ICBvYmotJChDT05GSUdfRFJNX1BBTkVMX0lMSVRFS19JTDkz MjIpICs9IHBhbmVsLWlsaXRlay1pbGk5MzIyLm8KPiAgb2JqLSQoQ09ORklHX0RSTV9QQU5FTF9J TElURUtfSUxJOTg4MUMpICs9IHBhbmVsLWlsaXRlay1pbGk5ODgxYy5vCj4gIG9iai0kKENPTkZJ R19EUk1fUEFORUxfSU5OT0xVWF9QMDc5WkNBKSArPSBwYW5lbC1pbm5vbHV4LXAwNzl6Y2Eubwo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtZmVpeWFuZy1meTA3MDI0 ZGkyNmEzMGQuYyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1mZWl5YW5nLWZ5MDcwMjRk aTI2YTMwZC5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmE0 YjQ2YmQ4ZmRiZQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwv cGFuZWwtZmVpeWFuZy1meTA3MDI0ZGkyNmEzMGQuYwo+IEBAIC0wLDAgKzEsMjg2IEBACj4gKy8v IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKwo+ICsvKgo+ICsgKiBDb3B5cmlnaHQg KEMpIDIwMTggQW1hcnVsYSBTb2x1dGlvbnMKPiArICogQXV0aG9yOiBKYWdhbiBUZWtpIDxqYWdh bkBhbWFydWxhc29sdXRpb25zLmNvbT4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvYmFj a2xpZ2h0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+ICsjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KPiArCj4gKyNpbmNsdWRl IDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29u c3VtZXIuaD4KPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9taXBpX2RzaS5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgo+ICsKPiArc3RydWN0 IGZlaXlhbmcgewo+ICsJc3RydWN0IGRybV9wYW5lbAlwYW5lbDsKPiArCXN0cnVjdCBtaXBpX2Rz aV9kZXZpY2UJKmRzaTsKPiArCj4gKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZQkqYmFja2xpZ2h0 Owo+ICsJc3RydWN0IHJlZ3VsYXRvcgkqZHZkZDsKPiArCXN0cnVjdCByZWd1bGF0b3IJKmF2ZGQ7 Cj4gKwlzdHJ1Y3QgZ3Bpb19kZXNjCSpyZXNldDsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IGZlaXlhbmcgKnBhbmVsX3RvX2ZlaXlhbmcoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwp Cj4gK3sKPiArCXJldHVybiBjb250YWluZXJfb2YocGFuZWwsIHN0cnVjdCBmZWl5YW5nLCBwYW5l bCk7Cj4gK30KPiArCj4gK3N0cnVjdCBmZWl5YW5nX2luaXRfY21kIHsKPiArCXNpemVfdCBsZW47 Cj4gKwljb25zdCBjaGFyICpkYXRhOwo+ICt9Owo+ICsKPiArI2RlZmluZSBGWTA3MDI0REkyNkEz MEQoLi4uKSB7IFwKPiArCS5sZW4gPSBzaXplb2YoKGNoYXJbXSl7X19WQV9BUkdTX199KSwgXAo+ ICsJLmRhdGEgPSAoY2hhcltdKXtfX1ZBX0FSR1NfX30gfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0 cnVjdCBmZWl5YW5nX2luaXRfY21kIGZlaXlhbmdfaW5pdF9jbWRzW10gPSB7Cj4gKwlGWTA3MDI0 REkyNkEzMEQoMHg4MCwgMHg1OCksCj4gKwlGWTA3MDI0REkyNkEzMEQoMHg4MSwgMHg0NyksCj4g KwlGWTA3MDI0REkyNkEzMEQoMHg4MiwgMHhENCksCj4gKwlGWTA3MDI0REkyNkEzMEQoMHg4Mywg MHg4OCksCj4gKwlGWTA3MDI0REkyNkEzMEQoMHg4NCwgMHhBOSksCj4gKwlGWTA3MDI0REkyNkEz MEQoMHg4NSwgMHhDMyksCj4gKwlGWTA3MDI0REkyNkEzMEQoMHg4NiwgMHg4MiksCj4gK307CgpU aGVzZSBpbml0IGNtZHMgZG9uJ3QgaGF2ZSB0byBiZSBzbyBjb21wbGljYXRlZC4gWW91J3ZlIG9u bHkgZ290IGxlbiA9PSAyLCBzbwpqdXN0IGhhcmRjb2RlIGl0IGluIGFuZCBhdm9pZCB0aGUgbWFj cm86CgojZGVmaW5lIEZFSVlBTkdfSU5JVF9DTURfTEVOICAgIDIKCnN0cnVjdCBmZWl5YW5nX2lu aXRfY21kIHsKICAgICAgICB1OCBkYXRhW0ZFSVlBTkdfSU5JVF9DTURdOwp9OwoKc3RhdGljIGNv bnN0IHN0cnVjdCBmZWl5YW5nX2luaXRfY21kIGZlaXlhbmdfaW5pdF9jbWRzW10gPSB7CiAgICAg ICAgeyAuZGF0YSA9IHsgMHg4MCwgMHg1OCB9IH0sCiAgICAgICAgLi4uCn07Cgo+ICsKPiArc3Rh dGljIGludCBmZWl5YW5nX3ByZXBhcmUoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCj4gK3sKPiAr CXN0cnVjdCBmZWl5YW5nICpjdHggPSBwYW5lbF90b19mZWl5YW5nKHBhbmVsKTsKPiArCXN0cnVj dCBtaXBpX2RzaV9kZXZpY2UgKmRzaSA9IGN0eC0+ZHNpOwo+ICsJdW5zaWduZWQgaW50IGk7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY3R4LT5kdmRkKTsKPiAr CWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwltc2xlZXAoMTAwKTsKCm5pdDogWW91 IHNob3VsZCBkbyB5b3VyIGJlc3QgdG8gY29ycmVsYXRlIHRoZSBzbGVlcHMgd2l0aCB0aGUgdGlt aW5nIHBhcmFtZXRlcnMgCmZyb20gdGhlIGRhdGFzaGVldCB3aXRoIGEgY29tbWVudC4KCmllOgog ICAgICAgIC8qIFQxOiA+IDEwMG1zICovCiAgICAgICAgbXNsZWVwKDEwMCk7Cgo+ICsKPiArCXJl dCA9IHJlZ3VsYXRvcl9lbmFibGUoY3R4LT5hdmRkKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJu IHJldDsKPiArCj4gKwltc2xlZXAoMjApOwo+ICsKPiArCWdwaW9kX3NldF92YWx1ZShjdHgtPnJl c2V0LCAxKTsKPiArCW1zbGVlcCg1MCk7Cj4gKwo+ICsJZ3Bpb2Rfc2V0X3ZhbHVlKGN0eC0+cmVz ZXQsIDApOwo+ICsJbXNsZWVwKDIwKTsKPiArCj4gKwlncGlvZF9zZXRfdmFsdWUoY3R4LT5yZXNl dCwgMSk7Cj4gKwltc2xlZXAoMjAwKTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShmZWl5YW5nX2luaXRfY21kcyk7IGkrKykgewo+ICsJCWNvbnN0IHN0cnVjdCBmZWl5YW5nX2lu aXRfY21kICpjbWQgPQo+ICsJCQkJCQkmZmVpeWFuZ19pbml0X2NtZHNbaV07Cj4gKwo+ICsJCXJl dCA9IG1pcGlfZHNpX2Rjc193cml0ZV9idWZmZXIoZHNpLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsK CiAgICAgICAgICAgICAgICByZXQgPSBtaXBpX2RzaV9kY3Nfd3JpdGVfYnVmZmVyKGRzaSwgY21k LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBG RUlZQU5HX0lOSVRfQ01EX0xFTik7Cgo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0 Owo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGZlaXlhbmdf ZW5hYmxlKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+ICt7Cj4gKwlzdHJ1Y3QgZmVpeWFuZyAq Y3R4ID0gcGFuZWxfdG9fZmVpeWFuZyhwYW5lbCk7Cj4gKwo+ICsJbXNsZWVwKDEyMCk7Cj4gKwo+ ICsJbWlwaV9kc2lfZGNzX3NldF9kaXNwbGF5X29uKGN0eC0+ZHNpKTsKPiArCWJhY2tsaWdodF9l bmFibGUoY3R4LT5iYWNrbGlnaHQpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGZlaXlhbmdfZGlzYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKPiArewo+ICsJ c3RydWN0IGZlaXlhbmcgKmN0eCA9IHBhbmVsX3RvX2ZlaXlhbmcocGFuZWwpOwo+ICsKPiArCWJh Y2tsaWdodF9kaXNhYmxlKGN0eC0+YmFja2xpZ2h0KTsKPiArCXJldHVybiBtaXBpX2RzaV9kY3Nf c2V0X2Rpc3BsYXlfb24oY3R4LT5kc2kpOwoKc2V0X2Rpc3BsYXlfb24/IFlvdSBwcm9iYWJseSB3 YW50IHNldF9kaXNwbGF5X29mZiBoZXJlIDopCgo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGZlaXlh bmdfdW5wcmVwYXJlKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+ICt7Cj4gKwlzdHJ1Y3QgZmVp eWFuZyAqY3R4ID0gcGFuZWxfdG9fZmVpeWFuZyhwYW5lbCk7Cj4gKwlpbnQgcmV0Owo+ICsKPiAr CXJldCA9IG1pcGlfZHNpX2Rjc19zZXRfZGlzcGxheV9vZmYoY3R4LT5kc2kpOwo+ICsJaWYgKHJl dCA8IDApCj4gKwkJRFJNX0RFVl9FUlJPUihwYW5lbC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBkaXNw bGF5IG9mZjogJWRcbiIsCj4gKwkJCSAgICAgIHJldCk7Cj4gKwo+ICsJcmV0ID0gbWlwaV9kc2lf ZGNzX2VudGVyX3NsZWVwX21vZGUoY3R4LT5kc2kpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJRFJN X0RFVl9FUlJPUihwYW5lbC0+ZGV2LCAiZmFpbGVkIHRvIGVudGVyIHNsZWVwIG1vZGU6ICVkXG4i LAo+ICsJCQkgICAgICByZXQpOwo+ICsKPiArCW1zbGVlcCgxMDApOwo+ICsKPiArCXJlZ3VsYXRv cl9kaXNhYmxlKGN0eC0+YXZkZCk7Cj4gKwo+ICsJcmVndWxhdG9yX2Rpc2FibGUoY3R4LT5kdmRk KTsKPiArCj4gKwlncGlvZF9zZXRfdmFsdWUoY3R4LT5yZXNldCwgMCk7Cj4gKwo+ICsJZ3Bpb2Rf c2V0X3ZhbHVlKGN0eC0+cmVzZXQsIDEpOwo+ICsKPiArCWdwaW9kX3NldF92YWx1ZShjdHgtPnJl c2V0LCAwKTsKClByZXN1bWFibHkgdGhpcyByZXNldCBsaW5lIHRvZ2dsZSBpc24ndCBuZWVkZWQg c2luY2UgdGhlIHJhaWxzIGFyZSBhbHJlYWR5CmRpc2FibGVkPwoKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGZlaXlhbmdf ZGVmYXVsdF9tb2RlID0gewo+ICsJLmNsb2NrID0gNTUwMDAsCj4gKwkudnJlZnJlc2ggPSA2MCwK ClRoaXMgZG9lc24ndCBhZGQgdXAgY29ycmVjdGx5LiBUaGUgcGl4ZWwgY2xvY2sgc2hvdWxkIGJl IGVxdWFsIHRvOgoKICAgICAgICAoaHRvdGFsICogdnRvdGFsICogdnJlZnJlc2gpIC8gMTAwMAoK Rm9yIHRoaXMgcmVhc29uLCB3ZSB1c3VhbGx5IGRvbid0IHNwZWNpZnkgdGhlIHJlZnJlc2ggcmF0 ZSBzaW5jZSBpdCBjYW4gYmUKbWlzbGVhZGluZy4gWW91ciBhY3R1YWwgcmVmcmVzaCByYXRlIHdp dGggdGhlIHBpeGVsIGNsb2NrIHlvdSBzcGVjaWZpZWQgaXMKYWN0dWFsbHkgZ29pbmcgdG8gYmUg NTYuMkh6IGluc3RlYWQgb2YgdGhlIDYwIHlvdSB3YW50LgoKSWYgeW91IGNhbiBvbmx5IGdlbmVy YXRlIGEgNTVNSHogcGl4ZWwgY2xvY2ssIGNvbnNpZGVyIHJlZHVjaW5nIHlvdXIgYmxhbmtpbmcK cGVyaW9kcyBzbyB0aGUgY2FsY3VsYXRpb24gYWJvdmUgbWF0Y2hlcy4KCj4gKwo+ICsJLmhkaXNw bGF5ID0gMTAyNCwKPiArCS5oc3luY19zdGFydCA9IDEwMjQgKyAzOTYsCj4gKwkuaHN5bmNfZW5k ID0gMTAyNCArIDM5NiArIDIwLAo+ICsJLmh0b3RhbCA9IDEwMjQgKyAzOTYgKyAyMCArIDEwMCwK PiArCj4gKwkudmRpc3BsYXkgPSA2MDAsCj4gKwkudnN5bmNfc3RhcnQgPSA2MDAgKyAxMiwKPiAr CS52c3luY19lbmQgPSA2MDAgKyAxMiArIDIsCj4gKwkudnRvdGFsID0gNjAwICsgMTIgKyAyICsg MjEsCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGZlaXlhbmdfZ2V0X21vZGVzKHN0cnVjdCBkcm1f cGFuZWwgKnBhbmVsKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0g cGFuZWwtPmNvbm5lY3RvcjsKPiArCXN0cnVjdCBmZWl5YW5nICpjdHggPSBwYW5lbF90b19mZWl5 YW5nKHBhbmVsKTsKPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwo+ICsKPiArCW1v ZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUocGFuZWwtPmRybSwgJmZlaXlhbmdfZGVmYXVsdF9tb2Rl KTsKPiArCWlmICghbW9kZSkgewo+ICsJCURSTV9ERVZfRVJST1IoJmN0eC0+ZHNpLT5kZXYsICJm YWlsZWQgdG8gYWRkIG1vZGUgJXV4JXV4QCV1XG4iLAo+ICsJCQkgICAgICBmZWl5YW5nX2RlZmF1 bHRfbW9kZS5oZGlzcGxheSwKPiArCQkJICAgICAgZmVpeWFuZ19kZWZhdWx0X21vZGUudmRpc3Bs YXksCj4gKwkJCSAgICAgIGZlaXlhbmdfZGVmYXVsdF9tb2RlLnZyZWZyZXNoKTsKPiArCQlyZXR1 cm4gLUVOT01FTTsKPiArCX0KPiArCj4gKwlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKPiArCj4g Kwltb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1fTU9ERV9UWVBFX1BSRUZF UlJFRDsKCkp1c3Qgc2V0IHRoZXNlIGFib3ZlLgoKPiArCWRybV9tb2RlX3Byb2JlZF9hZGQoY29u bmVjdG9yLCBtb2RlKTsKPiArCj4gKwlyZXR1cm4gMTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBkcm1fcGFuZWxfZnVuY3MgZmVpeWFuZ19mdW5jcyA9IHsKPiArCS5kaXNhYmxlID0g ZmVpeWFuZ19kaXNhYmxlLAo+ICsJLnVucHJlcGFyZSA9IGZlaXlhbmdfdW5wcmVwYXJlLAo+ICsJ LnByZXBhcmUgPSBmZWl5YW5nX3ByZXBhcmUsCj4gKwkuZW5hYmxlID0gZmVpeWFuZ19lbmFibGUs Cj4gKwkuZ2V0X21vZGVzID0gZmVpeWFuZ19nZXRfbW9kZXMsCj4gK307Cj4gKwo+ICtzdGF0aWMg aW50IGZlaXlhbmdfZHNpX3Byb2JlKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKPiArewo+ ICsJc3RydWN0IGRldmljZV9ub2RlICpucDsKPiArCXN0cnVjdCBmZWl5YW5nICpjdHg7Cj4gKwlp bnQgcmV0Owo+ICsKPiArCWN0eCA9IGRldm1fa3phbGxvYygmZHNpLT5kZXYsIHNpemVvZigqY3R4 KSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWN0eCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCW1p cGlfZHNpX3NldF9kcnZkYXRhKGRzaSwgY3R4KTsKPiArCWN0eC0+ZHNpID0gZHNpOwo+ICsKPiAr CWRybV9wYW5lbF9pbml0KCZjdHgtPnBhbmVsKTsKPiArCWN0eC0+cGFuZWwuZGV2ID0gJmRzaS0+ ZGV2Owo+ICsJY3R4LT5wYW5lbC5mdW5jcyA9ICZmZWl5YW5nX2Z1bmNzOwo+ICsKPiArCWN0eC0+ ZHZkZCA9IGRldm1fcmVndWxhdG9yX2dldCgmZHNpLT5kZXYsICJkdmRkIik7Cj4gKwlpZiAoSVNf RVJSKGN0eC0+ZHZkZCkpIHsKPiArCQlEUk1fREVWX0VSUk9SKCZkc2ktPmRldiwgIkNvdWxkbid0 IGdldCBkdmRkIHJlZ3VsYXRvclxuIik7Cj4gKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5kdmRkKTsK PiArCX0KPiArCj4gKwljdHgtPmF2ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJmRzaS0+ZGV2LCAi YXZkZCIpOwo+ICsJaWYgKElTX0VSUihjdHgtPmF2ZGQpKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUigm ZHNpLT5kZXYsICJDb3VsZG4ndCBnZXQgYXZkZCByZWd1bGF0b3JcbiIpOwo+ICsJCXJldHVybiBQ VFJfRVJSKGN0eC0+YXZkZCk7Cj4gKwl9Cj4gKwo+ICsJY3R4LT5yZXNldCA9IGRldm1fZ3Bpb2Rf Z2V0KCZkc2ktPmRldiwgInJlc2V0IiwgR1BJT0RfT1VUX0xPVyk7Cj4gKwlpZiAoSVNfRVJSKGN0 eC0+cmVzZXQpKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUigmZHNpLT5kZXYsICJDb3VsZG4ndCBnZXQg b3VyIHJlc2V0IEdQSU9cbiIpOwo+ICsJCXJldHVybiBQVFJfRVJSKGN0eC0+cmVzZXQpOwo+ICsJ fQo+ICsKPiArCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShkc2ktPmRldi5vZl9ub2RlLCAiYmFja2xp Z2h0IiwgMCk7Cj4gKwlpZiAobnApIHsKPiArCQljdHgtPmJhY2tsaWdodCA9IG9mX2ZpbmRfYmFj a2xpZ2h0X2J5X25vZGUobnApOwo+ICsJCW9mX25vZGVfcHV0KG5wKTsKPiArCj4gKwkJaWYgKCFj dHgtPmJhY2tsaWdodCkKPiArCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Cj4gKwl9Cj4gKwo+ICsJ cmV0ID0gZHJtX3BhbmVsX2FkZCgmY3R4LT5wYW5lbCk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQln b3RvIHB1dF9iYWNrbGlnaHQ7Cj4gKwo+ICsJZHNpLT5tb2RlX2ZsYWdzID0gTUlQSV9EU0lfTU9E RV9WSURFT19CVVJTVDsKPiArCWRzaS0+Zm9ybWF0ID0gTUlQSV9EU0lfRk1UX1JHQjg4ODsKPiAr CWRzaS0+bGFuZXMgPSA0Owo+ICsKPiArCXJldCA9IG1pcGlfZHNpX2F0dGFjaChkc2kpOwo+ICsJ aWYgKHJldCA8IDApCj4gKwkJZ290byBwYW5lbF9yZW1vdmU7Cj4gKwo+ICsJcmV0dXJuIHJldDsK PiArCj4gK3BhbmVsX3JlbW92ZToKPiArCWRybV9wYW5lbF9yZW1vdmUoJmN0eC0+cGFuZWwpOwo+ ICtwdXRfYmFja2xpZ2h0Ogo+ICsJaWYgKGN0eC0+YmFja2xpZ2h0KQo+ICsJCXB1dF9kZXZpY2Uo JmN0eC0+YmFja2xpZ2h0LT5kZXYpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgZmVpeWFuZ19kc2lfcmVtb3ZlKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkK PiArewo+ICsJc3RydWN0IGZlaXlhbmcgKmN0eCA9IG1pcGlfZHNpX2dldF9kcnZkYXRhKGRzaSk7 Cj4gKwo+ICsJbWlwaV9kc2lfZGV0YWNoKGRzaSk7Cj4gKwlkcm1fcGFuZWxfcmVtb3ZlKCZjdHgt PnBhbmVsKTsKPiArCj4gKwlpZiAoY3R4LT5iYWNrbGlnaHQpCj4gKwkJcHV0X2RldmljZSgmY3R4 LT5iYWNrbGlnaHQtPmRldik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZlaXlhbmdfb2ZfbWF0Y2hbXSA9IHsKPiArCXsgLmNv bXBhdGlibGUgPSAiZmVpeWFuZyxmeTA3MDI0ZGkyNmEzMGQiLCB9LAo+ICsJeyB9Cj4gK307Cj4g K01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZlaXlhbmdfb2ZfbWF0Y2gpOwo+ICsKPiArc3RhdGlj IHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgZmVpeWFuZ19kcml2ZXIgPSB7Cj4gKwkucHJvYmUgPSBm ZWl5YW5nX2RzaV9wcm9iZSwKPiArCS5yZW1vdmUgPSBmZWl5YW5nX2RzaV9yZW1vdmUsCj4gKwku ZHJpdmVyID0gewo+ICsJCS5uYW1lID0gImZlaXlhbmctZnkwNzAyNGRpMjZhMzBkIiwKPiArCQku b2ZfbWF0Y2hfdGFibGUgPSBmZWl5YW5nX29mX21hdGNoLAo+ICsJfSwKPiArfTsKPiArbW9kdWxl X21pcGlfZHNpX2RyaXZlcihmZWl5YW5nX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJK YWdhbiBUZWtpIDxqYWdhbkBhbWFydWxhc29sdXRpb25zLmNvbT4iKTsKPiArTU9EVUxFX0RFU0NS SVBUSU9OKCJGZWl5YW5nIEZZMDcwMjRESTI2QTMwLUQgTUlQSS1EU0kgTENEIHBhbmVsIik7Cj4g K01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiAtLSAKPiAyLjE4LjAuMzIxLmdmZmM2ZmEwZTMKPiAK Ci0tIApTZWFuIFBhdWwsIFNvZnR3YXJlIEVuZ2luZWVyLCBHb29nbGUgLyBDaHJvbWl1bSBPUwpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwg bWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,T_MIXED_ES,URIBL_BLOCKED, USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA0BCC65BAE for ; Thu, 13 Dec 2018 15:07:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 70CA620851 for ; Thu, 13 Dec 2018 15:07:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=poorly.run header.i=@poorly.run header.b="QZ3p7vsc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 70CA620851 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=poorly.run Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729216AbeLMPHk (ORCPT ); Thu, 13 Dec 2018 10:07:40 -0500 Received: from mail-yb1-f195.google.com ([209.85.219.195]:45297 "EHLO mail-yb1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727822AbeLMPHj (ORCPT ); Thu, 13 Dec 2018 10:07:39 -0500 Received: by mail-yb1-f195.google.com with SMTP id r11so901297ybp.12 for ; Thu, 13 Dec 2018 07:07:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poorly.run; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=SM57eTi17ZbBz501UB6FxCz2N+F7k/h3+LBNpkRqm2U=; b=QZ3p7vsc3gOJ2kGwGorQ9XPsAOzW6VZrEqCO4gvG4gxv4FHt2eX8qtJFodVY3kBr0B jK5ADggAMR4DiinzYFuM8jFGrOEsNMP5d0wNEPDnb4NsXzhn/xfKQcKLCZpAjeR4hmas 9JfLWMcYaXPZVwuM3ftp1BQsoUAAYeR7pF8vjo2UvIvX7RF2ti8rc5mwtELxRsGhzAVN dy8UchxRkLGvXmn6WZzp9uLIHrLzesWABi+yEKEF6IXMmblni2/O6Ssx7puape0G7JlJ U+hU898qT3/DZ0D9wY1YDArIpz9Hms50LddctDLi4hvdC/nvD+NNs7OR3rJSkyb/WNKH qCzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=SM57eTi17ZbBz501UB6FxCz2N+F7k/h3+LBNpkRqm2U=; b=F2nELEOf7J8diEP+KuOHz8mZF3/RjU5hGRZ0LH8UhHmOR55AzLkyde52k4LCH8VFhx p9uh+KpbCXFvEmtSSpTr0rw9/fbZhpsRvzVGNEnlk72fOWTjTpqYRxQraf/+Frfru21b gPOwwoF5tLr3LW+rikOtS2Z+Uj5ErzeFR/B+U8WB7Hc2kKz8mfRC9tXdeaC1qJVjyCIu yDNOOoxH6cvgHSopeNPT8tqZHBn3skfryHnRv0Ixo6ncXjjTN0uFX+19kMccuhgGkaAk NKrS+A+YJ0TeQNje9ByHq6gyXm1SbKPicIMgsnoHoINGcemBgMU0IJ1dg4r3Q8J/e+19 g2+Q== X-Gm-Message-State: AA+aEWbZYIhltsNITVvfPvGj87qq8IYXCN3r3X6d6/tSRWRinwTKKgkJ lQjCJlu5vDbQhVo5W3LAYVmzNw== X-Google-Smtp-Source: AFSGD/VRTULlafrlKNKn4LNBkZLrl9w6Lqnhyv9sT5QWC0wP7niqSTQCIhy6hLrgsRLt+uWmHKspEw== X-Received: by 2002:a25:9106:: with SMTP id v6mr5401534ybl.386.1544713657640; Thu, 13 Dec 2018 07:07:37 -0800 (PST) Received: from localhost ([2620:0:1013:11:ad55:b1db:adfe:3b9f]) by smtp.gmail.com with ESMTPSA id b129sm677289ywc.106.2018.12.13.07.07.36 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 13 Dec 2018 07:07:36 -0800 (PST) Date: Thu, 13 Dec 2018 10:07:36 -0500 From: Sean Paul To: Jagan Teki Cc: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Rob Herring , Chen-Yu Tsai , Icenowy Zheng , Jernej Skrabec , Vasily Khoruzhick , Thierry Reding , Mark Rutland , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Michael Trimarchi , TL Lim , linux-sunxi@googlegroups.com, linux-amarula@amarulasolutions.com Subject: Re: [PATCH v2 11/12] drm/panel: Add Feiyang FY07024DI26A30-D MIPI-DSI LCD panel Message-ID: <20181213150736.GL154160@art_vandelay> References: <20181116163916.29621-1-jagan@amarulasolutions.com> <20181116163916.29621-12-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181116163916.29621-12-jagan@amarulasolutions.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Nov 16, 2018 at 10:09:15PM +0530, Jagan Teki wrote: > Feiyang FY07024DI26A30-D is 1024x600, 4-lane MIPI-DSI LCD panel. > > Add panel driver for it. > > Signed-off-by: Jagan Teki > --- > MAINTAINERS | 6 + > drivers/gpu/drm/panel/Kconfig | 9 + > drivers/gpu/drm/panel/Makefile | 1 + > .../drm/panel/panel-feiyang-fy07024di26a30d.c | 286 ++++++++++++++++++ > 4 files changed, 302 insertions(+) > create mode 100644 drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 3dac08d0b3cb..40c8bfc974f4 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -4620,6 +4620,12 @@ T: git git://anongit.freedesktop.org/drm/drm-misc > S: Maintained > F: drivers/gpu/drm/tve200/ > > +DRM DRIVER FOR FEIYANG FY07024DI26A30-D MIPI-DSI LCD PANELS > +M: Jagan Teki > +S: Maintained > +F: drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > +F: Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.txt > + > DRM DRIVER FOR ILITEK ILI9225 PANELS > M: David Lechner > S: Maintained > diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig > index d0d4e60f5153..bc70896fe43c 100644 > --- a/drivers/gpu/drm/panel/Kconfig > +++ b/drivers/gpu/drm/panel/Kconfig > @@ -47,6 +47,15 @@ config DRM_PANEL_SIMPLE > that it can be automatically turned off when the panel goes into a > low power state. > > +config DRM_PANEL_FEIYANG_FY07024DI26A30D > + tristate "Feiyang FY07024DI26A30-D MIPI-DSI LCD panel" > + depends on OF > + depends on DRM_MIPI_DSI > + depends on BACKLIGHT_CLASS_DEVICE > + help > + Say Y if you want to enable support for panels based on the > + Feiyang FY07024DI26A30-D MIPI-DSI interface. > + > config DRM_PANEL_ILITEK_IL9322 > tristate "Ilitek ILI9322 320x240 QVGA panels" > depends on OF && SPI > diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile > index 88011f06edb8..e23c017639c7 100644 > --- a/drivers/gpu/drm/panel/Makefile > +++ b/drivers/gpu/drm/panel/Makefile > @@ -3,6 +3,7 @@ obj-$(CONFIG_DRM_PANEL_ARM_VERSATILE) += panel-arm-versatile.o > obj-$(CONFIG_DRM_PANEL_BANANAPI_S070WV20_ICN6211) += panel-bananapi-s070wv20-icn6211.o > obj-$(CONFIG_DRM_PANEL_LVDS) += panel-lvds.o > obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o > +obj-$(CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D) += panel-feiyang-fy07024di26a30d.o > obj-$(CONFIG_DRM_PANEL_ILITEK_IL9322) += panel-ilitek-ili9322.o > obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9881C) += panel-ilitek-ili9881c.o > obj-$(CONFIG_DRM_PANEL_INNOLUX_P079ZCA) += panel-innolux-p079zca.o > diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > new file mode 100644 > index 000000000000..a4b46bd8fdbe > --- /dev/null > +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c > @@ -0,0 +1,286 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Copyright (C) 2018 Amarula Solutions > + * Author: Jagan Teki > + */ > + > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +#include > +#include > +#include > + > +struct feiyang { > + struct drm_panel panel; > + struct mipi_dsi_device *dsi; > + > + struct backlight_device *backlight; > + struct regulator *dvdd; > + struct regulator *avdd; > + struct gpio_desc *reset; > +}; > + > +static inline struct feiyang *panel_to_feiyang(struct drm_panel *panel) > +{ > + return container_of(panel, struct feiyang, panel); > +} > + > +struct feiyang_init_cmd { > + size_t len; > + const char *data; > +}; > + > +#define FY07024DI26A30D(...) { \ > + .len = sizeof((char[]){__VA_ARGS__}), \ > + .data = (char[]){__VA_ARGS__} } > + > +static const struct feiyang_init_cmd feiyang_init_cmds[] = { > + FY07024DI26A30D(0x80, 0x58), > + FY07024DI26A30D(0x81, 0x47), > + FY07024DI26A30D(0x82, 0xD4), > + FY07024DI26A30D(0x83, 0x88), > + FY07024DI26A30D(0x84, 0xA9), > + FY07024DI26A30D(0x85, 0xC3), > + FY07024DI26A30D(0x86, 0x82), > +}; These init cmds don't have to be so complicated. You've only got len == 2, so just hardcode it in and avoid the macro: #define FEIYANG_INIT_CMD_LEN 2 struct feiyang_init_cmd { u8 data[FEIYANG_INIT_CMD]; }; static const struct feiyang_init_cmd feiyang_init_cmds[] = { { .data = { 0x80, 0x58 } }, ... }; > + > +static int feiyang_prepare(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + struct mipi_dsi_device *dsi = ctx->dsi; > + unsigned int i; > + int ret; > + > + ret = regulator_enable(ctx->dvdd); > + if (ret) > + return ret; > + > + msleep(100); nit: You should do your best to correlate the sleeps with the timing parameters from the datasheet with a comment. ie: /* T1: > 100ms */ msleep(100); > + > + ret = regulator_enable(ctx->avdd); > + if (ret) > + return ret; > + > + msleep(20); > + > + gpiod_set_value(ctx->reset, 1); > + msleep(50); > + > + gpiod_set_value(ctx->reset, 0); > + msleep(20); > + > + gpiod_set_value(ctx->reset, 1); > + msleep(200); > + > + for (i = 0; i < ARRAY_SIZE(feiyang_init_cmds); i++) { > + const struct feiyang_init_cmd *cmd = > + &feiyang_init_cmds[i]; > + > + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, cmd->len); ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, FEIYANG_INIT_CMD_LEN); > + if (ret < 0) > + return ret; > + } > + > + return 0; > +} > + > +static int feiyang_enable(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + > + msleep(120); > + > + mipi_dsi_dcs_set_display_on(ctx->dsi); > + backlight_enable(ctx->backlight); > + > + return 0; > +} > + > +static int feiyang_disable(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + > + backlight_disable(ctx->backlight); > + return mipi_dsi_dcs_set_display_on(ctx->dsi); set_display_on? You probably want set_display_off here :) > +} > + > +static int feiyang_unprepare(struct drm_panel *panel) > +{ > + struct feiyang *ctx = panel_to_feiyang(panel); > + int ret; > + > + ret = mipi_dsi_dcs_set_display_off(ctx->dsi); > + if (ret < 0) > + DRM_DEV_ERROR(panel->dev, "failed to set display off: %d\n", > + ret); > + > + ret = mipi_dsi_dcs_enter_sleep_mode(ctx->dsi); > + if (ret < 0) > + DRM_DEV_ERROR(panel->dev, "failed to enter sleep mode: %d\n", > + ret); > + > + msleep(100); > + > + regulator_disable(ctx->avdd); > + > + regulator_disable(ctx->dvdd); > + > + gpiod_set_value(ctx->reset, 0); > + > + gpiod_set_value(ctx->reset, 1); > + > + gpiod_set_value(ctx->reset, 0); Presumably this reset line toggle isn't needed since the rails are already disabled? > + > + return 0; > +} > + > +static const struct drm_display_mode feiyang_default_mode = { > + .clock = 55000, > + .vrefresh = 60, This doesn't add up correctly. The pixel clock should be equal to: (htotal * vtotal * vrefresh) / 1000 For this reason, we usually don't specify the refresh rate since it can be misleading. Your actual refresh rate with the pixel clock you specified is actually going to be 56.2Hz instead of the 60 you want. If you can only generate a 55MHz pixel clock, consider reducing your blanking periods so the calculation above matches. > + > + .hdisplay = 1024, > + .hsync_start = 1024 + 396, > + .hsync_end = 1024 + 396 + 20, > + .htotal = 1024 + 396 + 20 + 100, > + > + .vdisplay = 600, > + .vsync_start = 600 + 12, > + .vsync_end = 600 + 12 + 2, > + .vtotal = 600 + 12 + 2 + 21, > +}; > + > +static int feiyang_get_modes(struct drm_panel *panel) > +{ > + struct drm_connector *connector = panel->connector; > + struct feiyang *ctx = panel_to_feiyang(panel); > + struct drm_display_mode *mode; > + > + mode = drm_mode_duplicate(panel->drm, &feiyang_default_mode); > + if (!mode) { > + DRM_DEV_ERROR(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n", > + feiyang_default_mode.hdisplay, > + feiyang_default_mode.vdisplay, > + feiyang_default_mode.vrefresh); > + return -ENOMEM; > + } > + > + drm_mode_set_name(mode); > + > + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; Just set these above. > + drm_mode_probed_add(connector, mode); > + > + return 1; > +} > + > +static const struct drm_panel_funcs feiyang_funcs = { > + .disable = feiyang_disable, > + .unprepare = feiyang_unprepare, > + .prepare = feiyang_prepare, > + .enable = feiyang_enable, > + .get_modes = feiyang_get_modes, > +}; > + > +static int feiyang_dsi_probe(struct mipi_dsi_device *dsi) > +{ > + struct device_node *np; > + struct feiyang *ctx; > + int ret; > + > + ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return -ENOMEM; > + mipi_dsi_set_drvdata(dsi, ctx); > + ctx->dsi = dsi; > + > + drm_panel_init(&ctx->panel); > + ctx->panel.dev = &dsi->dev; > + ctx->panel.funcs = &feiyang_funcs; > + > + ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd"); > + if (IS_ERR(ctx->dvdd)) { > + DRM_DEV_ERROR(&dsi->dev, "Couldn't get dvdd regulator\n"); > + return PTR_ERR(ctx->dvdd); > + } > + > + ctx->avdd = devm_regulator_get(&dsi->dev, "avdd"); > + if (IS_ERR(ctx->avdd)) { > + DRM_DEV_ERROR(&dsi->dev, "Couldn't get avdd regulator\n"); > + return PTR_ERR(ctx->avdd); > + } > + > + ctx->reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); > + if (IS_ERR(ctx->reset)) { > + DRM_DEV_ERROR(&dsi->dev, "Couldn't get our reset GPIO\n"); > + return PTR_ERR(ctx->reset); > + } > + > + np = of_parse_phandle(dsi->dev.of_node, "backlight", 0); > + if (np) { > + ctx->backlight = of_find_backlight_by_node(np); > + of_node_put(np); > + > + if (!ctx->backlight) > + return -EPROBE_DEFER; > + } > + > + ret = drm_panel_add(&ctx->panel); > + if (ret < 0) > + goto put_backlight; > + > + dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST; > + dsi->format = MIPI_DSI_FMT_RGB888; > + dsi->lanes = 4; > + > + ret = mipi_dsi_attach(dsi); > + if (ret < 0) > + goto panel_remove; > + > + return ret; > + > +panel_remove: > + drm_panel_remove(&ctx->panel); > +put_backlight: > + if (ctx->backlight) > + put_device(&ctx->backlight->dev); > + > + return ret; > +} > + > +static int feiyang_dsi_remove(struct mipi_dsi_device *dsi) > +{ > + struct feiyang *ctx = mipi_dsi_get_drvdata(dsi); > + > + mipi_dsi_detach(dsi); > + drm_panel_remove(&ctx->panel); > + > + if (ctx->backlight) > + put_device(&ctx->backlight->dev); > + > + return 0; > +} > + > +static const struct of_device_id feiyang_of_match[] = { > + { .compatible = "feiyang,fy07024di26a30d", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, feiyang_of_match); > + > +static struct mipi_dsi_driver feiyang_driver = { > + .probe = feiyang_dsi_probe, > + .remove = feiyang_dsi_remove, > + .driver = { > + .name = "feiyang-fy07024di26a30d", > + .of_match_table = feiyang_of_match, > + }, > +}; > +module_mipi_dsi_driver(feiyang_driver); > + > +MODULE_AUTHOR("Jagan Teki "); > +MODULE_DESCRIPTION("Feiyang FY07024DI26A30-D MIPI-DSI LCD panel"); > +MODULE_LICENSE("GPL"); > -- > 2.18.0.321.gffc6fa0e3 > -- Sean Paul, Software Engineer, Google / Chromium OS