[lm-sensors] PATCH: hwmon-fschmd-fscher-and-newer-no-fixed-scaling.patch

Hans de Goede j.w.r.degoede at hhs.nl
Mon Dec 17 16:56:24 CET 2007


Hi Jean et all,

I finally found / made some time to try out using your below patch in the 
fschmd driver. Your patch works as advertised, I'll send a mail with a patch to 
the fschmd driver using its functionality right after this mail. I guess this 
is 2.6.25 material and that we should queue both patches for 2.6.25.

Thank & Regards,

hans


Jean Delvare wrote:
> Subject: dmi: Let drivers walk the DMI table
> 
> Let drivers walk the DMI table for their own needs. Some drivers need
> data stored in OEM-specific DMI records for proper operation.
> 
> Signed-off-by: Jean Delvare <khali at linux-fr.org>
> ---
>  drivers/firmware/dmi_scan.c |   61 +++++++++++++++++++++++++++++++++----------
>  include/linux/dmi.h         |    3 ++
>  2 files changed, 50 insertions(+), 14 deletions(-)
> 
> --- linux-2.6.24-rc1.orig/drivers/firmware/dmi_scan.c	2007-11-03 09:22:23.000000000 +0100
> +++ linux-2.6.24-rc1/drivers/firmware/dmi_scan.c	2007-11-03 17:24:45.000000000 +0100
> @@ -36,18 +36,12 @@ static char * __init dmi_string(const st
>   *	We have to be cautious here. We have seen BIOSes with DMI pointers
>   *	pointing to completely the wrong place for example
>   */
> -static int __init dmi_table(u32 base, int len, int num,
> -			    void (*decode)(const struct dmi_header *))
> +static void dmi_table(u8 *buf, int len, int num,
> +		      void (*decode)(const struct dmi_header *))
>  {
> -	u8 *buf, *data;
> +	u8 *data = buf;
>  	int i = 0;
>  
> -	buf = dmi_ioremap(base, len);
> -	if (buf == NULL)
> -		return -1;
> -
> -	data = buf;
> -
>  	/*
>  	 *	Stop when we see all the items the table claimed to have
>  	 *	OR we run off the end of the table (also happens)
> @@ -68,7 +62,23 @@ static int __init dmi_table(u32 base, in
>  		data += 2;
>  		i++;
>  	}
> -	dmi_iounmap(buf, len);
> +}
> +
> +static u32 dmi_base;
> +static u16 dmi_len;
> +static u16 dmi_num;
> +
> +static int __init dmi_walk_early(void (*decode)(const struct dmi_header *))
> +{
> +	u8 *buf;
> +
> +	buf = dmi_ioremap(dmi_base, dmi_len);
> +	if (buf == NULL)
> +		return -1;
> +
> +	dmi_table(buf, dmi_len, dmi_num, decode);
> +
> +	dmi_iounmap(buf, dmi_len);
>  	return 0;
>  }
>  
> @@ -273,9 +283,9 @@ static int __init dmi_present(const char
>  
>  	memcpy_fromio(buf, p, 15);
>  	if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) {
> -		u16 num = (buf[13] << 8) | buf[12];
> -		u16 len = (buf[7] << 8) | buf[6];
> -		u32 base = (buf[11] << 24) | (buf[10] << 16) |
> +		dmi_num = (buf[13] << 8) | buf[12];
> +		dmi_len = (buf[7] << 8) | buf[6];
> +		dmi_base = (buf[11] << 24) | (buf[10] << 16) |
>  			(buf[9] << 8) | buf[8];
>  
>  		/*
> @@ -287,7 +297,7 @@ static int __init dmi_present(const char
>  			       buf[14] >> 4, buf[14] & 0xF);
>  		else
>  			printk(KERN_INFO "DMI present.\n");
> -		if (dmi_table(base,len, num, dmi_decode) == 0)
> +		if (dmi_walk_early(dmi_decode) == 0)
>  			return 0;
>  	}
>  	return 1;
> @@ -470,3 +480,26 @@ int dmi_get_year(int field)
>  	return year;
>  }
>  
> +/**
> + *	dmi_walk - Walk the DMI table and get called back for every record
> + *	@decode: Callback function
> + *
> + *	Returns -1 when the DMI table can't be reached, 0 on success.
> + */
> +int dmi_walk(void (*decode)(const struct dmi_header *))
> +{
> +	u8 *buf;
> +
> +	if (!dmi_available)
> +		return -1;
> +
> +	buf = ioremap(dmi_base, dmi_len);
> +	if (buf == NULL)
> +		return -1;
> +
> +	dmi_table(buf, dmi_len, dmi_num, decode);
> +
> +	iounmap(buf);
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(dmi_walk);
> --- linux-2.6.24-rc1.orig/include/linux/dmi.h	2007-11-03 09:22:23.000000000 +0100
> +++ linux-2.6.24-rc1/include/linux/dmi.h	2007-11-03 09:28:06.000000000 +0100
> @@ -78,6 +78,7 @@ extern const struct dmi_device * dmi_fin
>  extern void dmi_scan_machine(void);
>  extern int dmi_get_year(int field);
>  extern int dmi_name_in_vendors(const char *str);
> +extern int dmi_walk(void (*decode)(const struct dmi_header *));
>  
>  #else
>  
> @@ -87,6 +88,8 @@ static inline const struct dmi_device * 
>  	const struct dmi_device *from) { return NULL; }
>  static inline int dmi_get_year(int year) { return 0; }
>  static inline int dmi_name_in_vendors(const char *s) { return 0; }
> +static inline int dmi_walk(void (*decode)(const struct dmi_header *))
> +	{ return -1; }
>  
>  #endif
>  
> 






More information about the lm-sensors mailing list