From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kuninori Morimoto Date: Tue, 15 Dec 2015 01:18:39 +0000 Subject: [PATCH 5/8 v5] thermal: rcar: enable to use thermal-zone on DT Message-Id: <876100qzp6.wl%kuninori.morimoto.gx@renesas.com> List-Id: References: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> In-Reply-To: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Simon , Zhang Rui , Eduardo Valentin Cc: 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 call as "renesas,rcar-thermal-gen2". Previous style is still supported by "renesas,rcar-thermal". Signed-off-by: Kuninori Morimoto --- v4 -> v5 - "1150000" -> "115000" on rcar-thermal.txt .../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 S933167AbbLOBSs (ORCPT ); Mon, 14 Dec 2015 20:18:48 -0500 Received: from relmlor2.renesas.com ([210.160.252.172]:33179 "EHLO relmlie1.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753739AbbLOBSp (ORCPT ); Mon, 14 Dec 2015 20:18:45 -0500 X-IronPort-AV: E=Sophos;i="5.20,429,1444662000"; d="scan'";a="201809473" Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Message-ID: <876100qzp6.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto Subject: [PATCH 5/8 v5] thermal: rcar: enable to use thermal-zone on DT User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") To: Simon , Zhang Rui , Eduardo Valentin CC: Geert Uytterhoeven , Magnus , , , , "devicetree@vger.kernel.org" In-Reply-To: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> References: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> Content-Type: text/plain; charset="US-ASCII" Date: Tue, 15 Dec 2015 01:18:39 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: TY1PR01CA0007.jpnprd01.prod.outlook.com (25.161.131.145) To SG2PR06MB1020.apcprd06.prod.outlook.com (25.161.9.28) X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB1020;2:zVBBSxIIlG9xKKzr6ppIfLIT12Ehe+CsTzkDz6xSQs8uBBXcOmX/+V/ZXjR+RsockVUqsThYbx6TkhD3i48qcxY28BAI4zYWoCQdh+94tHVe+zoSCxaxWOUKBl8M57v516o7/dE2nF2GFbYbMc2JQQ==;3:DpcIW0BULq9Btkbwa+33V/YB+fKvXDUtzyac8VsjGdRl0cqfS9Y+NKNiT68X9/00OrFi9rgrc6K44EzfWNm91loAmruZEEcL30G5PFWe+XtASK/hrl2kAM/O9wrHC5ct;25:cVbnUL0tA15UuXwV/gzT1FjvveEAvZdYJclTE9Jm75qpsg5WjdawWFV2OcdDXV8/9g0ee4xjg6/xn1cu1MqHf4OngSathDj+hX00wxPCVPFDYJamT4rDwAYHzuldiGWeYVUPqBfG4xCNHmsMUINSL3PWr7D+GRK8y9c+z2lU7iAtkqr+pYhHyf66NQdwvsIntrvx+DrFc2hKjeAjirsVF2trrib+702GQmE6XejkgWDQ7ZhqrIZ5GstvmDWOTPsBWK9JaKL5ZYgzH9ET52+L2w== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SG2PR06MB1020; X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB1020;20:Tn21vctUuPMtIiEC6CGch7hx2pAtBiLUIPtXa6gTyrvhw5ui9yV4JnxIjQCpzSveW4HxyN+YJnDuTNGHtBNQP0wlWH+RJguF4pf92tHJpe70F+OSLYOyX0P0p18uevyfNHHMTzCmsF+Du9cQ+zxh9TMSDoVPDIx4Me7jP/du0YzBbNkVnL2mOMqJoMkBmSPojLZTn9+0AziisWcNav7souG6+BKPY+j87UU3PA0Mp2peOApFrV3hTiLkH9VAdFjY+aj9sm7YnJ2TxmGMqzLl37+t+QeLczcUNgYiyt2joVV/9j53mYsmaFtPogygsjbseS4I5AeLCm4zaEcW8GAMo/AyIgIX/PyWUlf3mgsfnhCH7ik1TFMShYMzllQ+DzTBN++GANGDWkYqkx1I7x+wMHjdODvc6ecHu0ROgbf8Ow79sQM+it6GPAnoydsQknoPzEDXcYuqtI2YQjhNFY+/AFMLb8BrEDuXENAgiRiE3uiOEJIB8UL/Nfrq8xT2zAmp;4:/e2wCvkRR8DHGuv6YeRkLgAKTySgyMbzoMkQH5IelnQbfjCH/uNXCKj7qoTx3asMJykVmFSJ9EttMo163Ge3PRVAbn1OlL2jEZQSCcNNN7wqB4lpCN4sGLl8VXDnYbeH2tzX8UXb/+abU9l6etiUai4uOrC1XxzPeBJYxWY9bIbSvgoD3gdX1wSUvaD4yhI8vkFXe3N4w9lFwmi430PbXIJ7fgDsmGH10IYReyXTRsd7WfJMmt6EGzY+JwYqRTUma7CrpVu4pspW+VKsTBCUJX7FAuPgJTgn8IG4w5gE5WFDhaDVNuYq+Va1xMXO0AhM0D2oSJ41an+kktqUndufH9sBH9VYh7SlaZdNffG3jeCswNezPn+3AbZSge/egsctnFMeW/9ine4YMAytt8QXD8efWEFTONC3chm2Q69Gq6N8Zwh/60ETImtoO0QVxSxf 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:SG2PR06MB1020;BCL:0;PCL:0;RULEID:;SRVR:SG2PR06MB1020; X-Forefront-PRVS: 07915F544A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(189002)(199003)(50466002)(5004730100002)(6116002)(229853001)(54356999)(92566002)(101416001)(76176999)(33646002)(53416004)(69596002)(77096005)(19580395003)(42186005)(23726003)(83506001)(87976001)(106356001)(105586002)(2950100001)(50986999)(86362001)(3846002)(36756003)(47776003)(81156007)(5001770100001)(122386002)(40100003)(66066001)(19580405001)(4001350100001)(97736004)(5001960100002)(586003)(189998001)(5008740100001)(1096002)(46406003);DIR:OUT;SFP:1102;SCL:1;SRVR:SG2PR06MB1020;H:morimoto-PC.renesas.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SG2PR06MB1020;23:ZAJ5or6AL1HIG+cBh/Uye/j7vRB4/hG8Yyic9wb/J?= =?us-ascii?Q?KykkaawjvN12BKXbqSeUzZg7Yc8ResrgCHX6V8F1JeAT2u1MIW3WQZbmecB1?= =?us-ascii?Q?gGYmTLu9Z3a7YJWEFJPxa5pSOeJHiTWuR73342HRipP2uZhj0Jz4iBUBCUEP?= =?us-ascii?Q?bnaO+LeT35s/c7CP/m31a6UAmIhusch5iniptdM7MKW82E/uC8eWbvdEm4Br?= =?us-ascii?Q?jFfH0CK6atl4iWhbwP1vwK5+f/tOoZ7Pve6Do0J9PM9TsNgfJEILR547axaq?= =?us-ascii?Q?UnpEbiw9K50MdQ505qmSaMoMib4EbUOV1xhdV10uQNzCuQy7bSc6RNH6VDaW?= =?us-ascii?Q?Bb6n4qhtvmPn+W2JbMimyZ6LhYBHWfD5bHqTRK5cCd+0jIbqvf1D71tClpCU?= =?us-ascii?Q?jKsP28jqLKbfVlPGWHyngipxm/LHMPz091m3FxwWFHuIEUoKu8eT7WU4ECUu?= =?us-ascii?Q?rbHSvYypdVptSHDVZc6U3j/bazdTth3id53c8/3Q+uNMl9U1s6DPGM3n0XYI?= =?us-ascii?Q?h2Vg+Jfm4pEIC4b1Pm13wNjMJT2Kt8xqOCSy6dNTbnLUY8R9RwU5w/M5Ln/K?= =?us-ascii?Q?0zywI/h8vKARcL3zo7NIjk9BLPPoFSKum97xr4BMRb8XtKJgMzOfTgJgOR2+?= =?us-ascii?Q?uwK6ud0J4167JxUxqLaMPaC6lr9qqKp2uF4GrWlGgyzLQs3zZDOYgqcuda+5?= =?us-ascii?Q?XvwCnaYK1QNi4ijjN+2ZEl4DYo1WKgTVqOf5ht9Tqx7IWmUQMUvLASYEMYsf?= =?us-ascii?Q?GMSZT8W3/IDx6qfUb97iyYvr6MD3GUc9qU1/6LM2NjKjrsXm2vomKG9pgtVr?= =?us-ascii?Q?4gISHb4b+LhUT0GXchk9xSmEw4Wsp3tdaz8VT8ae9j253gCEI4icwD5RVd23?= =?us-ascii?Q?3WFFVJlNm+Pjaf2OcD+jSRWBJq68x4fkG53bhXvPZJfP2aKne3AJYrP2ruQF?= =?us-ascii?Q?jZhlOxF6/N70IfWA5WLZYrYwPYEWl9i8j7XvFqAT9K+9onwWD6dHfj7eNxMU?= =?us-ascii?Q?aaEsQeljx+HCUCE/L8hUZIpjxbbARaVndWAqjm5PAI077vVFZF+Ku8LMWgaa?= =?us-ascii?Q?Jb1lfIFFh5c1+N8tEpCcv1cdnj5ICgJMyPV8vluh/g7eQ9uEL2AI9Af0eXo8?= =?us-ascii?Q?O49stTkYs0=3D?= X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB1020;5:k3/rQtHguKmuEKJ0kdyolLP3QFIqEZIjwadjNtoANBiBREDbFo/q9tnM0K+1t5qqEHx6qAq49qG8iNA3jo8bREy8/clkqG7UXUpXno0GC4VF2o3P6nCU1LFJ7P7pP2xWkUQyXy6mNHJA8SiwxDbC5w==;24:oIKwxQkfHge2/H1GIwqFT/ZXgBI+Yc+APuTSHn2m4JFiCxCYQrcZlbcXYUPjzFqqPHw8veQMbvU/p+tRn4CrhqtirYaypXWUZ/VWlv78sfM=;20:6MdT/Qd0t9hd++ZM1VY5aIJtqto6AU7Ep3T4uhrXfcRRc9eXXJmKpGrJhyRqGDxGldZ31P2k8pz5mfibMZ2JumSZHleQ4fxGsmZeYfV3ZK5u16vxGUdPNcO44oiK3OD3ZY9IDEEwCfTZTslp/eAJ3pJyG3qyyOJEG0bQuXv6tbc= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Dec 2015 01:18:39.1290 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR06MB1020 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 call as "renesas,rcar-thermal-gen2". Previous style is still supported by "renesas,rcar-thermal". Signed-off-by: Kuninori Morimoto --- v4 -> v5 - "1150000" -> "115000" on rcar-thermal.txt .../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 v5] thermal: rcar: enable to use thermal-zone on DT Date: Tue, 15 Dec 2015 01:18:39 +0000 Message-ID: <876100qzp6.wl%kuninori.morimoto.gx@renesas.com> References: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> Mime-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset="US-ASCII" Return-path: In-Reply-To: <87d1u8qzsy.wl%kuninori.morimoto.gx@renesas.com> Sender: linux-sh-owner@vger.kernel.org To: Simon , Zhang Rui , Eduardo Valentin Cc: 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 call as "renesas,rcar-thermal-gen2". Previous style is still supported by "renesas,rcar-thermal". Signed-off-by: Kuninori Morimoto --- v4 -> v5 - "1150000" -> "115000" on rcar-thermal.txt .../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