From patchwork Wed Mar 30 16:57:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 8701321 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 41085C0553 for ; Wed, 30 Mar 2016 16:57:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 547E5200D6 for ; Wed, 30 Mar 2016 16:57:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4E2812038A for ; Wed, 30 Mar 2016 16:57:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932912AbcC3Q5f (ORCPT ); Wed, 30 Mar 2016 12:57:35 -0400 Received: from mail-pf0-f181.google.com ([209.85.192.181]:34063 "EHLO mail-pf0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932241AbcC3Q5d (ORCPT ); Wed, 30 Mar 2016 12:57:33 -0400 Received: by mail-pf0-f181.google.com with SMTP id x3so47476728pfb.1 for ; Wed, 30 Mar 2016 09:57:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=6aKNZxamSlMnkez1gJLREtXVMwKTO93YkiErRuX0/ug=; b=OBlNIDKioEyyC5lG+X3CqvP1i6u8ofC0nfg7WB2XT87qAQ3sOdZkAUX1b3mh8uDrHD DeUk9Cl2sF5XM/NEpJcM48HbMUerBZaXAsLFQL3KWf8WFsHYo4NCtdvU77BiX4yNPA6p 81jNgoDN524ZWnqqoUUZzDnwQIpthTOzqDlnk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=6aKNZxamSlMnkez1gJLREtXVMwKTO93YkiErRuX0/ug=; b=Rywp2Z4Tcz7uJd8+cyyFtySjd8wEnBHz1RJWpCmXsjebpR1Dft3OAdWCp+w/YH1Enx EH3hJtmn19MbjfrThwdc9PC8+3VnlVojFY+o0RakSGZLqfBQc/sfPQ8iRTA/NU6IRGmU Q+FU/vVaZ1mRmbJhiPPEl7nZ2aX/MUdZ2BFNSLW4nCkGsKdvu8VYrUeyNCWlqdVGNJqB glb9DkyiVu+rA7cyLRIogZoj6iV3W56tkRKAyb1+8A0XnE8fTNRC5smoCegowFz0njV8 AubLVuwtJRd96FJDSuVO+lmYLsH95iBoYU4/QUobzpp8ZDhrdCdc0EhWsCLmxJdBEGcR Sx3Q== X-Gm-Message-State: AD7BkJKdnHfqWafJ4HBvOqhWzObGlVhS1iBotjqk79QTYjpYwcYhghUZzja46YfCTOK0h4DQ X-Received: by 10.98.14.67 with SMTP id w64mr14843195pfi.154.1459357052126; Wed, 30 Mar 2016 09:57:32 -0700 (PDT) Received: from localhost.localdomain (ip68-111-223-48.sd.sd.cox.net. [68.111.223.48]) by smtp.gmail.com with ESMTPSA id ey7sm7192507pab.47.2016.03.30.09.57.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 30 Mar 2016 09:57:31 -0700 (PDT) From: Bjorn Andersson To: Dmitry Torokhov , Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Andrew Duggan , Christopher Heiny Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson Subject: [PATCH] Input: synaptics-rmi4: Support regulator supplies Date: Wed, 30 Mar 2016 09:57:29 -0700 Message-Id: <1459357049-5608-1-git-send-email-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.5.0 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-7.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable 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 From: Bjorn Andersson Support the two supplies - vdd and vio - to make it possible to control power to the Synaptics chip. Signed-off-by: Bjorn Andersson Signed-off-by: Bjorn Andersson --- .../devicetree/bindings/input/rmi4/rmi_i2c.txt | 7 ++++ drivers/input/rmi4/rmi_i2c.c | 45 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/Documentation/devicetree/bindings/input/rmi4/rmi_i2c.txt b/Documentation/devicetree/bindings/input/rmi4/rmi_i2c.txt index 95fa715c6046..a8c31f40f816 100644 --- a/Documentation/devicetree/bindings/input/rmi4/rmi_i2c.txt +++ b/Documentation/devicetree/bindings/input/rmi4/rmi_i2c.txt @@ -22,6 +22,13 @@ See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt - syna,reset-delay-ms: The number of milliseconds to wait after resetting the device. +- vdd-supply: VDD power supply. +See Documentation/devicetree/bindings/regulator/regulator.txt + +- vio-supply: VIO power supply +See Documentation/devicetree/bindings/regulator/regulator.txt + + Function Parameters: Parameters specific to RMI functions are contained in child nodes of the rmi device node. Documentation for the parameters of each function can be found in: diff --git a/drivers/input/rmi4/rmi_i2c.c b/drivers/input/rmi4/rmi_i2c.c index a96a326b53bd..a8c794daba04 100644 --- a/drivers/input/rmi4/rmi_i2c.c +++ b/drivers/input/rmi4/rmi_i2c.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include "rmi_driver.h" #define BUFFER_SIZE_INCREMENT 32 @@ -37,6 +39,8 @@ struct rmi_i2c_xport { u8 *tx_buf; size_t tx_buf_size; + + struct regulator_bulk_data supplies[2]; }; #define RMI_PAGE_SELECT_REGISTER 0xff @@ -246,6 +250,22 @@ static int rmi_i2c_probe(struct i2c_client *client, return -ENODEV; } + rmi_i2c->supplies[0].supply = "vdd"; + rmi_i2c->supplies[1].supply = "vio"; + retval = devm_regulator_bulk_get(&client->dev, + ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + if (retval < 0) + return retval; + + retval = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + if (retval < 0) + return retval; + + /* Allow the firmware to get ready */ + msleep(10); + rmi_i2c->client = client; mutex_init(&rmi_i2c->page_mutex); @@ -286,6 +306,8 @@ static int rmi_i2c_remove(struct i2c_client *client) struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); rmi_unregister_transport_device(&rmi_i2c->xport); + regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); return 0; } @@ -308,6 +330,10 @@ static int rmi_i2c_suspend(struct device *dev) dev_warn(dev, "Failed to enable irq for wake: %d\n", ret); } + + regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + return ret; } @@ -317,6 +343,14 @@ static int rmi_i2c_resume(struct device *dev) struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); int ret; + ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + if (ret) + return ret; + + /* Allow the firmware to get ready */ + msleep(10); + enable_irq(rmi_i2c->irq); if (device_may_wakeup(&client->dev)) { ret = disable_irq_wake(rmi_i2c->irq); @@ -346,6 +380,9 @@ static int rmi_i2c_runtime_suspend(struct device *dev) disable_irq(rmi_i2c->irq); + regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + return 0; } @@ -355,6 +392,14 @@ static int rmi_i2c_runtime_resume(struct device *dev) struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); int ret; + ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + if (ret) + return ret; + + /* Allow the firmware to get ready */ + msleep(10); + enable_irq(rmi_i2c->irq); ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev);