From patchwork Wed Jul 11 12:29:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jean-Baptiste Maneyrol X-Patchwork-Id: 10519647 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B8F596054E for ; Wed, 11 Jul 2018 12:30:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9BF7128E5C for ; Wed, 11 Jul 2018 12:30:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8FC3428E42; Wed, 11 Jul 2018 12:30:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C6DBD28DF4 for ; Wed, 11 Jul 2018 12:30:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732739AbeGKMeD (ORCPT ); Wed, 11 Jul 2018 08:34:03 -0400 Received: from mail-eopbgr700076.outbound.protection.outlook.com ([40.107.70.76]:39331 "EHLO NAM04-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732286AbeGKMeC (ORCPT ); Wed, 11 Jul 2018 08:34:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=invensense.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KseVBtkbET6u3ae/+E1KD4qXaDLElSZupDOiH3JnPzg=; b=EDGHILVGbRxMx2cRZmodzAL0LVauvmqS5yPu7c5glj1SgugWb7MtnJfy0lnguT/8z1E2pKlu/+uflnqApn7oiXBnbt7fecrZzImUFzVR9DLAtVPbOowF9ae/8ofPDkwar7dPR+C0NYRxsC1nVa8lSoayE1YMZGAKE1ofUxsdUP4= Received: from SN1PR12MB2525.namprd12.prod.outlook.com (52.132.196.156) by SN1PR12MB0349.namprd12.prod.outlook.com (10.162.4.155) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.930.21; Wed, 11 Jul 2018 12:29:33 +0000 Received: from SN1PR12MB2525.namprd12.prod.outlook.com ([fe80::64e2:d3c3:835e:17d0]) by SN1PR12MB2525.namprd12.prod.outlook.com ([fe80::64e2:d3c3:835e:17d0%6]) with mapi id 15.20.0952.017; Wed, 11 Jul 2018 12:29:33 +0000 From: Jean-Baptiste Maneyrol To: Brian Masney , "jic23@kernel.org" , "robh+dt@kernel.org" , "mark.rutland@arm.com" , "andy.gross@linaro.org" , "david.brown@linaro.org" , "linux-iio@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-arm-msm@vger.kernel.org" , "linux-soc@vger.kernel.org" CC: "jonathan@marek.ca" , "knaack.h@gmx.de" , "lars@metafoo.de" , "pmeerw@pmeerw.net" , "mkelly@xevo.com" , "fischerdouglasc@gmail.com" , "bshah@kde.org" , "ctatlor97@gmail.com" Subject: Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework Thread-Topic: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework Thread-Index: AQHUGLPc4EHyBTIlJEG93uxWEJTW/aSJ8wP+ Date: Wed, 11 Jul 2018 12:29:33 +0000 Message-ID: References: <20180711010932.20313-1-masneyb@onstation.org>, <20180711010932.20313-3-masneyb@onstation.org> In-Reply-To: <20180711010932.20313-3-masneyb@onstation.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=JManeyrol@invensense.com; x-originating-ip: [77.157.193.39] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; SN1PR12MB0349; 7:k+Hd5+/QEPJJOZEzteLMo0kb8LjUANj7ehe72Z6USKmylhEAq6/EXZ/+eh2hsKlY7PEo9bS1b+k2fvGwLCK97G4kre48Nm1325N/kY2YB2JPS0Q2J2AHd6r7CLWP4fIdWd20rvWMefNZqiy9B0SDXdF9ApGGKrulJWdw9QfofZZYunJ+TYjvIWRl3Oz6oWMcBK9i1OQiaVV2U7aPBzzmDbFsIbJtGn9zyvDMFCSGVkLDpVXQyPqxHSgGULqmVZnt x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 71074792-7c53-4a29-63f8-08d5e729f547 x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989117)(5600053)(711020)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020); SRVR:SN1PR12MB0349; x-ms-traffictypediagnostic: SN1PR12MB0349: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917)(26323138287068)(9452136761055)(85827821059158)(4782527817362)(17755550239193); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040522)(2401047)(5005006)(8121501046)(3231311)(944501410)(52105095)(10201501046)(3002001)(93006095)(93001095)(149027)(150027)(6041310)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011)(7699016); SRVR:SN1PR12MB0349; BCL:0; PCL:0; RULEID:; SRVR:SN1PR12MB0349; x-forefront-prvs: 0730093765 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(376002)(366004)(136003)(346002)(396003)(39850400004)(51914003)(52314003)(199004)(189003)(55016002)(6306002)(74316002)(106356001)(86362001)(97736004)(6246003)(2900100001)(33656002)(80792005)(99286004)(4326008)(68736007)(9686003)(7736002)(105586002)(2201001)(8936002)(305945005)(6116002)(39060400002)(6436002)(2906002)(6506007)(66066001)(54906003)(7696005)(478600001)(5660300001)(5250100002)(446003)(11346002)(81166006)(476003)(229853002)(2501003)(3846002)(81156014)(102836004)(14454004)(186003)(53936002)(7416002)(53546011)(5024004)(256004)(14444005)(26005)(966005)(316002)(72206003)(8676002)(25786009)(76176011)(110136005)(486006)(921003)(1121003); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0349; H:SN1PR12MB2525.namprd12.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: invensense.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: zZ+aqShvkB0xb3hnKbG3rqVLus4/VMaY/WKTdARYcDimBs8dSsixNv8UgYiyaQk6GAzYACr0N5iRT88vkUvIw3IhaUMkwTMV+lsQQuhzyEhByoCk4INXHqhlkkBLQZfO4DypyJ4/0VgpvScHAlmVQH6Xptn/NTRxrffbUB7VwFs+SLtEljZDQ+yFWrI7i8gpkjEVw7uqk9Z5g1Adm/KImry6LsbRJ0TCJukiadW2YfvVcOe8CXzzy0ZxvGy+42/aBwBzGaEH5Q1rP6v0kFi4R4ttYq959PYPHDjsQP9K51YHiKfOo/ENsv33d5hqIzAinsjMiBftVDVdAvYW7KplWnxurRX44GjyFHmHUBUkOdM= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: invensense.com X-MS-Exchange-CrossTenant-Network-Message-Id: 71074792-7c53-4a29-63f8-08d5e729f547 X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Jul 2018 12:29:33.6204 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 462b3b3b-e42b-47ea-801a-f1581aac892d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0349 Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hello, I really don't like the idea to have regulator handled inside the driver. I know this was done like that before for Nexus 5, but I think now this is something that can be done using dts only. Does anyone know if there is a way with dts to handle regulator automatically and prevent the use in the driver? That would be a good idea to search how this handled for other drivers. Anyway, you are enforcing regulator use in your code. It doesn't seem the code will work when there is no regulator declared in the dts, which is the case for the majority of configurations. We should at least make it optional. Thanks for the contribution. JB From: Brian Masney Sent: Wednesday, July 11, 2018 03:09 To: jic23@kernel.org; robh+dt@kernel.org; mark.rutland@arm.com; andy.gross@linaro.org; david.brown@linaro.org; linux-iio@vger.kernel.org; devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; linux-arm-msm@vger.kernel.org; linux-soc@vger.kernel.org Cc: jonathan@marek.ca; Jean-Baptiste Maneyrol; knaack.h@gmx.de; lars@metafoo.de; pmeerw@pmeerw.net; mkelly@xevo.com; fischerdouglasc@gmail.com; bshah@kde.org; ctatlor97@gmail.com; masneyb@onstation.org Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework   CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe. This patch adds support for the regulator framework to the mpu6050 driver. Signed-off-by: Brian Masney Signed-off-by: Jonathan Marek --- This is a variation of Jonathan Marek's patch from postmarketOS https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 with the following changes: - Stripped out 6515 variant code. (See my previous patch in this series) - Add the regulator to the mpu core instead of only the i2c variant. - Add error handling. - Release the regulator on suspend, device remove, etc. - Device tree documentation.  .../bindings/iio/imu/inv_mpu6050.txt          |  1 +  drivers/iio/imu/inv_mpu6050/inv_mpu_core.c    | 57 +++++++++++++++++--  drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c     |  2 +-  drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h     |  3 +  drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c     |  9 +++  5 files changed, 66 insertions(+), 6 deletions(-) -- 2.17.1 -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt index b7def51c8ad9..d39907b12a46 100644 --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt @@ -21,6 +21,7 @@ Required properties:    bindings.  Optional properties: + - vddio-supply: regulator phandle for VDDIO supply   - mount-matrix: an optional 3x3 mounting rotation matrix   - i2c-gate node.  These devices also support an auxiliary i2c bus.  This is     simple enough to be described using the i2c-gate binding. See diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 12c1b9507007..ec276b7bcc69 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -23,6 +23,7 @@  #include  #include  #include +#include  #include "inv_mpu_iio.h"  /* @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st)         return result;  } +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) +{ +       int result; + +       result = regulator_enable(st->vddio_supply); +       if (result == 0) { +               /* Give the device a little bit of time to start up. */ +               usleep_range(35000, 70000); +       } + +       return result; +} +  int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,                 int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type)  { @@ -990,15 +1004,28 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,                 return -EINVAL;         } +       st->vddio_supply = devm_regulator_get_optional(dev, "vddio"); +       if (IS_ERR(st->vddio_supply)) { +               if (PTR_ERR(st->vddio_supply) != -EPROBE_DEFER) +                       dev_err(dev, "Failed to get vddio regulator %d\n", +                               (int)PTR_ERR(st->vddio_supply)); + +               return PTR_ERR(st->vddio_supply); +       } + +       result = inv_mpu_core_enable_regulator(st); +       if (result) +               return result; +         /* power is turned on inside check chip type*/         result = inv_check_and_setup_chip(st);         if (result) -               return result; +               goto out_disable_regulator;         result = inv_mpu6050_init_config(indio_dev);         if (result) {                 dev_err(dev, "Could not initialize device.\n"); -               return result; +               goto out_disable_regulator;         }         if (inv_mpu_bus_setup) @@ -1023,24 +1050,34 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,                                                  NULL);         if (result) {                 dev_err(dev, "configure buffer fail %d\n", result); -               return result; +               goto out_disable_regulator;         }         result = inv_mpu6050_probe_trigger(indio_dev, irq_type);         if (result) {                 dev_err(dev, "trigger probe fail %d\n", result); -               return result; +               goto out_disable_regulator;         }         result = devm_iio_device_register(dev, indio_dev);         if (result) {                 dev_err(dev, "IIO register fail %d\n", result); -               return result; +               goto out_disable_regulator;         }         return 0; + +out_disable_regulator: +       regulator_disable(st->vddio_supply); +       return result; +  }  EXPORT_SYMBOL_GPL(inv_mpu_core_probe); +int inv_mpu_core_remove(struct inv_mpu6050_state *st) +{ +       return regulator_disable(st->vddio_supply); +} +  #ifdef CONFIG_PM_SLEEP  static int inv_mpu_resume(struct device *dev) @@ -1050,6 +1087,11 @@ static int inv_mpu_resume(struct device *dev)         mutex_lock(&st->lock);         result = inv_mpu6050_set_power_itg(st, true); +       if (result) +               goto out_unlock; + +       result = inv_mpu_core_enable_regulator(st); +out_unlock:         mutex_unlock(&st->lock);         return result; @@ -1062,6 +1104,11 @@ static int inv_mpu_suspend(struct device *dev)         mutex_lock(&st->lock);         result = inv_mpu6050_set_power_itg(st, false); +       if (result) +               goto out_unlock; + +       result = regulator_disable(st->vddio_supply); +out_unlock:         mutex_unlock(&st->lock);         return result; diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c index dd758e3d403d..ce227038c61c 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c @@ -164,7 +164,7 @@ static int inv_mpu_remove(struct i2c_client *client)                 i2c_mux_del_adapters(st->muxc);         } -       return 0; +       return inv_mpu_core_remove(st);  }  /* diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h index e69a59659dbc..0289615a6135 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h @@ -129,6 +129,7 @@ struct inv_mpu6050_hw {   *  @chip_period:      chip internal period estimation (~1kHz).   *  @it_timestamp:     timestamp from previous interrupt.   *  @data_timestamp:   timestamp for next data sample. + *  @vddio_supply      voltage regulator for the chip.   */  struct inv_mpu6050_state {         struct mutex lock; @@ -149,6 +150,7 @@ struct inv_mpu6050_state {         s64 chip_period;         s64 it_timestamp;         s64 data_timestamp; +       struct regulator *vddio_supply;  };  /*register and associated bit definition*/ @@ -321,4 +323,5 @@ int inv_mpu_acpi_create_mux_client(struct i2c_client *client);  void inv_mpu_acpi_delete_mux_client(struct i2c_client *client);  int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,                 int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type); +int inv_mpu_core_remove(struct inv_mpu6050_state *st);  extern const struct dev_pm_ops inv_mpu_pmops; diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c index 227f50afff22..fce935f8f1e4 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c @@ -70,6 +70,14 @@ static int inv_mpu_probe(struct spi_device *spi)                                   inv_mpu_i2c_disable, chip_type);  } +static int inv_mpu_remove(struct spi_device *spi) +{ +       struct iio_dev *indio_dev = spi_get_drvdata(spi); +       struct inv_mpu6050_state *st = iio_priv(indio_dev); + +       return inv_mpu_core_remove(st); +} +  /*   * device id table is used to identify what device can be   * supported by this driver @@ -94,6 +102,7 @@ MODULE_DEVICE_TABLE(acpi, inv_acpi_match);  static struct spi_driver inv_mpu_driver = {         .probe          =       inv_mpu_probe, +       .remove         =       inv_mpu_remove,         .id_table       =       inv_mpu_id,         .driver = {                 .acpi_match_table = ACPI_PTR(inv_acpi_match),