Received: by 10.213.65.68 with SMTP id h4csp3645101imn; Tue, 10 Apr 2018 02:15:36 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/wrdL99MSiVLYcqX1k39Wm2UoiYaWtOFqUUQYg62mkP+koUPONcBtLeGST6yB8kLUtJrbB X-Received: by 2002:a17:902:8546:: with SMTP id d6-v6mr4636278plo.106.1523351736457; Tue, 10 Apr 2018 02:15:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523351736; cv=none; d=google.com; s=arc-20160816; b=FHLXz9XW51XTBz+9+LKGp2mlJ0hF7+GbMaSD+s7HVBGtRAuO85+wtCU84mjLlW2Cnl umI20+i6spNox6Hmc7xP/DjPMF4JZKPDX6bZQS8G2zel6akWMMTFXNu0AikYArWt8x8l e4enVFhBN32w6LN6BneumAShdg4ZRGszim81uXFef9XVDDa1a8fbLLE6XmFnU4OdcTbl d9OpTvmuHBh/DBqVKoMeT6qqQq/BSOg+6m24/ieYIGElijYMPIHgqeS831hEVTNpZpDr UGSpowCV/HZdOq2/kxPkQGfXffFJg2/OQy4d/GAMb25Xi8p1VxtpXf/DTqW40lVaiQto KKIw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=Hd/V9GxaQtrQ/lhkc50/pOoMe84gqdXeE1tTAnRehOQ=; b=LmSE33j3xaxSVwY3F/X33SGcgL9lbSsmrgcPoJ+Po4Sm/1pO9Oy2f+HHgfcLNMV1Gt tHMJ5z9XVrv1J91iLINQUvTuEEQBlVj8JkDe/1KuncnceyFIVTePO0LFqcnhKAZy+Rb9 nr+/R+h/wBHCqhct4tAq/cNzbtQIrGLq30mInMKRhByjSoFf3Xw3MSospZRYMRBY/SiW 94M8RmYUC6Plto5YYMv/HdetaPiFjF/iD+vnF8QMMKMR7dv8KDdcsGMkYHNLxOAFbTZX MLYLmiS1S25xfu2FRkchrkDd9C0safXIdLgkvPRJf/IxxzLlEcBTrtT1y8HTNd3lQWtW jq2g== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ba7-v6si2140222plb.347.2018.04.10.02.14.59; Tue, 10 Apr 2018 02:15:36 -0700 (PDT) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753036AbeDJJGI (ORCPT + 99 others); Tue, 10 Apr 2018 05:06:08 -0400 Received: from esa6.microchip.iphmx.com ([216.71.154.253]:47501 "EHLO esa6.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752986AbeDJJGD (ORCPT ); Tue, 10 Apr 2018 05:06:03 -0400 X-IronPort-AV: E=Sophos;i="5.48,431,1517900400"; d="scan'208";a="10408591" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa6.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 10 Apr 2018 02:06:02 -0700 Received: from eh-station.mchp-main.com (10.10.76.4) by chn-sv-exch02.mchp-main.com (10.10.76.38) with Microsoft SMTP Server id 14.3.352.0; Tue, 10 Apr 2018 02:06:01 -0700 From: Eugen Hristev To: , , , , , , , , , , CC: Eugen Hristev Subject: [PATCH v3 01/11] iio: adc: at91-sama5d2_adc: fix channel configuration for differential channels Date: Tue, 10 Apr 2018 11:57:47 +0300 Message-ID: <1523350677-27106-2-git-send-email-eugen.hristev@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1523350677-27106-1-git-send-email-eugen.hristev@microchip.com> References: <1523350677-27106-1-git-send-email-eugen.hristev@microchip.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When iterating through the channels, the index in the array is not the scan index. Added an xlate function to translate to the proper index. The result of the bug is that the channel array is indexed with a wrong index, thus instead of the proper channel, we access invalid memory, which may lead to invalid results and/or corruption. This will be used also for devicetree channel xlate. Fixes: 5e1a1da0f ("iio: adc: at91-sama5d2_adc: add hw trigger and buffer support") Fixes: 073c66201 ("iio: adc: at91-sama5d2_adc: add support for DMA") Signed-off-by: Eugen Hristev --- drivers/iio/adc/at91-sama5d2_adc.c | 41 ++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c index 4eff835..8729d65 100644 --- a/drivers/iio/adc/at91-sama5d2_adc.c +++ b/drivers/iio/adc/at91-sama5d2_adc.c @@ -333,6 +333,27 @@ static const struct iio_chan_spec at91_adc_channels[] = { + AT91_SAMA5D2_DIFF_CHAN_CNT + 1), }; +static int at91_adc_chan_xlate(struct iio_dev *indio_dev, int chan) +{ + int i; + + for (i = 0; i < indio_dev->num_channels; i++) { + if (indio_dev->channels[i].scan_index == chan) + return i; + } + return -EINVAL; +} + +static inline struct iio_chan_spec const * +at91_adc_chan_get(struct iio_dev *indio_dev, int chan) +{ + int index = at91_adc_chan_xlate(indio_dev, chan); + + if (index < 0) + return NULL; + return indio_dev->channels + index; +} + static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) { struct iio_dev *indio = iio_trigger_get_drvdata(trig); @@ -350,8 +371,10 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) at91_adc_writel(st, AT91_SAMA5D2_TRGR, status); for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) { - struct iio_chan_spec const *chan = indio->channels + bit; + struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit); + if (!chan) + continue; if (state) { at91_adc_writel(st, AT91_SAMA5D2_CHER, BIT(chan->channel)); @@ -448,7 +471,11 @@ static int at91_adc_dma_start(struct iio_dev *indio_dev) for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->num_channels) { - struct iio_chan_spec const *chan = indio_dev->channels + bit; + struct iio_chan_spec const *chan = + at91_adc_chan_get(indio_dev, bit); + + if (!chan) + continue; st->dma_st.rx_buf_sz += chan->scan_type.storagebits / 8; } @@ -526,8 +553,11 @@ static int at91_adc_buffer_predisable(struct iio_dev *indio_dev) */ for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->num_channels) { - struct iio_chan_spec const *chan = indio_dev->channels + bit; + struct iio_chan_spec const *chan = + at91_adc_chan_get(indio_dev, bit); + if (!chan) + continue; if (st->dma_st.dma_chan) at91_adc_readl(st, chan->address); } @@ -587,8 +617,11 @@ static void at91_adc_trigger_handler_nodma(struct iio_dev *indio_dev, for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->num_channels) { - struct iio_chan_spec const *chan = indio_dev->channels + bit; + struct iio_chan_spec const *chan = + at91_adc_chan_get(indio_dev, bit); + if (!chan) + continue; st->buffer[i] = at91_adc_readl(st, chan->address); i++; } -- 2.7.4