hwmon: (pmbus/lm25066) Refactor device specific coefficients
Initialize device specific coefficients from table instead of hard-coding it to simplify adding additional chips. Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
		
					parent
					
						
							
								2507abb3a7
							
						
					
				
			
			
				commit
				
					
						e53e6497fc
					
				
			
		
					 1 changed files with 118 additions and 78 deletions
				
			
		| 
						 | 
				
			
			@ -44,6 +44,103 @@ enum chips { lm25066, lm5064, lm5066 };
 | 
			
		|||
 | 
			
		||||
#define LM25066_DEV_SETUP_CL		(1 << 4)	/* Current limit */
 | 
			
		||||
 | 
			
		||||
struct __coeff {
 | 
			
		||||
	short m, b, R;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define PSC_CURRENT_IN_L	(PSC_NUM_CLASSES)
 | 
			
		||||
#define PSC_POWER_L		(PSC_NUM_CLASSES + 1)
 | 
			
		||||
 | 
			
		||||
static struct __coeff lm25066_coeff[3][PSC_NUM_CLASSES + 2] = {
 | 
			
		||||
	[lm25066] = {
 | 
			
		||||
		[PSC_VOLTAGE_IN] = {
 | 
			
		||||
			.m = 22070,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_VOLTAGE_OUT] = {
 | 
			
		||||
			.m = 22070,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_CURRENT_IN] = {
 | 
			
		||||
			.m = 13661,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_CURRENT_IN_L] = {
 | 
			
		||||
			.m = 6852,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_POWER] = {
 | 
			
		||||
			.m = 736,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_POWER_L] = {
 | 
			
		||||
			.m = 369,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_TEMPERATURE] = {
 | 
			
		||||
			.m = 16,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	[lm5064] = {
 | 
			
		||||
		[PSC_VOLTAGE_IN] = {
 | 
			
		||||
			.m = 4611,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_VOLTAGE_OUT] = {
 | 
			
		||||
			.m = 4621,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_CURRENT_IN] = {
 | 
			
		||||
			.m = 10742,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_CURRENT_IN_L] = {
 | 
			
		||||
			.m = 5456,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_POWER] = {
 | 
			
		||||
			.m = 1204,
 | 
			
		||||
			.R = -3,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_POWER_L] = {
 | 
			
		||||
			.m = 612,
 | 
			
		||||
			.R = -3,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_TEMPERATURE] = {
 | 
			
		||||
			.m = 16,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	[lm5066] = {
 | 
			
		||||
		[PSC_VOLTAGE_IN] = {
 | 
			
		||||
			.m = 4587,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_VOLTAGE_OUT] = {
 | 
			
		||||
			.m = 4587,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_CURRENT_IN] = {
 | 
			
		||||
			.m = 10753,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_CURRENT_IN_L] = {
 | 
			
		||||
			.m = 5405,
 | 
			
		||||
			.R = -2,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_POWER] = {
 | 
			
		||||
			.m = 1204,
 | 
			
		||||
			.R = -3,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_POWER_L] = {
 | 
			
		||||
			.m = 605,
 | 
			
		||||
			.R = -3,
 | 
			
		||||
		},
 | 
			
		||||
		[PSC_TEMPERATURE] = {
 | 
			
		||||
			.m = 16,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct lm25066_data {
 | 
			
		||||
	int id;
 | 
			
		||||
	struct pmbus_driver_info info;
 | 
			
		||||
| 
						 | 
				
			
			@ -162,6 +259,7 @@ static int lm25066_probe(struct i2c_client *client,
 | 
			
		|||
	int config;
 | 
			
		||||
	struct lm25066_data *data;
 | 
			
		||||
	struct pmbus_driver_info *info;
 | 
			
		||||
	struct __coeff *coeff;
 | 
			
		||||
 | 
			
		||||
	if (!i2c_check_functionality(client->adapter,
 | 
			
		||||
				     I2C_FUNC_SMBUS_READ_BYTE_DATA))
 | 
			
		||||
| 
						 | 
				
			
			@ -186,9 +284,6 @@ static int lm25066_probe(struct i2c_client *client,
 | 
			
		|||
	info->format[PSC_TEMPERATURE] = direct;
 | 
			
		||||
	info->format[PSC_POWER] = direct;
 | 
			
		||||
 | 
			
		||||
	info->m[PSC_TEMPERATURE] = 16;
 | 
			
		||||
	info->b[PSC_TEMPERATURE] = 0;
 | 
			
		||||
	info->R[PSC_TEMPERATURE] = 0;
 | 
			
		||||
 | 
			
		||||
	info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VMON | PMBUS_HAVE_VOUT
 | 
			
		||||
	  | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_PIN | PMBUS_HAVE_IIN
 | 
			
		||||
| 
						 | 
				
			
			@ -197,81 +292,26 @@ static int lm25066_probe(struct i2c_client *client,
 | 
			
		|||
	info->read_word_data = lm25066_read_word_data;
 | 
			
		||||
	info->write_word_data = lm25066_write_word_data;
 | 
			
		||||
 | 
			
		||||
	switch (id->driver_data) {
 | 
			
		||||
	case lm25066:
 | 
			
		||||
		info->m[PSC_VOLTAGE_IN] = 22070;
 | 
			
		||||
		info->b[PSC_VOLTAGE_IN] = 0;
 | 
			
		||||
		info->R[PSC_VOLTAGE_IN] = -2;
 | 
			
		||||
		info->m[PSC_VOLTAGE_OUT] = 22070;
 | 
			
		||||
		info->b[PSC_VOLTAGE_OUT] = 0;
 | 
			
		||||
		info->R[PSC_VOLTAGE_OUT] = -2;
 | 
			
		||||
 | 
			
		||||
	coeff = &lm25066_coeff[data->id][0];
 | 
			
		||||
	info->m[PSC_TEMPERATURE] = coeff[PSC_TEMPERATURE].m;
 | 
			
		||||
	info->b[PSC_TEMPERATURE] = coeff[PSC_TEMPERATURE].b;
 | 
			
		||||
	info->R[PSC_TEMPERATURE] = coeff[PSC_TEMPERATURE].R;
 | 
			
		||||
	info->m[PSC_VOLTAGE_IN] = coeff[PSC_VOLTAGE_IN].m;
 | 
			
		||||
	info->b[PSC_VOLTAGE_IN] = coeff[PSC_VOLTAGE_IN].b;
 | 
			
		||||
	info->R[PSC_VOLTAGE_IN] = coeff[PSC_VOLTAGE_IN].R;
 | 
			
		||||
	info->m[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].m;
 | 
			
		||||
	info->b[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].b;
 | 
			
		||||
	info->R[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].R;
 | 
			
		||||
	info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].b;
 | 
			
		||||
	info->R[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].R;
 | 
			
		||||
	info->b[PSC_POWER] = coeff[PSC_POWER].b;
 | 
			
		||||
	info->R[PSC_POWER] = coeff[PSC_POWER].R;
 | 
			
		||||
	if (config & LM25066_DEV_SETUP_CL) {
 | 
			
		||||
			info->m[PSC_CURRENT_IN] = 6852;
 | 
			
		||||
			info->b[PSC_CURRENT_IN] = 0;
 | 
			
		||||
			info->R[PSC_CURRENT_IN] = -2;
 | 
			
		||||
			info->m[PSC_POWER] = 369;
 | 
			
		||||
			info->b[PSC_POWER] = 0;
 | 
			
		||||
			info->R[PSC_POWER] = -2;
 | 
			
		||||
		info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].m;
 | 
			
		||||
		info->m[PSC_POWER] = coeff[PSC_POWER_L].m;
 | 
			
		||||
	} else {
 | 
			
		||||
			info->m[PSC_CURRENT_IN] = 13661;
 | 
			
		||||
			info->b[PSC_CURRENT_IN] = 0;
 | 
			
		||||
			info->R[PSC_CURRENT_IN] = -2;
 | 
			
		||||
			info->m[PSC_POWER] = 736;
 | 
			
		||||
			info->b[PSC_POWER] = 0;
 | 
			
		||||
			info->R[PSC_POWER] = -2;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case lm5064:
 | 
			
		||||
		info->m[PSC_VOLTAGE_IN] = 22075;
 | 
			
		||||
		info->b[PSC_VOLTAGE_IN] = 0;
 | 
			
		||||
		info->R[PSC_VOLTAGE_IN] = -2;
 | 
			
		||||
		info->m[PSC_VOLTAGE_OUT] = 22075;
 | 
			
		||||
		info->b[PSC_VOLTAGE_OUT] = 0;
 | 
			
		||||
		info->R[PSC_VOLTAGE_OUT] = -2;
 | 
			
		||||
 | 
			
		||||
		if (config & LM25066_DEV_SETUP_CL) {
 | 
			
		||||
			info->m[PSC_CURRENT_IN] = 6713;
 | 
			
		||||
			info->b[PSC_CURRENT_IN] = 0;
 | 
			
		||||
			info->R[PSC_CURRENT_IN] = -2;
 | 
			
		||||
			info->m[PSC_POWER] = 3619;
 | 
			
		||||
			info->b[PSC_POWER] = 0;
 | 
			
		||||
			info->R[PSC_POWER] = -3;
 | 
			
		||||
		} else {
 | 
			
		||||
			info->m[PSC_CURRENT_IN] = 13426;
 | 
			
		||||
			info->b[PSC_CURRENT_IN] = 0;
 | 
			
		||||
			info->R[PSC_CURRENT_IN] = -2;
 | 
			
		||||
			info->m[PSC_POWER] = 7238;
 | 
			
		||||
			info->b[PSC_POWER] = 0;
 | 
			
		||||
			info->R[PSC_POWER] = -3;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case lm5066:
 | 
			
		||||
		info->m[PSC_VOLTAGE_IN] = 4587;
 | 
			
		||||
		info->b[PSC_VOLTAGE_IN] = 0;
 | 
			
		||||
		info->R[PSC_VOLTAGE_IN] = -2;
 | 
			
		||||
		info->m[PSC_VOLTAGE_OUT] = 4587;
 | 
			
		||||
		info->b[PSC_VOLTAGE_OUT] = 0;
 | 
			
		||||
		info->R[PSC_VOLTAGE_OUT] = -2;
 | 
			
		||||
 | 
			
		||||
		if (config & LM25066_DEV_SETUP_CL) {
 | 
			
		||||
			info->m[PSC_CURRENT_IN] = 10753;
 | 
			
		||||
			info->b[PSC_CURRENT_IN] = 0;
 | 
			
		||||
			info->R[PSC_CURRENT_IN] = -2;
 | 
			
		||||
			info->m[PSC_POWER] = 1204;
 | 
			
		||||
			info->b[PSC_POWER] = 0;
 | 
			
		||||
			info->R[PSC_POWER] = -3;
 | 
			
		||||
		} else {
 | 
			
		||||
			info->m[PSC_CURRENT_IN] = 5405;
 | 
			
		||||
			info->b[PSC_CURRENT_IN] = 0;
 | 
			
		||||
			info->R[PSC_CURRENT_IN] = -2;
 | 
			
		||||
			info->m[PSC_POWER] = 605;
 | 
			
		||||
			info->b[PSC_POWER] = 0;
 | 
			
		||||
			info->R[PSC_POWER] = -3;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
		info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].m;
 | 
			
		||||
		info->m[PSC_POWER] = coeff[PSC_POWER].m;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pmbus_do_probe(client, id, info);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue