From: Miquel Raynal <miquel.raynal@bootlin.com> To: Gregory Clement <gregory.clement@bootlin.com>, Jason Cooper <jason@lakedaemon.net>, Andrew Lunn <andrew@lunn.ch>, Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>, Zhang Rui <rui.zhang@intel.com>, Eduardo Valentin <edubezval@gmail.com> Cc: Mark Rutland <mark.rutland@arm.com>, devicetree@vger.kernel.org, Baruch Siach <baruch@tkos.co.il>, linux-pm@vger.kernel.org, Antoine Tenart <antoine.tenart@bootlin.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Maxime Chevallier <maxime.chevallier@bootlin.com>, Nadav Haklai <nadavh@marvell.com>, David Sniatkiwicz <davidsn@marvell.com>, Rob Herring <robh+dt@kernel.org>, Thomas Petazzoni <thomas.petazzoni@bootlin.com>, Miquel Raynal <miquel.raynal@bootlin.com>, linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 08/23] thermal: armada: use the resource managed registration helper alternative Date: Thu, 5 Jul 2018 18:04:22 +0200 [thread overview] Message-ID: <20180705160437.12325-9-miquel.raynal@bootlin.com> (raw) In-Reply-To: <20180705160437.12325-1-miquel.raynal@bootlin.com> Current use of thermal_zone_device_register() triggers a warning at boot and should be replaced by devm_thermal_zone_of_sensor_register(). This allows better handling of multiple thermal zones for later multi-sensors support. Also change the driver data to embed a new structure to make the difference between legacy data (which needs to be cleaned) and syscon-related data. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> --- drivers/thermal/armada_thermal.c | 123 ++++++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 22 deletions(-) diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c index be346c6afde2..dd894312dedf 100644 --- a/drivers/thermal/armada_thermal.c +++ b/drivers/thermal/armada_thermal.c @@ -64,6 +64,7 @@ struct armada_thermal_data; /* Marvell EBU Thermal Sensor Dev Structure */ struct armada_thermal_priv { + struct device *dev; struct regmap *syscon; char zone_name[THERMAL_NAME_LENGTH]; struct armada_thermal_data *data; @@ -95,6 +96,26 @@ struct armada_thermal_data { unsigned int syscon_status_off; }; +struct armada_drvdata { + enum drvtype { + LEGACY, + SYSCON + } type; + union { + struct armada_thermal_priv *priv; + struct thermal_zone_device *tz; + } data; +}; + +/* + * struct armada_thermal_sensor - hold the information of one thermal sensor + * @thermal: pointer to the local private structure + * @tzd: pointer to the thermal zone device + */ +struct armada_thermal_sensor { + struct armada_thermal_priv *priv; +}; + static void armadaxp_init(struct platform_device *pdev, struct armada_thermal_priv *priv) { @@ -243,16 +264,14 @@ static bool armada_is_valid(struct armada_thermal_priv *priv) return reg & priv->data->is_valid_bit; } -static int armada_get_temp(struct thermal_zone_device *thermal, - int *temp) +static int armada_read_sensor(struct armada_thermal_priv *priv, int *temp) { - struct armada_thermal_priv *priv = thermal->devdata; u32 reg, div; s64 sample, b, m; /* Valid check */ if (priv->data->is_valid && !priv->data->is_valid(priv)) { - dev_err(&thermal->device, + dev_err(priv->dev, "Temperature sensor reading not valid\n"); return -EIO; } @@ -278,7 +297,33 @@ static int armada_get_temp(struct thermal_zone_device *thermal, return 0; } -static struct thermal_zone_device_ops ops = { +static int armada_get_temp_legacy(struct thermal_zone_device *thermal, + int *temp) +{ + struct armada_thermal_priv *priv = thermal->devdata; + int ret; + + /* Do the actual reading */ + ret = armada_read_sensor(priv, temp); + + return ret; +} + +static struct thermal_zone_device_ops legacy_ops = { + .get_temp = armada_get_temp_legacy, +}; + +static int armada_get_temp(void *_sensor, int *temp) +{ + struct armada_thermal_sensor *sensor = _sensor; + struct armada_thermal_priv *priv = sensor->priv; + int ret; + + /* Do the actual reading */ + return armada_read_sensor(priv, &temp); +} + +static struct thermal_zone_of_device_ops of_ops = { .get_temp = armada_get_temp, }; @@ -480,7 +525,9 @@ static void armada_set_sane_name(struct platform_device *pdev, static int armada_thermal_probe(struct platform_device *pdev) { - struct thermal_zone_device *thermal; + struct thermal_zone_device *tz; + struct armada_thermal_sensor *sensors; + struct armada_drvdata *drvdata; const struct of_device_id *match; struct armada_thermal_priv *priv; int ret; @@ -493,11 +540,13 @@ static int armada_thermal_probe(struct platform_device *pdev) if (!priv) return -ENOMEM; + drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = &pdev->dev; priv->data = (struct armada_thermal_data *)match->data; - /* Ensure device name is correct for the thermal core */ - armada_set_sane_name(pdev, priv); - /* * Legacy DT bindings only described "control1" register (also referred * as "control MSB" on old documentation). Then, bindings moved to cover @@ -510,35 +559,65 @@ static int armada_thermal_probe(struct platform_device *pdev) * is to define an overall system controller and put the thermal node * into it, which requires the use of regmaps across all the driver. */ - if (IS_ERR(syscon_node_to_regmap(pdev->dev.parent->of_node))) + if (IS_ERR(syscon_node_to_regmap(pdev->dev.parent->of_node))) { + /* Ensure device name is correct for the thermal core */ + armada_set_sane_name(pdev, priv); + ret = armada_thermal_probe_legacy(pdev, priv); - else - ret = armada_thermal_probe_syscon(pdev, priv); + if (ret) + return ret; + priv->data->init(pdev, priv); + + tz = thermal_zone_device_register(priv->zone_name, 0, 0, priv, + &legacy_ops, NULL, 0, 0); + if (IS_ERR(tz)) { + dev_err(&pdev->dev, + "Failed to register thermal zone device\n"); + return PTR_ERR(tz); + } + + drvdata->type = LEGACY; + drvdata->data.tz = tz; + platform_set_drvdata(pdev, drvdata); + + return 0; + } + + ret = armada_thermal_probe_syscon(pdev, priv); if (ret) return ret; priv->data->init(pdev, priv); + drvdata->type = SYSCON; + drvdata->data.priv = priv; + platform_set_drvdata(pdev, drvdata); - thermal = thermal_zone_device_register(priv->zone_name, 0, 0, priv, - &ops, NULL, 0, 0); - if (IS_ERR(thermal)) { + sensors = devm_kzalloc(&pdev->dev, sizeof(struct armada_thermal_sensor), + GFP_KERNEL); + if (!sensors) + return -ENOMEM; + + sensors->priv = priv; + + tz = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, sensors, + &of_ops); + if (IS_ERR(tz)) { dev_err(&pdev->dev, - "Failed to register thermal zone device\n"); - return PTR_ERR(thermal); + "Failed to register thermal sensor (err: %ld)\n", + PTR_ERR(tz)); + return PTR_ERR(tz); } - platform_set_drvdata(pdev, thermal); - return 0; } static int armada_thermal_exit(struct platform_device *pdev) { - struct thermal_zone_device *armada_thermal = - platform_get_drvdata(pdev); + struct armada_drvdata *drvdata = platform_get_drvdata(pdev); - thermal_zone_device_unregister(armada_thermal); + if (drvdata->type == LEGACY) + thermal_zone_device_unregister(drvdata->data.tz); return 0; } -- 2.14.1
WARNING: multiple messages have this Message-ID (diff)
From: miquel.raynal@bootlin.com (Miquel Raynal) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 08/23] thermal: armada: use the resource managed registration helper alternative Date: Thu, 5 Jul 2018 18:04:22 +0200 [thread overview] Message-ID: <20180705160437.12325-9-miquel.raynal@bootlin.com> (raw) In-Reply-To: <20180705160437.12325-1-miquel.raynal@bootlin.com> Current use of thermal_zone_device_register() triggers a warning at boot and should be replaced by devm_thermal_zone_of_sensor_register(). This allows better handling of multiple thermal zones for later multi-sensors support. Also change the driver data to embed a new structure to make the difference between legacy data (which needs to be cleaned) and syscon-related data. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> --- drivers/thermal/armada_thermal.c | 123 ++++++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 22 deletions(-) diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c index be346c6afde2..dd894312dedf 100644 --- a/drivers/thermal/armada_thermal.c +++ b/drivers/thermal/armada_thermal.c @@ -64,6 +64,7 @@ struct armada_thermal_data; /* Marvell EBU Thermal Sensor Dev Structure */ struct armada_thermal_priv { + struct device *dev; struct regmap *syscon; char zone_name[THERMAL_NAME_LENGTH]; struct armada_thermal_data *data; @@ -95,6 +96,26 @@ struct armada_thermal_data { unsigned int syscon_status_off; }; +struct armada_drvdata { + enum drvtype { + LEGACY, + SYSCON + } type; + union { + struct armada_thermal_priv *priv; + struct thermal_zone_device *tz; + } data; +}; + +/* + * struct armada_thermal_sensor - hold the information of one thermal sensor + * @thermal: pointer to the local private structure + * @tzd: pointer to the thermal zone device + */ +struct armada_thermal_sensor { + struct armada_thermal_priv *priv; +}; + static void armadaxp_init(struct platform_device *pdev, struct armada_thermal_priv *priv) { @@ -243,16 +264,14 @@ static bool armada_is_valid(struct armada_thermal_priv *priv) return reg & priv->data->is_valid_bit; } -static int armada_get_temp(struct thermal_zone_device *thermal, - int *temp) +static int armada_read_sensor(struct armada_thermal_priv *priv, int *temp) { - struct armada_thermal_priv *priv = thermal->devdata; u32 reg, div; s64 sample, b, m; /* Valid check */ if (priv->data->is_valid && !priv->data->is_valid(priv)) { - dev_err(&thermal->device, + dev_err(priv->dev, "Temperature sensor reading not valid\n"); return -EIO; } @@ -278,7 +297,33 @@ static int armada_get_temp(struct thermal_zone_device *thermal, return 0; } -static struct thermal_zone_device_ops ops = { +static int armada_get_temp_legacy(struct thermal_zone_device *thermal, + int *temp) +{ + struct armada_thermal_priv *priv = thermal->devdata; + int ret; + + /* Do the actual reading */ + ret = armada_read_sensor(priv, temp); + + return ret; +} + +static struct thermal_zone_device_ops legacy_ops = { + .get_temp = armada_get_temp_legacy, +}; + +static int armada_get_temp(void *_sensor, int *temp) +{ + struct armada_thermal_sensor *sensor = _sensor; + struct armada_thermal_priv *priv = sensor->priv; + int ret; + + /* Do the actual reading */ + return armada_read_sensor(priv, &temp); +} + +static struct thermal_zone_of_device_ops of_ops = { .get_temp = armada_get_temp, }; @@ -480,7 +525,9 @@ static void armada_set_sane_name(struct platform_device *pdev, static int armada_thermal_probe(struct platform_device *pdev) { - struct thermal_zone_device *thermal; + struct thermal_zone_device *tz; + struct armada_thermal_sensor *sensors; + struct armada_drvdata *drvdata; const struct of_device_id *match; struct armada_thermal_priv *priv; int ret; @@ -493,11 +540,13 @@ static int armada_thermal_probe(struct platform_device *pdev) if (!priv) return -ENOMEM; + drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = &pdev->dev; priv->data = (struct armada_thermal_data *)match->data; - /* Ensure device name is correct for the thermal core */ - armada_set_sane_name(pdev, priv); - /* * Legacy DT bindings only described "control1" register (also referred * as "control MSB" on old documentation). Then, bindings moved to cover @@ -510,35 +559,65 @@ static int armada_thermal_probe(struct platform_device *pdev) * is to define an overall system controller and put the thermal node * into it, which requires the use of regmaps across all the driver. */ - if (IS_ERR(syscon_node_to_regmap(pdev->dev.parent->of_node))) + if (IS_ERR(syscon_node_to_regmap(pdev->dev.parent->of_node))) { + /* Ensure device name is correct for the thermal core */ + armada_set_sane_name(pdev, priv); + ret = armada_thermal_probe_legacy(pdev, priv); - else - ret = armada_thermal_probe_syscon(pdev, priv); + if (ret) + return ret; + priv->data->init(pdev, priv); + + tz = thermal_zone_device_register(priv->zone_name, 0, 0, priv, + &legacy_ops, NULL, 0, 0); + if (IS_ERR(tz)) { + dev_err(&pdev->dev, + "Failed to register thermal zone device\n"); + return PTR_ERR(tz); + } + + drvdata->type = LEGACY; + drvdata->data.tz = tz; + platform_set_drvdata(pdev, drvdata); + + return 0; + } + + ret = armada_thermal_probe_syscon(pdev, priv); if (ret) return ret; priv->data->init(pdev, priv); + drvdata->type = SYSCON; + drvdata->data.priv = priv; + platform_set_drvdata(pdev, drvdata); - thermal = thermal_zone_device_register(priv->zone_name, 0, 0, priv, - &ops, NULL, 0, 0); - if (IS_ERR(thermal)) { + sensors = devm_kzalloc(&pdev->dev, sizeof(struct armada_thermal_sensor), + GFP_KERNEL); + if (!sensors) + return -ENOMEM; + + sensors->priv = priv; + + tz = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, sensors, + &of_ops); + if (IS_ERR(tz)) { dev_err(&pdev->dev, - "Failed to register thermal zone device\n"); - return PTR_ERR(thermal); + "Failed to register thermal sensor (err: %ld)\n", + PTR_ERR(tz)); + return PTR_ERR(tz); } - platform_set_drvdata(pdev, thermal); - return 0; } static int armada_thermal_exit(struct platform_device *pdev) { - struct thermal_zone_device *armada_thermal = - platform_get_drvdata(pdev); + struct armada_drvdata *drvdata = platform_get_drvdata(pdev); - thermal_zone_device_unregister(armada_thermal); + if (drvdata->type == LEGACY) + thermal_zone_device_unregister(drvdata->data.tz); return 0; } -- 2.14.1
next prev parent reply other threads:[~2018-07-05 16:04 UTC|newest] Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-07-05 16:04 [PATCH v3 00/23] Add multi-channel support to Armada thermal driver Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 01/23] thermal: armada: add a function that sanitizes the thermal zone name Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 02/23] thermal: armada: remove useless register accesses Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 03/23] thermal: armada: remove misleading comments Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 04/23] thermal: armada: rename the initialization routine Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 05/23] thermal: armada: dissociate a380 and cp110 ->init() hooks Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 06/23] thermal: armada: average over samples to avoid glitches Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 07/23] thermal: armada: convert driver to syscon register accesses Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal [this message] 2018-07-05 16:04 ` [PATCH v3 08/23] thermal: armada: use the resource managed registration helper alternative Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 09/23] thermal: armada: add multi-channel sensors support Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 10/23] thermal: armada: remove sensors validity from the IP initialization Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 11/23] thermal: armada: move validity check out of the read function Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 12/23] thermal: armada: get rid of the ->is_valid() pointer Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 13/23] dt-bindings: cp110: rename cp110 syscon file Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 14/23] dt-bindings: ap806: prepare the syscon file to list other syscons nodes Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 15/23] dt-bindings: cp110: " Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 16/23] dt-bindings: ap806: add the thermal node in the syscon file Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 17/23] dt-bindings: cp110: update documentation since DT de-duplication Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 18/23] dt-bindings: cp110: add the thermal node in the syscon file Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 19/23] dt-bindings: thermal: armada: add reference to new bindings Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 20/23] arm64: dts: marvell: move AP806/CP110 thermal nodes into a new syscon Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 21/23] arm64: dts: marvell: add thermal-zone node in ap806 DTSI file Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 22/23] arm64: dts: marvell: add macro to make distinction between node names Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-05 16:04 ` [PATCH v3 23/23] arm64: dts: marvell: add thermal-zone node in cp110 DTSI file Miquel Raynal 2018-07-05 16:04 ` Miquel Raynal 2018-07-16 14:41 [PATCH v3 00/23] Add multi-channel support to Armada thermal driver Miquel Raynal 2018-07-16 14:41 ` [PATCH v3 08/23] thermal: armada: use the resource managed registration helper alternative Miquel Raynal 2018-07-16 14:41 ` Miquel Raynal 2018-07-26 21:37 ` Eduardo Valentin 2018-07-26 21:37 ` Eduardo Valentin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180705160437.12325-9-miquel.raynal@bootlin.com \ --to=miquel.raynal@bootlin.com \ --cc=andrew@lunn.ch \ --cc=antoine.tenart@bootlin.com \ --cc=baruch@tkos.co.il \ --cc=catalin.marinas@arm.com \ --cc=davidsn@marvell.com \ --cc=devicetree@vger.kernel.org \ --cc=edubezval@gmail.com \ --cc=gregory.clement@bootlin.com \ --cc=jason@lakedaemon.net \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-pm@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=maxime.chevallier@bootlin.com \ --cc=nadavh@marvell.com \ --cc=robh+dt@kernel.org \ --cc=rui.zhang@intel.com \ --cc=sebastian.hesselbarth@gmail.com \ --cc=thomas.petazzoni@bootlin.com \ --cc=will.deacon@arm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.