diff mbox

[RFC] Adding PM support to thermal driver

Message ID 57617ED6.6050305@free.fr (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Mason June 15, 2016, 4:14 p.m. UTC
Hello,

I need to support suspend-to-RAM in my platform.
This platform powers down on suspend, so the contents of device registers are lost.
Can you tell me if this patch looks OK for adding S2R support?
(I would then make a formal submission.)


Regards.


--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Kevin Hilman June 15, 2016, 9:51 p.m. UTC | #1
Mason <slash.tmp@free.fr> writes:

> I need to support suspend-to-RAM in my platform.
> This platform powers down on suspend, so the contents of device registers are lost.
> Can you tell me if this patch looks OK for adding S2R support?

The idea looks right for ensuring a clean resume after context loss.

However, I'm a bit surprised to see an empty ->suspend hook though.  Is
there nothing to do to gracefully shutdown this hardware?  A quick
glance suggests maybe CMD_OFF should be sent?

Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mason June 17, 2016, 11:11 a.m. UTC | #2
On 15/06/2016 23:51, Kevin Hilman wrote:

> Mason writes:
> 
>> I need to support suspend-to-RAM in my platform.
>> This platform powers down on suspend, so the contents of device registers are lost.
>> Can you tell me if this patch looks OK for adding S2R support?
> 
> The idea looks right for ensuring a clean resume after context loss.

Thanks for your quick review.

> However, I'm a bit surprised to see an empty ->suspend hook though.
> Is there nothing to do to gracefully shutdown this hardware?  A quick
> glance suggests maybe CMD_OFF should be sent?

We discussed this internally. When Linux asks to be suspended to RAM,
the firmware cuts the power to the entire platform (except RAM obviously,
and a few blocks listening for wakeup events).

So it seems pointless to write code to power individual HW blocks down
that are about to be powered down globally.

(NB: the thermal block dissipates ~50 microwatts, so powering it down
ASAP saves only a negligible amount of energy.)

Regards.

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/thermal/tango_thermal.c b/drivers/thermal/tango_thermal.c
index 70e0d9f406e9..29ef9f2f1b93 100644
--- a/drivers/thermal/tango_thermal.c
+++ b/drivers/thermal/tango_thermal.c
@@ -62,10 +62,16 @@  static int tango_get_temp(void *arg, int *res)
 
 static const struct thermal_zone_of_device_ops ops = {
 	.get_temp	= tango_get_temp,
 };
 
+static void tango_thermal_init(struct tango_thermal_priv *priv)
+{
+	writel(0, priv->base + TEMPSI_CFG);
+	writel(CMD_ON, priv->base + TEMPSI_CMD);
+}
+
 static int tango_thermal_probe(struct platform_device *pdev)
 {
 	struct resource *res;
 	struct tango_thermal_priv *priv;
 	struct thermal_zone_device *tzdev;
@@ -77,18 +83,28 @@  static int tango_thermal_probe(struct platform_device *pdev)
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	priv->base = devm_ioremap_resource(&pdev->dev, res);
 	if (IS_ERR(priv->base))
 		return PTR_ERR(priv->base);
 
+	platform_set_drvdata(pdev, priv);
 	priv->thresh_idx = IDX_MIN;
-	writel(0, priv->base + TEMPSI_CFG);
-	writel(CMD_ON, priv->base + TEMPSI_CMD);
+	tango_thermal_init(priv);
 
 	tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, priv, &ops);
 	return PTR_ERR_OR_ZERO(tzdev);
 }
 
+static int tango_thermal_resume(struct device *dev)
+{
+	struct tango_thermal_priv *priv = dev_get_drvdata(dev);
+	tango_thermal_init(priv);
+
+	return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(tango_thermal_pm_ops, NULL, tango_thermal_resume);
+
 static const struct of_device_id tango_sensor_ids[] = {
 	{
 		.compatible = "sigma,smp8758-thermal",
 	},
 	{ /* sentinel */ }
@@ -97,10 +113,11 @@  static const struct of_device_id tango_sensor_ids[] = {
 static struct platform_driver tango_thermal_driver = {
 	.probe	= tango_thermal_probe,
 	.driver	= {
 		.name		= "tango-thermal",
 		.of_match_table	= tango_sensor_ids,
+		.pm		= &tango_thermal_pm_ops,
 	},
 };
 
 module_platform_driver(tango_thermal_driver);