Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3511994yba; Tue, 16 Apr 2019 12:58:47 -0700 (PDT) X-Google-Smtp-Source: APXvYqzicEIEKvR0vNE37sjXVoI9aaY/0V1r0TIjN/NO8mX/ZBw12eq/saMgq4tAa3ms0bb0NVS2 X-Received: by 2002:a65:554e:: with SMTP id t14mr68213580pgr.107.1555444727166; Tue, 16 Apr 2019 12:58:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555444727; cv=none; d=google.com; s=arc-20160816; b=C1X2odFb3xqLE+7lM8voXqJTiPwqxgi+0z1f/G2Vk9JVpxISTKw8z6dyGoOpSNQVkc euTo+Ga6d0Rz3gnzRls8Ah8ojZqHI1Hkl0KSIVk3YOXc0WXdedcgt5rdXCdJcyU4hltd LtkfmliZ50WEWFAuOfLK0l9KRUpMbPYeL6CfeP7o3hhTdG/ZKpiaMgOlGOkpDYpQsE87 uHrYQCe5u4A4cfbLQG20R6xmqaE5sQvjDh3QeYfOzBbnQBs88Zng/0fpRhzevylkwtwb fUUrQqYbLi3wB8cBSkzhOo1DtaemB55/0a9mkTISSVtpJ9QwJpp5IInrNuzhjxKw7aFz Q0QA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=zdu0qEeqmNCtYzJ3ue01W6PVQ7bVUUhv8SuhK71e1xA=; b=YUk4rjc+n8ye+wckpomO1jynmg0ybMKXzLvoyBPExuJ95twuetvsjiTlpU8dzu48KL 3vBbl99X/OiF6Aifr0qZzHwNYTjXGy4q7iG1y6Mr1+Q5R86XFzF5Fzcia+VslHq5Q5Dh EK88g2sUl5HoM/iiH2Noth1nunINZbY7EYX8LIADMVb/HA1UQaZbwIRd0ffoMGoCFGXJ KfxnLbUBaSZ08CsrGElc7F21fRpjAs6QBAi6JkeRFmR8gntXTNRg0m6cVmCfv3IEZEzW PVLkbWmCIRaQYHfDz0CQqGDOzuP1T32jP6eELc8VP6GIaUZFW8LBUiV8QyOzfFlpiZIL 3zQg== 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 f7si55798093pfa.50.2019.04.16.12.58.31; Tue, 16 Apr 2019 12:58:47 -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 S1730367AbfDPT5t (ORCPT + 99 others); Tue, 16 Apr 2019 15:57:49 -0400 Received: from mout.kundenserver.de ([217.72.192.74]:47829 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728770AbfDPT5n (ORCPT ); Tue, 16 Apr 2019 15:57:43 -0400 Received: from orion.localdomain ([95.117.99.70]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MFba4-1h3nQ232Q2-00H953; Tue, 16 Apr 2019 21:57:40 +0200 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: dmitry.torokhov@gmail.com, linux-input@vger.kernel.org Subject: [PATCH 3/4] input: keyboard: gpio_keys_polled: use gpio lookup table Date: Tue, 16 Apr 2019 21:57:24 +0200 Message-Id: <1555444645-15156-4-git-send-email-info@metux.net> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1555444645-15156-1-git-send-email-info@metux.net> References: <1555444645-15156-1-git-send-email-info@metux.net> X-Provags-ID: V03:K1:CPdYnkIO5e3+kGA3V5cgWPn219nnvvi9Vdoo5187xAQ3g86z9ws qx6blkrm47RdLkPQQIivKqVU7Wl4lX20IoBHCZehiAAdhZY9CPjX0BlqdqObnLavXuLjl2W wfKdKd/6kk4wm9v4nEw0c7CbZtsrE7lG+7krm8I24pm6jdBaBgxWuiMUE4i3GDLMB75ertY a+4Jdh8OrPuBX2MVy3X3A== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:7gvHo7+nZ8g=:KlQ5qqE6dQ5s7ISN0gBmqb 0pmgssOVIDVjTQlfZSA8qsNRaMT/gBzaVsaXv71O56PuElkEAqk4mJVB2zdo89UchHmXAdB22 mWGnh6rZqMtQccU+Cyq710hl8vMZ62iulBU/X7EdAnPEnAoj/z/mHLHoMPa32xQ0a/KXH6GW/ JiEvfnOmF62fnpQACGo8JeumuQiVMSzy3684J/x67lsiuryVv5HQnejeHZ/AkdAtu2cXZbD+A SErWcew2FK+PFrACgddyl/fKe8nPQplf85G2jmSjA4687uVCVNb5WIIIjUKBPKAb33zAHRg3a iiCdaL7M1zzOzP3VhPYcpLNa0vnCEkJIeqW5ytij6HUjyTLal9/6aJQzVIZ4thq1shTklcW0B aBDscLcd/h+WL2t8iyR75crHfudk+iOJwdbfcB1HmSNYHjZl7/HqDxtmJ7pZdRqEtX0cr36IE 4cYw+F61D0/590dRPNdB7Twq5b0YSpVWeOle3xapSylhhebKQbky5MEddAOSUxn209r0UVKOt 5mNso6azkUQAHb8FBH/zY/lW/jNBSTlWCYqF7J8hVipNRfYS2Rljx5mqqKh0Af8ROFCOYcKFK eg3QmWUbvBezfCv1ks/b1BKRqX9HqIODUqaUzmJJFtx8BRxI4WMTiPBzkdnicXAInnjgi7bay o98fcCuRx/Ox/NqhgDgPh5ZgSX9RWnxUacEB2jvUYZKjkoUQoAvdZW9f+rM5zQ/JdYqyTYokS VbutjSQ58A6zI/GIAbsRGK3Bj3Pyp+3i9ephMw== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Support the recently introduced gpio lookup tables for attaching to gpio lines. So, harcoded gpio numbers aren't needed anymore. Cc: Dmitry Torokhov Cc: linux-input@vger.kernel.org Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/input/keyboard/gpio_keys_polled.c | 167 +++++++++++++++++++++--------- 1 file changed, 119 insertions(+), 48 deletions(-) diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c index 3312186..3f773b2 100644 --- a/drivers/input/keyboard/gpio_keys_polled.c +++ b/drivers/input/keyboard/gpio_keys_polled.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -227,6 +228,119 @@ static void gpio_keys_polled_set_abs_params(struct input_dev *input, }; MODULE_DEVICE_TABLE(of, gpio_keys_polled_of_match); +static struct gpio_desc *gpio_keys_polled_get_gpiod_fwnode( + struct device *dev, + int idx, + const char *desc) +{ + struct gpio_desc *gpiod; + struct fwnode_handle *child; + int x; + + /* get the idx'th child node */ + child = device_get_next_child_node(dev, NULL); + while (child && x) { + child = device_get_next_child_node(dev, child); + x--; + } + + if (!child) { + dev_err(dev, "missing oftree child node #%d\n", idx); + return ERR_PTR(-EINVAL); + } + + gpiod = devm_fwnode_get_gpiod_from_child(dev, + NULL, + child, + GPIOD_IN, + desc); + if (IS_ERR(gpiod)) { + if (PTR_ERR(gpiod) != -EPROBE_DEFER) + dev_err(dev, + "failed to get gpio: %ld\n", + PTR_ERR(gpiod)); + fwnode_handle_put(child); + return gpiod; + } + + return gpiod; +} + +static struct gpio_desc *gpio_keys_polled_get_gpiod_legacy( + struct device *dev, + int idx, + const struct gpio_keys_button *button) +{ + /* + * Legacy GPIO number so request the GPIO here and + * convert it to descriptor. + */ + unsigned int flags = GPIOF_IN; + struct gpio_desc *gpiod; + int error; + + dev_info(dev, "hardcoded gpio IDs are deprecated.\n"); + + if (button->active_low) + flags |= GPIOF_ACTIVE_LOW; + + error = devm_gpio_request_one(dev, button->gpio, + flags, button->desc ? : DRV_NAME); + if (error) { + dev_err(dev, + "unable to claim gpio %u, err=%d\n", + button->gpio, error); + return ERR_PTR(error); + } + + gpiod = gpio_to_desc(button->gpio); + if (!gpiod) { + dev_err(dev, + "unable to convert gpio %u to descriptor\n", + button->gpio); + return ERR_PTR(-EINVAL); + } + + return gpiod; +} + +static struct gpio_desc *gpio_keys_polled_get_gpiod( + struct device *dev, + int idx, + const struct gpio_keys_button *button) +{ + struct gpio_desc *gpiod = NULL; + int error; + + /* No legacy static platform data - use oftree */ + if (!dev_get_platdata(dev)) { + return gpio_keys_polled_get_gpiod_fwnode( + dev, idx, button->desc); + } + + gpiod = devm_gpiod_get_index(dev, NULL, idx, GPIOF_IN); + + if (!IS_ERR(gpiod)) { + dev_info(dev, "picked gpiod idx %d from gpio table\n", idx); + gpiod_set_consumer_name(gpiod, button->desc ? : DRV_NAME); + return gpiod; + } + + if (PTR_ERR(gpiod) != -ENOENT) { + dev_err(dev, "failed fetching gpiod #%d: %d\n", + idx, PTR_ERR(gpiod)); + return gpiod; + } + + /* Use legacy gpio id, if defined */ + if (gpio_is_valid(button->gpio)) { + return gpio_keys_polled_get_gpiod_legacy( + dev, idx, button); + } + + return ERR_PTR(-ENOENT); +} + static int gpio_keys_polled_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -291,57 +405,14 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) if (button->wakeup) { dev_err(dev, DRV_NAME " does not support wakeup\n"); - fwnode_handle_put(child); return -EINVAL; } - if (!dev_get_platdata(dev)) { - /* No legacy static platform data */ - child = device_get_next_child_node(dev, child); - if (!child) { - dev_err(dev, "missing child device node\n"); - return -EINVAL; - } - - bdata->gpiod = devm_fwnode_get_gpiod_from_child(dev, - NULL, child, - GPIOD_IN, - button->desc); - if (IS_ERR(bdata->gpiod)) { - error = PTR_ERR(bdata->gpiod); - if (error != -EPROBE_DEFER) - dev_err(dev, - "failed to get gpio: %d\n", - error); - fwnode_handle_put(child); - return error; - } - } else if (gpio_is_valid(button->gpio)) { - /* - * Legacy GPIO number so request the GPIO here and - * convert it to descriptor. - */ - unsigned flags = GPIOF_IN; - - if (button->active_low) - flags |= GPIOF_ACTIVE_LOW; - - error = devm_gpio_request_one(dev, button->gpio, - flags, button->desc ? : DRV_NAME); - if (error) { - dev_err(dev, - "unable to claim gpio %u, err=%d\n", - button->gpio, error); - return error; - } - - bdata->gpiod = gpio_to_desc(button->gpio); - if (!bdata->gpiod) { - dev_err(dev, - "unable to convert gpio %u to descriptor\n", - button->gpio); - return -EINVAL; - } + bdata->gpiod = gpio_keys_polled_get_gpiod(dev, i, button); + + if (IS_ERR(bdata->gpiod)) { + dev_err(dev, "failed to fetch gpiod #%d\n", i); + return PTR_ERR(bdata->gpiod); } bdata->last_state = -1; -- 1.9.1