From patchwork Mon Dec 3 13:31:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael David Tinoco X-Patchwork-Id: 152702 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp6814460ljp; Mon, 3 Dec 2018 05:31:20 -0800 (PST) X-Google-Smtp-Source: AFSGD/Wg7LpAnBhLUN/60O1ayOKPz4QmpgNv17ftjvFeDXD5Gw77QSr8z0HWgPv2XmvPSYbIhtxW X-Received: by 2002:a62:da5a:: with SMTP id w26mr15894972pfl.106.1543843880843; Mon, 03 Dec 2018 05:31:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543843880; cv=none; d=google.com; s=arc-20160816; b=atAv8I2/KxuwVMxj7PItYMUAzGFAIOzgZbkg9H1+cVr/SyQah7E4OSz87FoOKGrUnC BBw10568N45BvUzDltcSs7ixNagoICZFn1BgWOCGjgAqu4QtCARRC7pEjpY/IKeMV65j aZ/Qhmz+ZFpzBkShuiZLUGWhMXWAWIOv0ZG0GlHJtajqCW3Zl4JofOEbFwOZp/vp/inR FgVL5KXavIp92i9Ow+nDzITnnuJRjKCGVlZxLKF5WQcO8map9d32evDcKIaLnxH+NWCd QSEaCo7jxGzNzVhSPeHfvLuQ6b7VceJH2u9V73ddNECFH4dJ7gHgSpb74o8rpB2luM7f sRMQ== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=A2F6pDiQKGzz6oIk7/k7tBCF05mIb2PLp1W0NJSuOD0=; b=rySqaQn1kswkH9+pOlwSmWOx7fY18zrpI4JHDgSZVwOhNV7FDhGvpI4DqR9wwMTPx1 Qz0hrQtk8eAL3uCJ79lc2VgqRi5RCpanv2dU0/5SB8GvdVbU4OP37WEHr599agfTll9r xsyvgxDMOi26qdpewWXEX/oLrM5H1J8vikIpX02GDmtJ0oNFAtl3wYN2RcPzFgGD3NMV uwB3IYlRbzbmyPW7CCIUmZr1gYI6mUJPO1UicgDbGQi0f5UoRtbgPQA2jX3lnyDwdjsG f7trd2gOQir32J0POYsR1on9v1ssmzbqkzWI2yFQZBw55EPd4vAw3nKTpbfgZD9Hpk7d mHcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=aWUYb0pD; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id go3si14066912plb.97.2018.12.03.05.31.20; Mon, 03 Dec 2018 05:31:20 -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=@linaro.org header.s=google header.b=aWUYb0pD; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726146AbeLCNcT (ORCPT + 32 others); Mon, 3 Dec 2018 08:32:19 -0500 Received: from mail-qk1-f195.google.com ([209.85.222.195]:34034 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726014AbeLCNcS (ORCPT ); Mon, 3 Dec 2018 08:32:18 -0500 Received: by mail-qk1-f195.google.com with SMTP id a132so7291923qkg.1 for ; Mon, 03 Dec 2018 05:31:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=A2F6pDiQKGzz6oIk7/k7tBCF05mIb2PLp1W0NJSuOD0=; b=aWUYb0pDM8TN4MJwh7SGnXQrA9R28l+VNusyVE0faDzsIjokebAFFXlB+A6JYoAPQX GNR8Aubkj1A+4eZlJSCzOzerIKM+me0o4mIgC6+9IArY0Al5DWKgV5o/xsb7iHFWq9SE 28L08ILYAX57Tai848BId15KyUJwvywCrylRY= 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:mime-version:content-transfer-encoding; bh=A2F6pDiQKGzz6oIk7/k7tBCF05mIb2PLp1W0NJSuOD0=; b=XgTcrUCpszeIST1Pys6EUHTAXRwD9chNz/9UQjOcnHZYl3ali2AjL1BrFu2rdZMo6A jOtdf+ygyyRYEVb8JIQgMBl9D28ULkcdFhLkH1LTOF9snVRYwbrMw0D5VRaCFi770ygz vzL+D8aOh9u1pAD8L4zmm7UHO7ImTD/i0w3O+k21cV0ol8fa9Su3P+edtlCpQO5eAG5f aCnZDdtEhsoVww0KQAtEe8LuNyfo0Ru0xywBbh64+nyLAjUmIlWQehhFiiLX/Uoh3ejd 8TZ1Z3IbXz7DarihMuN0AZUTv+JIM8F8iqzqJq3grzmfupYP4nWp0EUy8rad6fg0DCWV 62Aw== X-Gm-Message-State: AA+aEWawODG+iT11aoSi3pjnDUV5F+/mWhai3jcJr5ikbUVC2L5S73A4 StjZqLkFo1feXjo+2A8lbNEJCg== X-Received: by 2002:a37:59c4:: with SMTP id n187mr15318058qkb.156.1543843875747; Mon, 03 Dec 2018 05:31:15 -0800 (PST) Received: from workstation.celeiro.br ([138.204.25.29]) by smtp.gmail.com with ESMTPSA id r56sm8619112qtj.30.2018.12.03.05.31.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Dec 2018 05:31:15 -0800 (PST) From: Rafael David Tinoco To: sashal@kernel.org Cc: rafael.tinoco@linaro.org, gregkh@linuxfoundation.org, rui.zhang@intel.com, edubezval@gmail.com, daniel.lezcano@linaro.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH 1/5] thermal/drivers/hisi: Remove the multiple sensors support Date: Mon, 3 Dec 2018 11:31:03 -0200 Message-Id: <20181203133107.4002-2-rafael.tinoco@linaro.org> X-Mailer: git-send-email 2.20.0.rc1 In-Reply-To: <20181203133107.4002-1-rafael.tinoco@linaro.org> References: <20181203133107.4002-1-rafael.tinoco@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Lezcano commit ff4ec2997df8fe7cc40513dbe5f86d9f88fb6be7 upstream. By essence, the tsensor does not really support multiple sensor at the same time. It allows to set a sensor and use it to get the temperature, another sensor could be switched but with a delay of 3-5ms. It is difficult to read simultaneously several sensors without a big delay. Today, just one sensor is used, it is not necessary to deal with multiple sensors in the code. Remove them and if it is needed in the future add them on top of a code which will be clean up in the meantime. Link: https://bugs.linaro.org/show_bug.cgi?id=4053 (PATCH 1/5) Signed-off-by: Daniel Lezcano Reviewed-by: Leo Yan Acked-by: Wangtao (Kevin, Kirin) Signed-off-by: Eduardo Valentin (cherry picked from commit ff4ec2997df8fe7cc40513dbe5f86d9f88fb6be7) Signed-off-by: Rafael David Tinoco --- drivers/thermal/hisi_thermal.c | 75 +++++++++------------------------- 1 file changed, 19 insertions(+), 56 deletions(-) -- 2.20.0.rc1 diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c index 6d8906d65476..aecbfe9fc8f2 100644 --- a/drivers/thermal/hisi_thermal.c +++ b/drivers/thermal/hisi_thermal.c @@ -40,6 +40,7 @@ #define HISI_TEMP_STEP (784) #define HISI_MAX_SENSORS 4 +#define HISI_DEFAULT_SENSOR 2 struct hisi_thermal_sensor { struct hisi_thermal_data *thermal; @@ -54,9 +55,8 @@ struct hisi_thermal_data { struct mutex thermal_lock; /* protects register data */ struct platform_device *pdev; struct clk *clk; - struct hisi_thermal_sensor sensors[HISI_MAX_SENSORS]; - - int irq, irq_bind_sensor; + struct hisi_thermal_sensor sensors; + int irq; bool irq_enabled; void __iomem *regs; @@ -133,7 +133,7 @@ static void hisi_thermal_enable_bind_irq_sensor mutex_lock(&data->thermal_lock); - sensor = &data->sensors[data->irq_bind_sensor]; + sensor = &data->sensors; /* setting the hdak time */ writel(0x0, data->regs + TEMP0_CFG); @@ -181,31 +181,8 @@ static int hisi_thermal_get_temp(void *_sensor, int *temp) struct hisi_thermal_sensor *sensor = _sensor; struct hisi_thermal_data *data = sensor->thermal; - int sensor_id = -1, i; - long max_temp = 0; - *temp = hisi_thermal_get_sensor_temp(data, sensor); - sensor->sensor_temp = *temp; - - for (i = 0; i < HISI_MAX_SENSORS; i++) { - if (!data->sensors[i].tzd) - continue; - - if (data->sensors[i].sensor_temp >= max_temp) { - max_temp = data->sensors[i].sensor_temp; - sensor_id = i; - } - } - - /* If no sensor has been enabled, then skip to enable irq */ - if (sensor_id == -1) - return 0; - - mutex_lock(&data->thermal_lock); - data->irq_bind_sensor = sensor_id; - mutex_unlock(&data->thermal_lock); - dev_dbg(&data->pdev->dev, "id=%d, irq=%d, temp=%d, thres=%d\n", sensor->id, data->irq_enabled, *temp, sensor->thres_temp); /* @@ -218,7 +195,7 @@ static int hisi_thermal_get_temp(void *_sensor, int *temp) return 0; } - if (max_temp < sensor->thres_temp) { + if (*temp < sensor->thres_temp) { data->irq_enabled = true; hisi_thermal_enable_bind_irq_sensor(data); enable_irq(data->irq); @@ -245,22 +222,16 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev) { struct hisi_thermal_data *data = dev; struct hisi_thermal_sensor *sensor; - int i; mutex_lock(&data->thermal_lock); - sensor = &data->sensors[data->irq_bind_sensor]; + sensor = &data->sensors; dev_crit(&data->pdev->dev, "THERMAL ALARM: T > %d\n", sensor->thres_temp); mutex_unlock(&data->thermal_lock); - for (i = 0; i < HISI_MAX_SENSORS; i++) { - if (!data->sensors[i].tzd) - continue; - - thermal_zone_device_update(data->sensors[i].tzd, - THERMAL_EVENT_UNSPECIFIED); - } + thermal_zone_device_update(data->sensors.tzd, + THERMAL_EVENT_UNSPECIFIED); return IRQ_HANDLED; } @@ -317,7 +288,6 @@ static int hisi_thermal_probe(struct platform_device *pdev) { struct hisi_thermal_data *data; struct resource *res; - int i; int ret; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); @@ -359,14 +329,13 @@ static int hisi_thermal_probe(struct platform_device *pdev) hisi_thermal_enable_bind_irq_sensor(data); data->irq_enabled = true; - for (i = 0; i < HISI_MAX_SENSORS; ++i) { - ret = hisi_thermal_register_sensor(pdev, data, - &data->sensors[i], i); - if (ret) - dev_err(&pdev->dev, - "failed to register thermal sensor: %d\n", ret); - else - hisi_thermal_toggle_sensor(&data->sensors[i], true); + ret = hisi_thermal_register_sensor(pdev, data, + &data->sensors, + HISI_DEFAULT_SENSOR); + if (ret) { + dev_err(&pdev->dev, "failed to register thermal sensor: %d\n", + ret); + return ret; } ret = devm_request_threaded_irq(&pdev->dev, data->irq, @@ -378,6 +347,8 @@ static int hisi_thermal_probe(struct platform_device *pdev) return ret; } + hisi_thermal_toggle_sensor(&data->sensors, true); + enable_irq(data->irq); return 0; @@ -386,17 +357,9 @@ static int hisi_thermal_probe(struct platform_device *pdev) static int hisi_thermal_remove(struct platform_device *pdev) { struct hisi_thermal_data *data = platform_get_drvdata(pdev); - int i; - - for (i = 0; i < HISI_MAX_SENSORS; i++) { - struct hisi_thermal_sensor *sensor = &data->sensors[i]; - - if (!sensor->tzd) - continue; - - hisi_thermal_toggle_sensor(sensor, false); - } + struct hisi_thermal_sensor *sensor = &data->sensors; + hisi_thermal_toggle_sensor(sensor, false); hisi_thermal_disable_sensor(data); clk_disable_unprepare(data->clk); From patchwork Mon Dec 3 13:31:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael David Tinoco X-Patchwork-Id: 152704 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp6814607ljp; Mon, 3 Dec 2018 05:31:27 -0800 (PST) X-Google-Smtp-Source: AFSGD/WaIHngpQ3xa293m96MM1BoQ0jtJBfOMnUyeLKF1NRsYChvnZfzaudXvnh6YSGbuyhvDute X-Received: by 2002:a17:902:27e6:: with SMTP id i35mr15673739plg.222.1543843886974; Mon, 03 Dec 2018 05:31:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543843886; cv=none; d=google.com; s=arc-20160816; b=V12Wf2bgdt4kkCE393dGuFw5MJZrMw9wA4ZBq90fBMG32H3oWeHdM2vtIAaZ4sxdvU m9SlxM9VSx/yQMh+i7Vh0ElRCqT35Q55APal4lFDF3tc9F4AB1QDGk9dKNXE1ckifNnr R2wH4U9lyBJgvUvNun5iLIDMm55TJCz5KQQrzcL7Suj7LX1PF8Q8ciEFULkdAsUc9GzI zOB95H7NV8OWQAUQB+9hD3DE5GS7VjjebWP4UiW2FnVkhD6Qh1ODDI8unB/XFTcm8KdN 6FYe0kLuxtCsqAw65Ykpaz/OVketcy8DAegzpMpc9w7i7pn2UhZbNrRGFj43hbNcb585 t12g== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=dMs6Mb/3EH6NUddI4Qk37lptneQwe896iQcc6U4t5qc=; b=llXUJCYfxTfZeTqOJajO8jzLNcMFjOvUuW8svpLMP3aI4r+zhr/9Pq/nc0l4sggJ04 e2SkdwZnjGR2nvFFwqtgjb+yDJ/onBtjM/Zqe+bJozdOHOgbatxH9tnSw19yLJpMJ2KX IUO7SxdbNwtFUKRQKUrN+y5mRqeTba5qM7HehutROPU1IAP8PZzSpforokvEhH8z8hsY lgb1jnQSMbQPCopSb3QcDlENVSKi+0YEiEnIJFWGiCLQi1qt0Z4el0LhE45KxMBVKS6m Su6rAXVFN0qhd/glSVHyKiVM3U8LYKBEVw4HDF/jsnOws5BC7FC7ZAnALPGnAGHHJ/42 9w0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=IX1aMkR4; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t65si14244081pfb.247.2018.12.03.05.31.26; Mon, 03 Dec 2018 05:31:26 -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=@linaro.org header.s=google header.b=IX1aMkR4; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726416AbeLCNcZ (ORCPT + 32 others); Mon, 3 Dec 2018 08:32:25 -0500 Received: from mail-qt1-f195.google.com ([209.85.160.195]:35489 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726277AbeLCNcY (ORCPT ); Mon, 3 Dec 2018 08:32:24 -0500 Received: by mail-qt1-f195.google.com with SMTP id v11so13657811qtc.2 for ; Mon, 03 Dec 2018 05:31:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dMs6Mb/3EH6NUddI4Qk37lptneQwe896iQcc6U4t5qc=; b=IX1aMkR49adgWwDGCUFOduoMyliyULnW1mVjUixl9fBhZ17qW9z3vlEpJGLUait8y6 /Wa3Cqp00fMO752D082/hqMoEWFtM1Zn7qLUEC1OvWH4Xb+Lwn8SUOb0y0duzXdZxGxt FDZD/s2lgACH9n6j9hnUTEy4IZLirFEgy1FHI= 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:mime-version:content-transfer-encoding; bh=dMs6Mb/3EH6NUddI4Qk37lptneQwe896iQcc6U4t5qc=; b=P56EH989vWBqeQdFgO7bqXcQXoTOXB/ayR91CeRr79HXoSGWJnuW2BXFAvEbF+rlvA 7SbjOzJosELi4Uh4jLzPsInBp1/sfVfbe5KwVxs84uqURNfKtwTlJ1rhMc5VUuVfHX9z Lr+Yp9foODW7/q+PDbLY0pDQyR8wVyLXHRW6UGbMu3i/AIFyBgZsHam4eVZY1UnaD2e0 ee91y/inzi4ykfFiSYpSLMqi0wdID5xLv4OhKx7ciHyBWuqZ36aH7NeR0X+3K+WiRmRE wxXob+9MdXjwoDtP/30tzG0sg4QHlmCoJMTtrx/LvMoqefVC+0vVuqFLSGhMesutEZ51 gNIQ== X-Gm-Message-State: AA+aEWZD7Yp7AWoZz4STbBi5TVKSj66DXQ9jtW9LTW2r9jr84wNE6XwJ cbJdh83NEPZkTKGGrylVXpUvmg== X-Received: by 2002:ad4:510f:: with SMTP id g15mr16041641qvp.46.1543843881781; Mon, 03 Dec 2018 05:31:21 -0800 (PST) Received: from workstation.celeiro.br ([138.204.25.29]) by smtp.gmail.com with ESMTPSA id r56sm8619112qtj.30.2018.12.03.05.31.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Dec 2018 05:31:21 -0800 (PST) From: Rafael David Tinoco To: sashal@kernel.org Cc: rafael.tinoco@linaro.org, gregkh@linuxfoundation.org, rui.zhang@intel.com, edubezval@gmail.com, daniel.lezcano@linaro.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH 3/5] thermal/drivers/hisi: Encapsulate register writes into helpers Date: Mon, 3 Dec 2018 11:31:05 -0200 Message-Id: <20181203133107.4002-4-rafael.tinoco@linaro.org> X-Mailer: git-send-email 2.20.0.rc1 In-Reply-To: <20181203133107.4002-1-rafael.tinoco@linaro.org> References: <20181203133107.4002-1-rafael.tinoco@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Lezcano commit 1e11b014271ceccb5ea04ae58f4829ac8209a86d upstream. Hopefully, the function name can help to clarify the semantic of the operations when writing in the register. Link: https://bugs.linaro.org/show_bug.cgi?id=4053 (PATCH 3/5) Signed-off-by: Daniel Lezcano Signed-off-by: Eduardo Valentin (cherry picked from commit 1e11b014271ceccb5ea04ae58f4829ac8209a86d) Signed-off-by: Rafael David Tinoco --- drivers/thermal/hisi_thermal.c | 92 ++++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 22 deletions(-) -- 2.20.0.rc1 diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c index 0c2966c285b1..a803043f37ae 100644 --- a/drivers/thermal/hisi_thermal.c +++ b/drivers/thermal/hisi_thermal.c @@ -26,6 +26,7 @@ #include "thermal_core.h" +#define TEMP0_LAG (0x0) #define TEMP0_TH (0x4) #define TEMP0_RST_TH (0x8) #define TEMP0_CFG (0xC) @@ -96,6 +97,56 @@ static inline long hisi_thermal_round_temp(int temp) hisi_thermal_temp_to_step(temp)); } +static inline void hisi_thermal_set_lag(void __iomem *addr, int value) +{ + writel(value, addr + TEMP0_LAG); +} + +static inline void hisi_thermal_alarm_clear(void __iomem *addr, int value) +{ + writel(value, addr + TEMP0_INT_CLR); +} + +static inline void hisi_thermal_alarm_enable(void __iomem *addr, int value) +{ + writel(value, addr + TEMP0_INT_EN); +} + +static inline void hisi_thermal_alarm_set(void __iomem *addr, int temp) +{ + writel(hisi_thermal_temp_to_step(temp) | 0x0FFFFFF00, addr + TEMP0_TH); +} + +static inline void hisi_thermal_reset_set(void __iomem *addr, int temp) +{ + writel(hisi_thermal_temp_to_step(temp), addr + TEMP0_RST_TH); +} + +static inline void hisi_thermal_reset_enable(void __iomem *addr, int value) +{ + writel(value, addr + TEMP0_RST_MSK); +} + +static inline void hisi_thermal_enable(void __iomem *addr, int value) +{ + writel(value, addr + TEMP0_EN); +} + +static inline void hisi_thermal_sensor_select(void __iomem *addr, int sensor) +{ + writel((sensor << 12), addr + TEMP0_CFG); +} + +static inline int hisi_thermal_get_temperature(void __iomem *addr) +{ + return hisi_thermal_step_to_temp(readl(addr + TEMP0_VALUE)); +} + +static inline void hisi_thermal_hdak_set(void __iomem *addr, int value) +{ + writel(value, addr + TEMP0_CFG); +} + static long hisi_thermal_get_sensor_temp(struct hisi_thermal_data *data, struct hisi_thermal_sensor *sensor) { @@ -104,22 +155,21 @@ static long hisi_thermal_get_sensor_temp(struct hisi_thermal_data *data, mutex_lock(&data->thermal_lock); /* disable interrupt */ - writel(0x0, data->regs + TEMP0_INT_EN); - writel(0x1, data->regs + TEMP0_INT_CLR); + hisi_thermal_alarm_enable(data->regs, 0); + hisi_thermal_alarm_clear(data->regs, 1); /* disable module firstly */ - writel(0x0, data->regs + TEMP0_EN); + hisi_thermal_enable(data->regs, 0); /* select sensor id */ - writel((sensor->id << 12), data->regs + TEMP0_CFG); + hisi_thermal_sensor_select(data->regs, sensor->id); /* enable module */ - writel(0x1, data->regs + TEMP0_EN); + hisi_thermal_enable(data->regs, 1); usleep_range(3000, 5000); - val = readl(data->regs + TEMP0_VALUE); - val = hisi_thermal_step_to_temp(val); + val = hisi_thermal_get_temperature(data->regs); mutex_unlock(&data->thermal_lock); @@ -136,28 +186,26 @@ static void hisi_thermal_enable_bind_irq_sensor sensor = &data->sensors; /* setting the hdak time */ - writel(0x0, data->regs + TEMP0_CFG); + hisi_thermal_hdak_set(data->regs, 0); /* disable module firstly */ - writel(0x0, data->regs + TEMP0_RST_MSK); - writel(0x0, data->regs + TEMP0_EN); + hisi_thermal_reset_enable(data->regs, 0); + hisi_thermal_enable(data->regs, 0); /* select sensor id */ - writel((sensor->id << 12), data->regs + TEMP0_CFG); + hisi_thermal_sensor_select(data->regs, sensor->id); /* enable for interrupt */ - writel(hisi_thermal_temp_to_step(sensor->thres_temp) | 0x0FFFFFF00, - data->regs + TEMP0_TH); + hisi_thermal_alarm_set(data->regs, sensor->thres_temp); - writel(hisi_thermal_temp_to_step(HISI_TEMP_RESET), - data->regs + TEMP0_RST_TH); + hisi_thermal_reset_set(data->regs, HISI_TEMP_RESET); /* enable module */ - writel(0x1, data->regs + TEMP0_RST_MSK); - writel(0x1, data->regs + TEMP0_EN); + hisi_thermal_reset_enable(data->regs, 1); + hisi_thermal_enable(data->regs, 1); - writel(0x0, data->regs + TEMP0_INT_CLR); - writel(0x1, data->regs + TEMP0_INT_EN); + hisi_thermal_alarm_clear(data->regs, 0); + hisi_thermal_alarm_enable(data->regs, 1); usleep_range(3000, 5000); @@ -169,9 +217,9 @@ static void hisi_thermal_disable_sensor(struct hisi_thermal_data *data) mutex_lock(&data->thermal_lock); /* disable sensor module */ - writel(0x0, data->regs + TEMP0_INT_EN); - writel(0x0, data->regs + TEMP0_RST_MSK); - writel(0x0, data->regs + TEMP0_EN); + hisi_thermal_enable(data->regs, 0); + hisi_thermal_alarm_enable(data->regs, 0); + hisi_thermal_reset_enable(data->regs, 0); mutex_unlock(&data->thermal_lock); } From patchwork Mon Dec 3 13:31:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Rafael David Tinoco X-Patchwork-Id: 152706 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp6814728ljp; Mon, 3 Dec 2018 05:31:33 -0800 (PST) X-Google-Smtp-Source: AFSGD/UvKeo+kHdrYhpXTg2DWgVVQYwwxZEmifcdAs4ZKdSUBZdv5i308DKAj0+w7HjYf6DGPz+V X-Received: by 2002:a65:4142:: with SMTP id x2mr12914986pgp.356.1543843893051; Mon, 03 Dec 2018 05:31:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543843893; cv=none; d=google.com; s=arc-20160816; b=Rinq/TcvCOdA1xFUAy0bcpofTB+Gz0ob2SeD9mwlJJyATHlrNYmUjn0yUCIPQw3zbm B3i5pyhV76lFVizRDp23Ermg0HwyEc8+CV/OdJpXDB2TR/zsXlGOiP531KoD8ggfOSeO UShRR1HsxN8hbXJHHPgWpdMwUUC7JWp70rsCGdNgszB4DBFid1v48XnpHE8jwalmb/4+ ox1482sojRMsi/05gBPn9c8/qxyLcLDb0EE+t1bi4ddqG7bSPoEXTdTv/5GFFzR6fN4m XOH8iEs0krgBb7/nSHsqRFuGfIONt5OnlCJWF0ok6BWnKWSNEFUNccfYIeofenPYRcM1 gy/A== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=rPP2crPp8qfalgTp8X/h/6lTKYQZMKVyebb+n4dfJh8=; b=UWiSlBBW/AyORaACnThFJu65ZgtL0NtoEYX54XGd1LOLkMiSfM0jnrgU5LU0gYrCpO 1bWnqpU/5zEuvZigqvodMd/3fitOcdTXrzYSlIfki7J5jUW0tCtcF/8km6JLKpQNe2rt WX5jyNZFQsDAirFv8Z4W4P/ScJjcT7xR6MiU39Z0Fxa2Clzx9MEbewsZaOBfMXynmXTs b6S/zsD0I/1Fxh9KGbwb2erVi6I2iF5eNmUWkW6zTI5dvWrnPkANZ1cS9mGMPKUHRumW z0NF3PeQURdErqVz91mE4UIvTdpMKQUB2jzMRTz8jNBpXU6B0DMqc/MyMNFDaCp3gEiF oo5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=XVs0wWdi; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o184si12426027pgo.591.2018.12.03.05.31.32; Mon, 03 Dec 2018 05:31:33 -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=@linaro.org header.s=google header.b=XVs0wWdi; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726048AbeLCNcb (ORCPT + 32 others); Mon, 3 Dec 2018 08:32:31 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:39519 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726285AbeLCNca (ORCPT ); Mon, 3 Dec 2018 08:32:30 -0500 Received: by mail-qt1-f193.google.com with SMTP id n21so13639711qtl.6 for ; Mon, 03 Dec 2018 05:31:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rPP2crPp8qfalgTp8X/h/6lTKYQZMKVyebb+n4dfJh8=; b=XVs0wWdiblqeQ4DCwvDBPmwIRd3w7eI+BKqkTVcCeUOdE7axv7lbGFPzezTKVZwJPA AkZR+8oVGGQiU6LfJESrkh6Vk0Sw3WOXqsPo4qSSZ3RgNe/bPHINekMzdn31kUofh3+3 pHk0QUrz/iQkaAHDYab/+K8nbQmN6xC0gSn6k= 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:mime-version:content-transfer-encoding; bh=rPP2crPp8qfalgTp8X/h/6lTKYQZMKVyebb+n4dfJh8=; b=nyysY4PfGW7CodT/mLmA6Kprnkmn3cVSoJCbOoiOQ1zFI4SrWW5KYxF2JtnvnFGnMp ALY6Z9XC/DeFPsoMkymq3rUH+YDoozTRtjUthpJHOfhUdYdXtS9Ta5HTSlnbYNRulSeg 7XGEH8CXupnXcSEi3lN+kTO8Z6/uTgnP9GCE0S2DUuT+QVC0+AaOQcw/Ag+sqcwPWAQO DTvQZgkv/oRcmf+eYlwTgob6HcwpSIiuhp4yKJ5I2oi+kYyDarUvIbT7qTrbRigBNoA8 kWYoKzmOFGMCnCHgiPkXoQtvwZKSTCpHgiOe8M+8WJQgWU6ZrqntA+IcLD3KZy8cl1SJ bQXQ== X-Gm-Message-State: AA+aEWZMx2kBQXqF9uYeMsCMvEtwyEVsmUfbgEuL4c+Pv/l8xZ2C/zuU mY6hGAWo9wQ/QqMu6ny2eW1uZw== X-Received: by 2002:a0c:d268:: with SMTP id o37mr15827714qvh.136.1543843887852; Mon, 03 Dec 2018 05:31:27 -0800 (PST) Received: from workstation.celeiro.br ([138.204.25.29]) by smtp.gmail.com with ESMTPSA id r56sm8619112qtj.30.2018.12.03.05.31.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Dec 2018 05:31:27 -0800 (PST) From: Rafael David Tinoco To: sashal@kernel.org Cc: rafael.tinoco@linaro.org, gregkh@linuxfoundation.org, rui.zhang@intel.com, edubezval@gmail.com, daniel.lezcano@linaro.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH 5/5] thermal/drivers/hisi: Remove costly sensor inspection Date: Mon, 3 Dec 2018 11:31:07 -0200 Message-Id: <20181203133107.4002-6-rafael.tinoco@linaro.org> X-Mailer: git-send-email 2.20.0.rc1 In-Reply-To: <20181203133107.4002-1-rafael.tinoco@linaro.org> References: <20181203133107.4002-1-rafael.tinoco@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Lezcano commit 10d7e9a9181f4637640f388d334c6740c1b5d0e8 upstream. The sensor is all setup, bind, resetted, acked, etc... every single second. That was the way to workaround a problem with the interrupt bouncing again and again. With the following changes, we fix all in one: - Do the setup, one time, at probe time - Add the IRQF_ONESHOT, ack the interrupt in the threaded handler - Remove the interrupt handler - Set the correct value for the LAG register - Remove all the irq_enabled stuff in the code as the interruption handling is fixed - Remove the 3ms delay - Reorder the initialization routine to be in the right order It ends up to a nicer code and more efficient, the 3-5ms delay is removed from the get_temp() path. Link: https://bugs.linaro.org/show_bug.cgi?id=4053 (PATCH 5/5) Signed-off-by: Daniel Lezcano Reviewed-by: Leo Yan Tested-by: Leo Yan Signed-off-by: Eduardo Valentin (cherry picked from commit 10d7e9a9181f4637640f388d334c6740c1b5d0e8) Signed-off-by: Rafael David Tinoco --- drivers/thermal/hisi_thermal.c | 203 +++++++++++++++------------------ 1 file changed, 93 insertions(+), 110 deletions(-) -- 2.20.0.rc1 diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c index 31b52ebf426f..7c5d4647cb5e 100644 --- a/drivers/thermal/hisi_thermal.c +++ b/drivers/thermal/hisi_thermal.c @@ -41,6 +41,7 @@ #define HISI_TEMP_BASE (-60000) #define HISI_TEMP_RESET (100000) #define HISI_TEMP_STEP (784) +#define HISI_TEMP_LAG (3500) #define HISI_MAX_SENSORS 4 #define HISI_DEFAULT_SENSOR 2 @@ -60,8 +61,6 @@ struct hisi_thermal_data { struct clk *clk; struct hisi_thermal_sensor sensors; int irq; - bool irq_enabled; - void __iomem *regs; }; @@ -99,9 +98,40 @@ static inline long hisi_thermal_round_temp(int temp) hisi_thermal_temp_to_step(temp)); } +/* + * The lag register contains 5 bits encoding the temperature in steps. + * + * Each time the temperature crosses the threshold boundary, an + * interrupt is raised. It could be when the temperature is going + * above the threshold or below. However, if the temperature is + * fluctuating around this value due to the load, we can receive + * several interrupts which may not desired. + * + * We can setup a temperature representing the delta between the + * threshold and the current temperature when the temperature is + * decreasing. + * + * For instance: the lag register is 5°C, the threshold is 65°C, when + * the temperature reaches 65°C an interrupt is raised and when the + * temperature decrease to 65°C - 5°C another interrupt is raised. + * + * A very short lag can lead to an interrupt storm, a long lag + * increase the latency to react to the temperature changes. In our + * case, that is not really a problem as we are polling the + * temperature. + * + * [0:4] : lag register + * + * The temperature is coded in steps, cf. HISI_TEMP_STEP. + * + * Min : 0x00 : 0.0 °C + * Max : 0x1F : 24.3 °C + * + * The 'value' parameter is in milliCelsius. + */ static inline void hisi_thermal_set_lag(void __iomem *addr, int value) { - writel(value, addr + TEMP0_LAG); + writel((value / HISI_TEMP_STEP) & 0x1F, addr + TEMP0_LAG); } static inline void hisi_thermal_alarm_clear(void __iomem *addr, int value) @@ -171,71 +201,6 @@ static inline void hisi_thermal_hdak_set(void __iomem *addr, int value) (value << 4), addr + TEMP0_CFG); } -static long hisi_thermal_get_sensor_temp(struct hisi_thermal_data *data, - struct hisi_thermal_sensor *sensor) -{ - long val; - - mutex_lock(&data->thermal_lock); - - /* disable interrupt */ - hisi_thermal_alarm_enable(data->regs, 0); - hisi_thermal_alarm_clear(data->regs, 1); - - /* disable module firstly */ - hisi_thermal_enable(data->regs, 0); - - /* select sensor id */ - hisi_thermal_sensor_select(data->regs, sensor->id); - - /* enable module */ - hisi_thermal_enable(data->regs, 1); - - usleep_range(3000, 5000); - - val = hisi_thermal_get_temperature(data->regs); - - mutex_unlock(&data->thermal_lock); - - return val; -} - -static void hisi_thermal_enable_bind_irq_sensor - (struct hisi_thermal_data *data) -{ - struct hisi_thermal_sensor *sensor; - - mutex_lock(&data->thermal_lock); - - sensor = &data->sensors; - - /* setting the hdak time */ - hisi_thermal_hdak_set(data->regs, 0); - - /* disable module firstly */ - hisi_thermal_reset_enable(data->regs, 0); - hisi_thermal_enable(data->regs, 0); - - /* select sensor id */ - hisi_thermal_sensor_select(data->regs, sensor->id); - - /* enable for interrupt */ - hisi_thermal_alarm_set(data->regs, sensor->thres_temp); - - hisi_thermal_reset_set(data->regs, HISI_TEMP_RESET); - - /* enable module */ - hisi_thermal_reset_enable(data->regs, 1); - hisi_thermal_enable(data->regs, 1); - - hisi_thermal_alarm_clear(data->regs, 0); - hisi_thermal_alarm_enable(data->regs, 1); - - usleep_range(3000, 5000); - - mutex_unlock(&data->thermal_lock); -} - static void hisi_thermal_disable_sensor(struct hisi_thermal_data *data) { mutex_lock(&data->thermal_lock); @@ -253,25 +218,10 @@ static int hisi_thermal_get_temp(void *_sensor, int *temp) struct hisi_thermal_sensor *sensor = _sensor; struct hisi_thermal_data *data = sensor->thermal; - *temp = hisi_thermal_get_sensor_temp(data, sensor); - - dev_dbg(&data->pdev->dev, "id=%d, irq=%d, temp=%d, thres=%d\n", - sensor->id, data->irq_enabled, *temp, sensor->thres_temp); - /* - * Bind irq to sensor for two cases: - * Reenable alarm IRQ if temperature below threshold; - * if irq has been enabled, always set it; - */ - if (data->irq_enabled) { - hisi_thermal_enable_bind_irq_sensor(data); - return 0; - } + *temp = hisi_thermal_get_temperature(data->regs); - if (*temp < sensor->thres_temp) { - data->irq_enabled = true; - hisi_thermal_enable_bind_irq_sensor(data); - enable_irq(data->irq); - } + dev_dbg(&data->pdev->dev, "id=%d, temp=%d, thres=%d\n", + sensor->id, *temp, sensor->thres_temp); return 0; } @@ -280,26 +230,27 @@ static const struct thermal_zone_of_device_ops hisi_of_thermal_ops = { .get_temp = hisi_thermal_get_temp, }; -static irqreturn_t hisi_thermal_alarm_irq(int irq, void *dev) +static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev) { struct hisi_thermal_data *data = dev; + struct hisi_thermal_sensor *sensor = &data->sensors; + int temp; - disable_irq_nosync(irq); - data->irq_enabled = false; + hisi_thermal_alarm_clear(data->regs, 1); - return IRQ_WAKE_THREAD; -} + temp = hisi_thermal_get_temperature(data->regs); -static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev) -{ - struct hisi_thermal_data *data = dev; - struct hisi_thermal_sensor *sensor = &data->sensors; + if (temp >= sensor->thres_temp) { + dev_crit(&data->pdev->dev, "THERMAL ALARM: %d > %d\n", + temp, sensor->thres_temp); - dev_crit(&data->pdev->dev, "THERMAL ALARM: T > %d\n", - sensor->thres_temp); + thermal_zone_device_update(data->sensors.tzd, + THERMAL_EVENT_UNSPECIFIED); - thermal_zone_device_update(data->sensors.tzd, - THERMAL_EVENT_UNSPECIFIED); + } else if (temp < sensor->thres_temp) { + dev_crit(&data->pdev->dev, "THERMAL ALARM stopped: %d < %d\n", + temp, sensor->thres_temp); + } return IRQ_HANDLED; } @@ -352,6 +303,40 @@ static void hisi_thermal_toggle_sensor(struct hisi_thermal_sensor *sensor, on ? THERMAL_DEVICE_ENABLED : THERMAL_DEVICE_DISABLED); } +static int hisi_thermal_setup(struct hisi_thermal_data *data) +{ + struct hisi_thermal_sensor *sensor; + + sensor = &data->sensors; + + /* disable module firstly */ + hisi_thermal_reset_enable(data->regs, 0); + hisi_thermal_enable(data->regs, 0); + + /* select sensor id */ + hisi_thermal_sensor_select(data->regs, sensor->id); + + /* setting the hdak time */ + hisi_thermal_hdak_set(data->regs, 0); + + /* setting lag value between current temp and the threshold */ + hisi_thermal_set_lag(data->regs, HISI_TEMP_LAG); + + /* enable for interrupt */ + hisi_thermal_alarm_set(data->regs, sensor->thres_temp); + + hisi_thermal_reset_set(data->regs, HISI_TEMP_RESET); + + /* enable module */ + hisi_thermal_reset_enable(data->regs, 1); + hisi_thermal_enable(data->regs, 1); + + hisi_thermal_alarm_clear(data->regs, 0); + hisi_thermal_alarm_enable(data->regs, 1); + + return 0; +} + static int hisi_thermal_probe(struct platform_device *pdev) { struct hisi_thermal_data *data; @@ -394,9 +379,6 @@ static int hisi_thermal_probe(struct platform_device *pdev) return ret; } - hisi_thermal_enable_bind_irq_sensor(data); - data->irq_enabled = true; - ret = hisi_thermal_register_sensor(pdev, data, &data->sensors, HISI_DEFAULT_SENSOR); @@ -406,10 +388,15 @@ static int hisi_thermal_probe(struct platform_device *pdev) return ret; } - ret = devm_request_threaded_irq(&pdev->dev, data->irq, - hisi_thermal_alarm_irq, + ret = hisi_thermal_setup(data); + if (ret) { + dev_err(&pdev->dev, "Failed to setup the sensor: %d\n", ret); + return ret; + } + + ret = devm_request_threaded_irq(&pdev->dev, data->irq, NULL, hisi_thermal_alarm_irq_thread, - 0, "hisi_thermal", data); + IRQF_ONESHOT, "hisi_thermal", data); if (ret < 0) { dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret); return ret; @@ -417,8 +404,6 @@ static int hisi_thermal_probe(struct platform_device *pdev) hisi_thermal_toggle_sensor(&data->sensors, true); - enable_irq(data->irq); - return 0; } @@ -440,7 +425,6 @@ static int hisi_thermal_suspend(struct device *dev) struct hisi_thermal_data *data = dev_get_drvdata(dev); hisi_thermal_disable_sensor(data); - data->irq_enabled = false; clk_disable_unprepare(data->clk); @@ -456,8 +440,7 @@ static int hisi_thermal_resume(struct device *dev) if (ret) return ret; - data->irq_enabled = true; - hisi_thermal_enable_bind_irq_sensor(data); + hisi_thermal_setup(data); return 0; }