|
@@ -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);
|