Received: by 10.223.176.5 with SMTP id f5csp1702677wra; Sun, 28 Jan 2018 06:40:25 -0800 (PST) X-Google-Smtp-Source: AH8x224eZmx82URktp7ZlF1jtwbE0w0LnGTYxQEVhEepX/6VKcldwMwlVP9xElFJy/JlEQlR709r X-Received: by 2002:a17:902:a607:: with SMTP id u7-v6mr3631186plq.71.1517150425718; Sun, 28 Jan 2018 06:40:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517150425; cv=none; d=google.com; s=arc-20160816; b=EgmHJys4HkbGQ2/3l11RovTVRsHFwQl1zstgEltFb8JtZlVA7rvr5ARBtx9h3NArSN zhuBLmN4KPDUZS6JN19RKnjYAym3awmlCVdSowrUn5NiQKiDv6b0Yi4GHtCb2DRURpjc DxHhNrKxhLQY3OPdzLrYI6F2xyE3pCrqNYxJQNiSSIwNKmfA80JziQldH0vsu+ag7/qd huGsK95+X3RfMAaqwytF0CBRMb6dqvrSApfdem0uMr1yP92lxrrLCBDopMYOKmQU3V2c Lsrva8Oyog5MPlqWJVMEUlUC7ZleOdsvn0B9lRWfc0he/Q5yfXG/2JBGI71l4Wrb4t1+ YV/w== 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=XKZyZBFECKhBckQGMThGq0xkpFmVvgOhpM3SURgeA/A=; b=Ip7omN+9OkJPV8XJ5r7QQirvobxWchSbmpEqwATdK8wtVC0rfIwW4fDIC4uE+AGsZ1 /+dzhAspPcfC3LXcXYuXJI2z+hcOj3HiqgntfV6SA1uV1oRmZH2gFXBOT+TLxk32MPnF G9EnuBAvjBhLm3Fc8OMRZmnAwMnZw2xcjweRT7PHgOVDhxk00li77j1k03h/8wbF76m0 4gA9m4g8v7AJhaQd9wPRDHm7BJrqHTZrWDGnq+rlZVIh2BFmoWuEMO/HjdJ7fpTpa1yq fCdLNvPmIDcvXcXe/LiCKpMFg9xAz4pT8ozLNrwz7Ul60u9WCN7vGcXb6vjihO35Aqp8 65dg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Y6yf2eZU; 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 z16si9728920pfh.370.2018.01.28.06.40.11; Sun, 28 Jan 2018 06:40:25 -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=Y6yf2eZU; 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 S1751847AbeA1OjV (ORCPT + 99 others); Sun, 28 Jan 2018 09:39:21 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36527 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751412AbeA1OjT (ORCPT ); Sun, 28 Jan 2018 09:39:19 -0500 Received: by mail-wm0-f68.google.com with SMTP id f3so29056710wmc.1; Sun, 28 Jan 2018 06:39:18 -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=XKZyZBFECKhBckQGMThGq0xkpFmVvgOhpM3SURgeA/A=; b=Y6yf2eZUl9ePf2kPdlcIL4hww+21cb+PxJBgoAhH29v/U3lvwVp60IsiI3lGOrU7TY 336ebRg8vqUuBAiFUEoDofes8ifKXjxHGPwwShUuu+j7HNgonHngfMmOWxoC7GcBkwcd pXk8NgxJj+KNHkHwIIvwUCabDbeLBxXzb3UrAfgyZrV0/805aYQ4ixnMk6m8DiIA0IF7 rmtTF+zXUVvZHGTq8tg1nEJKyNLvyAV3phJBKmamAdPMy6rRq9ju84Aov6kWv+DT3q0s U3TE2S9m4wxqfKPjRuGwnOzsBRvFgoGkXYmRRdd8981qfcC9F8icoe1n2trW9SeGgPzT aNAw== 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=XKZyZBFECKhBckQGMThGq0xkpFmVvgOhpM3SURgeA/A=; b=fkzbAlatbSxFu58gK2V72pqmFOgTobTqLZ399vMrp322lItWynlulDlXAJIIRe8u/Y pSqFRolz4ns661BJHTX4XXsKVyV3fEqhPdoyXcvf5MtiaYkWK6WyX/FGGsqmDIrFrUbw 9de9UoGz1q3b6478J+dRrThjnzLpvZh9Fd89DVqRsqJnKyMwBwWpnHLKNkfsPxpwtZhw svO2fUsVizGtudDYzrm7qpiCS9JL39JqTZ+5fmLUf9mF/yIRy6IfDhJEXgGs1k9Etai3 y5laE9kUtxgp/3jbLgI0MMc855vesvNLjzj5NpntID6ymR+q4f5WBmkzg4PxkpPHoNKy 5CZw== X-Gm-Message-State: AKwxyte98zqYcAg6T3IJtCCjL+Kdxo3m38Y86Q6wlP1vaVXkO0Yf2y+R iCgdOuD4KqgwZWj88Gvv9TA= X-Received: by 10.28.94.12 with SMTP id s12mr14382365wmb.155.1517150357334; Sun, 28 Jan 2018 06:39:17 -0800 (PST) Received: from [192.168.2.62] (p578F04D2.dip0.t-ipconnect.de. [87.143.4.210]) by smtp.gmail.com with ESMTPSA id 59sm10154875wrs.85.2018.01.28.06.39.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 28 Jan 2018 06:39:16 -0800 (PST) Subject: Re: [PATCH 07/16] iio: adc: sun4i-gpadc-iio: rework: support nvmem calibration data To: Icenowy Zheng , linux-arm-kernel@lists.infradead.org, Jonathan Cameron Cc: mark.rutland@arm.com, sean@mess.org, linux-iio@vger.kernel.org, linux-sunxi@googlegroups.com, clabbe.montjoie@gmail.com, pmeerw@pmeerw.net, lee.jones@linaro.org, lars@metafoo.de, edu.molinas@gmail.com, linux@armlinux.org.uk, krzk@kernel.org, wens@csie.org, hans.verkuil@cisco.com, rask@formelder.dk, devicetree@vger.kernel.org, mchehab@kernel.org, robh+dt@kernel.org, singhalsimran0@gmail.com, linux-kernel@vger.kernel.org, quentin.schulz@free-electrons.com, knaack.h@gmx.de, maxime.ripard@free-electrons.com, davem@davemloft.net References: <20180126151941.12183-1-embed3d@gmail.com> <20180126151941.12183-8-embed3d@gmail.com> <20180128090258.56e8ac93@archlinux> <6ebbb5e0-eb5f-afe4-50e8-eb3cee8ec7fa@gmail.com> <1927F24D-D3ED-49CF-9B7C-A7C8C873F0CF@aosc.io> From: Philipp Rossak Message-ID: Date: Sun, 28 Jan 2018 15:39:15 +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: <1927F24D-D3ED-49CF-9B7C-A7C8C873F0CF@aosc.io> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 28.01.2018 14:52, Icenowy Zheng wrote: > > > 于 2018年1月28日 GMT+08:00 下午9:46:18, Philipp Rossak 写到: >> >> >> On 28.01.2018 10:02, Jonathan Cameron wrote: >>> On Fri, 26 Jan 2018 16:19:32 +0100 >>> Philipp Rossak wrote: >>> >>>> This patch reworks the driver to support nvmem calibration cells. >>>> The driver checks if the nvmem calibration is supported and reads >> out >>>> the nvmem. At the beginning of the startup process the calibration >> data >>>> is written to the related registers. >>>> >>>> Signed-off-by: Philipp Rossak >>> >>> A few minor suggestions inline. >>> >>> Jonathan >>> >>>> --- >>>> drivers/iio/adc/sun4i-gpadc-iio.c | 52 >> +++++++++++++++++++++++++++++++++++++++ >>>> include/linux/mfd/sun4i-gpadc.h | 2 ++ >>>> 2 files changed, 54 insertions(+) >>>> >>>> diff --git a/drivers/iio/adc/sun4i-gpadc-iio.c >> b/drivers/iio/adc/sun4i-gpadc-iio.c >>>> index bff06f2798e8..7b12666cdd9e 100644 >>>> --- a/drivers/iio/adc/sun4i-gpadc-iio.c >>>> +++ b/drivers/iio/adc/sun4i-gpadc-iio.c >>>> @@ -27,6 +27,7 @@ >>>> #include >>>> #include >>>> #include >>>> +#include >>>> #include >>>> #include >>>> #include >>>> @@ -81,6 +82,7 @@ struct gpadc_data { >>>> bool has_bus_rst; >>>> bool has_mod_clk; >>>> int sensor_count; >>>> + bool supports_nvmem; >>>> }; >>>> >>>> static const struct gpadc_data sun4i_gpadc_data = { >>>> @@ -94,6 +96,7 @@ static const struct gpadc_data sun4i_gpadc_data = >> { >>>> .sample_start = sun4i_gpadc_sample_start, >>>> .sample_end = sun4i_gpadc_sample_end, >>>> .sensor_count = 1, >>>> + .supports_nvmem = false, >>>> }; >>>> >>>> static const struct gpadc_data sun5i_gpadc_data = { >>>> @@ -107,6 +110,7 @@ static const struct gpadc_data sun5i_gpadc_data >> = { >>>> .sample_start = sun4i_gpadc_sample_start, >>>> .sample_end = sun4i_gpadc_sample_end, >>>> .sensor_count = 1, >>>> + .supports_nvmem = false, >>>> }; >>>> >>>> static const struct gpadc_data sun6i_gpadc_data = { >>>> @@ -120,6 +124,7 @@ static const struct gpadc_data sun6i_gpadc_data >> = { >>>> .sample_start = sun4i_gpadc_sample_start, >>>> .sample_end = sun4i_gpadc_sample_end, >>>> .sensor_count = 1, >>>> + .supports_nvmem = false, >>>> }; >>>> >>>> static const struct gpadc_data sun8i_a33_gpadc_data = { >>>> @@ -130,6 +135,7 @@ static const struct gpadc_data >> sun8i_a33_gpadc_data = { >>>> .sample_start = sun4i_gpadc_sample_start, >>>> .sample_end = sun4i_gpadc_sample_end, >>>> .sensor_count = 1, >>>> + .supports_nvmem = false, > > BTW A33 claims to support calibration data according to the manual. > Yes that's true, but I haven't seen a sid/nvmem driver for the a33. If that is available, we can change this for true (same on a83t). >>>> }; >>>> >>>> struct sun4i_gpadc_iio { >>>> @@ -148,6 +154,8 @@ struct sun4i_gpadc_iio { >>>> struct clk *mod_clk; >>>> struct reset_control *reset; >>>> int sensor_id; >>>> + u32 calibration_data[2]; >>>> + bool has_calibration_data[2]; >>>> /* prevents concurrent reads of temperature and ADC */ >>>> struct mutex mutex; >>>> struct thermal_zone_device *tzd; >>>> @@ -459,6 +467,17 @@ static int sun4i_gpadc_runtime_suspend(struct >> device *dev) >>>> return info->data->sample_end(info); >>>> } >>>> >>>> +static void sunxi_calibrate(struct sun4i_gpadc_iio *info) >>>> +{ >>>> + if (info->has_calibration_data[0]) >>>> + regmap_write(info->regmap, SUNXI_THS_CDATA_0_1, >>>> + info->calibration_data[0]); >>>> + >>>> + if (info->has_calibration_data[1]) >>>> + regmap_write(info->regmap, SUNXI_THS_CDATA_2_3, >>>> + info->calibration_data[1]); >>>> +} >>>> + >>>> static int sun4i_gpadc_sample_start(struct sun4i_gpadc_iio *info) >>>> { >>>> /* clkin = 6MHz */ >>>> @@ -481,6 +500,7 @@ static int sun4i_gpadc_sample_start(struct >> sun4i_gpadc_iio *info) >>>> static int sunxi_ths_sample_start(struct sun4i_gpadc_iio *info) >>>> { >>>> u32 value; >>>> + sunxi_calibrate(info); >>>> >>>> if (info->data->ctrl0_map) >>>> regmap_write(info->regmap, SUNXI_THS_CTRL0, >>>> @@ -602,6 +622,9 @@ static int sun4i_gpadc_probe_dt(struct >> platform_device *pdev, >>>> struct resource *mem; >>>> void __iomem *base; >>>> int ret; >>>> + struct nvmem_cell *cell; >>>> + ssize_t cell_size; >>>> + u64 *cell_data; >>>> >>>> info->data = of_device_get_match_data(&pdev->dev); >>>> if (!info->data) >>>> @@ -616,6 +639,35 @@ static int sun4i_gpadc_probe_dt(struct >> platform_device *pdev, >>>> if (IS_ERR(base)) >>>> return PTR_ERR(base); >>>> >>>> + info->has_calibration_data[0] = false; >>>> + info->has_calibration_data[1] = false; >>>> + >>>> + if (!info->data->supports_nvmem) >>>> + goto no_nvmem; >>>> + >>>> + cell = devm_nvmem_cell_get(&pdev->dev, "calibration"); >>>> + if (IS_ERR(cell)) { >>>> + if (PTR_ERR(cell) == -EPROBE_DEFER) >>>> + return PTR_ERR(cell); >>> Use a goto here to no_nvmem. >>> >>> Then you can drop the below else to make things more readable. >>>> + } else { >>>> + cell_data = (u64 *)nvmem_cell_read(cell, &cell_size); >>>> + devm_nvmem_cell_put(&pdev->dev, cell); >>> >>> I'm really not keen on use of devm for things we are intending >>> to drop almost immediately. Just use the non managed versions >>> and clean up properly in the error paths (if there are any >>> where it is needed - which there aren't that I can see) >>> >> >> ^^ Ok, I will rework that. >> >>>> + if (cell_size <= 4) { >>> Is it valid if it is anything other than 4? >> >> For sensors with only one sensor would be also a 2 valid, for those >> with >> 2 sensors ==> 4, with 3 sensors ==> 6 and with and with 4 sensors ==> >> 8. >> >> In hardware we have in total to 32bit registers for calibration, thus I >> >> thought it would be a good idea to use always four bytes per register. >> If two bytes are used, they should be the default value. >> >> But I agree, this needs a rework. >> >>>> + info->has_calibration_data[0] = true; >>>> + info->calibration_data[0] = be32_to_cpu(cell_data[0] & >>>> + GENMASK(31, 0)); >>> >>> Masking isn't needed, If you want to be paranoid there is the >> lower_32_bits >>> function.. >>> >> ^^ Ok, I will rework that. >>>> + } else if (cell_size <= 8) { >>>> + info->has_calibration_data[0] = true; >>>> + info->calibration_data[0] = be32_to_cpu(cell_data[0] & >>>> + GENMASK(31, 0)); >>> >>> This first block is repeated. Easy enough to avoid I think... >>> >> >> ^^ Ok, I will rework that. >> >>>> + info->has_calibration_data[1] = true; >>>> + info->calibration_data[1] = be32_to_cpu( >>>> + (cell_data[0] >> 32) & GENMASK(31, 0)); >>>> + } >>>> + } >>>> + >>>> +no_nvmem: >>>> + >>>> info->regmap = devm_regmap_init_mmio(&pdev->dev, base, >>>> &sun4i_gpadc_regmap_config); >>>> if (IS_ERR(info->regmap)) { >>>> diff --git a/include/linux/mfd/sun4i-gpadc.h >> b/include/linux/mfd/sun4i-gpadc.h >>>> index 40b4dd9d2405..c251002431bd 100644 >>>> --- a/include/linux/mfd/sun4i-gpadc.h >>>> +++ b/include/linux/mfd/sun4i-gpadc.h >>>> @@ -90,6 +90,8 @@ >>>> #define SUNXI_THS_CTRL0 0x00 >>>> #define SUNXI_THS_CTRL2 0x40 >>>> #define SUNXI_THS_FILTER 0x70 >>>> +#define SUNXI_THS_CDATA_0_1 0x74 >>>> +#define SUNXI_THS_CDATA_2_3 0x78 >>>> #define SUNXI_THS_TDATA0 0x80 >>>> #define SUNXI_THS_TDATA1 0x84 >>>> #define SUNXI_THS_TDATA2 0x88 >>> >> Thanks, >> Philipp >> >> _______________________________________________ >> linux-arm-kernel mailing list >> linux-arm-kernel@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel