Received: by 2002:a05:6a10:2785:0:0:0:0 with SMTP id ia5csp1922492pxb; Sun, 10 Jan 2021 16:42:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJxr+tGTHPpSB2V7ceEWRVVaoSH2LsrwUE6lcaCyNpw3MLxabGvTVkgFhPMW7GqKSt/KKmIo X-Received: by 2002:a50:fc96:: with SMTP id f22mr12957632edq.162.1610325738938; Sun, 10 Jan 2021 16:42:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610325738; cv=none; d=google.com; s=arc-20160816; b=iROPBqhUPQ4ADh6rkTsbR55U2HYbeeyPKjzhMCun5fyD7Vj70oscUvntG4+Q+HqXzf msL0fm3vFU19WigcqUmGA4zzw0NpLgptjtk9hd0MSUE4gPf9KN69KlX1lDSFHtI/NgxZ DiDTrm0qzpdLv5leHyl5LM6Kd8GGdcHJDPYnMlIk1/3YRCd41S/iUjH5+Fh2dneQB/o/ Pmmd4xCCj3fQMeh9jm3oNFwGS75qGwETZinQ+DnheKqCWAbiAetSLs3X1+x878grC0ZR y4pkrkDbA0TIXga1aNRItXLAhep5bp43uu1u4karisw+uYv+NangDElmK0DWKZJ0Az4P Pw5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=tfW1bXDcu/lByxe5Lzd9326trCLUNqKWrb1d3xD70zE=; b=EuglWFAKCh0yMew2NUwemoPx/SFyOMY4V5oHVwbYTL/11zmKc00NbA4b3pV4/YRMGq S6CeQRDR9DAodj/Qc7inVZZykWFho5P02AeSUN2TT2zkoG9TmenM2G96pFkllQnh6NXP wFTDJOltsI0gXrr9++8arEQ+sHth6JM3aj+maVn5Fz4nW5yLYIWJZzRYTiNSCOwMs1vX inyH1hTvwjM9HS7Fsdc6+z7Lnsnn1vG9fWkrtRgLxHxM7vEXyEOLLKpZZJfcJIoAk8kO EPNfsZ8G1H9VzxN7F4BoMAKi4fm5S4Wo5Dk0FQiefOfJ7Lyl+9DHmABavToFSAvVjga0 Kqdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=Vcss8DRQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r17si6590236edq.47.2021.01.10.16.41.55; Sun, 10 Jan 2021 16:42:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=Vcss8DRQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727112AbhAKAj5 (ORCPT + 99 others); Sun, 10 Jan 2021 19:39:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727094AbhAKAj5 (ORCPT ); Sun, 10 Jan 2021 19:39:57 -0500 Received: from mail-vk1-xa2b.google.com (mail-vk1-xa2b.google.com [IPv6:2607:f8b0:4864:20::a2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 606B0C061795 for ; Sun, 10 Jan 2021 16:39:16 -0800 (PST) Received: by mail-vk1-xa2b.google.com with SMTP id a6so3872673vkb.8 for ; Sun, 10 Jan 2021 16:39:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=tfW1bXDcu/lByxe5Lzd9326trCLUNqKWrb1d3xD70zE=; b=Vcss8DRQLz+AJgqcoiMcwtcRHNY+1FT4m5PO1GpPO7uSSe/h3lptsFESwXv6y/jDPn uZeESDldBzFW4P11UXupd8R0iDzHZdVW2iUmfDvnV2JfbnEIKbc1827Nlg2rjywQnJk9 03bSP87LEsYrhPVKci/2g8cz3XGXrRryTp/58= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=tfW1bXDcu/lByxe5Lzd9326trCLUNqKWrb1d3xD70zE=; b=RzFA5JAjhd/JqfTRLTYA6bOIQfvIGrLfOX7IpHA1H6VWaEZPjoUOPVoebHzCcoHUbg pQBuoX+ZNKIo+krKehHefpsmJD0w/xWnfOyTwW9OvsNYUm6lyZb/zJ0xJ/MGxJ2WZabg 9idehqPktT7OFks0qeHHCqUdAvklbDHMD9X22MZekIIa+ln6qjQZHxuyeTgBRro5s8Wb mLFzqZS/+g5OxB2mmq+bGluiuswkHVwfTHiQ+7t/wSLW4zMGz5ErYWfVXXdqV8biTc9d GZ4YO9NANWRG1lH0gWFBDdoqUprMcJZ6bo7owDucwbWgrfZUpHgbIdt2gWbUSxKD37H5 OaDg== X-Gm-Message-State: AOAM533m9CuyU7ditlOPz/WXAsi3htqTp/ZEGN64k1cmV9rYrMXWIwis JUI0eiXLs7TsubQHtLeBMfl1/BgwT819jvrtlOgfwQ== X-Received: by 2002:ac5:c5b5:: with SMTP id f21mr10963955vkl.13.1610325555144; Sun, 10 Jan 2021 16:39:15 -0800 (PST) MIME-Version: 1.0 References: <20201013102358.22588-1-michael.kao@mediatek.com> <20201013102358.22588-4-michael.kao@mediatek.com> In-Reply-To: <20201013102358.22588-4-michael.kao@mediatek.com> From: Nicolas Boichat Date: Mon, 11 Jan 2021 08:39:04 +0800 Message-ID: Subject: Re: [v5 3/3] thermal: mediatek: add another get_temp ops for thermal sensors To: Michael Kao Cc: Zhang Rui , Daniel Lezcano , "open list:THERMAL" , srv_heupstream , Eduardo Valentin , Rob Herring , Mark Rutland , Matthias Brugger , Hsin-Yi Wang , Devicetree List , lkml , linux-arm Mailing List , "moderated list:ARM/Mediatek SoC support" Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Oct 13, 2020 at 6:24 PM Michael Kao wrote: > > Provide thermal zone to read thermal sensor > in the SoC. We can read all the thermal sensors > value in the SoC by the node /sys/class/thermal/ > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > on the first read of sensor that often are bogus values. > > This can avoid following warning on boot: > > thermal thermal_zone6: failed to read out thermal zone (-13) > > Signed-off-by: Michael Kao > Signed-off-by: Hsin-Yi Wang > --- > drivers/thermal/mtk_thermal.c | 99 +++++++++++++++++++++++++++-------- > 1 file changed, 76 insertions(+), 23 deletions(-) > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > index 0bd7aa564bc2..43c7bdbc147f 100644 > --- a/drivers/thermal/mtk_thermal.c > +++ b/drivers/thermal/mtk_thermal.c > @@ -245,6 +245,11 @@ enum mtk_thermal_version { > > struct mtk_thermal; > > +struct mtk_thermal_zone { > + struct mtk_thermal *mt; > + int id; > +}; > + > struct thermal_bank_cfg { > unsigned int num_sensors; > const int *sensors; > @@ -637,6 +642,32 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > mutex_unlock(&mt->lock); > } > > +static u32 _get_sensor_temp(struct mtk_thermal *mt, int id) > +{ > + u32 raw; > + int temp; > + > + const struct mtk_thermal_data *conf = mt->conf; nit: You only use conf once, so I'd just use mt->conf->msr[id] below. (or at least use conf->version instead of mt->conf->version just below) > + > + raw = readl(mt->thermal_base + conf->msr[id]); > + > + if (mt->conf->version == MTK_THERMAL_V1) > + temp = raw_to_mcelsius_v1(mt, id, raw); > + else > + temp = raw_to_mcelsius_v2(mt, id, raw); > + > + /* > + * The first read of a sensor often contains very high bogus > + * temperature value. Filter these out so that the system does > + * not immediately shut down. > + */ > + > + if (temp > 200000) > + return -EAGAIN; nit: one space between return and -EAGAIN. > + else > + return temp; ditto. > +} > + > /** > * mtk_thermal_bank_temperature - get the temperature of a bank > * @bank: The bank > @@ -649,26 +680,10 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > struct mtk_thermal *mt = bank->mt; > const struct mtk_thermal_data *conf = mt->conf; nit: Since this is now only used once, drop this variable? > int i, temp = INT_MIN, max = INT_MIN; > - u32 raw; > > for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > - raw = readl(mt->thermal_base + conf->msr[i]); > - > - if (mt->conf->version == MTK_THERMAL_V1) { > - temp = raw_to_mcelsius_v1( > - mt, conf->bank_data[bank->id].sensors[i], raw); The new version of the code does this instead: temp = raw_to_mcelsius_v1(mt, i, raw); What's the difference between conf->bank_data[bank->id].sensors[i] and i? > - } else { > - temp = raw_to_mcelsius_v2( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } > > - /* > - * The first read of a sensor often contains very high bogus > - * temperature value. Filter these out so that the system does > - * not immediately shut down. > - */ > - if (temp > 200000) > - temp = 0; > + temp = _get_sensor_temp(mt, i); > > if (temp > max) > max = temp; > @@ -679,7 +694,8 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > > static int mtk_read_temp(void *data, int *temperature) > { > - struct mtk_thermal *mt = data; > + struct mtk_thermal_zone *tz = data; > + struct mtk_thermal *mt = tz->mt; > int i; > int tempmax = INT_MIN; > > @@ -698,10 +714,28 @@ static int mtk_read_temp(void *data, int *temperature) > return 0; > } > > +static int mtk_read_sensor_temp(void *data, int *temperature) > +{ > + struct mtk_thermal_zone *tz = data; > + struct mtk_thermal *mt = tz->mt; > + int id = tz->id - 1; > + > + if (id < 0) > + return -EACCES; nit: one space after return. > + > + *temperature = _get_sensor_temp(mt, id); > + > + return 0; > +} > + > static const struct thermal_zone_of_device_ops mtk_thermal_ops = { > .get_temp = mtk_read_temp, > }; > > +static const struct thermal_zone_of_device_ops mtk_thermal_sensor_ops = { > + .get_temp = mtk_read_sensor_temp, > +}; > + > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > u32 apmixed_phys_base, u32 auxadc_phys_base, > int ctrl_id) > @@ -992,6 +1026,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) > u64 auxadc_phys_base, apmixed_phys_base; > struct thermal_zone_device *tzdev; > void __iomem *apmixed_base, *auxadc_base; > + struct mtk_thermal_zone *tz; > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > if (!mt) > @@ -1080,11 +1115,29 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, mt); > > - tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, mt, > - &mtk_thermal_ops); > - if (IS_ERR(tzdev)) { > - ret = PTR_ERR(tzdev); > - goto err_disable_clk_peri_therm; > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > + tz = kmalloc(sizeof(*tz), GFP_KERNEL); I don't see those structures being freed on error, or on driver unbind. Maybe use dev_kmalloc instead? > + if (!tz) > + return -ENOMEM; > + > + tz->mt = mt; > + tz->id = i; > + > + tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, i, tz, (i == 0) ? > + &mtk_thermal_ops : > + &mtk_thermal_sensor_ops); > + > + if (IS_ERR(tzdev)) { > + if (PTR_ERR(tzdev) == -ENODEV) { > + dev_warn(&pdev->dev, > + "sensor %d not registered in thermal zone in dt\n", i); > + continue; > + } > + if (PTR_ERR(tzdev) == -EACCES) { > + ret = PTR_ERR(tzdev); > + goto err_disable_clk_peri_therm; > + } > + } > } > > return 0; > -- > 2.18.0