Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4408453imu; Mon, 7 Jan 2019 22:58:18 -0800 (PST) X-Google-Smtp-Source: ALg8bN4AzIm+VnUyTYtX2JzaJrwfn4CDsF3Vv8dodOG9o6XLeprpNRisW7ZBx51nKJVroA9BQRRr X-Received: by 2002:a17:902:2ac3:: with SMTP id j61mr587214plb.185.1546930698462; Mon, 07 Jan 2019 22:58:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546930698; cv=none; d=google.com; s=arc-20160816; b=PsMiag+bo7JWUSkJwj9+HSnuTD06v4Dmnme1F474eliB4FiOdOcB+X7ayYb1naeJnF xbqVgCpvUKTkq4A8cm94TX9TdeMySKw73hDdeluv6Q+3EU0Vpkpx+WT3Fx+DVN87wUUu OZms/8SVWn09ltByFv2lE/RZXVBTFfM4OWkHl434VNv6PqnfaJ+GyXpxzixrN8gwiXH4 f/xV/n1PNTZESaw3S6iacDPSPsrIWZg5RG99x+n8eyEYpSvuVmxEX/zkDDQvAKKrlJFb RGPFLmU++QstK+knAShR+zQBEDjmx6XuA0ySNR2Fb4GRPGZgx1u4NdGCFgE4GNMeRbXf u78A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:autocrypt:openpgp:from:references:cc:to:subject :dkim-signature; bh=TrQBf2cRz1jMZrQGa2vkTGqmTw17PZ/Hckp+BU6ol94=; b=aTyADScI68NM0HVRQok6wzBZk0x1FYpSvbgf/KKWqAmKl+cmnxLgm6GjdyGvgkCaoV J7BH74cjHKNLfiouMtjACgDLsMzu6o8/sfb5xxP0Hu0WJTn8b/CFDv3XLHR5xzJfWyZ5 ZV1P1B8M/IQIvhfpYVhpDiaeTsvEmjot5A3UpIMy6pjlxrAtdM8VPo5uWeuqJoDVrRwe 2//E03IkvakCKQhWjuy6ztLfsCKLqp21hBQy5OmtThMtYPbfQS5cA0UE+AVrtMGaAc8o 7l0Z/SMQkGYPThEyJXcPmc1SlTH1Ma1B+rsd4eGVBQHmhVL8RlQgHVBKxDFv56Axifx3 T7pA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@posteo.de header.s=2017 header.b=A84jdkVH; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=posteo.de Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bb4si7117770plb.322.2019.01.07.22.58.03; Mon, 07 Jan 2019 22:58:18 -0800 (PST) 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; dkim=pass header.i=@posteo.de header.s=2017 header.b=A84jdkVH; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=posteo.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727948AbfAHGju (ORCPT + 99 others); Tue, 8 Jan 2019 01:39:50 -0500 Received: from mout02.posteo.de ([185.67.36.66]:32895 "EHLO mout02.posteo.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727706AbfAHGju (ORCPT ); Tue, 8 Jan 2019 01:39:50 -0500 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id CB8402400FB for ; Tue, 8 Jan 2019 07:39:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1546929586; bh=qYylgmuZoXlAkpvmXvaVyvAwZ8kfqy+ZrsUKyBaYk6U=; h=Subject:To:Cc:From:Openpgp:Autocrypt:Date:From; b=A84jdkVHoSMWrehj+G/22F4EF2cZMEq0+ozV3d0TPW+UUaclJiu4l/RgPtg7H87a7 PTBe3o3bFIsCsOXAUkYeMyuSPvx1V2pQ/prfXvfI0vVYFUXWFmMn1Q+lY9phyGpfFg SHQOAVCkHOlgPYfwHzuE1IMAnhCMgyvH7yb1UuO3x+XRcl0ed0u+nqC7+fRiQ1c37A P0KVAYDDAJLld/xCyBPOiUCGVdD98Fg/KIaQixDeGiiB61+tnr7zCtp1M8E3C9wI7u EarbD2xC+Khoag2FP9Kt3XK/XSX7T9I4fghB3dpIpKO1K3WtvuoEuhZRVDbWFtQ2rp qCj6vkaP1FcWA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 43YjKq72zYz9rxD; Tue, 8 Jan 2019 07:39:43 +0100 (CET) Subject: Re: [PATCH V6 2/2] iio: accell: mma8452: add vdd/vddio regulator operation support To: Jonathan Cameron , Anson Huang Cc: "knaack.h@gmx.de" , "lars@metafoo.de" , "pmeerw@pmeerw.net" , "robh+dt@kernel.org" , "mark.rutland@arm.com" , Leonard Crestez , "gregkh@linuxfoundation.org" , "gustavo@embeddedor.com" , "rtresidd@electromag.com.au" , "linux-iio@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , dl-linux-imx References: <1545555462-16121-1-git-send-email-Anson.Huang@nxp.com> <1545555462-16121-2-git-send-email-Anson.Huang@nxp.com> <20190105172942.2787d236@archlinux> From: Martin Kepplinger Openpgp: preference=signencrypt Autocrypt: addr=martink@posteo.de; keydata= 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 Message-ID: Date: Tue, 8 Jan 2019 07:39:43 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <20190105172942.2787d236@archlinux> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05.01.19 18:29, Jonathan Cameron wrote: > On Sun, 23 Dec 2018 09:02:32 +0000 > Anson Huang wrote: > >> The accelerometer's power supply could be controllable on some >> platforms, such as i.MX6Q-SABRESD board, the mma8451's power supplies >> are controlled by a GPIO fixed regulator, need to make sure the >> regulators are enabled before any communication with mma8451, this >> patch adds vdd/vddio regulator operation support. >> >> Signed-off-by: Anson Huang >> Acked-by: Martin Kepplinger > > I'm fine with the general approach now, though I would like separate > error handling for the two different regulators. > > Also, this has obviously changed a fair bit since Martin originally gave > that Ack. Martin, could you confirm you are still happy with the code? I'd like to have the change you mention below too. I'll build, review and confirm after that. thanks! > > Thanks, > > Jonathan > > >> --- >> ChangeLog since V5: >> - ONLY enable vdd/vddio regulators after both of them are aquired; >> - Since the suspend/resume operations are same as runtime suspend/resume, so just use the >> pm_runtime_force_suspend/resume for suspend/resuem callback to simply the code. >> --- >> drivers/iio/accel/mma8452.c | 99 +++++++++++++++++++++++++++++++++++---------- >> 1 file changed, 77 insertions(+), 22 deletions(-) >> >> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c >> index 421a0a8..7519ed5 100644 >> --- a/drivers/iio/accel/mma8452.c >> +++ b/drivers/iio/accel/mma8452.c >> @@ -31,6 +31,7 @@ >> #include >> #include >> #include >> +#include >> >> #define MMA8452_STATUS 0x00 >> #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0)) >> @@ -107,6 +108,8 @@ struct mma8452_data { >> u8 data_cfg; >> const struct mma_chip_info *chip_info; >> int sleep_val; >> + struct regulator *vdd_reg; >> + struct regulator *vddio_reg; >> }; >> >> /** >> @@ -1534,9 +1537,33 @@ static int mma8452_probe(struct i2c_client *client, >> mutex_init(&data->lock); >> data->chip_info = match->data; >> >> + data->vdd_reg = devm_regulator_get(&client->dev, "vdd"); >> + data->vddio_reg = devm_regulator_get(&client->dev, "vddio"); >> + if (IS_ERR(data->vdd_reg) || IS_ERR(data->vddio_reg)) { >> + if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER || >> + PTR_ERR(data->vddio_reg) == -EPROBE_DEFER) >> + return -EPROBE_DEFER; >> + >> + dev_err(&client->dev, "failed to get VDD/VDDIO regulator!\n"); >> + return IS_ERR(data->vdd_reg) ? >> + PTR_ERR(data->vdd_reg) : PTR_ERR(data->vddio_reg); > > This is overly complex. It'll be more lines of code, but I'd prefer > you handle the two separately as the result will be more readable / less > fragile. > >> + } >> + >> + ret = regulator_enable(data->vdd_reg); >> + if (ret) { >> + dev_err(&client->dev, "failed to enable VDD regulator!\n"); >> + return ret; >> + } >> + >> + ret = regulator_enable(data->vddio_reg); >> + if (ret) { >> + dev_err(&client->dev, "failed to enable VDDIO regulator!\n"); >> + goto disable_regulator_vdd; >> + } >> + >> ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> >> switch (ret) { >> case MMA8451_DEVICE_ID: >> @@ -1549,7 +1576,8 @@ static int mma8452_probe(struct i2c_client *client, >> break; >> /* else: fall through */ >> default: >> - return -ENODEV; >> + ret = -ENODEV; >> + goto disable_regulators; >> } >> >> dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n", >> @@ -1566,13 +1594,13 @@ static int mma8452_probe(struct i2c_client *client, >> >> ret = mma8452_reset(client); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> >> data->data_cfg = MMA8452_DATA_CFG_FS_2G; >> ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG, >> data->data_cfg); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> >> /* >> * By default set transient threshold to max to avoid events if >> @@ -1581,7 +1609,7 @@ static int mma8452_probe(struct i2c_client *client, >> ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS, >> MMA8452_TRANSIENT_THS_MASK); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> >> if (client->irq) { >> int irq2; >> @@ -1595,7 +1623,7 @@ static int mma8452_probe(struct i2c_client *client, >> MMA8452_CTRL_REG5, >> data->chip_info->all_events); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> >> dev_dbg(&client->dev, "using interrupt line INT1\n"); >> } >> @@ -1604,11 +1632,11 @@ static int mma8452_probe(struct i2c_client *client, >> MMA8452_CTRL_REG4, >> data->chip_info->enabled_events); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> >> ret = mma8452_trigger_setup(indio_dev); >> if (ret < 0) >> - return ret; >> + goto disable_regulators; >> } >> >> data->ctrl_reg1 = MMA8452_CTRL_ACTIVE | >> @@ -1661,12 +1689,19 @@ static int mma8452_probe(struct i2c_client *client, >> trigger_cleanup: >> mma8452_trigger_cleanup(indio_dev); >> >> +disable_regulators: >> + regulator_disable(data->vddio_reg); >> + >> +disable_regulator_vdd: >> + regulator_disable(data->vdd_reg); >> + >> return ret; >> } >> >> static int mma8452_remove(struct i2c_client *client) >> { >> struct iio_dev *indio_dev = i2c_get_clientdata(client); >> + struct mma8452_data *data = iio_priv(indio_dev); >> >> iio_device_unregister(indio_dev); >> >> @@ -1678,6 +1713,9 @@ static int mma8452_remove(struct i2c_client *client) >> mma8452_trigger_cleanup(indio_dev); >> mma8452_standby(iio_priv(indio_dev)); >> >> + regulator_disable(data->vddio_reg); >> + regulator_disable(data->vdd_reg); >> + >> return 0; >> } >> >> @@ -1696,6 +1734,18 @@ static int mma8452_runtime_suspend(struct device *dev) >> return -EAGAIN; >> } >> >> + ret = regulator_disable(data->vddio_reg); >> + if (ret) { >> + dev_err(dev, "failed to disable VDDIO regulator\n"); >> + return ret; >> + } >> + >> + ret = regulator_disable(data->vdd_reg); >> + if (ret) { >> + dev_err(dev, "failed to disable VDD regulator\n"); >> + return ret; >> + } >> + >> return 0; >> } >> >> @@ -1705,9 +1755,22 @@ static int mma8452_runtime_resume(struct device *dev) >> struct mma8452_data *data = iio_priv(indio_dev); >> int ret, sleep_val; >> >> + ret = regulator_enable(data->vdd_reg); >> + if (ret) { >> + dev_err(dev, "failed to enable VDD regulator\n"); >> + return ret; >> + } >> + >> + ret = regulator_enable(data->vddio_reg); >> + if (ret) { >> + dev_err(dev, "failed to enable VDDIO regulator\n"); >> + regulator_disable(data->vdd_reg); >> + return ret; >> + } >> + >> ret = mma8452_active(data); >> if (ret < 0) >> - return ret; >> + goto runtime_resume_failed; >> >> ret = mma8452_get_odr_index(data); >> sleep_val = 1000 / mma8452_samp_freq[ret][0]; >> @@ -1717,25 +1780,17 @@ static int mma8452_runtime_resume(struct device *dev) >> msleep_interruptible(sleep_val); >> >> return 0; >> -} >> -#endif >> >> -#ifdef CONFIG_PM_SLEEP >> -static int mma8452_suspend(struct device *dev) >> -{ >> - return mma8452_standby(iio_priv(i2c_get_clientdata( >> - to_i2c_client(dev)))); >> -} >> +runtime_resume_failed: >> + regulator_disable(data->vddio_reg); >> + regulator_disable(data->vdd_reg); >> >> -static int mma8452_resume(struct device *dev) >> -{ >> - return mma8452_active(iio_priv(i2c_get_clientdata( >> - to_i2c_client(dev)))); >> + return ret; >> } >> #endif >> >> static const struct dev_pm_ops mma8452_pm_ops = { >> - SET_SYSTEM_SLEEP_PM_OPS(mma8452_suspend, mma8452_resume) >> + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) >> SET_RUNTIME_PM_OPS(mma8452_runtime_suspend, >> mma8452_runtime_resume, NULL) >> }; >