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:
Guenter Roeck 2013-02-09 14:26:51 -08:00
parent 2507abb3a7
commit e53e6497fc
1 changed files with 118 additions and 78 deletions

View File

@ -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;
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;
} 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;
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] = coeff[PSC_CURRENT_IN_L].m;
info->m[PSC_POWER] = coeff[PSC_POWER_L].m;
} else {
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);