From patchwork Tue Nov 12 10:38:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Shiyan X-Patchwork-Id: 3171681 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id BD5359F3AE for ; Tue, 12 Nov 2013 11:07:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7069D203F7 for ; Tue, 12 Nov 2013 11:07:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 605C52037F for ; Tue, 12 Nov 2013 11:07:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753470Ab3KLLHx (ORCPT ); Tue, 12 Nov 2013 06:07:53 -0500 Received: from fallback8.mail.ru ([94.100.176.136]:36572 "EHLO fallback8.mail.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753283Ab3KLLHx (ORCPT ); Tue, 12 Nov 2013 06:07:53 -0500 Received: from smtp48.i.mail.ru (smtp48.i.mail.ru [94.100.177.108]) by fallback8.mail.ru (mPOP.Fallback_MX) with ESMTP id 9097744D70F1 for ; Tue, 12 Nov 2013 14:39:19 +0400 (MSK) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=B9dhmOG5GNTRZoyuSTHfL+hRhjrX04aTIp5hgM85WVQ=; b=mN0jFiTfFizXtyM4VeZwUw32oTYNeZA+PTaR1H/FQqo0a3NbNR6gufsITDEDXhn6uSiTLUzWUGMBstjSUmaPlE9RSFGXTNLAo1SM/XIr7VqIg7HgYA44/gkIB11/KN4x5hR5MJv2vTYARS3Mh5aPWUHpNQA8Q7Ln16L87UkxYQ4=; Received: from [217.119.30.118] (port=40325 helo=shc.milas.spb.ru) by smtp48.i.mail.ru with esmtpa (envelope-from ) id 1VgBMt-0008BK-VE; Tue, 12 Nov 2013 14:38:48 +0400 From: Alexander Shiyan To: linux-input@vger.kernel.org Cc: Dmitry Torokhov , Alexander Shiyan Subject: [PATCH RESEND 3/3] input: gpio_keys{_polled}: Replace enable/disable callbacks with regulator API Date: Tue, 12 Nov 2013 14:38:25 +0400 Message-Id: <1384252705-18553-3-git-send-email-shc_work@mail.ru> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <1384252705-18553-1-git-send-email-shc_work@mail.ru> References: <1384252705-18553-1-git-send-email-shc_work@mail.ru> X-Spam-Status: No, score=-6.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, FREEMAIL_FROM,RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_WEB,RP_MATCHES_RCVD, T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Mras: Ok Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-0.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_WEB, RDNS_NONE, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Typical use to enable/disable is a power switch, so replace these callbacks to the regulator API. This will allow using devices, which depends on the regulator, from devicetree. Signed-off-by: Alexander Shiyan --- .../devicetree/bindings/input/gpio-keys-polled.txt | 1 + drivers/input/keyboard/gpio_keys.c | 16 ++++++++++------ drivers/input/keyboard/gpio_keys_polled.c | 16 ++++++++++------ include/linux/gpio_keys.h | 2 -- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Documentation/devicetree/bindings/input/gpio-keys-polled.txt b/Documentation/devicetree/bindings/input/gpio-keys-polled.txt index 313abef..a210963 100644 --- a/Documentation/devicetree/bindings/input/gpio-keys-polled.txt +++ b/Documentation/devicetree/bindings/input/gpio-keys-polled.txt @@ -7,6 +7,7 @@ Required properties: Optional properties: - autorepeat: Boolean, Enable auto repeat feature of Linux input subsystem. + - vcc-supply: The regulator to drive the GPIOs. Each button (key) is represented as a sub-node of "gpio-keys-polled": Subnode properties: diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 50c2746..659c426 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -30,6 +30,7 @@ #include #include #include +#include struct gpio_button_data { const struct gpio_keys_button *button; @@ -48,6 +49,7 @@ struct gpio_keys_drvdata { struct input_dev *input; struct mutex disable_lock; struct gpio_button_data data[0]; + struct regulator *regulator; }; /* @@ -528,11 +530,10 @@ static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata) static int gpio_keys_open(struct input_dev *input) { struct gpio_keys_drvdata *ddata = input_get_drvdata(input); - const struct gpio_keys_platform_data *pdata = ddata->pdata; int error; - if (pdata->enable) { - error = pdata->enable(input->dev.parent); + if (!IS_ERR(ddata->regulator)) { + error = regulator_enable(ddata->regulator); if (error) return error; } @@ -546,10 +547,9 @@ static int gpio_keys_open(struct input_dev *input) static void gpio_keys_close(struct input_dev *input) { struct gpio_keys_drvdata *ddata = input_get_drvdata(input); - const struct gpio_keys_platform_data *pdata = ddata->pdata; - if (pdata->disable) - pdata->disable(input->dev.parent); + if (!IS_ERR(ddata->regulator)) + regulator_disable(ddata->regulator); } /* @@ -683,6 +683,10 @@ static int gpio_keys_probe(struct platform_device *pdev) return -ENOMEM; } + ddata->regulator = devm_regulator_get(&pdev->dev, "vcc"); + if (PTR_ERR(ddata->regulator) == -EPROBE_DEFER) + return -EPROBE_DEFER; + ddata->pdata = pdata; ddata->input = input; mutex_init(&ddata->disable_lock); diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c index 0dce49d..955a59d 100644 --- a/drivers/input/keyboard/gpio_keys_polled.c +++ b/drivers/input/keyboard/gpio_keys_polled.c @@ -28,6 +28,7 @@ #include #include #include +#include #define DRV_NAME "gpio-keys-polled" @@ -43,6 +44,7 @@ struct gpio_keys_polled_dev { struct device *dev; const struct gpio_keys_platform_data *pdata; struct gpio_keys_button_data data[0]; + struct regulator *regulator; }; static void gpio_keys_polled_check_state(struct input_dev *input, @@ -88,19 +90,17 @@ static void gpio_keys_polled_poll(struct input_polled_dev *dev) static void gpio_keys_polled_open(struct input_polled_dev *dev) { struct gpio_keys_polled_dev *bdev = dev->private; - const struct gpio_keys_platform_data *pdata = bdev->pdata; - if (pdata->enable) - pdata->enable(bdev->dev); + if (!IS_ERR(bdev->regulator)) + WARN_ON(regulator_enable(bdev->regulator)); } static void gpio_keys_polled_close(struct input_polled_dev *dev) { struct gpio_keys_polled_dev *bdev = dev->private; - const struct gpio_keys_platform_data *pdata = bdev->pdata; - if (pdata->disable) - pdata->disable(bdev->dev); + if (!IS_ERR(bdev->regulator)) + regulator_disable(bdev->regulator); } #ifdef CONFIG_OF @@ -227,6 +227,10 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) return -ENOMEM; } + bdev->regulator = devm_regulator_get(&pdev->dev, "vcc"); + if (PTR_ERR(bdev->regulator) == -EPROBE_DEFER) + return -EPROBE_DEFER; + poll_dev = input_allocate_polled_device(); if (!poll_dev) { dev_err(dev, "no memory for polled device\n"); diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index a7e977f..05d3bf8 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h @@ -23,8 +23,6 @@ struct gpio_keys_platform_data { unsigned int poll_interval; /* polling interval in msecs - for polling driver only */ unsigned int rep:1; /* enable input subsystem auto repeat */ - int (*enable)(struct device *dev); - void (*disable)(struct device *dev); const char *name; /* input device name */ };