From patchwork Fri Mar 16 22:49:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodrigo Siqueira X-Patchwork-Id: 10290437 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 1413560386 for ; Fri, 16 Mar 2018 22:50:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 038B0290DD for ; Fri, 16 Mar 2018 22:50:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EC720290DF; Fri, 16 Mar 2018 22:50:07 +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=ham 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 6E02D290DD for ; Fri, 16 Mar 2018 22:50:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751751AbeCPWuG (ORCPT ); Fri, 16 Mar 2018 18:50:06 -0400 Received: from mail-qt0-f195.google.com ([209.85.216.195]:44279 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751567AbeCPWuF (ORCPT ); Fri, 16 Mar 2018 18:50:05 -0400 Received: by mail-qt0-f195.google.com with SMTP id g60so12537253qtd.11; Fri, 16 Mar 2018 15:50:05 -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=wRAgupL8/yPk8ViDxmeTUrQaH+TnNCD+dBu5ZSujE3A=; b=WiLsFld/5fETZer+YIjcmhIA/3HQmKdxbzgo8zUuXesE4rnWe2FWpGTqY1UmUDYEwv /qIBUoj8qGDzPgheMTpkdaRGYYE8OO/yaMrNzD4DyLgKUv3uuEePZvOiIJI0+dMjNoii kThj9Jz8CcnB6eLyX6YX1B0+usaB/VItUtLuzVsi3KbhmtZHvfBzIOMoLJjx+3O4iSua A6L9+ZUaJ+DPKNzHHO0xtf2GEXojossTNLA69PjfVtehTap+EOjm4ovMd8CBBvja7kDN 0PrQON0CrpvoKVkM75TOuOq3FWR/m49rDddqN6U+pBmEF56byUSFr08qFK+7oCjsyJjR 47Fw== 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=wRAgupL8/yPk8ViDxmeTUrQaH+TnNCD+dBu5ZSujE3A=; b=nWdrPP8t7E+lyljfyQa1Xa9V8fmzbPTFVq0zH26iA67fQEKkxlhCPQG8O4AJnGsmgy FRXXCIclZ5OFWmjkIz73z0dOf0wYfenCP9De3k2Y6JRx6tOJiGgYUNtvjtgE+TZJb2jd 8H0quuGdoOOdS24m4unattKXX2MZ0VEe7lBwYh6TkXyKYcR2llCY9+LNWC0cN5PLJM7y EkK4xLyQYPlhCuTT8Z6CBt07oB2iXJGUAPsuzo/aZwtH13LEtlwD7bAB15VefNiivkD6 Ij9wi1xzXE59pVqFMyZrbGwkssYop4nJeYmAYCi4Ow/Rgsqppru/fbfUWGP065lCF3vx ZMWQ== X-Gm-Message-State: AElRT7Fz5xOtW44A8Iw67Ioh8pW+r1b1fAEZLa7VDO+7j6GfROFU8Kf5 2JYMV4BBnsToVyXRnlm49YE= X-Google-Smtp-Source: AG47ELsiOp0WmHjpelMAbT9xxOEcuc7w1LmKMMP1vvf1iTijP8Zs9/F95nqaJgf0eQnP9jyHTceDcw== X-Received: by 10.237.55.132 with SMTP id j4mr5586028qtb.275.1521240604511; Fri, 16 Mar 2018 15:50:04 -0700 (PDT) Received: from smtp.gmail.com ([143.107.45.1]) by smtp.gmail.com with ESMTPSA id b125sm5789285qkd.29.2018.03.16.15.50.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 16 Mar 2018 15:50:04 -0700 (PDT) Date: Fri, 16 Mar 2018 19:49:59 -0300 From: Rodrigo Siqueira To: John Syne , Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Greg Kroah-Hartman , linux-iio@vger.kernel.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, Barry Song <21cnbao@gmail.com> Cc: daniel.baluta@nxp.com, linux-iio@vger.kernel.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 6/8] staging:iio:ade7854: Rework I2C read function Message-ID: <1d0edf1a515e71b0198cb76ed6ec679f85ba2127.1521239766.git.rodrigosiqueiramelo@gmail.com> 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 | 110 ++++++++++++-------------------- 1 file changed, 41 insertions(+), 69 deletions(-) diff --git a/drivers/staging/iio/meter/ade7854-i2c.c b/drivers/staging/iio/meter/ade7854-i2c.c index e95147a1bac1..20db8eedb84a 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 < 0 ? ret : 0; } -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, + int bytes) { struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct ade7854_state *st = iio_priv(indio_dev); @@ -79,95 +80,66 @@ static int ade7854_i2c_read_reg_8(struct device *dev, ret = i2c_master_send(st->i2c, st->tx, 2); if (ret < 0) - goto out; + goto unlock; - ret = i2c_master_recv(st->i2c, st->rx, 1); + ret = i2c_master_recv(st->i2c, st->rx, bytes); if (ret < 0) - goto out; + goto unlock; + + switch (bytes) { + 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 unlock; + } - *val = st->rx[0]; -out: +unlock: mutex_unlock(&st->buf_lock); return ret; } +static int ade7854_i2c_read_reg_8(struct device *dev, + u16 reg_address, + u8 *val) +{ + return ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_8_BITS); +} + 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 < 0) - goto out; - - ret = i2c_master_recv(st->i2c, st->rx, 2); - if (ret < 0) - goto out; - - *val = (st->rx[0] << 8) | st->rx[1]; -out: - mutex_unlock(&st->buf_lock); - return ret; + return ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_16_BITS); } 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 < 0) - goto out; - - ret = i2c_master_recv(st->i2c, st->rx, 3); - if (ret < 0) - goto out; - - *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2]; -out: - mutex_unlock(&st->buf_lock); - return ret; + return ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_24_BITS); } 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 < 0) - goto out; - - ret = i2c_master_recv(st->i2c, st->rx, 4); - if (ret < 0) - goto out; - - *val = (st->rx[0] << 24) | (st->rx[1] << 16) | - (st->rx[2] << 8) | st->rx[3]; -out: - mutex_unlock(&st->buf_lock); - return ret; + return ade7854_i2c_read_reg(dev, reg_address, (u32 *)val, + DATA_SIZE_32_BITS); } static int ade7854_i2c_probe(struct i2c_client *client,