Received: by 10.223.176.5 with SMTP id f5csp2364003wra; Sun, 28 Jan 2018 18:56:48 -0800 (PST) X-Google-Smtp-Source: AH8x227TySGBqaR4ciHkLGY5QApPYOVVjT9sKoj3BF45DQL9TpwzrubUSr1VXlRZqK9C99kO/2fT X-Received: by 2002:a17:902:7e0e:: with SMTP id b14-v6mr4470292plm.97.1517194608653; Sun, 28 Jan 2018 18:56:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517194608; cv=none; d=google.com; s=arc-20160816; b=CmeN22hg/t9c+RRNxrKlvNGG6pbcnHFdqS9wTNcZOirhJ9TP8ToHGXHWXQSTPUR3zb tXanGMl/oo/hT7yJ7N4cT6w7eXJwqeaWZQ1sSw0QMnFxgkvkSVR/aP3kB0vBQIUiFCrd laN0MeF1U/SA5XCHzsTCrXGR4JPjnSdG2MskI1eB0PTWtwb45pN3C6CRUfuI8i3Mrcaq Lxkr/YKTXfx222PKdQYRJAuT2JsMID5D6Aw6Dqq7kmiiRcgYQY1m9d8pAKsElHiXxUaT 7l1UdjsmosA47WCvGurbmMJtuFUor5EkJcIKpSJgqnO/Xya9QvQMuztGkpodv5i7xwP6 L18g== 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=LwWDcYigKExDHsT9/5OXVJV+oDSb7peCeYXfEaPxtO0=; b=zxsX5rrvWq16iy0S/J3shZgeBXJk1Ho7DqSilH3ZQYOfTyxUksWb3qWJwIO97cRBzi /6R3A1FI45cVALTbGtquKnKyC4IzbmZMMqNeg/vTlr2Gf9Uh4zaBlQz+6RWyo7gf+Mh7 rvoFmu68sKvuavb5v1bUeT8zAfPF9FJe8EfUQFHIwhxOqzGjmzYAHMij48WwAk22US37 w/VTFEhFIsDAQVjFosNp2xUt9B6klxACvrpzaPA2pJk0XZJ3f1YhakoU+8dW95m4T3SW qn3EWHUaR1lVxD7+L6zy5ddHD1lc5XClpXIakR/FPwdEuLU+oUZjpvRZlHPHiSFLx34m m9vQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=lWRuo/fr; 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 a185si6573707pgc.69.2018.01.28.18.56.34; Sun, 28 Jan 2018 18:56:48 -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=lWRuo/fr; 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 S1753325AbeA1X3l (ORCPT + 99 others); Sun, 28 Jan 2018 18:29:41 -0500 Received: from mail-wr0-f193.google.com ([209.85.128.193]:36078 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752470AbeA1X3f (ORCPT ); Sun, 28 Jan 2018 18:29:35 -0500 Received: by mail-wr0-f193.google.com with SMTP id d9so5295229wre.3; Sun, 28 Jan 2018 15:29:34 -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=LwWDcYigKExDHsT9/5OXVJV+oDSb7peCeYXfEaPxtO0=; b=lWRuo/frRkdqdXI37nRNFOh3aR0+V1chymdb/x8q/vt5T4VltBuj+3nPNzcs3AX+ZL Pvnkp2RXIo/IJ6plI05BGT7aOh0OUwphHClDOUsbGvh4RQQN/HEripUOfWNV5ti+J/RC ZHktv1980SxKscbFtfGZdYwaKiutoijsBda3KerUWEnEvKUHAgjkrFA7QPtAi8mtJXPt nN+vn2hlPawz11iDR+X/ZP9zX2HvE9DiZ1YI+V7GUCv5NHKmoiBwYFTjVxyAJFOHLZq8 ic2cs4G11zoJBUxn6nVb/HdsVcWW/vpSiIhNJr9XnyWYBC64+szAh0c27fR60aq7Z/+I SwAw== 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=LwWDcYigKExDHsT9/5OXVJV+oDSb7peCeYXfEaPxtO0=; b=UhvhI8mdrcudQVqeqEoyB65zzJf62gFbldXz8E25PTDJ8TgoAzd5s3O2seEFFIK7c5 9vLg+cBQVyOXTa4q/rWwJsCaN+iRijQwbxJy+XKB8dihi0XN2jkS5u/Q3NvNdj4OqgSH r/9plS0P4Ld/+ZzEDvSjGaAnUR7jpWofzWSuRRzV1LRCIddR5wQnaHtx7ppKzqU15QtB QZ8Awi8ihIK+5KKVzESVN+v4k+g8gNZbSbzVo5OF/2XeCzxFtUSHCr/R00hys5pYZvZg 05NGovTkfepb3DKEUjbua/SPklFGBe7AyyPQHikJUddDOdtNyLohRYVatQQMvLoUom3N 6fNQ== X-Gm-Message-State: AKwxytdA9y92GeouKqJ60jEJUO9jV/9mTJafZVb3hdkdL4utYSSc82nS ChfcAq7saarWBlr7oHHyWZQ= X-Received: by 10.223.133.183 with SMTP id 52mr16738264wrt.78.1517182173485; Sun, 28 Jan 2018 15:29:33 -0800 (PST) Received: from debian-laptop.fritz.box (p578F04D2.dip0.t-ipconnect.de. [87.143.4.210]) by smtp.gmail.com with ESMTPSA id m86sm11839223wmi.40.2018.01.28.15.29.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 28 Jan 2018 15:29:33 -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 v2 06/16] iio: adc: sun4i-gpadc-iio: rework: support multiple sensors Date: Mon, 29 Jan 2018 00:29:09 +0100 Message-Id: <20180128232919.12639-7-embed3d@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180128232919.12639-1-embed3d@gmail.com> References: <20180128232919.12639-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. In function sun4i_gpadc_read_raw(), the sensor number of the ths sensor was directly set to 0 (sun4i_gpadc_temp_read(x,x,0)). This selects in the temp_read function automatically sensor 0. A check for the sensor_id is here not required since the old sensors only have one thermal sensor. In addition to that is the sun4i_gpadc_read_raw() function only used by the "older" sensors (before A33) where the thermal sensor was a cobination of an adc and a thermal sensor. Signed-off-by: Philipp Rossak --- drivers/iio/adc/sun4i-gpadc-iio.c | 36 +++++++++++++++++++++++------------- include/linux/mfd/sun4i-gpadc.h | 3 +++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/iio/adc/sun4i-gpadc-iio.c b/drivers/iio/adc/sun4i-gpadc-iio.c index 51ec0104d678..ac9ad2f8232f 100644 --- a/drivers/iio/adc/sun4i-gpadc-iio.c +++ b/drivers/iio/adc/sun4i-gpadc-iio.c @@ -67,12 +67,13 @@ 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); bool has_bus_clk; bool has_bus_rst; bool has_mod_clk; + int sensor_count; }; static const struct gpadc_data sun4i_gpadc_data = { @@ -82,9 +83,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 = { @@ -94,9 +96,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 = { @@ -106,18 +109,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 { @@ -135,6 +140,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; @@ -302,14 +308,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); @@ -356,7 +363,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; @@ -470,7 +477,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); @@ -712,7 +719,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) @@ -745,9 +752,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 78d31984a222..20fa02040007 100644 --- a/include/linux/mfd/sun4i-gpadc.h +++ b/include/linux/mfd/sun4i-gpadc.h @@ -90,6 +90,9 @@ /* 10s delay before suspending the IP */ #define SUN4I_GPADC_AUTOSUSPEND_DELAY 10000 +/* SUNXI_THS COMMON REGISTERS + DEFINES */ +#define MAX_SENSOR_COUNT 4 + struct sun4i_gpadc_dev { struct device *dev; struct regmap *regmap; -- 2.11.0