From patchwork Wed Mar 14 18:11:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodrigo Siqueira X-Patchwork-Id: 10283189 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 66AE7602C2 for ; Wed, 14 Mar 2018 18:11:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 53FEE285B7 for ; Wed, 14 Mar 2018 18:11:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 48AC328606; Wed, 14 Mar 2018 18:11:23 +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=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,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 C84E6285B7 for ; Wed, 14 Mar 2018 18:11:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752537AbeCNSLN (ORCPT ); Wed, 14 Mar 2018 14:11:13 -0400 Received: from mail-qt0-f193.google.com ([209.85.216.193]:33292 "EHLO mail-qt0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751869AbeCNSLL (ORCPT ); Wed, 14 Mar 2018 14:11:11 -0400 Received: by mail-qt0-f193.google.com with SMTP id a23so4469773qtn.0; Wed, 14 Mar 2018 11:11:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=RVm4haLa5G34U5ccN4uubL5treB+xeSUVUvCjlnhNHY=; b=EQUZ3+XxiZ6V/Jn+1WhWYF6MawUoepgqj192OYCrei/Q3X5zEC5zWM3ZMsAvaM1MRA dsqo8jk+vEKxw2X6dcu8/9HtrnNEApyAlPnVL9J7iYX4eVYSZoLO3VuLOCYoW5DBf0vo ddVheGlPBrqWju8mqQRIL8i4rT/tfOb4wG56DZJJChrZkeB1v9cJW4lqM0e9DaR+9zUW 55Cnf+hG7N75hueKssN/x5wCYKnuknGeLiiAsxne5O2fKerYYi0Fhh9GoCnU7g2BT/AZ 8Zu2DXpwnHeuIZ9V7G0HLkRVOqOp9v1NMN68xt8ncnXV0Vb5mjsy5sz5FFucjY2M50ps DrDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=RVm4haLa5G34U5ccN4uubL5treB+xeSUVUvCjlnhNHY=; b=T1E+CswqpagTnsLdULrQzOYWQA80pEFKCOZx3uqqXA8wolKSV67zbqvwAk4zm6FDkN 0N3bVUFCnVDmWd9smRnIzniwK1FSQifsudv/849zXaXt3cYhmDbIm5RPpQOooTmG+Wjm 6dp3foXLCqd5M9f877K9fBeYSd9qGb7kshCu9j2mXNSnWnE2VjQ6kMbvsxBl30zfWP+c eLqd1gKMp2EOlULw8diKFX30vMvaKcS4FWyngy1C9NZw6YJVfWhQUmhfp1dFqIXnQnLp iNkzIJXpZZGyQ7QiOePRK2WvzAEgEQV3UfLiMbx4TrRzhx1mk8XDUuyauDsfFqcoXZDT TH7g== X-Gm-Message-State: AElRT7F5q892l9X05gMjKg5xUhMhye0LuABJJBOvFZt40StKkE5ZaQJE gYxRPvq+QRUgP/hR2LIfCFQ= X-Google-Smtp-Source: AG47ELs1xjtr74JY65nBKkH4MUQwGtSyxINfsAYlGL2ihY7BIyeqd2fGmZa7fDjPvJ9ybyIp5+U/2w== X-Received: by 10.237.49.195 with SMTP id 61mr1156112qth.77.1521051069927; Wed, 14 Mar 2018 11:11:09 -0700 (PDT) Received: from smtp.gmail.com ([143.107.45.1]) by smtp.gmail.com with ESMTPSA id o63sm2288854qtd.83.2018.03.14.11.11.07 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Mar 2018 11:11:09 -0700 (PDT) Date: Wed, 14 Mar 2018 15:11:05 -0300 From: Rodrigo Siqueira To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Greg Kroah-Hartman , Barry Song <21cnbao@gmail.com>, John Syne Cc: daniel.baluta@nxp.com, linux-iio@vger.kernel.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/7] staging:iio:ade7854: Rework I2C read function Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20180223 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 The read operation for the I2C function has many duplications that can be generalized into a single function. This patch reworks the read operation for I2C to centralizes all similar code in a single function. Part of the rework includes a proper error handling and a fix on the i2c_master_recv for 32 bits as pointed by John Syne patches. It is possible to remove all the old interface to use the new one, however, for keeping the things simple and working this patch maintain legacy interface. Signed-off-by: Rodrigo Siqueira Signed-off-by: John Syne --- drivers/staging/iio/meter/ade7854-i2c.c | 106 ++++++++++++++------------------ 1 file changed, 47 insertions(+), 59 deletions(-) diff --git a/drivers/staging/iio/meter/ade7854-i2c.c b/drivers/staging/iio/meter/ade7854-i2c.c index f302359d2265..845f8c348945 100644 --- a/drivers/staging/iio/meter/ade7854-i2c.c +++ b/drivers/staging/iio/meter/ade7854-i2c.c @@ -65,9 +65,10 @@ static int ade7854_i2c_write_reg(struct device *dev, return ret; } -static int ade7854_i2c_read_reg_8(struct device *dev, - u16 reg_address, - u8 *val) +static int ade7854_i2c_read_reg(struct device *dev, + u16 reg_address, + u32 *val, + enum data_size type) { struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct ade7854_state *st = iio_priv(indio_dev); @@ -78,42 +79,58 @@ static int ade7854_i2c_read_reg_8(struct device *dev, st->tx[1] = reg_address & 0xFF; ret = i2c_master_send(st->i2c, st->tx, 2); - if (ret) - goto out; + if (ret < 0) + goto error_i2c_read_unlock; - ret = i2c_master_recv(st->i2c, st->rx, 1); - if (ret) - goto out; + ret = i2c_master_recv(st->i2c, st->rx, type); + if (ret < 0) + goto error_i2c_read_unlock; - *val = st->rx[0]; -out: + switch (type) { + case DATA_SIZE_8_BITS: + *val = st->rx[0]; + break; + case DATA_SIZE_16_BITS: + *val = (st->rx[0] << 8) | st->rx[1]; + break; + case DATA_SIZE_24_BITS: + *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2]; + break; + case DATA_SIZE_32_BITS: + *val = (st->rx[0] << 24) | (st->rx[1] << 16) | + (st->rx[2] << 8) | st->rx[3]; + break; + default: + ret = -EINVAL; + goto error_i2c_read_unlock; + } + +error_i2c_read_unlock: mutex_unlock(&st->buf_lock); return ret; } +static int ade7854_i2c_read_reg_8(struct device *dev, + u16 reg_address, + u8 *val) +{ + int ret; + + ret = ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_8_BITS); + + return ret; +} + static int ade7854_i2c_read_reg_16(struct device *dev, u16 reg_address, u16 *val) { - struct iio_dev *indio_dev = dev_to_iio_dev(dev); - struct ade7854_state *st = iio_priv(indio_dev); int ret; - mutex_lock(&st->buf_lock); - st->tx[0] = (reg_address >> 8) & 0xFF; - st->tx[1] = reg_address & 0xFF; - - ret = i2c_master_send(st->i2c, st->tx, 2); - if (ret) - goto out; - - ret = i2c_master_recv(st->i2c, st->rx, 2); - if (ret) - goto out; + ret = ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_16_BITS); - *val = (st->rx[0] << 8) | st->rx[1]; -out: - mutex_unlock(&st->buf_lock); return ret; } @@ -121,25 +138,11 @@ static int ade7854_i2c_read_reg_24(struct device *dev, u16 reg_address, u32 *val) { - struct iio_dev *indio_dev = dev_to_iio_dev(dev); - struct ade7854_state *st = iio_priv(indio_dev); int ret; - mutex_lock(&st->buf_lock); - st->tx[0] = (reg_address >> 8) & 0xFF; - st->tx[1] = reg_address & 0xFF; - - ret = i2c_master_send(st->i2c, st->tx, 2); - if (ret) - goto out; - - ret = i2c_master_recv(st->i2c, st->rx, 3); - if (ret) - goto out; + ret = ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_24_BITS); - *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2]; -out: - mutex_unlock(&st->buf_lock); return ret; } @@ -147,26 +150,11 @@ static int ade7854_i2c_read_reg_32(struct device *dev, u16 reg_address, u32 *val) { - struct iio_dev *indio_dev = dev_to_iio_dev(dev); - struct ade7854_state *st = iio_priv(indio_dev); int ret; - mutex_lock(&st->buf_lock); - st->tx[0] = (reg_address >> 8) & 0xFF; - st->tx[1] = reg_address & 0xFF; - - ret = i2c_master_send(st->i2c, st->tx, 2); - if (ret) - goto out; - - ret = i2c_master_recv(st->i2c, st->rx, 3); - if (ret) - goto out; + ret = ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_32_BITS); - *val = (st->rx[0] << 24) | (st->rx[1] << 16) | - (st->rx[2] << 8) | st->rx[3]; -out: - mutex_unlock(&st->buf_lock); return ret; }