Received: by 10.213.65.68 with SMTP id h4csp355590imn; Mon, 26 Mar 2018 23:53:04 -0700 (PDT) X-Google-Smtp-Source: AIpwx49y0zLPMD2Guqg+JsfLg12ssPqrHhV0zdQThqzR0rKzrVwPjZaFeaBc68+zxEQru+4wfaQm X-Received: by 2002:a17:902:bc3:: with SMTP id 61-v6mr5154318plr.398.1522133584749; Mon, 26 Mar 2018 23:53:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522133584; cv=none; d=google.com; s=arc-20160816; b=b9ECgUcY+7DOtSDyak1WDGMeBgAnsGX6NxXiwgCZfhXBm5rgcgotpmLXEkLUyPsEpl SzomXephkkg/3s/LrPU2sb67rIDb0yWzcQoCywhKPk3TrbFe7q5Wz+zRa9byFWrjT5FG h4L66K1ZEG99B6PwtB/7xrC0Y9tC0S0JxVbrdBsmbW1vYyTTh/2O177h9SONBy10jmaF 3aYsqpWdptxI9jfIXz1rV0nMkvvRXjZRIzXxWCIcB1KvhsFzHOdIxwVbKpE6hCehNrLL ntamuiANCoBi2xfnQtUbKNDYnL6Z+bg9gdFE6eJFT1LtuQP5sctAeyPHGTBHhyRy36af zUxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject:arc-authentication-results; bh=qxNtPxkOI6/se4XoC1TWUH7vJxmTRb7mN+C9sgd61X0=; b=LRsigzI8eU8bwt8unr82UqvLmqUPhQYswSbguani98gf23Zwh8IlQSd2YPMuhaw5S1 tTWEuKGNNOrQED+YzTMXH7fvpdsVtYx9/Rj/GRk6eJ9wntw68Z1WOolW4fBHC35SHZ7g 1l4hMQy2d5NFA2tr6uDdGkQqYU630weuz6QcPqhGRPQ5B5+YN/pJVkkD/qUzB8hN5KOS 3yV9qKWQv83YdJKYn/tXG/w/EATTLA0r4+rSkB/PEXkY1t9nMng1Wbts1MJUXvJzbA4/ lTFuRk4lbOM8L4+TsV4Z7QtfYqmaBgTIMhwr/61dy+pyZVj4zIhdxW26S9eekb7sVNz6 W5sA== 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 11-v6si628649plb.658.2018.03.26.23.52.49; Mon, 26 Mar 2018 23:53:04 -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 S1752090AbeC0GYh (ORCPT + 99 others); Tue, 27 Mar 2018 02:24:37 -0400 Received: from relay1.mentorg.com ([192.94.38.131]:37687 "EHLO relay1.mentorg.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752035AbeC0GYf (ORCPT ); Tue, 27 Mar 2018 02:24:35 -0400 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-MBX-04.mgc.mentorg.com) by relay1.mentorg.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) id 1f0i25-0002Zu-KJ from Vladimir_Zapolskiy@mentor.com ; Mon, 26 Mar 2018 23:24:33 -0700 Received: from [137.202.108.125] (137.202.0.87) by SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) with Microsoft SMTP Server (TLS) id 15.0.1320.4; Tue, 27 Mar 2018 07:24:28 +0100 Subject: Re: [PATCH v6 2/3] drm: bridge: Add thc63lvd1024 LVDS decoder driver To: Jacopo Mondi , , , , , , , , , , , References: <1521213399-31947-1-git-send-email-jacopo+renesas@jmondi.org> <1521213399-31947-3-git-send-email-jacopo+renesas@jmondi.org> CC: , , , From: Vladimir Zapolskiy Message-ID: <30381869-9bc8-b6aa-a37a-598d9c8f280d@mentor.com> Date: Tue, 27 Mar 2018 09:24:28 +0300 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Icedove/45.2.0 MIME-Version: 1.0 In-Reply-To: <1521213399-31947-3-git-send-email-jacopo+renesas@jmondi.org> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [137.202.0.87] X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jacopo, On 03/16/2018 05:16 PM, Jacopo Mondi wrote: > Add DRM bridge driver for Thine THC63LVD1024 LVDS to digital parallel > output converter. > > Signed-off-by: Jacopo Mondi > Reviewed-by: Andrzej Hajda > Reviewed-by: Niklas Söderlund > --- > drivers/gpu/drm/bridge/Kconfig | 6 + > drivers/gpu/drm/bridge/Makefile | 1 + > drivers/gpu/drm/bridge/thc63lvd1024.c | 255 ++++++++++++++++++++++++++++++++++ > 3 files changed, 262 insertions(+) > create mode 100644 drivers/gpu/drm/bridge/thc63lvd1024.c > > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index 3b99d5a..5815a20 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -92,6 +92,12 @@ config DRM_SII9234 > It is an I2C driver, that detects connection of MHL bridge > and starts encapsulation of HDMI signal. > > +config DRM_THINE_THC63LVD1024 > + tristate "Thine THC63LVD1024 LVDS decoder bridge" > + depends on OF > + ---help--- > + Thine THC63LVD1024 LVDS/parallel converter driver. > + > config DRM_TOSHIBA_TC358767 > tristate "Toshiba TC358767 eDP bridge" > depends on OF > diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile > index 373eb28..fd90b16 100644 > --- a/drivers/gpu/drm/bridge/Makefile > +++ b/drivers/gpu/drm/bridge/Makefile > @@ -8,6 +8,7 @@ obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o > obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o > obj-$(CONFIG_DRM_SII902X) += sii902x.o > obj-$(CONFIG_DRM_SII9234) += sii9234.o > +obj-$(CONFIG_DRM_THINE_THC63LVD1024) += thc63lvd1024.o > obj-$(CONFIG_DRM_TOSHIBA_TC358767) += tc358767.o > obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix/ > obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511/ > diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c b/drivers/gpu/drm/bridge/thc63lvd1024.c > new file mode 100644 > index 0000000..02a54c2 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/thc63lvd1024.c > @@ -0,0 +1,255 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * THC63LVD1024 LVDS to parallel data DRM bridge driver. > + * > + * Copyright (C) 2018 Jacopo Mondi > + */ > + > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +enum { > + THC63_LVDS_IN0, > + THC63_LVDS_IN1, > + THC63_DIGITAL_OUT0, > + THC63_DIGITAL_OUT1, > +}; > + > +static const char * const thc63_reg_names[] = { > + "vcc", "lvcc", "pvcc", "cvcc", > +}; > + > +struct thc63_dev { > + struct device *dev; > + > + struct regulator *vccs[ARRAY_SIZE(thc63_reg_names)]; > + > + struct gpio_desc *pdwn; > + struct gpio_desc *oe; > + > + struct drm_bridge bridge; > + struct drm_bridge *next; > +}; > + > +static inline struct thc63_dev *to_thc63(struct drm_bridge *bridge) > +{ > + return container_of(bridge, struct thc63_dev, bridge); > +} > + > +static int thc63_attach(struct drm_bridge *bridge) > +{ > + struct thc63_dev *thc63 = to_thc63(bridge); > + > + return drm_bridge_attach(bridge->encoder, thc63->next, bridge); > +} > + > +static void thc63_enable(struct drm_bridge *bridge) > +{ > + struct thc63_dev *thc63 = to_thc63(bridge); > + struct regulator *vcc; > + int i; unsigned int i; > + > + for (i = 0; i < ARRAY_SIZE(thc63->vccs); i++) { > + vcc = thc63->vccs[i]; > + if (!vcc) > + continue; > + > + if (regulator_enable(vcc)) > + goto error_vcc_enable; > + } > + > + if (thc63->pdwn) > + gpiod_set_value(thc63->pdwn, 0); > + > + if (thc63->oe) > + gpiod_set_value(thc63->oe, 1); > + > + return; > + > +error_vcc_enable: > + dev_err(thc63->dev, "Failed to enable regulator %s\n", > + thc63_reg_names[i]); > + > + for (i = i - 1; i >= 0; i--) { > + vcc = thc63->vccs[i]; > + if (!vcc) > + continue; > + > + regulator_disable(vcc); > + } > +} > + > +static void thc63_disable(struct drm_bridge *bridge) > +{ > + struct thc63_dev *thc63 = to_thc63(bridge); > + struct regulator *vcc; > + int i; > + > + if (thc63->oe) > + gpiod_set_value(thc63->oe, 0); > + > + if (thc63->pdwn) > + gpiod_set_value(thc63->pdwn, 1); > + > + for (i = ARRAY_SIZE(thc63->vccs) - 1; i >= 0; i--) { > + vcc = thc63->vccs[i]; > + if (!vcc) > + continue; > + > + if (regulator_disable(vcc)) > + dev_dbg(thc63->dev, > + "Failed to disable regulator %s\n", > + thc63_reg_names[i]); > + } > +} > + > +struct drm_bridge_funcs thc63_bridge_func = { Apparently you missed all my comments from v2 review. If you like to avoid non-NULL function pointers to the void, please use static const storage qualifier. -- With best wishes, Vladimir