Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp3745146imm; Sat, 25 Aug 2018 01:42:07 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYnvUuJplQMbx0j23J+jcgVFWZXWZkix2c0Jo2yPLINQ3rJI9HAs4qk9pitzG/SE3cgVI8C X-Received: by 2002:a17:902:758a:: with SMTP id j10-v6mr5000106pll.281.1535186527687; Sat, 25 Aug 2018 01:42:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535186527; cv=none; d=google.com; s=arc-20160816; b=sjyMrChdTSC5g3n/8UIrw3LlbWh3utu4FbAgmRkLcPcPWVhNjATnlWOYIy9+xNWLhN u4EfgnnCJKnExlxnFAjAKIqg5ZMcQ7p/scyDoCWgJIYy4tkwu3eFw9108m65t3lMCsSF NF0x5E3WM7qyIbL8F0ddN01jY0tC3or/47UUfMua8qjRjsbiAoNfsXXOC3iif/W47xB4 Kd84lMF0JJTjFkxDvcZRk8j4mtLHcEY9kFj6iLtHQ69MXx5Q74/iQLif2rpdnJbdNBXM EOKVK4gf9oQ8Y5OYKqSxdcow/vj1XIfadanmUdEnJorYhEL6j+fgnkxJab0QB0cg9Hcy +WVA== 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:arc-authentication-results; bh=ibAZVHNlk8GtEw7stfUgFOwuEfP/ABZu+eQQ2Ww3jFg=; b=kQch68oEtGNuNLvouD2Y31MK8IVHIv8+rfrKkzREGX1wDhuEejASiFU7ByEqnAA6Uz RaVgnTk5SfOu90o5dzoVxZ3bAvPM8MMPHNiDZSGljmtMT0kokNaiIx6YwnbDRqreENi4 a1Q+isq52ogYBVLLkklyfeW/zwYq0kqnqlTYie4yrYUfb6TmS238h066ORoTYaRgZdeN 1QdbaffYJuYZRqEM5ebuOAwtdj35jgjhGTjWfF7eTTIMFdn8UYKiqbgcHqNUEydi8tke aZZoy7Fv61jk6NazNNXlNGh5XeuKBgdOFNrMS1aeIqlMhTVD0qaqhSWBeai7TOoZIP48 rcSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=H4rj39y6; 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 l10-v6si7772301plt.136.2018.08.25.01.41.28; Sat, 25 Aug 2018 01:42:07 -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; dkim=pass header.i=@kernel.org header.s=default header.b=H4rj39y6; 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 S1727059AbeHYMRB (ORCPT + 99 others); Sat, 25 Aug 2018 08:17:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:34510 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726348AbeHYMRB (ORCPT ); Sat, 25 Aug 2018 08:17:01 -0400 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 3C9BE21477; Sat, 25 Aug 2018 08:38:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1535186326; bh=uj7mONdHP9WS0OoUdVtnVphXns2VHkZI/1zTHdxwmyI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=H4rj39y6BbAnsL+uIGd8AYW7+YTyR8N8mERF+07Xg1xuwOS+LfUIU5niCftp6a3lo DUpKHQ0IYY89Y4KRe8sYOAqdXPWVE+YGXWucVY8IHq7rYNDlPttuZxkO4N9yn0ilLj JUXspW1BqUru/oETtRpvniaQOjRXa498o+0VVFlo= Date: Sat, 25 Aug 2018 09:38:41 +0100 From: Jonathan Cameron To: Baolin Wang Cc: robh+dt@kernel.org, mark.rutland@arm.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, freeman.liu@spreadtrum.com, broonie@kernel.org, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/2] iio: adc: sc27xx: Add raw data support Message-ID: <20180825093841.72a5d099@archlinux> In-Reply-To: <4a7e33457617e6f0f7c9627fe20ddd3039e4fe82.1535103920.git.baolin.wang@linaro.org> References: <4a7e33457617e6f0f7c9627fe20ddd3039e4fe82.1535103920.git.baolin.wang@linaro.org> X-Mailer: Claws Mail 3.16.0 (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 Fri, 24 Aug 2018 17:53:15 +0800 Baolin Wang wrote: > The headset device will use channel 20 of ADC controller to detect events, > but it needs the raw ADC data to do conversion according to its own formula. > > Thus we should configure the channel mask separately and configure channel > 20 as IIO_CHAN_INFO_RAW, as well as adding raw data read support. So is this a general thing, i.e. that channel is 'meant' to be used for the headset, or just a one off for a particular board? If it is a general thing, than I'm fine with this (unlikely we'll break any other users), but if not we need to find a nicer way to do it. I am a little unclear on how a channel would provide the voltage on it's pin but that could be wrong when used for a different purpose? If it's just a matter of unusual loading characteristics then perhaps that is valid, but I'd like to understand this a little. > > Signed-off-by: Baolin Wang > --- > drivers/iio/adc/sc27xx_adc.c | 80 ++++++++++++++++++++++++------------------ > 1 file changed, 45 insertions(+), 35 deletions(-) > > diff --git a/drivers/iio/adc/sc27xx_adc.c b/drivers/iio/adc/sc27xx_adc.c > index 2b60efe..153c311 100644 > --- a/drivers/iio/adc/sc27xx_adc.c > +++ b/drivers/iio/adc/sc27xx_adc.c > @@ -273,6 +273,17 @@ static int sc27xx_adc_read_raw(struct iio_dev *indio_dev, > int ret, tmp; > > switch (mask) { > + case IIO_CHAN_INFO_RAW: > + mutex_lock(&indio_dev->mlock); > + ret = sc27xx_adc_read(data, chan->channel, scale, &tmp); > + mutex_unlock(&indio_dev->mlock); > + > + if (ret) > + return ret; > + > + *val = tmp; > + return IIO_VAL_INT; > + > case IIO_CHAN_INFO_PROCESSED: > mutex_lock(&indio_dev->mlock); > ret = sc27xx_adc_read_processed(data, chan->channel, scale, > @@ -315,48 +326,47 @@ static int sc27xx_adc_write_raw(struct iio_dev *indio_dev, > .write_raw = &sc27xx_adc_write_raw, > }; > > -#define SC27XX_ADC_CHANNEL(index) { \ > +#define SC27XX_ADC_CHANNEL(index, mask) { \ > .type = IIO_VOLTAGE, \ > .channel = index, \ > - .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | \ > - BIT(IIO_CHAN_INFO_SCALE), \ > + .info_mask_separate = mask | BIT(IIO_CHAN_INFO_SCALE), \ > .datasheet_name = "CH##index", \ > .indexed = 1, \ > } > > static const struct iio_chan_spec sc27xx_channels[] = { > - SC27XX_ADC_CHANNEL(0), > - SC27XX_ADC_CHANNEL(1), > - SC27XX_ADC_CHANNEL(2), > - SC27XX_ADC_CHANNEL(3), > - SC27XX_ADC_CHANNEL(4), > - SC27XX_ADC_CHANNEL(5), > - SC27XX_ADC_CHANNEL(6), > - SC27XX_ADC_CHANNEL(7), > - SC27XX_ADC_CHANNEL(8), > - SC27XX_ADC_CHANNEL(9), > - SC27XX_ADC_CHANNEL(10), > - SC27XX_ADC_CHANNEL(11), > - SC27XX_ADC_CHANNEL(12), > - SC27XX_ADC_CHANNEL(13), > - SC27XX_ADC_CHANNEL(14), > - SC27XX_ADC_CHANNEL(15), > - SC27XX_ADC_CHANNEL(16), > - SC27XX_ADC_CHANNEL(17), > - SC27XX_ADC_CHANNEL(18), > - SC27XX_ADC_CHANNEL(19), > - SC27XX_ADC_CHANNEL(20), > - SC27XX_ADC_CHANNEL(21), > - SC27XX_ADC_CHANNEL(22), > - SC27XX_ADC_CHANNEL(23), > - SC27XX_ADC_CHANNEL(24), > - SC27XX_ADC_CHANNEL(25), > - SC27XX_ADC_CHANNEL(26), > - SC27XX_ADC_CHANNEL(27), > - SC27XX_ADC_CHANNEL(28), > - SC27XX_ADC_CHANNEL(29), > - SC27XX_ADC_CHANNEL(30), > - SC27XX_ADC_CHANNEL(31), > + SC27XX_ADC_CHANNEL(0, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(1, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(2, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(3, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(4, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(5, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(6, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(7, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(8, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(9, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(10, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(11, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(12, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(13, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(14, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(15, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(16, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(17, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(18, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(19, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(20, BIT(IIO_CHAN_INFO_RAW)), > + SC27XX_ADC_CHANNEL(21, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(22, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(23, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(24, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(25, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(26, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(27, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(28, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(29, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(30, BIT(IIO_CHAN_INFO_PROCESSED)), > + SC27XX_ADC_CHANNEL(31, BIT(IIO_CHAN_INFO_PROCESSED)), > }; > > static int sc27xx_adc_enable(struct sc27xx_adc_data *data)