[lm-sensors] LM64 support in lm63.c

Jean Delvare khali at linux-fr.org
Mon May 7 14:18:57 CEST 2007


Hi Ramji,

On Wed, 25 Apr 2007 18:15:31 +0530, Ramji wrote:
> Attached, patch for LM64 chip in LM63 chip driver.
> 
> Please, review it.
> 
> Every review comments and suggestions are most welcome.

First of all:
* Please generate a patch that can be applied with "patch -p1".
* Please generate a patch against a recent tree. Your patch is against
  linux 2.6.10, which is two-year old. Things have changed so much
  since then that I am simply unable to apply your patch.

On the code itself:

> --- /home/shabbirali/linux-2.6.10_mvl401/drivers/i2c/chips/lm63.c	2006-11-20 19:25:26.000000000 +0530
> +++ lm63.c	2007-04-21 15:41:36.000000000 +0530
> @@ -37,6 +37,8 @@
>   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
>   */
>  
> + /* MEDIO_BOARD : Medio 1.0 : Ramji Jiyani : Added support for National's LM64 sensor */
> + 

No history information in the code, please. We have a version tracking
system (git) for that.

>  #include <linux/config.h>
>  #include <linux/module.h>
>  #include <linux/init.h>
> @@ -48,15 +50,15 @@
>   * Addresses to scan
>   * Address is fully defined internally and cannot be changed.
>   */
> -
> -static unsigned short normal_i2c[] = { 0x4c, I2C_CLIENT_END };
> +//	Need to add addresses for the two other LM64

This comment isn't particularly useful, as the reader doesn't know what
"other two" addresses these are in the list. Better list explicitly
what chip can be found at what address, as is done in the lm90 driver
for example.

> +static unsigned short normal_i2c[] = { 0x4c, 0x18, 0x4E, I2C_CLIENT_END };

Please don't mix upper-case hexadecimal values with lower-case
hexadecimal values, it's inconsistent. Also, please keep the address
values sorted.

>  static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
>  
>  /*
>   * Insmod parameters
>   */
> -
> -SENSORS_INSMOD_1(lm63);
> +/*MEDIO_BOARD : Medio 1.0 : RJ : Changed to support two chips, LM63 and LM64 */
> +SENSORS_INSMOD_2( lm63, lm64 );

No spaces inside the parentheses please.

>  
>  /*
>   * The LM63 registers
> @@ -140,6 +142,8 @@
>  static struct i2c_driver lm63_driver = {
>  	.owner		= THIS_MODULE,
>  	.name		= "lm63",
> +	/* MEDIO_BOARD: Medio 1.0 : RJ : Add id of the driver, define same in i2c-id.h */
> +	.id = I2C_DRIVERID_LM63, /* MEDIO_BOARD: Medio 1.0 : RJ : Add I2C_DRIVERID_LM63 = 1048 in i2c-id.h */

This has nothing to do in this patch (see below.)

>  	.flags		= I2C_DF_NOTIFY,
>  	.attach_adapter	= lm63_attach_adapter,
>  	.detach_client	= lm63_detach_client,
> @@ -171,6 +175,12 @@
>  	u8 alarms;
>  };
>  
> +/* MEDIO_BOARD: Medio 1.0 : RJ : Added to support LM64 */
> +/*
> + * Internal variables
> + */
> +static int lm63_id;

Same here: this has nothing to do with adding support for the LM64.

> +
>  /*
>   * Sysfs callback functions and files
>   */
> @@ -346,6 +356,8 @@
>  	struct i2c_client *new_client;
>  	struct lm63_data *data;
>  	int err = 0;
> +	/*MEDIO_BOARD:Medio 1.0:RJ: Added two support both LM64 and LM64 */
> +	const char *name = "";
>  
>  	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
>  		goto exit;
> @@ -365,6 +377,17 @@
>  	new_client->driver = &lm63_driver;
>  	new_client->flags = 0;
>  
> +	/*MEDIO_BOARD:Medio 1.0:RJ: Added following understanding.
> +	 * Now we do the remaining detection. A negative kind means that
> +	 * the driver was loaded with no force parameter (default), so we
> +	 * must both detect and identify the chip. A zero kind means that
> +	 * the driver was loaded with the force parameter, the detection
> +	 * step shall be skipped. A positive kind means that the driver
> +	 * was loaded with the force parameter and a given kind of chip is
> +	 * requested, so both the detection and the identification steps
> +	 * are skipped.
> +	 */

This comment partly contradicts the code below: a zero kind is treated
as if an LM63 chip had been forced, so the identification step is
skipped as well.

> +	
>  	/* Default to an LM63 if forced */
>  	if (kind == 0)
>  		kind = lm63;
> @@ -386,22 +409,42 @@
>  		reg_alert_mask = i2c_smbus_read_byte_data(new_client,
>  				 LM63_REG_ALERT_MASK);
>  
> -		if (man_id == 0x01 /* National Semiconductor */
> -		 && chip_id == 0x41 /* LM63 */
> -		 && (reg_config1 & 0x18) == 0x00
> -		 && (reg_config2 & 0xF8) == 0x00
> -		 && (reg_alert_status & 0x20) == 0x00
> -		 && (reg_alert_mask & 0xA4) == 0xA4) {
> -			kind = lm63;
> -		} else { /* failed */
> +		/*MEDIO_BOARD:Medio 1.0:RJ: Added for LM64 detection */
> +		if (man_id == 0x01
> +			&& (reg_config2 & 0xF8) == 0x00
> +			&& (reg_alert_status & 0x20) == 0x00
> +			&& (reg_alert_mask & 0xA4) == 0xA4) /* National Semiconductor */{

Please leave the indentation the way it was. Also, the comment
"National Semiconductor" really corresponds to the first test so don't
move it.

> +				if( chip_id == 0x41 /* LM63 */
> +				&& (reg_config1 & 0x18) == 0x00) {
> +					kind = lm63;
> +				}else if( chip_id == 0x51 /* LM64 */
> +				 && (reg_config1 & 0x1E) == 0x00 ){
> +					kind = lm64;
> +				}else{

You could make the detection a bit more robust by additionally checking
the address. For example, an LM63 at address 0x18 isn't possible.

> +				dev_dbg(&adapter->dev, "Unsupported chip of National Semiconductor"
> +					"(man_id=0x%02X, chip_id=0x%02X).\n",
> +					man_id, chip_id);
> +				goto exit_free;
> +				}
> +		}else { /* failed */

Missing space.

>  			dev_dbg(&adapter->dev, "Unsupported chip "
>  				"(man_id=0x%02X, chip_id=0x%02X).\n",
>  				man_id, chip_id);
>  			goto exit_free;
>  		}
>  	}
> +	
> +	/*MEDIO_BOARD:Medio 1.0:RJ: Added to support both LM63 and LM64 */
> +	if( kind == lm63 ){
> +		name = "lm63";
> +	}else if( kind == lm64 ){
> +		name = "lm64";
> +	}

Please respect the coding style that is used in the rest of the source
file, all hardware monitoring drivers, and more generally in the vast
majority of the linux kernel source: no space inside the parentheses,
but spaces around curly braces - not the other way around. This applies
to your whole patch.

>  
> -	strlcpy(new_client->name, "lm63", I2C_NAME_SIZE);
> +	/*MEDIO_BOARD:Medio 1.0:RJ: replaced "lm63" by name */
> +	strlcpy(new_client->name, name, I2C_NAME_SIZE);
> +	/*MEDIO_BOARD:Medio 1.0:RJ: added to support LM64 */
> +	new_client->id = lm63_id++;

This won't even compile with a recent kernel: the i2c_client.id field
has been dropped long ago.

>  	data->valid = 0;
>  	init_MUTEX(&data->update_lock);
>  
> @@ -460,9 +503,13 @@
>  		data->pwm1_freq = 1;
>  
>  	/* Show some debug info about the LM63 configuration */
> -	dev_dbg(&client->dev, "Alert/tach pin configured for %s\n",
> -		(data->config & 0x04) ? "tachometer input" :
> -		"alert output");
> +	/*MEDIO_BOARD:Medio 1.0:RJ: Added if test to support LM64 */
> +	if( data->client.id == I2C_DRIVERID_LM63 )
> +	{
> +		dev_dbg(&client->dev, "Alert/tach pin configured for %s\n",
> +			(data->config & 0x04) ? "tachometer input" :
> +			"alert output");
> +	}

This is totally broken, but I think I see what you're trying to do. If
you want to differentiate between an LM63 and an LM64, you have to add
a "kind" field in the lm63_data structure, fill it in the detect
function, and use it later as needed. Again, see the lm90 for an
example.

>  	dev_dbg(&client->dev, "PWM clock %s kHz, output frequency %u Hz\n",
>  		(data->config_fan & 0x04) ? "1.4" : "360",
>  		((data->config_fan & 0x04) ? 700 : 180000) / data->pwm1_freq);
> @@ -495,7 +542,8 @@
>  	if ((jiffies - data->last_updated > HZ) ||
>  	    (jiffies < data->last_updated) ||
>  	    !data->valid) {
> -		if (data->config & 0x04) { /* tachometer enabled  */
> +		/* MEDIO_BOARD:Medio 1.0:RJ: Changed if test to enalble case for LM64 as well */
> +		if ( (data->config & 0x04) ||  ( client->id != I2C_DRIVERID_LM63 ) ){ /* tachometer enabled  */
>  			/* order matters for fan1_input */
>  			data->fan1_input = i2c_smbus_read_byte_data(client,
>  					   LM63_REG_TACH_COUNT_LSB) & 0xFC;

Additionally, you will have to document the LM64 support:
* in Documentation/hwmon/lm63
* in drivers/hwmon/Kconfig
* in the header comment of lm63.c, as is done in lm90.c

Thanks,
-- 
Jean Delvare




More information about the lm-sensors mailing list