Message ID | 57617ED6.6050305@free.fr (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
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
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 --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);