From patchwork Wed Aug 12 14:31:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Irina Tirdea X-Patchwork-Id: 506670 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 5FAD91400A0 for ; Thu, 13 Aug 2015 00:34:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755326AbbHLOdR (ORCPT ); Wed, 12 Aug 2015 10:33:17 -0400 Received: from mga03.intel.com ([134.134.136.65]:38824 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755123AbbHLOdQ (ORCPT ); Wed, 12 Aug 2015 10:33:16 -0400 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga103.jf.intel.com with ESMTP; 12 Aug 2015 07:32:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,661,1432623600"; d="scan'208";a="782729922" Received: from itirdea-desk.rb.intel.com ([10.237.104.230]) by orsmga002.jf.intel.com with ESMTP; 12 Aug 2015 07:32:36 -0700 From: Irina Tirdea To: Wolfram Sang , Jonathan Cameron , linux-iio@vger.kernel.org, linux-i2c@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Srinivas Pandruvada , Peter Meerwald , Irina Tirdea Subject: [PATCH v5 6/8] iio: gyro: bmg160: optimize i2c transfers in trigger handler Date: Wed, 12 Aug 2015 17:31:38 +0300 Message-Id: <1439389900-10108-7-git-send-email-irina.tirdea@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1439389900-10108-1-git-send-email-irina.tirdea@intel.com> References: <1439389900-10108-1-git-send-email-irina.tirdea@intel.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Some i2c busses (e.g.: Synopsys DesignWare I2C adapter) need to enable/disable the bus at each i2c transfer and must wait for the enable/disable to happen before sending the data. When reading data in the trigger handler, the bmg160 driver does one i2c transfer for each axis. This has an impact on the frequency of the gyroscope at high sample rates due to additional delays introduced by the i2c bus at each transfer. Reading all axis values in one i2c transfer reduces the delays introduced by the i2c bus. Uses i2c_smbus_read_i2c_block_data_or_emulated that will fallback to reading each axis as a separate word in case i2c block read is not supported. Signed-off-by: Irina Tirdea Acked-by: Jonathan Cameron Acked-by: Srinivas Pandruvada --- drivers/iio/gyro/bmg160.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/iio/gyro/bmg160.c b/drivers/iio/gyro/bmg160.c index b2a6ccb..1ff306d 100644 --- a/drivers/iio/gyro/bmg160.c +++ b/drivers/iio/gyro/bmg160.c @@ -772,6 +772,7 @@ static const struct iio_event_spec bmg160_event = { .sign = 's', \ .realbits = 16, \ .storagebits = 16, \ + .endianness = IIO_LE, \ }, \ .event_spec = &bmg160_event, \ .num_event_specs = 1 \ @@ -809,19 +810,16 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p) struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct bmg160_data *data = iio_priv(indio_dev); - int bit, ret, i = 0; + int ret = 0; mutex_lock(&data->mutex); - for (bit = 0; bit < AXIS_MAX; bit++) { - ret = i2c_smbus_read_word_data(data->client, - BMG160_AXIS_TO_REG(bit)); - if (ret < 0) { - mutex_unlock(&data->mutex); - goto err; - } - data->buffer[i++] = ret; - } + ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client, + BMG160_REG_XOUT_L, + AXIS_MAX * 2, + (u8 *)data->buffer); mutex_unlock(&data->mutex); + if (ret < 0) + goto err; iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, pf->timestamp);