From patchwork Fri Nov 22 22:44:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Olovyannikov X-Patchwork-Id: 1199708 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="O5pYciNP"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47KWkG4SGxz9sPW for ; Sat, 23 Nov 2019 09:46:14 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 4C88BC21E29; Fri, 22 Nov 2019 22:45:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 8BC0FC21E44; Fri, 22 Nov 2019 22:45:36 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 97F60C21DDC; Fri, 22 Nov 2019 22:45:12 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id B4803C21DFB for ; Fri, 22 Nov 2019 22:45:10 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id z3so10505426wru.3 for ; Fri, 22 Nov 2019 14:45:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=uQ9IGr3l0UUTDBULUkYYTCp77se6lM56xjQyGdVTUEs=; b=O5pYciNPA532BLAQAdZNe0Pmyph+Brh4kENL6f73kkzXVI+m0rxSdOh44Dx7eY+k46 x72GePo+Y+zfdSErW50JBtlUc+uOo8XinClhfj24hcH/FOtkZqVQG1D5HdN4SqRnYM1J VOqPOnNJdVOZA65OpuEB8VPPtOpNP2Ykl6LRo= 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:in-reply-to :references; bh=uQ9IGr3l0UUTDBULUkYYTCp77se6lM56xjQyGdVTUEs=; b=ceOh0VH5ru3XbaFKOM/k6m3ANM99CVxkPT2f76E+nqWV5MhCzWJEUYIN36arh17V1y /IWtH9f5xz3tg5urlUM6o8NbAGXhBu2CC92nImG7AVyZx1DEWlnSBMknG6sWe0wSRIg+ 7uK8hYjkaTgNLcuKb5DbN8ncMTJZ6HKbkETg9k75RNlfRWWq67mxMnACBnL+YrjbRXTM 5EBGaP/5YR1fEsRxZAvhGXz8kaG4oTx5eHJf0Cqk6JHAi3/bOImtx7PhLUKOO9fbUlLP yP1SRLvR7eYJZhlShEyISdig8CM5Cr8KUig+uVnbmcWTXNXcJkvTniwHNNnmIVn+bDPR Sobw== X-Gm-Message-State: APjAAAVOF14dCE19VS2ywfwBQOWRgcNNZnNcuvYiDxd5Q0xkHz0MlBa2 VAbbCTfpP/sqt7P3oNEuaEy9VgL27APmaW0Gyn3yLuF9WSkQ6BfuyzKD9zDCY+qPxpV3BZqLgom jYCDvPWIfbgFUQIF7b5vT8XXpq8L0QJvWR21ilTkHIv7YsVV6mCEV1TU1s/9JypmeFFXrrix0LW y9TUHcdNpOG3E= X-Google-Smtp-Source: APXvYqxZybDeRAu5iZEk5EbW30NUkijByR3CAT0T09bKvEYByseAV1pkbZpoAXGoOrU+niLGuosxeA== X-Received: by 2002:adf:f108:: with SMTP id r8mr8052909wro.390.1574462709809; Fri, 22 Nov 2019 14:45:09 -0800 (PST) Received: from LBRMN-LNXUB114.ric.broadcom.com ([192.19.228.250]) by smtp.gmail.com with ESMTPSA id b15sm9143223wrx.77.2019.11.22.14.45.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Nov 2019 14:45:09 -0800 (PST) From: Vladimir Olovyannikov To: u-boot@lists.denx.de Date: Fri, 22 Nov 2019 14:44:43 -0800 Message-Id: <20191122224443.29497-4-vladimir.olovyannikov@broadcom.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191122224443.29497-1-vladimir.olovyannikov@broadcom.com> References: <20191122224443.29497-1-vladimir.olovyannikov@broadcom.com> Cc: Rayagonda Kokatanur Subject: [U-Boot] [PATCH 3/3] pinctrl: pinctrl-single: Parse gpio details from dt X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Rayagonda Kokatanur Parse different gpio properties from dt as part of probe function. This detail is required to enable pinctrl pad. Signed-off-by: Rayagonda Kokatanur Signed-off-by: Vladimir Olovyannikov --- drivers/pinctrl/pinctrl-single.c | 61 +++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 2dcc131513..449e8a2bfe 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -5,18 +5,35 @@ #include #include +#include #include #include #include DECLARE_GLOBAL_DATA_PTR; +/** + * struct single_gpiofunc_range - pin ranges with same mux value of gpio fun + * @offset: offset base of pins + * @npins: number pins with the same mux value of gpio function + * @gpiofunc: mux value of gpio function + * @node: list node + */ +struct single_gpiofunc_range { + u32 offset; + u32 npins; + u32 gpiofunc; + struct list_head node; +}; + /** * struct single_pdata - pinctrl device instance * @base first configuration register * @offset index of last configuration register * @mask configuration-value mask bits * @width configuration register bit width + * @mutex mutex protecting the list + * @gpiofuncs list of gpio functions * @read register read function to use * @write register write function to use */ @@ -26,6 +43,8 @@ struct single_pdata { u32 mask; int width; bool bits_per_mux; + struct mutex mutex; + struct list_head gpiofuncs; u32 (*read)(void __iomem *reg); void (*write)(u32 val, void __iomem *reg); }; @@ -204,9 +223,42 @@ static int single_set_state(struct udevice *dev, return len; } +static int single_add_gpio_func(struct udevice *dev, + struct single_pdata *pdata) +{ + const char *propname = "pinctrl-single,gpio-range"; + const char *cellname = "#pinctrl-single,gpio-range-cells"; + struct single_gpiofunc_range *range; + struct ofnode_phandle_args gpiospec; + int ret, i; + + for (i = 0; ; i++) { + ret = ofnode_parse_phandle_with_args(dev->node, propname, + cellname, 0, i, &gpiospec); + /* Do not treat it as error. Only treat it as end condition. */ + if (ret) { + ret = 0; + break; + } + range = devm_kzalloc(dev, sizeof(*range), GFP_KERNEL); + if (!range) { + ret = -ENOMEM; + break; + } + range->offset = gpiospec.args[0]; + range->npins = gpiospec.args[1]; + range->gpiofunc = gpiospec.args[2]; + mutex_lock(&pdata->mutex); + list_add_tail(&range->node, &pdata->gpiofuncs); + mutex_unlock(&pdata->mutex); + } + return ret; +} + static int single_probe(struct udevice *dev) { struct single_pdata *pdata = dev->platdata; + int ret; switch (pdata->width) { case 8: @@ -227,7 +279,14 @@ static int single_probe(struct udevice *dev) return -EINVAL; } - return 0; + mutex_init(&pdata->mutex); + INIT_LIST_HEAD(&pdata->gpiofuncs); + + ret = single_add_gpio_func(dev, pdata); + if (ret < 0) + dev_err(dev, "%s: Failed to add gpio functions\n", __func__); + + return ret; } static int single_ofdata_to_platdata(struct udevice *dev)