From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kuninori Morimoto Date: Fri, 18 Dec 2015 00:25:51 +0000 Subject: [PATCH 5/8 v6] thermal: rcar: enable to use thermal-zone on DT Message-Id: <87wpsctxjv.wl%kuninori.morimoto.gx@renesas.com> List-Id: References: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> <876100qzp6.wl%kuninori.morimoto.gx@renesas.com> <20151217203707.GD7999@localhost.localdomain> In-Reply-To: <20151217203707.GD7999@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Eduardo Valentin Cc: Simon , Zhang Rui , Geert Uytterhoeven , Magnus , linux-sh@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, "devicetree@vger.kernel.org" From: Kuninori Morimoto This patch enables to use thermal-zone on DT if it was calles as "renesas,rcar-thermal-gen2". Previous style (= non thermal-zone) is still supported by "renesas,rcar-thermal" to keep compatibility for "git bisect". Signed-off-by: Kuninori Morimoto --- v5 -> v6 - "was call" -> "was called" - add reason why it keeps previous style .../devicetree/bindings/thermal/rcar-thermal.txt | 37 +++++++++++++++++- drivers/thermal/rcar_thermal.c | 45 +++++++++++++++++++--- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/Documentation/devicetree/bindings/thermal/rcar-thermal.txt b/Documentation/devicetree/bindings/thermal/rcar-thermal.txt index 332e625..e5ee3f1 100644 --- a/Documentation/devicetree/bindings/thermal/rcar-thermal.txt +++ b/Documentation/devicetree/bindings/thermal/rcar-thermal.txt @@ -1,8 +1,9 @@ * Renesas R-Car Thermal Required properties: -- compatible : "renesas,thermal-", "renesas,rcar-thermal" - as fallback. +- compatible : "renesas,thermal-", + "renesas,rcar-gen2-thermal" (with thermal-zone) or + "renesas,rcar-thermal" (without thermal-zone) as fallback. Examples with soctypes are: - "renesas,thermal-r8a73a4" (R-Mobile APE6) - "renesas,thermal-r8a7779" (R-Car H1) @@ -36,3 +37,35 @@ thermal@e61f0000 { 0xe61f0300 0x38>; interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; }; + +Example (with thermal-zone): + +thermal-zones { + cpu_thermal: cpu-thermal { + polling-delay-passive = <1000>; + polling-delay = <5000>; + + thermal-sensors = <&thermal>; + + trips { + cpu-crit { + temperature = <115000>; + hysteresis = <0>; + type = "critical"; + }; + }; + cooling-maps { + }; + }; +}; + +thermal: thermal@e61f0000 { + compatible = "renesas,thermal-r8a7790", + "renesas,rcar-gen2-thermal", + "renesas,rcar-thermal"; + reg = <0 0xe61f0000 0 0x14>, <0 0xe61f0100 0 0x38>; + interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&mstp5_clks R8A7790_CLK_THERMAL>; + power-domains = <&cpg_clocks>; + #thermal-sensor-cells = <0>; +}; diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 30602f2..e92f29b 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -75,8 +76,10 @@ struct rcar_thermal_priv { #define rcar_has_irq_support(priv) ((priv)->common->base) #define rcar_id_to_shift(priv) ((priv)->id * 8) +#define USE_OF_THERMAL 1 static const struct of_device_id rcar_thermal_dt_ids[] = { { .compatible = "renesas,rcar-thermal", }, + { .compatible = "renesas,rcar-gen2-thermal", .data = (void *)USE_OF_THERMAL }, {}, }; MODULE_DEVICE_TABLE(of, rcar_thermal_dt_ids); @@ -200,9 +203,9 @@ err_out_unlock: return ret; } -static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) +static int rcar_thermal_get_current_temp(struct rcar_thermal_priv *priv, + int *temp) { - struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone); int tmp; int ret; @@ -226,6 +229,20 @@ static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) return 0; } +static int rcar_thermal_of_get_temp(void *data, int *temp) +{ + struct rcar_thermal_priv *priv = data; + + return rcar_thermal_get_current_temp(priv, temp); +} + +static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) +{ + struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone); + + return rcar_thermal_get_current_temp(priv, temp); +} + static int rcar_thermal_get_trip_type(struct thermal_zone_device *zone, int trip, enum thermal_trip_type *type) { @@ -282,6 +299,10 @@ static int rcar_thermal_notify(struct thermal_zone_device *zone, return 0; } +static const struct thermal_zone_of_device_ops rcar_thermal_zone_of_ops = { + .get_temp = rcar_thermal_of_get_temp, +}; + static struct thermal_zone_device_ops rcar_thermal_zone_ops = { .get_temp = rcar_thermal_get_temp, .get_trip_type = rcar_thermal_get_trip_type, @@ -318,14 +339,20 @@ static void rcar_thermal_work(struct work_struct *work) priv = container_of(work, struct rcar_thermal_priv, work.work); - rcar_thermal_get_temp(priv->zone, &cctemp); + ret = rcar_thermal_get_current_temp(priv, &cctemp); + if (ret < 0) + return; + ret = rcar_thermal_update_temp(priv); if (ret < 0) return; rcar_thermal_irq_enable(priv); - rcar_thermal_get_temp(priv->zone, &nctemp); + ret = rcar_thermal_get_current_temp(priv, &nctemp); + if (ret < 0) + return; + if (nctemp != cctemp) thermal_zone_device_update(priv->zone); } @@ -386,6 +413,8 @@ static int rcar_thermal_probe(struct platform_device *pdev) struct rcar_thermal_priv *priv; struct device *dev = &pdev->dev; struct resource *res, *irq; + const struct of_device_id *of_id = of_match_device(rcar_thermal_dt_ids, dev); + unsigned long of_data = (unsigned long)of_id->data; int mres = 0; int i; int ret = -ENODEV; @@ -444,7 +473,13 @@ static int rcar_thermal_probe(struct platform_device *pdev) if (ret < 0) goto error_unregister; - priv->zone = thermal_zone_device_register("rcar_thermal", + if (of_data = USE_OF_THERMAL) + priv->zone = thermal_zone_of_sensor_register( + dev, i, priv, + &rcar_thermal_zone_of_ops); + else + priv->zone = thermal_zone_device_register( + "rcar_thermal", 1, 0, priv, &rcar_thermal_zone_ops, NULL, 0, idle); -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933408AbbLRA0B (ORCPT ); Thu, 17 Dec 2015 19:26:01 -0500 Received: from relmlor3.renesas.com ([210.160.252.173]:42563 "EHLO relmlie2.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753512AbbLRAZ6 (ORCPT ); Thu, 17 Dec 2015 19:25:58 -0500 X-IronPort-AV: E=Sophos;i="5.20,443,1444662000"; d="scan'";a="200811097" Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Message-ID: <87wpsctxjv.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto Subject: [PATCH 5/8 v6] thermal: rcar: enable to use thermal-zone on DT User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Eduardo Valentin CC: Simon , Zhang Rui , Geert Uytterhoeven , Magnus , , , , "devicetree@vger.kernel.org" In-Reply-To: <20151217203707.GD7999@localhost.localdomain> References: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> <876100qzp6.wl%kuninori.morimoto.gx@renesas.com> <20151217203707.GD7999@localhost.localdomain> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset="US-ASCII" Date: Fri, 18 Dec 2015 00:25:51 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: HK2PR02CA0019.apcprd02.prod.outlook.com (25.163.104.157) To SIXPR06MB1022.apcprd06.prod.outlook.com (25.160.239.156) X-Microsoft-Exchange-Diagnostics: 1;SIXPR06MB1022;2:0R5ZcDOLO2r1E6uy6uHlq7ezdfZUNsmJzH/kEngnps99Vhud6au/5QANEUlW8wZymnACzvoMQE5WBNm8MGox0wObHYwkTUVE7SRFlBw3EykfqPXx06No/a5IA1TU8R+OEoLCj+jgy6+o/FciYmfZUg==;3:1tvxBF2/pZiIsZWeU78uSKdxI0O4mybKctuw3u8mSNZ+h/GakGCShfXnzVlQuJ0u1WyqqdcvSSeq3q/UO0u3WEY3Sg56pN7k6YlGHCdaZbbtvbgsatGPDN+KRSdaCBiO;25:lhcQnECEju/BNmau6wVkuVIg2fhgHtkjuEoKt7wM+fsSJqiM2Edi1Kwk9fidfo96TDP5l6lA1XYqfcZ9t62BahOXrXSrTKrOCvrV/XxayVEjz1sltagnL83Po2QMhQWq5LFkY1hNLsltop+gnwz/b+o0f9qEPLUx6cjL7vfD5J8rUIE/SHO5dWB1NXgf0h9F061AMgx3MjsxWso5yf83TaPkKSEhG8cq5edBmkjek9ouQqLGC72uH6kO+O5V72o3b5EdRph0y0kAV0ikKQ3hLQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SIXPR06MB1022; X-Microsoft-Exchange-Diagnostics: 1;SIXPR06MB1022;20:Wk6qq7qqqaswCizTQNCH8gLj+/0RpfzieJmjlJgsHAn1Ld0XbX4GOBh/CsWANowHEHrOkHzsp+jHJ9QGP6F//44l1zPFM3UgFhTlzwShg3WOXmFj/tYi/Y6Hc91I4/Xliq9lPNKGGO1kU82+0X5IX6LkvACeOycPOkvIY+1CSjaHYYjN7D5ElPw8x+4X5r8ILQZvYKJBGbEyrKeaVzocSa8Y/+SnPOGve/2qNQGdxnYZ7hCnAGxG9vMvdL/jrHPySRQzdgXB8tNqKoLvuUUdopTfXIAd64G6HF93rIXhJ9x8c4P839yWPSdIksMz0UUGBh+77noYT5ZqiSrUY5oKGgWzOMtJfpNbS70Lo6yuPJ6ja93wOOhcvK05BDuoIidIsNB5oM/u8NzDvRj0NE547B2gAc8xyO0LgtY4rimu8YlZ25HGEHovpMDe3MeOv2dg/q/dlmUcbHIZMcY8uV4pwBjhcCwgSekrdxB8uDsUWLkIvv/skZV+aAxR3Xzce7fs;4:5/CKWxNUZn2lsZTE/uVLDWcFdq/jmDMUcewFE4hSgdwEQTltH8l7hu6VkympPlUt0kNaB1+C541Edm9t6YPtZAOxEixplde7+LkNHjNeKx4xdPxZMeX9sQdPKsEKYJCeDEK5CM7U9a2vSpI1fiQOpvIYzUvQdr6OoI4o+uBtlfFlQpoXxHLOL9TBo7EdCJRFkd2EF4VWCV4QxuNqpMnJUvZ/aIRayxTFWb8zWgFxWnrWx8l94pViB8JrgyMa1iPNuSo3U0l/WP7WDQdkxBJnRiOQCXFYf7QWPnjrdHaD+vWg6l21ppB0tSamKKX4Eeda/Ap/8FK1IPKPpYnVm4zjNkCPHMn7k/GtA1RfAKa9oKSA8jNA0QMVFc6uIwy6jedrIbnwMUBw7mjwuNkhsg+NceBKMSzt5R+J1VsK3nC4YH6oJhERP6aBoPxTL77enlUm X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(85106069007906); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(10201501046);SRVR:SIXPR06MB1022;BCL:0;PCL:0;RULEID:;SRVR:SIXPR06MB1022; X-Forefront-PRVS: 07943272E1 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(189002)(199003)(19580405001)(47776003)(66066001)(5004730100002)(105586002)(50986999)(87976001)(54356999)(76176999)(1411001)(101416001)(106356001)(92566002)(83506001)(53416004)(42186005)(86362001)(33646002)(229853001)(19580395003)(189998001)(5008740100001)(110136002)(50466002)(2950100001)(23726003)(46406003)(5001960100002)(3846002)(6116002)(40100003)(586003)(81156007)(122386002)(69596002)(97736004)(4001350100001)(1096002)(36756003)(77096005);DIR:OUT;SFP:1102;SCL:1;SRVR:SIXPR06MB1022;H:morimoto-PC.renesas.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SIXPR06MB1022;23:UVc1Nse776YOdqEhbRct/vdgmIoR/He3YW2XX7PP3?= =?us-ascii?Q?2PfaHuqHL+xXjsWu8OT3uzJhQc47MGT6kkzbGIoPJYqqV7jZ6gj/Mt20s4SG?= =?us-ascii?Q?V5hobq2nVPYQJbx/pcphS40aidQBwuHLoBIH8kSR63PSrB592JQvr/CLCSit?= =?us-ascii?Q?ubag60rNHj2IBGUjPTUNuSwjojXVHOfv/7pmXRm/Fk1VYJXlIQsIVUznqmI9?= =?us-ascii?Q?ys66PkQEyGumlKrpQOKduxC9VbLTVeFkVauKQyWGqAEMGkeIDbGcHXnW4DjD?= =?us-ascii?Q?TiLMGRQRYy6WlBcBROi97j541i6EIy7uZ+av62y/EAVeVYhh7/02kDgtvovB?= =?us-ascii?Q?pceBAzIdQQVqinjX9Ay+IrDSg6YU8ol0uDTJprwg+RuIYcq/AgoXT4nQHcoK?= =?us-ascii?Q?fkKMV9QskCm6WCWQ7IQ3gc8ZlofJGkI1KGUU6XlVR+28PRo7ZEShkDJxct34?= =?us-ascii?Q?TjROTojV8BsDlKx4mXLFIbwvKk/XyVB8fW3qMkEnIL325dqgNQdSP8OqEDCk?= =?us-ascii?Q?7Dz6Yxa0sSxAmBYJy6xSQayvinqyQWbLgUer8kRcqJ2qhBRtZuSXChP9IuTM?= =?us-ascii?Q?FgCPfUeTQcbcKJ/AKcNCyflJn+vMJgCtI+OvLFnclvAptDj9qA9y2mUspgoB?= =?us-ascii?Q?beMgLVD7XmxsAQ/T7dqYwh9g42AaCAh8VnXmrKoO5CPu+rX/etFlgPiQFf5/?= =?us-ascii?Q?k7tpwuXfVkg3hyYhacRh18jSjv4ernOxjBlI+DUCHVJHY90LOdJNsjy9lF5F?= =?us-ascii?Q?UxoACT4NWsxY/ZMI/kCjhZrDaN/23CTts+jjTcjfVESC05l1Btwxd4eT8dv5?= =?us-ascii?Q?jB/6zBAypoauKJhkDB9EUWSc+J8viQTbxvxk43T4DM9dJIUunj49TPunr3VX?= =?us-ascii?Q?QB7XDEpwZMFUgg88LELv3EcHlB946yJOk9n5Hd8Uo0AIT1KIHD941TGzQpUG?= =?us-ascii?Q?03lENUcZed4WFBQES48ULq5tDcCTdlt5fwsvmPxCT2A1OU0OYYjCoKk81i3N?= =?us-ascii?Q?vAHjkQY6m1YkPgUoMvKeVvmCGXrPR5prgHA02RedHzCjOZAXqv+sICFd8J1W?= =?us-ascii?Q?Kd9shrrGGTvl/UlRAHqlE5mkeX6My5CHi9XVo9RGGuS5rwftIlXvZ80mFdoq?= =?us-ascii?Q?0+qX53qnkY=3D?= X-Microsoft-Exchange-Diagnostics: 1;SIXPR06MB1022;5:2dr5RdSy/blPgvYewgbCiAFxmIogd7JRJ+t0uW2k7hk82yl0VKfqRAX8WDyNjoL5vEvNkqeq+nTwsdzqoxdrVsLOTO5cyF9OWNHZki5Kt/qRWkig6Z2TGYDbuyDGSDHHy/JUClTcwea3OZxyx9IxKQ==;24:YP5Hz1FMkWJIs6cuIbV6LVT7WYH8UM1tyPjyZjlQMPrtM7hR4jAC90u5Htn+W8sCcbazuwajpQsqmL7aZrPxihE6YF7BHPgYLkX/ZeWSvA0=;20:pztl6mutfBRZsh3nlcmMeDF80Uwpo1HH7e5MwyPiE1TGojPpHMEKp3oB/z36yGsTcP6IyS+QD87lUl34N6/Z9BSElxXbzju4zSxEFJibSI6TEk0W34Tw9gWHt95fYTrPf3fdRKL7AYqYTUwIt7zEcyTEupaHFh1dZDBqyyqujoI= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Dec 2015 00:25:51.9345 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SIXPR06MB1022 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kuninori Morimoto This patch enables to use thermal-zone on DT if it was calles as "renesas,rcar-thermal-gen2". Previous style (= non thermal-zone) is still supported by "renesas,rcar-thermal" to keep compatibility for "git bisect". Signed-off-by: Kuninori Morimoto --- v5 -> v6 - "was call" -> "was called" - add reason why it keeps previous style .../devicetree/bindings/thermal/rcar-thermal.txt | 37 +++++++++++++++++- drivers/thermal/rcar_thermal.c | 45 +++++++++++++++++++--- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/Documentation/devicetree/bindings/thermal/rcar-thermal.txt b/Documentation/devicetree/bindings/thermal/rcar-thermal.txt index 332e625..e5ee3f1 100644 --- a/Documentation/devicetree/bindings/thermal/rcar-thermal.txt +++ b/Documentation/devicetree/bindings/thermal/rcar-thermal.txt @@ -1,8 +1,9 @@ * Renesas R-Car Thermal Required properties: -- compatible : "renesas,thermal-", "renesas,rcar-thermal" - as fallback. +- compatible : "renesas,thermal-", + "renesas,rcar-gen2-thermal" (with thermal-zone) or + "renesas,rcar-thermal" (without thermal-zone) as fallback. Examples with soctypes are: - "renesas,thermal-r8a73a4" (R-Mobile APE6) - "renesas,thermal-r8a7779" (R-Car H1) @@ -36,3 +37,35 @@ thermal@e61f0000 { 0xe61f0300 0x38>; interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; }; + +Example (with thermal-zone): + +thermal-zones { + cpu_thermal: cpu-thermal { + polling-delay-passive = <1000>; + polling-delay = <5000>; + + thermal-sensors = <&thermal>; + + trips { + cpu-crit { + temperature = <115000>; + hysteresis = <0>; + type = "critical"; + }; + }; + cooling-maps { + }; + }; +}; + +thermal: thermal@e61f0000 { + compatible = "renesas,thermal-r8a7790", + "renesas,rcar-gen2-thermal", + "renesas,rcar-thermal"; + reg = <0 0xe61f0000 0 0x14>, <0 0xe61f0100 0 0x38>; + interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&mstp5_clks R8A7790_CLK_THERMAL>; + power-domains = <&cpg_clocks>; + #thermal-sensor-cells = <0>; +}; diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 30602f2..e92f29b 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -75,8 +76,10 @@ struct rcar_thermal_priv { #define rcar_has_irq_support(priv) ((priv)->common->base) #define rcar_id_to_shift(priv) ((priv)->id * 8) +#define USE_OF_THERMAL 1 static const struct of_device_id rcar_thermal_dt_ids[] = { { .compatible = "renesas,rcar-thermal", }, + { .compatible = "renesas,rcar-gen2-thermal", .data = (void *)USE_OF_THERMAL }, {}, }; MODULE_DEVICE_TABLE(of, rcar_thermal_dt_ids); @@ -200,9 +203,9 @@ err_out_unlock: return ret; } -static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) +static int rcar_thermal_get_current_temp(struct rcar_thermal_priv *priv, + int *temp) { - struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone); int tmp; int ret; @@ -226,6 +229,20 @@ static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) return 0; } +static int rcar_thermal_of_get_temp(void *data, int *temp) +{ + struct rcar_thermal_priv *priv = data; + + return rcar_thermal_get_current_temp(priv, temp); +} + +static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) +{ + struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone); + + return rcar_thermal_get_current_temp(priv, temp); +} + static int rcar_thermal_get_trip_type(struct thermal_zone_device *zone, int trip, enum thermal_trip_type *type) { @@ -282,6 +299,10 @@ static int rcar_thermal_notify(struct thermal_zone_device *zone, return 0; } +static const struct thermal_zone_of_device_ops rcar_thermal_zone_of_ops = { + .get_temp = rcar_thermal_of_get_temp, +}; + static struct thermal_zone_device_ops rcar_thermal_zone_ops = { .get_temp = rcar_thermal_get_temp, .get_trip_type = rcar_thermal_get_trip_type, @@ -318,14 +339,20 @@ static void rcar_thermal_work(struct work_struct *work) priv = container_of(work, struct rcar_thermal_priv, work.work); - rcar_thermal_get_temp(priv->zone, &cctemp); + ret = rcar_thermal_get_current_temp(priv, &cctemp); + if (ret < 0) + return; + ret = rcar_thermal_update_temp(priv); if (ret < 0) return; rcar_thermal_irq_enable(priv); - rcar_thermal_get_temp(priv->zone, &nctemp); + ret = rcar_thermal_get_current_temp(priv, &nctemp); + if (ret < 0) + return; + if (nctemp != cctemp) thermal_zone_device_update(priv->zone); } @@ -386,6 +413,8 @@ static int rcar_thermal_probe(struct platform_device *pdev) struct rcar_thermal_priv *priv; struct device *dev = &pdev->dev; struct resource *res, *irq; + const struct of_device_id *of_id = of_match_device(rcar_thermal_dt_ids, dev); + unsigned long of_data = (unsigned long)of_id->data; int mres = 0; int i; int ret = -ENODEV; @@ -444,7 +473,13 @@ static int rcar_thermal_probe(struct platform_device *pdev) if (ret < 0) goto error_unregister; - priv->zone = thermal_zone_device_register("rcar_thermal", + if (of_data == USE_OF_THERMAL) + priv->zone = thermal_zone_of_sensor_register( + dev, i, priv, + &rcar_thermal_zone_of_ops); + else + priv->zone = thermal_zone_device_register( + "rcar_thermal", 1, 0, priv, &rcar_thermal_zone_ops, NULL, 0, idle); -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kuninori Morimoto Subject: [PATCH 5/8 v6] thermal: rcar: enable to use thermal-zone on DT Date: Fri, 18 Dec 2015 00:25:51 +0000 Message-ID: <87wpsctxjv.wl%kuninori.morimoto.gx@renesas.com> References: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> <876100qzp6.wl%kuninori.morimoto.gx@renesas.com> <20151217203707.GD7999@localhost.localdomain> Mime-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset="US-ASCII" Return-path: In-Reply-To: <20151217203707.GD7999@localhost.localdomain> Sender: linux-pm-owner@vger.kernel.org To: Eduardo Valentin Cc: Simon , Zhang Rui , Geert Uytterhoeven , Magnus , linux-sh@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, "devicetree@vger.kernel.org" List-Id: devicetree@vger.kernel.org From: Kuninori Morimoto This patch enables to use thermal-zone on DT if it was calles as "renesas,rcar-thermal-gen2". Previous style (= non thermal-zone) is still supported by "renesas,rcar-thermal" to keep compatibility for "git bisect". Signed-off-by: Kuninori Morimoto --- v5 -> v6 - "was call" -> "was called" - add reason why it keeps previous style .../devicetree/bindings/thermal/rcar-thermal.txt | 37 +++++++++++++++++- drivers/thermal/rcar_thermal.c | 45 +++++++++++++++++++--- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/Documentation/devicetree/bindings/thermal/rcar-thermal.txt b/Documentation/devicetree/bindings/thermal/rcar-thermal.txt index 332e625..e5ee3f1 100644 --- a/Documentation/devicetree/bindings/thermal/rcar-thermal.txt +++ b/Documentation/devicetree/bindings/thermal/rcar-thermal.txt @@ -1,8 +1,9 @@ * Renesas R-Car Thermal Required properties: -- compatible : "renesas,thermal-", "renesas,rcar-thermal" - as fallback. +- compatible : "renesas,thermal-", + "renesas,rcar-gen2-thermal" (with thermal-zone) or + "renesas,rcar-thermal" (without thermal-zone) as fallback. Examples with soctypes are: - "renesas,thermal-r8a73a4" (R-Mobile APE6) - "renesas,thermal-r8a7779" (R-Car H1) @@ -36,3 +37,35 @@ thermal@e61f0000 { 0xe61f0300 0x38>; interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; }; + +Example (with thermal-zone): + +thermal-zones { + cpu_thermal: cpu-thermal { + polling-delay-passive = <1000>; + polling-delay = <5000>; + + thermal-sensors = <&thermal>; + + trips { + cpu-crit { + temperature = <115000>; + hysteresis = <0>; + type = "critical"; + }; + }; + cooling-maps { + }; + }; +}; + +thermal: thermal@e61f0000 { + compatible = "renesas,thermal-r8a7790", + "renesas,rcar-gen2-thermal", + "renesas,rcar-thermal"; + reg = <0 0xe61f0000 0 0x14>, <0 0xe61f0100 0 0x38>; + interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&mstp5_clks R8A7790_CLK_THERMAL>; + power-domains = <&cpg_clocks>; + #thermal-sensor-cells = <0>; +}; diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 30602f2..e92f29b 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -75,8 +76,10 @@ struct rcar_thermal_priv { #define rcar_has_irq_support(priv) ((priv)->common->base) #define rcar_id_to_shift(priv) ((priv)->id * 8) +#define USE_OF_THERMAL 1 static const struct of_device_id rcar_thermal_dt_ids[] = { { .compatible = "renesas,rcar-thermal", }, + { .compatible = "renesas,rcar-gen2-thermal", .data = (void *)USE_OF_THERMAL }, {}, }; MODULE_DEVICE_TABLE(of, rcar_thermal_dt_ids); @@ -200,9 +203,9 @@ err_out_unlock: return ret; } -static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) +static int rcar_thermal_get_current_temp(struct rcar_thermal_priv *priv, + int *temp) { - struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone); int tmp; int ret; @@ -226,6 +229,20 @@ static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) return 0; } +static int rcar_thermal_of_get_temp(void *data, int *temp) +{ + struct rcar_thermal_priv *priv = data; + + return rcar_thermal_get_current_temp(priv, temp); +} + +static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp) +{ + struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone); + + return rcar_thermal_get_current_temp(priv, temp); +} + static int rcar_thermal_get_trip_type(struct thermal_zone_device *zone, int trip, enum thermal_trip_type *type) { @@ -282,6 +299,10 @@ static int rcar_thermal_notify(struct thermal_zone_device *zone, return 0; } +static const struct thermal_zone_of_device_ops rcar_thermal_zone_of_ops = { + .get_temp = rcar_thermal_of_get_temp, +}; + static struct thermal_zone_device_ops rcar_thermal_zone_ops = { .get_temp = rcar_thermal_get_temp, .get_trip_type = rcar_thermal_get_trip_type, @@ -318,14 +339,20 @@ static void rcar_thermal_work(struct work_struct *work) priv = container_of(work, struct rcar_thermal_priv, work.work); - rcar_thermal_get_temp(priv->zone, &cctemp); + ret = rcar_thermal_get_current_temp(priv, &cctemp); + if (ret < 0) + return; + ret = rcar_thermal_update_temp(priv); if (ret < 0) return; rcar_thermal_irq_enable(priv); - rcar_thermal_get_temp(priv->zone, &nctemp); + ret = rcar_thermal_get_current_temp(priv, &nctemp); + if (ret < 0) + return; + if (nctemp != cctemp) thermal_zone_device_update(priv->zone); } @@ -386,6 +413,8 @@ static int rcar_thermal_probe(struct platform_device *pdev) struct rcar_thermal_priv *priv; struct device *dev = &pdev->dev; struct resource *res, *irq; + const struct of_device_id *of_id = of_match_device(rcar_thermal_dt_ids, dev); + unsigned long of_data = (unsigned long)of_id->data; int mres = 0; int i; int ret = -ENODEV; @@ -444,7 +473,13 @@ static int rcar_thermal_probe(struct platform_device *pdev) if (ret < 0) goto error_unregister; - priv->zone = thermal_zone_device_register("rcar_thermal", + if (of_data == USE_OF_THERMAL) + priv->zone = thermal_zone_of_sensor_register( + dev, i, priv, + &rcar_thermal_zone_of_ops); + else + priv->zone = thermal_zone_device_register( + "rcar_thermal", 1, 0, priv, &rcar_thermal_zone_ops, NULL, 0, idle); -- 1.9.1