Received: by 10.223.176.5 with SMTP id f5csp1678154wra; Sun, 28 Jan 2018 06:11:22 -0800 (PST) X-Google-Smtp-Source: AH8x224k00v6v8SKAbkNTjGECeLoFbVi7UFQqekVCxEgf82AQdGF9wbmKtMID5aSMoRPWg0b/PeN X-Received: by 2002:a17:902:9a43:: with SMTP id x3-v6mr19495928plv.45.1517148682091; Sun, 28 Jan 2018 06:11:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517148682; cv=none; d=google.com; s=arc-20160816; b=01QyPPK54FAP9qJs2tFUPM2WVlNs+ARNtl5yqE1XjWRz54Tff80w4DgGeuXqnL5mNM Y03q7RO+9St4Djr2n1k2dwQFMs24IIwW42MQD//3xgENaYW+llOHRwjc7YC9dDiOkxQL wIqxQX4mkhUfVrn5rDMA6E3Q2X9z1ce4sY1DjIC3acLdBG2OHYA9W+/BVITI6WJvTMMW eXOS6KNunvkF0bCgXpooyhX3kP5Jp19v489XkTgtPlYPt6DOHXYxtIoO4p/Zhh//eMu+ 9jhUee2LEaAvMiy2MWdo9EjTUQjY4OQwSXLDiLZCllhSBON8Aqm9BKLKKvEcDV9INvh8 hFcA== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=zpuOrKRO74vOJ0bEUzSzMI25ZmhHA139iiHcCN/mME8=; b=NHYMnBxENAFDVkDKgLvSJ1/Velp77mR2tan+/Z9xVtx+qtwmGOpQGz6nl8LkLYrDkO PNGmpaU29o2BAGdsVHioa2xx7vQDTTR/rpjEq+KooTY0meMpoAfXPvMqLdRZUhQNord6 pYMOZFdVtupIlpR7kHhzHxMeuR0BWSW7PgN305nDeJqmeJ0GydOLMo/EZ7faFLl3Ntty c+3vupDba0I5EOoo4S5PYbyan+giBPi05IaYgP3ZYzdPo8RyarSPE6Ms3VGFqw6Dp6VI CDrM27X4OQ1rXouDD9uh8mLBgVPhju+ZGbYA0KnUGCoAnuF7UR8K8upb37qh+cU4A61+ jhfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QNUvXdmD; 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=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i7si4370215pgr.255.2018.01.28.06.11.07; Sun, 28 Jan 2018 06:11:22 -0800 (PST) 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=@gmail.com header.s=20161025 header.b=QNUvXdmD; 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=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751842AbeA1OKm (ORCPT + 99 others); Sun, 28 Jan 2018 09:10:42 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:36710 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751676AbeA1OKk (ORCPT ); Sun, 28 Jan 2018 09:10:40 -0500 Received: by mail-wr0-f195.google.com with SMTP id d9so4425834wre.3; Sun, 28 Jan 2018 06:10:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=zpuOrKRO74vOJ0bEUzSzMI25ZmhHA139iiHcCN/mME8=; b=QNUvXdmDNWCKZRfkF68RQaSO21VNuWfCkykTULf5Tnjv2C8V/bMmW4cuMaUgpXNAcl VgA4lfhRR7VOPtfBL06JGoBZSmgoxr+E6ejmwAmmHD5N9w+n59cwHkND+r4bG/Ybny8D mqSnK2/tuBGJuO2Am1ZH1Z3kThMh3ZgCbA3tl/FvuZnGKmuBI+rhDo0SI8tziCfm3xWW CCU81beOkgt9X9Kie4dwml9oGzGlUropWbcOMPYT7V5TGq/boksitq2rw4UT6mr5/jlQ 1r1FFMf8sm3A5qKutBVrGo45kJhsLlIivCgCMujAjWC5PQFGK3v1UTsJMEursv1AxTBV e/pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=zpuOrKRO74vOJ0bEUzSzMI25ZmhHA139iiHcCN/mME8=; b=Wocieo/wlIZ66obnNeOJ2UMx4WLMToCqBW+oSYPK0c+sdVYFHm8Kr5U72pAsm4BrWI 5AB4e5xB/9szssLEJ6WFBFTI8kVVB8pIzgjwVLseBXkw5AVvTJG7N+0ZDJHie9UfKLxu CDZbTbdge0sCexfT/3Zb9JtX5gTujvurMntpK/GDXwbTaVsg+CaFtEVOkv76EwweF7rf yd/OjIGtN71C/I0g/MP/z/wQ/Qa4qhLbM+2QX9jKDYCAlMFiskxm+YQSGfyb4i53GwHX WfP+0gTY1RRQvVzxtAPdLzds+O4p28xaMs3sOSvco8G99a5Ixb1JK4As5/D449KOJZDu 3VRA== X-Gm-Message-State: AKwxytdbUXRaJmyrntF45UXT0TtLOVQvKwXzVtbaLYJYLqSQKrY6lHg1 9CWVHKqips9v9UENJ4skBak= X-Received: by 10.223.166.248 with SMTP id t111mr18045176wrc.248.1517148638816; Sun, 28 Jan 2018 06:10:38 -0800 (PST) Received: from [192.168.2.62] (p578F04D2.dip0.t-ipconnect.de. [87.143.4.210]) by smtp.gmail.com with ESMTPSA id r5sm9831742wmg.30.2018.01.28.06.10.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 28 Jan 2018 06:10:38 -0800 (PST) Subject: Re: [PATCH 06/16] iio: adc: sun4i-gpadc-iio: rework: support multible sensors To: Jonathan Cameron Cc: lee.jones@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, maxime.ripard@free-electrons.com, wens@csie.org, linux@armlinux.org.uk, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, davem@davemloft.net, hans.verkuil@cisco.com, mchehab@kernel.org, rask@formelder.dk, clabbe.montjoie@gmail.com, sean@mess.org, krzk@kernel.org, quentin.schulz@free-electrons.com, icenowy@aosc.io, edu.molinas@gmail.com, singhalsimran0@gmail.com, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-sunxi@googlegroups.com References: <20180126151941.12183-1-embed3d@gmail.com> <20180126151941.12183-7-embed3d@gmail.com> <20180128090839.42295eea@archlinux> From: Philipp Rossak Message-ID: Date: Sun, 28 Jan 2018 15:10:36 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20180128090839.42295eea@archlinux> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 28.01.2018 10:08, Jonathan Cameron wrote: > On Fri, 26 Jan 2018 16:19:31 +0100 > Philipp Rossak wrote: > > multible -> multiple > ^^ Ok, I will fix that. >> For adding newer sensor some basic rework of the code is necessary. >> >> This patch reworks the driver to be able to handle more than one >> thermal sensor. Newer SoC like the A80 have 4 thermal sensors. >> Because of this the maximal sensor count value was set to 4. >> >> The sensor_id value is set during sensor registration and is for each >> registered sensor indiviual. This makes it able to differntiate the >> sensors when the value is read from the register. >> >> Signed-off-by: Philipp Rossak > Question inline about why you aren't exposing the additional temperature > sensors as IIO channels? > > Fine to not do so I suppose, but needs justifying. > ^^ Ok, I will rework the commit mesage. Detailed explanation see below. > Jonathan > >> --- >> drivers/iio/adc/sun4i-gpadc-iio.c | 36 +++++++++++++++++++++++------------- >> include/linux/mfd/sun4i-gpadc.h | 6 ++++++ >> 2 files changed, 29 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/iio/adc/sun4i-gpadc-iio.c b/drivers/iio/adc/sun4i-gpadc-iio.c >> index 1a80744bd472..bff06f2798e8 100644 >> --- a/drivers/iio/adc/sun4i-gpadc-iio.c >> +++ b/drivers/iio/adc/sun4i-gpadc-iio.c >> @@ -70,7 +70,7 @@ struct gpadc_data { >> unsigned int tp_adc_select; >> unsigned int (*adc_chan_select)(unsigned int chan); >> unsigned int adc_chan_mask; >> - unsigned int temp_data; >> + unsigned int temp_data[MAX_SENSOR_COUNT]; >> int (*sample_start)(struct sun4i_gpadc_iio *info); >> int (*sample_end)(struct sun4i_gpadc_iio *info); >> u32 ctrl0_map; >> @@ -80,6 +80,7 @@ struct gpadc_data { >> bool has_bus_clk; >> bool has_bus_rst; >> bool has_mod_clk; >> + int sensor_count; >> }; >> >> static const struct gpadc_data sun4i_gpadc_data = { >> @@ -89,9 +90,10 @@ static const struct gpadc_data sun4i_gpadc_data = { >> .tp_adc_select = SUN4I_GPADC_CTRL1_TP_ADC_SELECT, >> .adc_chan_select = &sun4i_gpadc_chan_select, >> .adc_chan_mask = SUN4I_GPADC_CTRL1_ADC_CHAN_MASK, >> - .temp_data = SUN4I_GPADC_TEMP_DATA, >> + .temp_data = {SUN4I_GPADC_TEMP_DATA, 0, 0, 0}, >> .sample_start = sun4i_gpadc_sample_start, >> .sample_end = sun4i_gpadc_sample_end, >> + .sensor_count = 1, >> }; >> >> static const struct gpadc_data sun5i_gpadc_data = { >> @@ -101,9 +103,10 @@ static const struct gpadc_data sun5i_gpadc_data = { >> .tp_adc_select = SUN4I_GPADC_CTRL1_TP_ADC_SELECT, >> .adc_chan_select = &sun4i_gpadc_chan_select, >> .adc_chan_mask = SUN4I_GPADC_CTRL1_ADC_CHAN_MASK, >> - .temp_data = SUN4I_GPADC_TEMP_DATA, >> + .temp_data = {SUN4I_GPADC_TEMP_DATA, 0, 0, 0}, >> .sample_start = sun4i_gpadc_sample_start, >> .sample_end = sun4i_gpadc_sample_end, >> + .sensor_count = 1, >> }; >> >> static const struct gpadc_data sun6i_gpadc_data = { >> @@ -113,18 +116,20 @@ static const struct gpadc_data sun6i_gpadc_data = { >> .tp_adc_select = SUN6I_GPADC_CTRL1_TP_ADC_SELECT, >> .adc_chan_select = &sun6i_gpadc_chan_select, >> .adc_chan_mask = SUN6I_GPADC_CTRL1_ADC_CHAN_MASK, >> - .temp_data = SUN4I_GPADC_TEMP_DATA, >> + .temp_data = {SUN4I_GPADC_TEMP_DATA, 0, 0, 0}, >> .sample_start = sun4i_gpadc_sample_start, >> .sample_end = sun4i_gpadc_sample_end, >> + .sensor_count = 1, >> }; >> >> static const struct gpadc_data sun8i_a33_gpadc_data = { >> .temp_offset = -1662, >> .temp_scale = 162, >> .tp_mode_en = SUN8I_A33_GPADC_CTRL1_CHOP_TEMP_EN, >> - .temp_data = SUN4I_GPADC_TEMP_DATA, >> + .temp_data = {SUN4I_GPADC_TEMP_DATA, 0, 0, 0}, [*] ^^ >> .sample_start = sun4i_gpadc_sample_start, >> .sample_end = sun4i_gpadc_sample_end, >> + .sensor_count = 1, >> }; >> >> struct sun4i_gpadc_iio { >> @@ -142,6 +147,7 @@ struct sun4i_gpadc_iio { >> struct clk *bus_clk; >> struct clk *mod_clk; >> struct reset_control *reset; >> + int sensor_id; >> /* prevents concurrent reads of temperature and ADC */ >> struct mutex mutex; >> struct thermal_zone_device *tzd; >> @@ -309,14 +315,15 @@ static int sun4i_gpadc_adc_read(struct iio_dev *indio_dev, int channel, >> return sun4i_gpadc_read(indio_dev, channel, val, info->fifo_data_irq); >> } >> >> -static int sun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val) >> +static int sun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val, >> + int sensor) >> { >> struct sun4i_gpadc_iio *info = iio_priv(indio_dev); >> >> if (info->no_irq) { >> pm_runtime_get_sync(indio_dev->dev.parent); >> >> - regmap_read(info->regmap, info->data->temp_data, val); >> + regmap_read(info->regmap, info->data->temp_data[sensor], val); >> >> pm_runtime_mark_last_busy(indio_dev->dev.parent); >> pm_runtime_put_autosuspend(indio_dev->dev.parent); >> @@ -363,7 +370,7 @@ static int sun4i_gpadc_read_raw(struct iio_dev *indio_dev, >> ret = sun4i_gpadc_adc_read(indio_dev, chan->channel, >> val); >> else >> - ret = sun4i_gpadc_temp_read(indio_dev, val); >> + ret = sun4i_gpadc_temp_read(indio_dev, val, 0); > > Wouldn't it make more sense to pass the channel number in here? > > Looking at it, seems you only expose the first temperature sensor > as an IIO channel? Perhaps fair enough, but please justify that > decision in the patch description. > The "old" thermal sensors only have one ths sensor. This function is only used with the older sensors when the adc and the ths is used. The channel number is not related to that. This here is related to the temp_data. register selection above (marked with [*]). > >> >> if (ret) >> return ret; >> @@ -511,7 +518,7 @@ static int sun4i_gpadc_get_temp(void *data, int *temp) >> struct sun4i_gpadc_iio *info = data; >> int val, scale, offset; >> >> - if (sun4i_gpadc_temp_read(info->indio_dev, &val)) >> + if (sun4i_gpadc_temp_read(info->indio_dev, &val, info->sensor_id)) >> return -ETIMEDOUT; >> >> sun4i_gpadc_temp_scale(info->indio_dev, &scale); >> @@ -755,7 +762,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) >> { >> struct sun4i_gpadc_iio *info; >> struct iio_dev *indio_dev; >> - int ret; >> + int ret, i; >> >> indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); >> if (!indio_dev) >> @@ -788,9 +795,12 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) >> pm_runtime_enable(&pdev->dev); >> >> if (IS_ENABLED(CONFIG_THERMAL_OF)) { >> - info->tzd = thermal_zone_of_sensor_register(info->sensor_device, >> - 0, info, >> - &sun4i_ts_tz_ops); >> + for (i = 0; i < info->data->sensor_count; i++) { >> + info->sensor_id = i; >> + info->tzd = thermal_zone_of_sensor_register( >> + info->sensor_device, >> + i, info, &sun4i_ts_tz_ops); >> + } >> /* >> * Do not fail driver probing when failing to register in >> * thermal because no thermal DT node is found. >> diff --git a/include/linux/mfd/sun4i-gpadc.h b/include/linux/mfd/sun4i-gpadc.h >> index 39e096c3ddac..40b4dd9d2405 100644 >> --- a/include/linux/mfd/sun4i-gpadc.h >> +++ b/include/linux/mfd/sun4i-gpadc.h >> @@ -90,6 +90,10 @@ >> #define SUNXI_THS_CTRL0 0x00 >> #define SUNXI_THS_CTRL2 0x40 >> #define SUNXI_THS_FILTER 0x70 >> +#define SUNXI_THS_TDATA0 0x80 >> +#define SUNXI_THS_TDATA1 0x84 >> +#define SUNXI_THS_TDATA2 0x88 >> +#define SUNXI_THS_TDATA3 0x8c >> >> #define SUNXI_THS_FILTER_EN BIT(2) >> #define SUNXI_THS_FILTER_TYPE(x) (GENMASK(1, 0) & (x)) >> @@ -101,6 +105,8 @@ >> #define SUNXI_THS_TEMP_SENSE_EN2 BIT(2) >> #define SUNXI_THS_TEMP_SENSE_EN3 BIT(3) >> >> +#define MAX_SENSOR_COUNT 4 >> + >> struct sun4i_gpadc_dev { >> struct device *dev; >> struct regmap *regmap; > Thanks, Philipp