From patchwork Mon Dec 12 11:05:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Caesar Wang X-Patchwork-Id: 9470429 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AFC8560573 for ; Mon, 12 Dec 2016 11:06:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A0AFD2845A for ; Mon, 12 Dec 2016 11:06:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9578028472; Mon, 12 Dec 2016 11:06:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.7 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_SPAM autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5735E2845A for ; Mon, 12 Dec 2016 11:06:34 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1cGORF-0007C7-S8; Mon, 12 Dec 2016 11:06:33 +0000 Received: from mail-pf0-f194.google.com ([209.85.192.194]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1cGORD-00073g-LW for linux-rockchip@lists.infradead.org; Mon, 12 Dec 2016 11:06:32 +0000 Received: by mail-pf0-f194.google.com with SMTP id y68so4272868pfb.1 for ; Mon, 12 Dec 2016 03:06:10 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=voggPDbCcyZXMw2+vN1Jj153smsOmXlTg4qgtQj9zDw=; b=HXyiIAmxPJ8mzDjlrzSIhyOWuSQCu0itavrI4v/TGjVJr+/Mp0qfpS+kJBCHlquE+g eHx540viAJgpGGj5gQVVrEtJw0HFnvKEc4LftVfH2DZfHT5QsIaKfdpO1rA9+p5/AaZh 9FVyNICYowclmT4bRCeT6kChie2Ls/FZ/ERqyv5nQnDo++8vBAjv9Y6pQkx81sOcy0oM 16uN5mVci/TDy4pO8ycK3DW+CZ6wS5HInbnYDGpaHUu+nTCPvxwMuDjhLFuc7SlubOyr rRX7MUbbBKS/YDpN967vzJaaDcWiyRTD+mm6Qa6oCNo4D4wklAedLn/HfTony7TEiVY9 VNNQ== X-Gm-Message-State: AKaTC01dn8xTh9w66X5x5WVjOvWU6Ib0MkkVo0Py7oeIjBNIsxYjZ7T5DcFRi33Kw7cbig== X-Received: by 10.98.144.213 with SMTP id q82mr94215731pfk.56.1481540769921; Mon, 12 Dec 2016 03:06:09 -0800 (PST) Received: from localhost.localdomain ([47.89.33.70]) by smtp.gmail.com with ESMTPSA id i124sm76047411pgd.15.2016.12.12.03.06.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 12 Dec 2016 03:06:08 -0800 (PST) From: Caesar Wang To: edubezval@gmail.com, rui.zhang@intel.com Subject: [PATCH v4 4/5] thermal: rockchip: optimize the conversion table Date: Mon, 12 Dec 2016 19:05:34 +0800 Message-Id: <1481540735-12710-5-git-send-email-wxt@rock-chips.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1481540735-12710-1-git-send-email-wxt@rock-chips.com> References: <1481540735-12710-1-git-send-email-wxt@rock-chips.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161212_030631_798459_35165912 X-CRM114-Status: GOOD ( 15.09 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-pm@vger.kernel.org, briannorris@chromium.org, linux-kernel@vger.kernel.org, smbarber@chromium.org, linux-rockchip@lists.infradead.org, Caesar Wang MIME-Version: 1.0 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP In order to support the valid temperature can conver to analog value. The rockchip thermal driver has not supported the all valid temperature to convert the analog value. (e.g.: 61C, 62C, 63C....) For example: In some cases, we need adjust the trip point. $cd /sys/class/thermal/thermal_zone* $echo 68000 > trip_point_0_temp That will return the max analogic value indicates the invalid before posting this patch. So, this patch will optimize the conversion table to support the other cases. Signed-off-by: Caesar Wang --- Changes in v4: - Print a better name. - As Eduardo commented on https://patchwork.kernel.org/patch/9449313/ - remove the Brain's review for previous version, since the new version update something. Changes in v3: None Changes in v2: - improve the commit as Brian commnets on https://patchwork.kernel.org/patch/9440985 Changes in v1: None drivers/thermal/rockchip_thermal.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c index f027b86..cacc12b 100644 --- a/drivers/thermal/rockchip_thermal.c +++ b/drivers/thermal/rockchip_thermal.c @@ -317,6 +317,7 @@ static const struct tsadc_table rk3288_code_table[] = { {3452, 115000}, {3437, 120000}, {3421, 125000}, + {0, 125000}, }; static const struct tsadc_table rk3368_code_table[] = { @@ -401,10 +402,12 @@ static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table, int temp) { int high, low, mid; + unsigned long num; + unsigned int denom; u32 error = table->data_mask; low = 0; - high = table->length - 1; + high = (table->length - 1) - 1; /* ignore the last check for table */ mid = (high + low) / 2; /* Return mask code data when the temp is over table range */ @@ -421,6 +424,26 @@ static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table, mid = (low + high) / 2; } + /* + * The conversion code granularity provided by the table. Let's + * assume that the relationship between temperature and + * analog value between 2 table entries is linear and interpolate + * to produce less granular result. + */ + num = abs(table->id[mid + 1].code - table->id[mid].code); + num *= temp - table->id[mid].temp; + denom = table->id[mid + 1].temp - table->id[mid].temp; + + switch (table->mode) { + case ADC_DECREMENT: + return table->id[mid].code - (num / denom); + case ADC_INCREMENT: + return table->id[mid].code + (num / denom); + default: + pr_err("%s: unknown table mode: %d\n", __func__, table->mode); + return error; + } + exit: pr_err("%s: invalid temperature, temp=%d error=%d\n", __func__, temp, error);