Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2000142imu; Sat, 12 Jan 2019 12:39:39 -0800 (PST) X-Google-Smtp-Source: ALg8bN48l4dKGP5eHfB64YuWnHKRdrXYDBT0lpde2CdQbsnc1m67BCur1bzhQ8zksVN7n7fH0w6h X-Received: by 2002:a63:554b:: with SMTP id f11mr16070394pgm.37.1547325579277; Sat, 12 Jan 2019 12:39:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547325579; cv=none; d=google.com; s=arc-20160816; b=sywPHFP8KVVBIN/u12Ge887kj+XyyIz+DJx+GtPv5t3d4JLJrIiDw6ycb1HGmluMYn oBMCl0QRY7NZc5OH6aXTfWC2DiIKmPBlYhuMdJ27ob02FWpzXT1Jqc5dAxXnMByGveAm OvjU7oLkiLVjS8DXkiMbssu9oqVwQM2/DYux5s4THVD3hngwVr3JSGivqFWTNBPIp5a9 I/4agRba55/6lLnqzWtsQ4JA91nxT92Vm/7zzR86dVEmbP377A1wB4X4JP002EdumNVe sp+rcwnKveVlThYG6oe3itap0FnTtD2t/cdZeRvAY3xyS9fOLYgX6aiDRu/oQ2NHylUe pfJQ== 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:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=R7EV6j0X3eRPlYeaDyrZ30dE4VKySWr2Grts3/rSSvc=; b=0EjFgbR6AqrJzKJzP/1wDUp1+ampi5De2U7lXGnHqmAvNk/mnImTf1YhGsehr7SNiN AlbcVZAbbTtLn8WI8agDIrJapbZSNaMGvmZNJqx7Ht2We4HDYiaQ3LvFL4Pk0y3D9xAj Zg4p2UTl6j7wO28FE9kda2MstB9p9GyLNrbC1ju9skVcigikHM8dL3sax4Hhvx5LUjqd eE8eiuPXcUeQYrfj8ZQvh5tSiP18p7bUbrVFoC86Anry2UMSQDp5llglinkRSzdHuZgq fvA0pAutmO/pnPbkduczY/tYe/FGZBG/anqMTCZkQjsRKEmXtgB6nboJe/Qeep6jWTi+ cZLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NbFCVhHR; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3si24757701plo.217.2019.01.12.12.39.23; Sat, 12 Jan 2019 12:39:39 -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=@kernel.org header.s=default header.b=NbFCVhHR; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726625AbfALTBE (ORCPT + 99 others); Sat, 12 Jan 2019 14:01:04 -0500 Received: from mail.kernel.org ([198.145.29.99]:40274 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725851AbfALTBE (ORCPT ); Sat, 12 Jan 2019 14:01:04 -0500 Received: from archlinux (cpc91196-cmbg18-2-0-cust659.5-4.cable.virginm.net [81.96.234.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5C8A320449; Sat, 12 Jan 2019 19:01:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547319662; bh=yWtBk6qs2sfJO3jyaOFnwrL+s8lBcHRntHhGEV+uRRc=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=NbFCVhHR4MyiyiE2Z7uyGkSrQZo9qjiamL0lg+vyyMXIzZvFKaj0CvftAAyrv4lsb LP1sWRqweIIJ99FS7Z+onAXA0aqv4OPNRitRGZxDgTcspwyBLdhgJHQ6gdP6GRSzQz bkH+6wjNTP5K2l2Wjoz9/QWCX/xqtQnFbHFdUmsM= Date: Sat, 12 Jan 2019 19:00:58 +0000 From: Jonathan Cameron To: Anson Huang Cc: "knaack.h@gmx.de" , "lars@metafoo.de" , "pmeerw@pmeerw.net" , "rtresidd@electromag.com.au" , "linux-iio@vger.kernel.org" , "linux-kernel@vger.kernel.org" , dl-linux-imx Subject: Re: [PATCH V7] iio: magnetometer: mag3110: add vdd/vddio regulator operation support Message-ID: <20190112190058.03b799df@archlinux> In-Reply-To: <1546938681-27028-1-git-send-email-Anson.Huang@nxp.com> References: <1546938681-27028-1-git-send-email-Anson.Huang@nxp.com> X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 8 Jan 2019 09:16:04 +0000 Anson Huang wrote: > The magnetometer's power supplies could be controllable on some platforms, > such as i.MX6Q-SABRESD board, the mag3110's power supplies are controlled > by a GPIO fixed regulator, need to make sure the regulators are enabled > before any communication with mag3110, this patch adds vdd/vddio regulator > operation support. > > Signed-off-by: Anson Huang Thanks for you persistence on these. Applied to the togreg branch of iio.git and pushed out as testing to let the autobuilders see if we missed anything. Thanks, Jonathan > --- > ChangeLog Since V6: > - separate the error handling of regulators get to make code easy to read. > --- > drivers/iio/magnetometer/mag3110.c | 94 ++++++++++++++++++++++++++++++++++---- > 1 file changed, 86 insertions(+), 8 deletions(-) > > diff --git a/drivers/iio/magnetometer/mag3110.c b/drivers/iio/magnetometer/mag3110.c > index f063355..dd990cd 100644 > --- a/drivers/iio/magnetometer/mag3110.c > +++ b/drivers/iio/magnetometer/mag3110.c > @@ -20,6 +20,7 @@ > #include > #include > #include > +#include > > #define MAG3110_STATUS 0x00 > #define MAG3110_OUT_X 0x01 /* MSB first */ > @@ -56,6 +57,8 @@ struct mag3110_data { > struct mutex lock; > u8 ctrl_reg1; > int sleep_val; > + struct regulator *vdd_reg; > + struct regulator *vddio_reg; > }; > > static int mag3110_request(struct mag3110_data *data) > @@ -469,17 +472,50 @@ static int mag3110_probe(struct i2c_client *client, > struct iio_dev *indio_dev; > int ret; > > - ret = i2c_smbus_read_byte_data(client, MAG3110_WHO_AM_I); > - if (ret < 0) > - return ret; > - if (ret != MAG3110_DEVICE_ID) > - return -ENODEV; > - > indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); > if (!indio_dev) > return -ENOMEM; > > data = iio_priv(indio_dev); > + > + data->vdd_reg = devm_regulator_get(&client->dev, "vdd"); > + if (IS_ERR(data->vdd_reg)) { > + if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER) > + return -EPROBE_DEFER; > + > + dev_err(&client->dev, "failed to get VDD regulator!\n"); > + return PTR_ERR(data->vdd_reg); > + } > + > + data->vddio_reg = devm_regulator_get(&client->dev, "vddio"); > + if (IS_ERR(data->vddio_reg)) { > + if (PTR_ERR(data->vddio_reg) == -EPROBE_DEFER) > + return -EPROBE_DEFER; > + > + dev_err(&client->dev, "failed to get VDDIO regulator!\n"); > + return PTR_ERR(data->vddio_reg); > + } > + > + 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, MAG3110_WHO_AM_I); > + if (ret < 0) > + goto disable_regulators; > + if (ret != MAG3110_DEVICE_ID) { > + ret = -ENODEV; > + goto disable_regulators; > + } > + > data->client = client; > mutex_init(&data->lock); > > @@ -499,7 +535,7 @@ static int mag3110_probe(struct i2c_client *client, > > ret = mag3110_change_config(data, MAG3110_CTRL_REG1, data->ctrl_reg1); > if (ret < 0) > - return ret; > + goto disable_regulators; > > ret = i2c_smbus_write_byte_data(client, MAG3110_CTRL_REG2, > MAG3110_CTRL_AUTO_MRST_EN); > @@ -520,16 +556,24 @@ static int mag3110_probe(struct i2c_client *client, > iio_triggered_buffer_cleanup(indio_dev); > standby_on_error: > mag3110_standby(iio_priv(indio_dev)); > +disable_regulators: > + regulator_disable(data->vddio_reg); > +disable_regulator_vdd: > + regulator_disable(data->vdd_reg); > + > return ret; > } > > static int mag3110_remove(struct i2c_client *client) > { > struct iio_dev *indio_dev = i2c_get_clientdata(client); > + struct mag3110_data *data = iio_priv(indio_dev); > > iio_device_unregister(indio_dev); > iio_triggered_buffer_cleanup(indio_dev); > mag3110_standby(iio_priv(indio_dev)); > + regulator_disable(data->vddio_reg); > + regulator_disable(data->vdd_reg); > > return 0; > } > @@ -537,14 +581,48 @@ static int mag3110_remove(struct i2c_client *client) > #ifdef CONFIG_PM_SLEEP > static int mag3110_suspend(struct device *dev) > { > - return mag3110_standby(iio_priv(i2c_get_clientdata( > + struct mag3110_data *data = iio_priv(i2c_get_clientdata( > + to_i2c_client(dev))); > + int ret; > + > + ret = mag3110_standby(iio_priv(i2c_get_clientdata( > to_i2c_client(dev)))); > + if (ret) > + return ret; > + > + 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; > } > > static int mag3110_resume(struct device *dev) > { > struct mag3110_data *data = iio_priv(i2c_get_clientdata( > to_i2c_client(dev))); > + int ret; > + > + 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; > + } > > return i2c_smbus_write_byte_data(data->client, MAG3110_CTRL_REG1, > data->ctrl_reg1);