Received: by 10.223.176.46 with SMTP id f43csp819343wra; Fri, 26 Jan 2018 07:24:50 -0800 (PST) X-Google-Smtp-Source: AH8x226kFAhh+kMowVgAI4bCY3rO5ALxsy9PZX9Z884Dis97KYmE+eCX8Vopa+rfK/oH4bP29iN2 X-Received: by 10.101.93.17 with SMTP id e17mr16266899pgr.352.1516980289983; Fri, 26 Jan 2018 07:24:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516980289; cv=none; d=google.com; s=arc-20160816; b=WaskV23z5ptX0eHtCcvklwZ9ApB3HB9AlYFVJ5IAOYKVFYxWzk+s6YUL2JZFNbS9iJ 4exvThG4laG884zliYDJ6MPH/WldIwHrr4uwg9pLdTOjKJV+GUc3UUCnoY711S3/xYp7 pEYuTiIANtkhdm31KWYS8+/0FTBy2snE+QejFQKsqnhenVuRXhO4Ti7zLrx3pQ7VcBNL POVAsc4S7F40t0aQYHrs/r+xtBpgtMjz4M+RekRxt5Ebqxm/gsL4g71zU75Hj1fRtO1N z3u9XHXnCWglxBXTXb+aYMvZ6VlTc6Avvjmhvs/mo0rig813N6b8LGh6vyZtJy7Me+IB 6jFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=XaHcjZmwmNR4rYWQhne8CFaoTW+b9N5K7JQr7I/uy3k=; b=uMWescah5iHJUQoEPVsc4pqZf9aAjd9xk4v8AX7tlWVOB12nYJhdcG9yawcf/L6tkz psw67pjbkuZ4CnMONMV9npeyUwJWmHs2MrzxK7dJ86x7bLziY2ny5JWmghYbsccB5Bho IZy8ZX7+ea0LzYIfmgFPICTt6c07GUBfni54txxQJXdO7w3L2IBcldtT9YPgkzYO/nWp EVghibW2AblEWI9Y8X4579oYX1WOVt3KbScsfGN1f+Av6ExqFEHNu+gZDOEk8+TyWJs0 aFdY7iSNqDWGrcC9J7uMPn1DPyr8o2cTH+4YITJWsR+zcDSlJ6zFKt1hLWpnRZigmv39 6uDQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=jY0hkTNw; 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 u10-v6si3808292plu.365.2018.01.26.07.24.35; Fri, 26 Jan 2018 07:24:49 -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=jY0hkTNw; 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 S1753668AbeAZPXj (ORCPT + 99 others); Fri, 26 Jan 2018 10:23:39 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:45461 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752000AbeAZPT5 (ORCPT ); Fri, 26 Jan 2018 10:19:57 -0500 Received: by mail-wr0-f196.google.com with SMTP id 16so815240wry.12; Fri, 26 Jan 2018 07:19:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=XaHcjZmwmNR4rYWQhne8CFaoTW+b9N5K7JQr7I/uy3k=; b=jY0hkTNwUGVJge2cJTfPYCwtbxXafIHSheXHeJtduPOavYjfXCJqq1p5XPpOUI7PK5 z6IG2Oq+YnMMA/0bEsJmKR0mBVqKefHqj7zeCbhhWdo+VM64J9Fg4jvW8xR7Qk7fQzZU MKEuPDHUpZFupkHcbIwUhrnmyna+MMTpu4H3IF01Bp7P9qaijJnXNnyxNM3y9/LcYHVu OmuDUMXIll+KbQ4En27B++ueGxDK82mMDxsfXSWAhtKKQo5aas1vXbsLqchyQq76QeAM 8vazhrT2RYm3eKajaEufWRF/apbytiAiWz8uFwUOBLMAjY6D4eMacqjt7z/rboA4l76q t0Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=XaHcjZmwmNR4rYWQhne8CFaoTW+b9N5K7JQr7I/uy3k=; b=DJmJka77pOh7mIdH0WyKcIA3EZgA93IIUo05R/IqNPFx7hcRqM+t8ncl4V6SHFRZ5y TDAtFd1ThTpNk0B/U/fFs0/Mb/PXEKQleevFD+pLap2djndIrDvlEjugTegm+RJZKblv e7SXDnhmSceGvxQ5jW1ETNMBVbbSErlgL1VYsv2Jsqig55xIHCAtVa2G9NYZP2R5Kq/7 y1GEIzIcgRsaoFfDZ/m28ij6agxsGV/6ry4FnH8/SCiLGx22w6G89BWZnRFLqn5hI9u0 HfHVSfnr4FTXocV7+9wgge2iVVrpDmIoCv2Tm0TnI8pg17fbWrYxYGkT5BK9W4Psn7Jg wdWg== X-Gm-Message-State: AKwxytd59a0cDpkXDr11KdvOnQDRd73KiLGV/8CYYBXO5XLSVyFLYqxD G7VxNjQmuT4YP91i9J6aIRM= X-Received: by 10.223.187.201 with SMTP id z9mr12073590wrg.108.1516979996118; Fri, 26 Jan 2018 07:19:56 -0800 (PST) Received: from debian-laptop.fritz.box (p578F04D2.dip0.t-ipconnect.de. [87.143.4.210]) by smtp.gmail.com with ESMTPSA id e15sm4586130wmd.26.2018.01.26.07.19.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 26 Jan 2018 07:19:55 -0800 (PST) From: Philipp Rossak To: lee.jones@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, maxime.ripard@free-electrons.com, wens@csie.org, linux@armlinux.org.uk, jic23@kernel.org, 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 Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-sunxi@googlegroups.com Subject: [PATCH 06/16] iio: adc: sun4i-gpadc-iio: rework: support multible sensors Date: Fri, 26 Jan 2018 16:19:31 +0100 Message-Id: <20180126151941.12183-7-embed3d@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180126151941.12183-1-embed3d@gmail.com> References: <20180126151941.12183-1-embed3d@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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); 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; -- 2.11.0