From patchwork Fri May 24 10:43:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 432 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 995833F066 for ; Fri, 24 May 2019 12:43:34 +0200 (CEST) Received: by mail-pg1-f197.google.com with SMTP id 21sf6023020pgl.5 for ; Fri, 24 May 2019 03:43:34 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1558694613; cv=pass; d=google.com; s=arc-20160816; b=wQ8Q8uAqLPMKpJOyasdiWV4CKbLoAJQAaoylT0JPO1w7DZA0rNwGMepgyXjEyHHpSt wnZB7/et0zdqhDCWbwEkRzkwHe8t1R8+zOeWl5aQbgDLbb0lUpIQJHCgRnrHbYdUn6nF Lo4Kn21rsAPPcN2TEJs3UboOix7rJzS05KqOU/d6hwaANZhwS60OK2X94qKufpOToTVm 05/SB13+/kiSZ4e5jC1WWrkTlhwM7VjRraaIOj0dACdEQg9N38bFZjg5hjCaEkf9X/gn 9MZr67QTp6zDm9KpbjpIHXsV1ZJmF6cKmMJ7A+51QW7r+BJIyPQE3HkL3JGKm5pm7JmT yJYA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:message-id:date:subject:cc:to :from:dkim-signature; bh=r1ZYl9ZXP2NMl+wqtvqDX0g++yA/JOM345PFpA/Vtng=; b=qnHFckExnX+N8we/Q4ny75c9AGbVq27WLFHncKTKIPDMhO5djgIf3onVg6FV8smnPg 2ZaiPWtJwJO3tzrKGdcNEah7/0qPAFAfZdXjjP//dEhRnrYgQIVnYKdQtq+rkH57Lle3 S0CGn8L1fQKyv673BzZDZPFUgAU7ewII5cjU1NDb+fa4K0tLmu57DZiUtEsvdJ/Eq8N+ QtzubcS2XV2tfJxFnK6rFqVO7kIjBMo/ejxtvkvIvBUZGqUunVJTgNRF9P9At6aaiZ4I 4SSKqruZxjHxYgjeMeg4gUE504ORL8jri6PIskki781mGaTYXIa+J/Y/0BcJ8ek+L9fF rmuQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=EXBKWqHz; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:mime-version:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe; bh=r1ZYl9ZXP2NMl+wqtvqDX0g++yA/JOM345PFpA/Vtng=; b=JgSDieyr9D+5PCXdedb6isb/jbIMYbS4WGvXsAHbNgG084RkADUisbYWjyv4g8Ul1P NZB3z1RmF+ck33wyHHBrP2F9KLGuDkQ8YzyWs4ezlX/w5Op9m0JMkvy5x0jJ4/1lO8id 6hsqFxvKZ+CDljifQTbPU5kSHoAXGSb/x4DL0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:x-spam-checked-in-group:list-post:list-help :list-archive:list-unsubscribe; bh=r1ZYl9ZXP2NMl+wqtvqDX0g++yA/JOM345PFpA/Vtng=; b=UfFoXXw0AkrFO7hM2/s/t8rVCEbpB+51BovxmT12mjavHToX5tqxZrvtFulVpVUSSo g6MFe/k6JZZdPrGTg2W5i052KsmsPz6ROzwe6f1RaSgJirx7+ccEBUkf/a0D9Oi9Wudj sBXmx53jC06dwu30Injxl2/JtU+mfredxoFOxECyA45fuqQ5Qp52FoydZjfl01Owa36i j/62NtdF16d1RUf/Ky/CwbhP7TMXWxGUk7m33AadIfzw8PeucyWzLLVq83IJ0IdayG6m a6Cb9TMHf+h5qv1dEfWQGawhizC8KaUIB5J+Nv5b7qW4VttMhkYli1Sy66i9h4N0S3Q4 1F4g== X-Gm-Message-State: APjAAAUo/76o5Ad4ZFrO9hQsB08tt4ncnQLQL9Zogoa+05dNZE0uQbsM 2y2dxuSJcy4NL8Dy21FB7V41VjsJ X-Google-Smtp-Source: APXvYqylJc/LS/t4/g1gTvmfhVO3sH5SaFWwpvJy5aciO/8EJ/R0+B+Sl1f6I6YhbdaTQIZI/dBj3w== X-Received: by 2002:a62:2a0a:: with SMTP id q10mr64775068pfq.79.1558694613422; Fri, 24 May 2019 03:43:33 -0700 (PDT) X-BeenThere: linux-amarula@amarulasolutions.com Received: by 2002:a62:3483:: with SMTP id b125ls2611997pfa.11.gmail; Fri, 24 May 2019 03:43:33 -0700 (PDT) X-Received: by 2002:a65:6497:: with SMTP id e23mr12597899pgv.388.1558694613035; Fri, 24 May 2019 03:43:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558694613; cv=none; d=google.com; s=arc-20160816; b=IAFocuRvLFcdrkJM+JhGrqsF2/Tt+v7Ao3t4NT/Qkx2vEXl4rhAY47dk7JCJanrCpK CVHJcjKbWCdvvW6cuzHkRSMAEiwvv55WwKAvU+8lUcjTx90LiGjxOAiWgRN9qdCSMx3/ 5M2Al8rl6tpmjnimGJZBWlz0EZFd1V/NUIeWywb8Aqg9RzeYCZMYVULheuFgI8qJ8lQo tj994GSySPlanVEIti8mmckTjMwu1xoScky3Zcnhs/GyMddDzRI1ZmcLshWAfpPiAiog p/J3WnTcNRijGiI6NgZFFd2I8XyhvtWrjM7zVpyqYBG1CnpMdrlc1LlvJmy69dIAUvIt 9Uxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:dkim-signature; bh=8vuYuFD/5hunekM87lEsGh/8eCfgNQ+vP68Nh+1lg0I=; b=d0//PHYppKZP4PYhZUsDWtV8whFUOrTSZ+VPIjvj5Fg6uktPqyt84TkzJ/IC/QxamR CKCzyxj8utaDC+A1T/Ec92g2UMffS2xqsmj0LU+FboIMPllhepuRPu+rNSpCBtxZGeDe 3Pyx9Q8Akgm6X4DEcUtfS1dLIeE8m8DUoUa24TzPJPJMihlzSj9AfEB+g0PkmGNCiQSp b3UdDKRdBqHdRuYvY8XyP/pu4ZqvwlJiJV1DnqwNU+s5KUbR7hWwLqpqs+b6gu4Vc63e BtZDNV9QSL81ZxFF4EU916a2S5iVBn0oufkiC27fSbZoqgY/q6NsuScN/DS5M+ky0+QQ jE+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=EXBKWqHz; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id r21sor201330pfh.54.2019.05.24.03.43.33 for (Google Transport Security); Fri, 24 May 2019 03:43:33 -0700 (PDT) Received-SPF: pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; X-Received: by 2002:aa7:842f:: with SMTP id q15mr112526398pfn.161.1558694612646; Fri, 24 May 2019 03:43:32 -0700 (PDT) Received: from localhost.localdomain ([183.82.227.60]) by smtp.gmail.com with ESMTPSA id h11sm2303416pfn.170.2019.05.24.03.43.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 May 2019 03:43:32 -0700 (PDT) From: Jagan Teki To: Andrzej Hajda , Laurent Pinchart , Chen-Yu Tsai , Maxime Ripard , David Airlie , Daniel Vetter , Rob Herring , Mark Rutland Cc: Michael Trimarchi , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@googlegroups.com, linux-amarula@amarulasolutions.com, Jagan Teki Subject: [PATCH v2 3/6] drm/sun4i: dsi: Add bridge support Date: Fri, 24 May 2019 16:13:14 +0530 Message-Id: <20190524104317.20287-1-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.18.0.321.gffc6fa0e3 MIME-Version: 1.0 X-Original-Sender: jagan@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=EXBKWqHz; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Some display panels would come up with a non-DSI output which can have an option to connect DSI interface by means of bridge converter. This DSI to non-DSI bridge converter would require a bridge driver that would communicate the DSI controller for bridge functionalities. So, add support for bridge functionalities in Allwinner DSI controller. Signed-off-by: Jagan Teki --- drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 60 +++++++++++++++++++------- drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h | 1 + 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c index ae2fe31b05b1..2b4b1355a88f 100644 --- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c @@ -775,6 +775,9 @@ static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder) if (!IS_ERR(dsi->panel)) drm_panel_prepare(dsi->panel); + if (!IS_ERR(dsi->bridge)) + drm_bridge_pre_enable(dsi->bridge); + /* * FIXME: This should be moved after the switch to HS mode. * @@ -790,6 +793,9 @@ static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder) if (!IS_ERR(dsi->panel)) drm_panel_enable(dsi->panel); + if (!IS_ERR(dsi->bridge)) + drm_bridge_enable(dsi->bridge); + sun6i_dsi_start(dsi, DSI_START_HSC); udelay(1000); @@ -806,6 +812,9 @@ static void sun6i_dsi_encoder_disable(struct drm_encoder *encoder) if (!IS_ERR(dsi->panel)) { drm_panel_disable(dsi->panel); drm_panel_unprepare(dsi->panel); + } else if (!IS_ERR(dsi->bridge)) { + drm_bridge_disable(dsi->bridge); + drm_bridge_post_disable(dsi->bridge); } phy_power_off(dsi->dphy); @@ -969,11 +978,12 @@ static int sun6i_dsi_attach(struct mipi_dsi_host *host, dsi->device = device; ret = drm_of_find_panel_or_bridge(host->dev->of_node, 0, 0, - &dsi->panel, NULL); + &dsi->panel, &dsi->bridge); if (ret) return ret; - dev_info(host->dev, "Attached device %s\n", device->name); + dev_info(host->dev, "Attached %s %s\n", + dsi->bridge ? "bridge" : "panel", device->name); return 0; } @@ -983,7 +993,10 @@ static int sun6i_dsi_detach(struct mipi_dsi_host *host, { struct sun6i_dsi *dsi = host_to_sun6i_dsi(host); - dsi->panel = NULL; + if (dsi->panel) + dsi->panel = NULL; + else if (dsi->bridge) + dsi->bridge = NULL; dsi->device = NULL; return 0; @@ -1055,8 +1068,10 @@ static int sun6i_dsi_bind(struct device *dev, struct device *master, struct sun4i_tcon *tcon0 = sun4i_get_tcon0(drm); int ret; - if (!dsi->panel) + if (!(dsi->panel || dsi->bridge)) { + dev_info(drm->dev, "No panel or bridge found... DSI output disabled\n"); return -EPROBE_DEFER; + } dsi->drv = drv; @@ -1078,19 +1093,29 @@ static int sun6i_dsi_bind(struct device *dev, struct device *master, } dsi->encoder.possible_crtcs = BIT(0); - drm_connector_helper_add(&dsi->connector, - &sun6i_dsi_connector_helper_funcs); - ret = drm_connector_init(drm, &dsi->connector, - &sun6i_dsi_connector_funcs, - DRM_MODE_CONNECTOR_DSI); - if (ret) { - dev_err(dsi->dev, - "Couldn't initialise the DSI connector\n"); - goto err_cleanup_connector; + if (dsi->panel) { + drm_connector_helper_add(&dsi->connector, + &sun6i_dsi_connector_helper_funcs); + ret = drm_connector_init(drm, &dsi->connector, + &sun6i_dsi_connector_funcs, + DRM_MODE_CONNECTOR_DSI); + if (ret) { + dev_err(dsi->dev, + "Couldn't initialise the DSI connector\n"); + goto err_cleanup_connector; + } + + drm_connector_attach_encoder(&dsi->connector, &dsi->encoder); + drm_panel_attach(dsi->panel, &dsi->connector); } - drm_connector_attach_encoder(&dsi->connector, &dsi->encoder); - drm_panel_attach(dsi->panel, &dsi->connector); + if (dsi->bridge) { + ret = drm_bridge_attach(&dsi->encoder, dsi->bridge, NULL); + if (ret) { + dev_err(dsi->dev, "Couldn't attach the DSI bridge\n"); + goto err_cleanup_connector; + } + } return 0; @@ -1104,7 +1129,10 @@ static void sun6i_dsi_unbind(struct device *dev, struct device *master, { struct sun6i_dsi *dsi = dev_get_drvdata(dev); - drm_panel_detach(dsi->panel); + if (dsi->panel) + drm_panel_detach(dsi->panel); + else if (dsi->bridge->funcs->detach) + dsi->bridge->funcs->detach(dsi->bridge); } static const struct component_ops sun6i_dsi_ops = { diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h index c570f2b3868f..c76b71259d2e 100644 --- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h +++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h @@ -32,6 +32,7 @@ struct sun6i_dsi { struct sun4i_tcon *tcon; struct mipi_dsi_device *device; struct drm_panel *panel; + struct drm_bridge *bridge; }; static inline struct sun6i_dsi *host_to_sun6i_dsi(struct mipi_dsi_host *host)