From patchwork Wed May 25 03:27:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Caesar Wang X-Patchwork-Id: 9134609 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 20729607D9 for ; Wed, 25 May 2016 03:28:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 149D02822B for ; Wed, 25 May 2016 03:28:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 090ED2827C; Wed, 25 May 2016 03:28:02 +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=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham 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 948D92822B for ; Wed, 25 May 2016 03:28:01 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5PUE-0003FO-Ed; Wed, 25 May 2016 03:27:58 +0000 Received: from mail-pa0-x241.google.com ([2607:f8b0:400e:c03::241]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1b5PUB-0003Cy-Ok for linux-rockchip@lists.infradead.org; Wed, 25 May 2016 03:27:56 +0000 Received: by mail-pa0-x241.google.com with SMTP id yl2so3817602pac.1 for ; Tue, 24 May 2016 20:27:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=u4d4iTgkZaPFcVyaH/UvDIKcKqnMoKRk5zCjApRhifk=; b=h7jKnfHjHhzgrFtGgdnmllGYjcnDRKhbdG5Nlz+8q3Qxg31FXt63GKzcvpmP0P0hS7 9BWmFUp3ugXUG8hngA8wGHzva/y7GQ9run3wsbFbxmxfB8zOb+g2/YBH8Obx7JVTlaim +1qnRYZKpJ2m1Inn/8vtY81Ar0YXfdx2u+dsZhsRRVEMxZgSuWbSb6xue2R4Cx8pgXyY EPdcSyNd7kDmUsb8pH2pVvR8CCNVl+r4tNSunHqCD1m2UoRY8GCDmtmhGsAxhZa5i0Ds CJUtvAv/uelcq//7CHpHlrnch+0Kz60XzOMVl/od4saXrRBuWZ19+cEVVv/SjDk0GMaq H7bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=u4d4iTgkZaPFcVyaH/UvDIKcKqnMoKRk5zCjApRhifk=; b=WngPSmKIAGXwc0ydXwLzbdgHnoCbM7ikKhOBj2DB6CeVuWRd5WNETcmYlUVrBFCQGA pA1jTp0YwSzcmaAlsVeoBq+cmP6MkOzD79wxZ4adnaunhjCxMHi/U4Zy1cxpHu5C6t5R Ione2wAogUfFSTEnRO7QbYMGCKxk5SfXCZHnkzAm3zG2DSy+O1d9Aa6dY1KiezsuCNxy pHla/vfDNEGmXN2LzsPxudhJNfRlAo62Y9oy9O6dsvhf4NnwSr098R3cyEPdDwn/ArVJ Ja7DY9xSXwMqRuGS1ZezdHdpYwbMqQfRsgFHAgy+iY+lfic4ZzEKNYY4mL9pvNpxsvdK Y2PA== X-Gm-Message-State: ALyK8tIWOcag9GuXtJU2iQZlra85iNMOgWItKSrp1HANvBcEd6LlKsPprnhHrcAUCUs7vQ== X-Received: by 10.66.237.35 with SMTP id uz3mr2284929pac.145.1464146854463; Tue, 24 May 2016 20:27:34 -0700 (PDT) Received: from [172.16.22.195] ([103.29.142.67]) by smtp.gmail.com with ESMTPSA id qm10sm8415847pac.33.2016.05.24.20.27.28 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 24 May 2016 20:27:33 -0700 (PDT) Message-ID: <57451B9C.7070705@gmail.com> Date: Wed, 25 May 2016 11:27:24 +0800 From: Caesar Wang User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Javi Merino Subject: Re: [PATCH v2 1/5] thermal: Add support for hardware-tracked trip points References: <1462268013-14992-1-git-send-email-wxt@rock-chips.com> <1462268013-14992-2-git-send-email-wxt@rock-chips.com> <20160524125741.GA8979@e104805> In-Reply-To: <20160524125741.GA8979@e104805> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160524_202755_852219_81894ED2 X-CRM114-Status: GOOD ( 25.29 ) 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: huangtao@rock-chips.com, Ni Wade , dmitry.torokhov@gmail.com, Durgadoss R , Heiko Stuebner , Jonathan Corbet , Sascha Hauer , linux-pm@vger.kernel.org, linux-doc@vger.kernel.org, dianders@chromium.org, linux-kernel@vger.kernel.org, edubezval@gmail.com, linux-rockchip@lists.infradead.org, Laxman Dewangan , smbarber@google.com, Leo Yan , cf@rock-chips.com, briannorris@google.com, Zhang Rui , Andy Champ , Caesar Wang Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Hi Javi, Thanks your reviewing. On 2016年05月24日 20:57, Javi Merino wrote: > On Tue, May 03, 2016 at 05:33:29PM +0800, Caesar Wang wrote: >> From: Sascha Hauer >> >> This adds support for hardware-tracked trip points to the device tree >> thermal sensor framework. >> >> The framework supports an arbitrary number of trip points. Whenever >> the current temperature is updated, the trip points immediately >> below and above the current temperature are found. A .set_trips >> callback is then called with the temperatures. If there is no trip >> point above or below the current temperature, the passed trip >> temperature will be -INT_MAX or INT_MAX respectively. In this callback, >> the driver should program the hardware such that it is notified >> when either of these trip points are triggered. When a trip point >> is triggered, the driver should call `thermal_zone_device_update' >> for the respective thermal zone. This will cause the trip points >> to be updated again. >> >> If .set_trips is not implemented, the framework behaves as before. >> >> This patch is based on an earlier version from Mikko Perttunen >> >> >> Signed-off-by: Sascha Hauer >> Signed-off-by: Caesar Wang >> Cc: Zhang Rui >> Cc: Eduardo Valentin >> Cc: linux-pm@vger.kernel.org >> >> --- >> >> Changes in v2: >> - update the sysfs-api.txt for set_trips >> >> Documentation/thermal/sysfs-api.txt | 7 +++++ >> drivers/thermal/thermal_core.c | 52 +++++++++++++++++++++++++++++++++++++ >> include/linux/thermal.h | 3 +++ >> 3 files changed, 62 insertions(+) >> + /* >> + * Set a temperature window. When this window is left the driver >> + * must inform the thermal core via thermal_zone_device_update. >> + */ >> + ret = tz->ops->set_trips(tz, low, high); >> + if (ret) >> + dev_err(&tz->device, "Failed to set trips: %d\n", ret); > This function can be called at the same time from multiple places so > it should be reentrant. I think you should call mutex_lock(tz->lock) > before "if (tz->prev_low_trip == low && ..." and unlock it here. Sound reasonable, fixes it in next version. >> +} >> + >> static void update_temperature(struct thermal_zone_device *tz) >> { >> int temp, ret; >> @@ -569,6 +614,8 @@ void thermal_zone_device_update(struct thermal_zone_device *tz) >> >> update_temperature(tz); >> >> + thermal_zone_set_trips(tz); >> + >> for (count = 0; count < tz->trips; count++) >> handle_thermal_trip(tz, count); >> } >> @@ -754,6 +801,9 @@ trip_point_hyst_store(struct device *dev, struct device_attribute *attr, >> */ >> ret = tz->ops->set_trip_hyst(tz, trip, temperature); >> >> + if (!ret) >> + thermal_zone_set_trips(tz); >> + > You should add a similar call to thermal_zone_set_trips() in trip_point_temp_store() No, this patch has been done. if you see the linux next kernel. 72f3ada UPSTREAM: thermal: trip_point_temp_store() calls thermal_zone_device_update() So the "thermal_zone_set_trips(tz)" have been set in thermal_zone_device_update. >> return ret ? ret : count; >> } >> >> @@ -1843,6 +1893,8 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, >> tz->trips = trips; >> tz->passive_delay = passive_delay; >> tz->polling_delay = polling_delay; >> + tz->prev_low_trip = INT_MAX; >> + tz->prev_high_trip = -INT_MAX; >> /* A new thermal zone needs to be updated anyway. */ >> atomic_set(&tz->need_update, 1); >> >> diff --git a/include/linux/thermal.h b/include/linux/thermal.h >> index e45abe7..e258359 100644 >> --- a/include/linux/thermal.h >> +++ b/include/linux/thermal.h >> @@ -98,6 +98,7 @@ struct thermal_zone_device_ops { >> int (*unbind) (struct thermal_zone_device *, >> struct thermal_cooling_device *); >> int (*get_temp) (struct thermal_zone_device *, int *); >> + int (*set_trips) (struct thermal_zone_device *, int, int); >> int (*get_mode) (struct thermal_zone_device *, >> enum thermal_device_mode *); >> int (*set_mode) (struct thermal_zone_device *, >> @@ -199,6 +200,8 @@ struct thermal_zone_device { >> int last_temperature; >> int emul_temperature; >> int passive; >> + int prev_low_trip; >> + int prev_high_trip; > Please document these fields in the kerneldoc comment before struct > thermal_zone_device. Okay, done. Thanks! - Caesar >> unsigned int forced_passive; >> atomic_t need_update; >> struct thermal_zone_device_ops *ops; > Cheers, > Javi > > _______________________________________________ > Linux-rockchip mailing list > Linux-rockchip@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-rockchip --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -733,8 +733,12 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr, return -EINVAL; ret = tz->ops->set_trip_temp(tz, trip, temperature); + if (ret) + return ret; - return ret ? ret : count; + thermal_zone_device_update(tz); + + return count; }