Re: [PATCH] hwmon: (w83627hf) Add support for suspend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Oct 23, 2012 at 05:50:25PM +0200, Jean Delvare wrote:
> On suspend some register values are lost, most notably the Value RAM
> areas but also other limits. Restore them on resume. On top of that,
> some fixups are needed to work around BIOS bugs, in particular when
> the BIOS omits running the same initialization sequence on resume
> that it does after boot. In that case we have to carry initialization
> over suspend.
> 
> Signed-off-by: Jean Delvare <khali@xxxxxxxxxxxx>

Does the BIOS bug apply to all BIOSes, or just to some, or does it not matter ?

I have a system with w83627hf - want me to test the code with it ?

Code itself looks good afaics, so

Acked-by: Guenter Roeck <linux@xxxxxxxxxxxx>

Thanks,
Guenter

> ---
>  drivers/hwmon/w83627hf.c |   75 +++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 74 insertions(+), 1 deletion(-)
> 
> --- linux-3.7-rc2.orig/drivers/hwmon/w83627hf.c	2012-10-23 11:36:26.491575637 +0200
> +++ linux-3.7-rc2/drivers/hwmon/w83627hf.c	2012-10-23 17:42:40.211546839 +0200
> @@ -5,7 +5,7 @@
>   *			      Philip Edelbrock <phil@xxxxxxxxxxxxx>,
>   *			      and Mark Studebaker <mdsxyz123@xxxxxxxxx>
>   * Ported to 2.6 by Bernhard C. Schrenk <clemy@xxxxxxxxx>
> - * Copyright (c) 2007  Jean Delvare <khali@xxxxxxxxxxxx>
> + * Copyright (c) 2007 - 1012  Jean Delvare <khali@xxxxxxxxxxxx>
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License as published by
> @@ -389,6 +389,12 @@ struct w83627hf_data {
>  				 */
>  	u8 vrm;
>  	u8 vrm_ovt;		/* Register value, 627THF/637HF/687THF only */
> +
> +#ifdef CONFIG_PM
> +	/* Remember extra register values over suspend/resume */
> +	u8 scfg1;
> +	u8 scfg2;
> +#endif
>  };
>  
>  
> @@ -401,10 +407,77 @@ static void w83627hf_update_fan_div(stru
>  static struct w83627hf_data *w83627hf_update_device(struct device *dev);
>  static void w83627hf_init_device(struct platform_device *pdev);
>  
> +#ifdef CONFIG_PM
> +static int w83627hf_suspend(struct device *dev)
> +{
> +	struct w83627hf_data *data = w83627hf_update_device(dev);
> +
> +	mutex_lock(&data->update_lock);
> +	data->scfg1 = w83627hf_read_value(data, W83781D_REG_SCFG1);
> +	data->scfg2 = w83627hf_read_value(data, W83781D_REG_SCFG2);
> +	mutex_unlock(&data->update_lock);
> +
> +	return 0;
> +}
> +
> +static int w83627hf_resume(struct device *dev)
> +{
> +	struct w83627hf_data *data = dev_get_drvdata(dev);
> +	int i, num_temps = (data->type == w83697hf) ? 2 : 3;
> +
> +	/* Restore limits */
> +	mutex_lock(&data->update_lock);
> +	for (i = 0; i <= 8; i++) {
> +		/* skip missing sensors */
> +		if (((data->type == w83697hf) && (i == 1)) ||
> +		    ((data->type != w83627hf && data->type != w83697hf)
> +		    && (i == 5 || i == 6)))
> +			continue;
> +		w83627hf_write_value(data, W83781D_REG_IN_MAX(i),
> +				     data->in_max[i]);
> +		w83627hf_write_value(data, W83781D_REG_IN_MIN(i),
> +				     data->in_min[i]);
> +	}
> +	for (i = 0; i <= 2; i++)
> +		w83627hf_write_value(data, W83627HF_REG_FAN_MIN(i),
> +				     data->fan_min[i]);
> +	for (i = 0; i < num_temps; i++) {
> +		w83627hf_write_value(data, w83627hf_reg_temp_over[i],
> +				     data->temp_max[i]);
> +		w83627hf_write_value(data, w83627hf_reg_temp_hyst[i],
> +				     data->temp_max_hyst[i]);
> +	}
> +
> +	/* Fixup BIOS bugs */
> +	if (data->type == w83627thf || data->type == w83637hf ||
> +	    data->type == w83687thf)
> +		w83627hf_write_value(data, W83627THF_REG_VRM_OVT_CFG,
> +				     data->vrm_ovt);
> +	w83627hf_write_value(data, W83781D_REG_SCFG1, data->scfg1);
> +	w83627hf_write_value(data, W83781D_REG_SCFG2, data->scfg2);
> +
> +	/* Force re-reading all values */
> +	data->valid = 0;
> +	mutex_unlock(&data->update_lock);
> +
> +	return 0;
> +}
> +
> +static const struct dev_pm_ops w83627hf_dev_pm_ops = {
> +	.suspend = w83627hf_suspend,
> +	.resume = w83627hf_resume,
> +};
> +
> +#define W83627HF_DEV_PM_OPS	(&w83627hf_dev_pm_ops)
> +#else
> +#define W83627HF_DEV_PM_OPS	NULL
> +#endif /* CONFIG_PM */
> +
>  static struct platform_driver w83627hf_driver = {
>  	.driver = {
>  		.owner	= THIS_MODULE,
>  		.name	= DRVNAME,
> +		.pm	= W83627HF_DEV_PM_OPS,
>  	},
>  	.probe		= w83627hf_probe,
>  	.remove		= __devexit_p(w83627hf_remove),
> 
> 
> -- 
> Jean Delvare
> 

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux