mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-11-02 19:28:18 +00:00
Merge pull request #522 from phani-karanam/add_YM2851J_PSU_support
Added YM2851J PSU support to onlpdump,and also ym2651y.c single driv…
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#define MAX_FAN_DUTY_CYCLE 100
|
||||
#define I2C_RW_RETRY_COUNT 10
|
||||
@@ -62,6 +63,9 @@ struct ym2651y_data {
|
||||
u16 status_word; /* Register value */
|
||||
u8 fan_fault; /* Register value */
|
||||
u8 over_temp; /* Register value */
|
||||
u16 v_in; /* Register value */
|
||||
u16 i_in; /* Register value */
|
||||
u16 p_in; /* Register value */
|
||||
u16 v_out; /* Register value */
|
||||
u16 i_out; /* Register value */
|
||||
u16 p_out; /* Register value */
|
||||
@@ -110,6 +114,9 @@ enum ym2651y_sysfs_attributes {
|
||||
PSU_FAN1_FAULT,
|
||||
PSU_FAN_DIRECTION,
|
||||
PSU_OVER_TEMP,
|
||||
PSU_V_IN,
|
||||
PSU_I_IN,
|
||||
PSU_P_IN,
|
||||
PSU_V_OUT,
|
||||
PSU_I_OUT,
|
||||
PSU_P_OUT,
|
||||
@@ -138,6 +145,9 @@ static SENSOR_DEVICE_ATTR(psu_temp_fault, S_IRUGO, show_word, NULL, PSU_TEMP
|
||||
static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_word, NULL, PSU_POWER_GOOD);
|
||||
static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT);
|
||||
static SENSOR_DEVICE_ATTR(psu_over_temp, S_IRUGO, show_over_temp, NULL, PSU_OVER_TEMP);
|
||||
static SENSOR_DEVICE_ATTR(psu_v_in, S_IRUGO, show_linear, NULL, PSU_V_IN);
|
||||
static SENSOR_DEVICE_ATTR(psu_i_in, S_IRUGO, show_linear, NULL, PSU_I_IN);
|
||||
static SENSOR_DEVICE_ATTR(psu_p_in, S_IRUGO, show_linear, NULL, PSU_P_IN);
|
||||
static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_vout, NULL, PSU_V_OUT);
|
||||
static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, show_linear, NULL, PSU_I_OUT);
|
||||
static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, show_linear, NULL, PSU_P_OUT);
|
||||
@@ -152,8 +162,8 @@ static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IRUGO, show_ascii, NULL, PSU_MFR_R
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_serial, S_IRUGO, show_ascii, NULL, PSU_MFR_SERIAL);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_vin_min, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MIN);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_vin_max, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MAX);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MIN);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MAX);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_vout, NULL, PSU_MFR_VOUT_MIN);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_vout, NULL, PSU_MFR_VOUT_MAX);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_iin_max, S_IRUGO, show_linear, NULL, PSU_MFR_IIN_MAX);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_iout_max, S_IRUGO, show_linear, NULL, PSU_MFR_IOUT_MAX);
|
||||
static SENSOR_DEVICE_ATTR(psu_mfr_pin_max, S_IRUGO, show_linear, NULL, PSU_MFR_PIN_MAX);
|
||||
@@ -165,6 +175,9 @@ static struct attribute *ym2651y_attributes[] = {
|
||||
&sensor_dev_attr_psu_power_good.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_fan1_fault.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_over_temp.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_v_in.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_i_in.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_p_in.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_v_out.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_i_out.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_p_out.dev_attr.attr,
|
||||
@@ -223,6 +236,8 @@ static ssize_t show_word(struct device *dev, struct device_attribute *da,
|
||||
case PSU_POWER_GOOD: /* psu_power_good, high byte bit 3 of status_word, 0=>OK, 1=>FAIL */
|
||||
status = (data->status_word & 0x800) ? 0 : 1;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", status);
|
||||
@@ -266,16 +281,36 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da,
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
struct ym2651y_data *data = ym2651y_update_device(dev);
|
||||
u8 *ptr = NULL;
|
||||
|
||||
u16 value = 0;
|
||||
int exponent, mantissa;
|
||||
int multiplier = 1000;
|
||||
ptr = data->mfr_model + 1; /* The first byte is the count byte of string. */
|
||||
|
||||
if (!data->valid) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (attr->index) {
|
||||
case PSU_V_IN:
|
||||
if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)||
|
||||
(strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) {
|
||||
value = data->v_in;
|
||||
}
|
||||
break;
|
||||
case PSU_I_IN:
|
||||
if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)||
|
||||
(strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) {
|
||||
value = data->i_in;
|
||||
}
|
||||
break;
|
||||
case PSU_P_IN:
|
||||
if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)||
|
||||
(strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) {
|
||||
value = data->p_in;
|
||||
}
|
||||
break;
|
||||
case PSU_V_OUT:
|
||||
value = data->v_out;
|
||||
break;
|
||||
@@ -320,6 +355,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da,
|
||||
case PSU_MFR_IIN_MAX:
|
||||
value = data->mfr_iin_max;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
exponent = two_complement_to_int(value >> 11, 5, 0x1f);
|
||||
@@ -394,6 +431,7 @@ static ssize_t show_ascii(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t show_vout_by_mode(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
struct ym2651y_data *data = ym2651y_update_device(dev);
|
||||
int exponent, mantissa;
|
||||
int multiplier = 1000;
|
||||
@@ -403,7 +441,19 @@ static ssize_t show_vout_by_mode(struct device *dev, struct device_attribute *da
|
||||
}
|
||||
|
||||
exponent = two_complement_to_int(data->vout_mode, 5, 0x1f);
|
||||
mantissa = data->v_out;
|
||||
switch (attr->index) {
|
||||
case PSU_MFR_VOUT_MIN:
|
||||
mantissa = data->mfr_vout_min;
|
||||
break;
|
||||
case PSU_MFR_VOUT_MAX:
|
||||
mantissa = data->mfr_vout_max;
|
||||
break;
|
||||
case PSU_V_OUT:
|
||||
mantissa = data->v_out;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (exponent > 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) :
|
||||
sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent));
|
||||
@@ -414,12 +464,19 @@ static ssize_t show_vout(struct device *dev, struct device_attribute *da,
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct ym2651y_data *data = i2c_get_clientdata(client);
|
||||
u8 *ptr = NULL;
|
||||
|
||||
ptr = data->mfr_model + 1; /* The first byte is the count byte of string. */
|
||||
if (data->chip == YM2401) {
|
||||
return show_vout_by_mode(dev, da, buf);
|
||||
}
|
||||
|
||||
return show_linear(dev, da, buf);
|
||||
else if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)||
|
||||
(strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) {
|
||||
return show_vout_by_mode(dev, da, buf);
|
||||
}
|
||||
else {
|
||||
return show_linear(dev, da, buf);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct attribute_group ym2651y_group = {
|
||||
@@ -612,8 +669,11 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev)
|
||||
{0x81, &data->fan_fault},
|
||||
{0x98, &data->pmbus_revision}};
|
||||
struct reg_data_word regs_word[] = { {0x79, &data->status_word},
|
||||
{0x88, &data->v_in},
|
||||
{0x8b, &data->v_out},
|
||||
{0x89, &data->i_in},
|
||||
{0x8c, &data->i_out},
|
||||
{0x97, &data->p_in},
|
||||
{0x96, &data->p_out},
|
||||
{0x8d, &data->temp},
|
||||
{0x3b, &(data->fan_duty_cycle[0])},
|
||||
@@ -751,4 +811,3 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(ym2651y_init);
|
||||
module_exit(ym2651y_exit);
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#define PSU_MODEL_NAME_LEN 8
|
||||
#define PSU_SERIAL_NUMBER_LEN 18
|
||||
#define PSU_NODE_MAX_PATH_LEN 64
|
||||
#define PSU_FAN_DIR_LEN 3
|
||||
|
||||
int psu_serial_number_get(int id, char *serial, int serial_len)
|
||||
{
|
||||
@@ -60,6 +61,7 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len)
|
||||
int ret = ONLP_STATUS_OK;
|
||||
char model[PSU_MODEL_NAME_LEN + 1] = {0};
|
||||
char *prefix = NULL;
|
||||
char fan_dir[PSU_FAN_DIR_LEN + 1] = {0};
|
||||
|
||||
if (modelname && modelname_len < PSU_MODEL_NAME_LEN) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
@@ -89,11 +91,51 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len)
|
||||
}
|
||||
|
||||
if (strncmp(model, "DPS-850A", strlen("DPS-850A")) == 0) {
|
||||
return PSU_TYPE_AC_DPS850_F2B;
|
||||
prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX;
|
||||
ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir");
|
||||
if (ret != ONLP_STATUS_OK || value != PSU_FAN_DIR_LEN) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
|
||||
return PSU_TYPE_AC_DPS850_F2B;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
|
||||
return PSU_TYPE_AC_DPS850_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) {
|
||||
return PSU_TYPE_AC_YM2851_F2B;
|
||||
prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX;
|
||||
ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir");
|
||||
if (ret != ONLP_STATUS_OK || value != PSU_FAN_DIR_LEN) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
|
||||
return PSU_TYPE_AC_YM2851_F2B;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
|
||||
return PSU_TYPE_AC_YM2851_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(model, "YM-2851J", strlen("YM-2851J")) == 0) {
|
||||
prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX;
|
||||
ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir");
|
||||
if (ret != ONLP_STATUS_OK || value != PSU_FAN_DIR_LEN) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
|
||||
return PSU_TYPE_AC_YM2851_F2B;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
|
||||
return PSU_TYPE_AC_YM2851_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
|
||||
@@ -60,21 +60,56 @@ psu_ym2651y_info_get(onlp_psu_info_t* info)
|
||||
/* Set the associated oid_table */
|
||||
info->hdr.coids[0] = ONLP_FAN_ID_CREATE(index + CHASSIS_FAN_COUNT);
|
||||
info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(index + CHASSIS_THERMAL_COUNT);
|
||||
|
||||
if (strncmp(info->model, "YM-2851J", strlen("YM-2851J")) == 0) {
|
||||
|
||||
/* Read voltage, current and power */
|
||||
if (psu_dps850_pmbus_info_get(index, "psu_v_out", &val) == 0) {
|
||||
info->mvout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
/* Read voltage, current and power */
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_v_out", &val) == 0) {
|
||||
info->mvout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
if (psu_dps850_pmbus_info_get(index, "psu_v_in", &val) == 0) {
|
||||
info->mvin = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VIN;
|
||||
}
|
||||
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_i_out", &val) == 0) {
|
||||
info->miout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
if (psu_dps850_pmbus_info_get(index, "psu_i_out", &val) == 0) {
|
||||
info->miout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_p_out", &val) == 0) {
|
||||
info->mpout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
if (psu_dps850_pmbus_info_get(index, "psu_i_in", &val) == 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_IIN;
|
||||
}
|
||||
|
||||
if (psu_dps850_pmbus_info_get(index, "psu_p_out", &val) == 0) {
|
||||
info->mpout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
|
||||
if (psu_dps850_pmbus_info_get(index, "psu_p_in", &val) == 0) {
|
||||
info->mpin = val;
|
||||
info->caps |= ONLP_PSU_CAPS_PIN;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
/* Read voltage, current and power */
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_v_out", &val) == 0) {
|
||||
info->mvout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_i_out", &val) == 0) {
|
||||
info->miout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_p_out", &val) == 0) {
|
||||
info->mpout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
}
|
||||
|
||||
psu_serial_number_get(index, info->serial, sizeof(info->serial));
|
||||
|
||||
@@ -6,16 +6,10 @@ class OnlPlatform_x86_64_accton_as7816_64x_r0(OnlPlatformAccton,
|
||||
PLATFORM='x86-64-accton-as7816-64x-r0'
|
||||
MODEL="AS7816-64x"
|
||||
SYS_OBJECT_ID=".7816.64"
|
||||
PSU1_MODEL="/sys/bus/i2c/devices/i2c-10/10-005b/psu_mfr_model"
|
||||
PSU2_MODEL="/sys/bus/i2c/devices/i2c-9/9-0058/psu_mfr_model"
|
||||
PSU1_POWER="/sys/bus/i2c/devices/i2c-19/19-0060/psu1_power_good"
|
||||
PSU2_POWER="/sys/bus/i2c/devices/i2c-19/19-0060/psu2_power_good"
|
||||
|
||||
|
||||
def baseconfig(self):
|
||||
self.insmod('optoe')
|
||||
self.insmod('ym2651y')
|
||||
self.insmod('dps850')
|
||||
self.insmod('accton_i2c_cpld')
|
||||
for m in [ 'fan', 'cpld1', 'leds' ]:
|
||||
self.insmod("x86-64-accton-as7816-64x-%s.ko" % m)
|
||||
@@ -32,13 +26,11 @@ class OnlPlatform_x86_64_accton_as7816_64x_r0(OnlPlatformAccton,
|
||||
|
||||
# initiate PSU-1
|
||||
('24c02', 0x53, 10),
|
||||
('dps850', 0x5b, 10),
|
||||
#('ym2851', 0x5b, 10),
|
||||
('ym2851', 0x5b, 10),
|
||||
|
||||
# initiate PSU-2
|
||||
('24c02', 0x50, 9),
|
||||
('dps850', 0x58, 9),
|
||||
#('ym2851', 0x58, 9),
|
||||
('ym2851', 0x58, 9),
|
||||
|
||||
# initiate chassis fan
|
||||
('as7816_64x_fan', 0x68, 17),
|
||||
@@ -200,40 +192,5 @@ class OnlPlatform_x86_64_accton_as7816_64x_r0(OnlPlatformAccton,
|
||||
subprocess.call('echo port50 > /sys/bus/i2c/devices/86-0050/port_name', shell=True)
|
||||
subprocess.call('echo port51 > /sys/bus/i2c/devices/87-0050/port_name', shell=True)
|
||||
subprocess.call('echo port52 > /sys/bus/i2c/devices/88-0050/port_name', shell=True)
|
||||
|
||||
PSU_DELTA="DPS-850"
|
||||
PSU_3Y= "YM-2851F"
|
||||
if os.path.exists(self.PSU2_POWER):
|
||||
with open(self.PSU2_POWER, 'r') as fd:
|
||||
val=int(fd.read())
|
||||
if val==1:
|
||||
if os.path.exists(self.PSU2_MODEL):
|
||||
with open(self.PSU2_MODEL, 'r') as fd:
|
||||
f=open(self.PSU2_MODEL)
|
||||
val_str=f.read()
|
||||
if int(val_str.find(PSU_3Y))== 0:
|
||||
subprocess.call('echo 0x58 > /sys/bus/i2c/devices/i2c-9/delete_device', shell=True)
|
||||
subprocess.call('echo 0x5b > /sys/bus/i2c/devices/i2c-10/delete_device', shell=True)
|
||||
self.new_i2c_devices([
|
||||
('ym2851', 0x58, 9),
|
||||
('ym2851', 0x5b, 10),
|
||||
])
|
||||
return True
|
||||
if os.path.exists(self.PSU1_POWER):
|
||||
with open(self.PSU1_POWER, 'r') as fd:
|
||||
val=int(fd.read())
|
||||
if val==1:
|
||||
if os.path.exists(self.PSU1_MODEL):
|
||||
with open(self.PSU1_MODEL, 'r') as fd:
|
||||
f=open(self.PSU1_MODEL)
|
||||
val_str=f.read()
|
||||
if int(val_str.find(PSU_3Y))== 0:
|
||||
subprocess.call('echo 0x58 > /sys/bus/i2c/devices/i2c-9/delete_device', shell=True)
|
||||
subprocess.call('echo 0x5b > /sys/bus/i2c/devices/i2c-10/delete_device', shell=True)
|
||||
self.new_i2c_devices([
|
||||
('ym2851', 0x58, 9),
|
||||
('ym2851', 0x5b, 10),
|
||||
])
|
||||
return True
|
||||
|
||||
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user