sonic-buildimage/platform/innovium/sonic-platform-modules-cameo/esc600-128q/modules/x86-64-cameo-esc600-128q.c
Tony Titus fbd4e452c7
[201911] [Innovium] Add new platforms and config updates (#7545)
Update Innovium configs + Add new platforms supporting Innovium chips
2021-05-17 12:30:20 -07:00

4545 lines
178 KiB
C

/* An hwmon driver for Cameo ESC600-128Q i2c Module */
#pragma GCC diagnostic ignored "-Wformat-zero-length"
#include "x86-64-cameo-esc600-128q.h"
/* Addresses scanned */
static const unsigned short normal_i2c[] = { 0x30, 0x31, 0x33, I2C_CLIENT_END };
/*function */
/*0x31 CPLD-1 700HC*/
#ifdef LED_CTRL_WANTED
/********************************************************************************/
/* Function Name : led_ctrl_get */
/* Description : This is the function to get Ctrl LED Reg 0x31 0xa0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t led_ctrl_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == LED_CTRL)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa0); //to get register 0x31 0xa0
debug_print((KERN_DEBUG "DEBUG : LED_CTRL status = %x\n",status));
sprintf(buf, "");
if (status & res)
{
sprintf(buf, "%sFront port LED is enabled\n", buf);
}
else
{
sprintf(buf, "%sFront port LED is disabled\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : led_ctrl_set */
/* Description : This is the function to set Ctrl LED Reg 0x31 0xa0 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t led_ctrl_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = 0;
u8 value = 0;
u8 result = 0;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_3_data = i2c_get_clientdata(Cameo_CPLD_3_client);
mutex_lock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : led_ctrl_set lock\n"));
if (attr->index == LED_CTRL)
{
i = simple_strtol(buf, NULL, 10);
switch(i)
{
case TURN_ON:
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa0); //to get register 0x31 0xa0
debug_print((KERN_ALERT "DEBUG : LED_CTRL status = %x\n",status));
value = status | LED_ON;
debug_print((KERN_ALERT "DEBUG : LED_CTRL value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xa0, value); //to set register 0x31 0xa0
debug_print((KERN_ALERT "DEBUG : LED_CTRL result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: led_ctrl_set on FAILED!\n");
}
else
{
debug_print((KERN_ALERT "DEBUG : Fiber LED is Enable\n"));
}
break;
case TURN_OFF:
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa0); //to get register 0x31 0xa0
debug_print((KERN_DEBUG "DEBUG : LED_CTRL status = %x\n",status));
value = status & LED_OFF;
debug_print((KERN_DEBUG "DEBUG : LED_CTRL value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xa0, value); //to set register 0x31 0xa0
debug_print((KERN_DEBUG "DEBUG : LED_CTRL result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: led_ctrl_set off FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "DEBUG : Fiber LED is Disable\n"));
}
break;
default:
printk(KERN_ALERT "LED set wrong Value\n");
}
}
mutex_unlock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : led_ctrl_set unlock\n"));
return count;
}
#endif
/********************************************************************************/
/* Function Name : sensor_status_get */
/* Description : This is the function to get thermal sensor alert */
/* status 0x31 0xc0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sensor_status_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc0); //to get register 0x31 0xc0
debug_print((KERN_DEBUG "DEBUG : sensor_status_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SENSOR_STATUS)
{
for (i = 1; i <= 6; i++)
{
switch(i)
{
case ALERT_TH0:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by ALERT_TH0 (LM63)\n", buf);
}
break;
case ALERT_TH1:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by ALERT_TH1\n", buf);
}
break;
case ALERT_TH2:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by ALERT_TH2\n", buf);
}
break;
case ALERT_TH3:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by ALERT_TH3\n", buf);
}
break;
case ALERT_TH4:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by ALERT_TH4\n", buf);
}
break;
case ALERT_TH5:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by ALERT_TH5 (IO Board)\n", buf);
}
break;
}
res = res << 1;
}
if(status == 0xf)
{
sprintf(buf, "%sNo interrupt is triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sersor_status_mask_all_get */
/* Description : This is the function to get all thermal sensor alert */
/* status mask 0x31 0xc1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sersor_status_mask_all_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc1); //to get register 0x31 0xc1
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_all_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SENSOR_STATUS_MASK)
{
for (i = 1; i <= 6; i++)
{
switch(i)
{
case ALERT_TH0_MASK:
if (status & res)
{
sprintf(buf, "%sALERT_TH1 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH1 Mask is disabled\n", buf);
}
break;
case ALERT_TH1_MASK:
if (status & res)
{
sprintf(buf, "%sALERT_TH2 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH2 Mask is disabled\n", buf);
}
break;
case ALERT_TH2_MASK:
if (status & res)
{
sprintf(buf, "%sALERT_TH3 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH3 Mask is disabled\n", buf);
}
break;
case ALERT_TH3_MASK:
if (status & res)
{
sprintf(buf, "%sALERT_TH4 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH4 Mask is disabled\n", buf);
}
break;
case ALERT_TH4_MASK:
if (status & res)
{
sprintf(buf, "%sALERT_TH5 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH5 Mask is disabled\n", buf);
}
break;
case ALERT_TH5_MASK:
if (status & res)
{
sprintf(buf, "%sALERT_TH6 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH6 Mask is disabled\n", buf);
}
break;
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sersor_status_mask_get */
/* Description : This is the function to get thermal sensor alert */
/* status mask 0x31 0xc1 */
/* Input(s) : attr->index. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sersor_status_mask_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc1); //to get register 0x31 0xc1
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_get status = %x\n",status));
sprintf(buf, "");
switch(attr->index)
{
case ALERT_TH0_MASK:
if (status & 0x1)
{
sprintf(buf, "%sALERT_TH1 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH1 Mask is disabled\n", buf);
}
break;
case ALERT_TH1_MASK:
if (status & 0x2)
{
sprintf(buf, "%sALERT_TH2 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH2 Mask is disabled\n", buf);
}
break;
case ALERT_TH2_MASK:
if (status & 0x4)
{
sprintf(buf, "%sALERT_TH3 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH3 Mask is disabled\n", buf);
}
break;
case ALERT_TH3_MASK:
if (status & 0x8)
{
sprintf(buf, "%sALERT_TH4 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH4 Mask is disabled\n", buf);
}
break;
case ALERT_TH4_MASK:
if (status & 0x10)
{
sprintf(buf, "%sALERT_TH5 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH5 Mask is disabled\n", buf);
}
break;
case ALERT_TH5_MASK:
if (status & 0x20)
{
sprintf(buf, "%sALERT_TH6 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH6 Mask is disabled\n", buf);
}
break;
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sersor_status_mask_set */
/* Description : This is the function to set thermal sensor alert */
/* status mask 0x31 0xc1 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t sersor_status_mask_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 result = 0;
int i = 0;
int j = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_3_data = i2c_get_clientdata(Cameo_CPLD_3_client);
i = attr->index;
j = simple_strtol(buf, NULL, 10); //get input ON or OFF
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set i: %d\n", i));
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set j: %d\n", j));
mutex_lock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set lock\n"));
if (i >= 1 && i <= 6)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc1); //to get register 0x31 0xc1
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set status = %x\n",status));
if( j == TURN_ON)
{
status |= (1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xc1, status); //to set register 0x31 0xc1
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sersor_status_mask_%d set ON FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "sersor_status_mask_set %02d ON\n", i));
}
}
else if( j == TURN_OFF)
{
status &= ~(1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xc1, status); //to set register 0x31 0xc1
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sersor_status_mask_%d set set OFF FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "sersor_status_mask_set %02d OFF\n", i));
}
}
else
{
printk(KERN_ALERT "sersor_status_mask_%d set wrong value\n", i);
}
}
mutex_unlock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sersor_status_mask_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : switch_alarm_get */
/* Description : This is the function to get thermal sensor alert */
/* status switch board 0x31 0xc2 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_alarm_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
res = 0x1;
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc2); //to get register 0x31 0xc2
debug_print((KERN_DEBUG "DEBUG : switch_alarm_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SWITCH_ALARM)
{
for (i = 1; i <= 4; i++)
{
if ( i == SW_ALERT_TH0)
{
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by SW_ALERT_TH0\n", buf);
}
}
else if( i == SW_ALERT_TH1)
{
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by SW_ALERT_TH1\n", buf);
}
}
else if( i == SW_ALERT_TH2)
{
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by SW_ALERT_TH2\n", buf);
}
}
else if( i == SW_ALERT_TH3)
{
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by SW_ALERT_TH3\n", buf);
}
}
res = res << 1;
}
if(status == 0xf)
{
sprintf(buf, "%sNo interrupt is triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_alarm_mask_all_get */
/* Description : This is the function to get all thermal sensor alert */
/* status switch board mask 0x31 0xc3 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_alarm_mask_all_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc3); //to get register 0x31 0xc3
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_all_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SWITCH_ALARM_MASK)
{
for (i = 1; i <= 4; i++)
{
if ( i == SW_ALERT_TH0)
{
if (status & res)
{
sprintf(buf, "%sSW_ALERT_TH1 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSW_ALERT_TH1 Mask is disabled\n", buf);
}
}
else if( i == SW_ALERT_TH1)
{
if (status & res)
{
sprintf(buf, "%sSW_ALERT_TH2 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSW_ALERT_TH2 Mask is disabled\n", buf);
}
}
else if( i == SW_ALERT_TH2)
{
if (status & res)
{
sprintf(buf, "%sSW_ALERT_TH3 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSW_ALERT_TH3 Mask is disabled\n", buf);
}
}
else if( i == SW_ALERT_TH3)
{
if (status & res)
{
sprintf(buf, "%sSW_ALERT_TH4 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSW_ALERT_TH4 Mask is disabled\n", buf);
}
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_alarm_mask_get */
/* Description : This is the function to get thermal sensor alert */
/* status switch board mask 0x31 0xc3 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_alarm_mask_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc3); //to get register 0x31 0xc3
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SW_ALERT_TH0_MASK)
{
if (status & 0x1)
{
sprintf(buf, "%sALERT_TH1 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH1 Mask is disabled\n", buf);
}
}
else if(attr->index == SW_ALERT_TH1_MASK)
{
if (status & 0x2)
{
sprintf(buf, "%sALERT_TH2 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH2 Mask is disabled\n", buf);
}
}
else if(attr->index == SW_ALERT_TH2_MASK)
{
if (status & 0x4)
{
sprintf(buf, "%sALERT_TH3 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH3 Mask is disabled\n", buf);
}
}
else if(attr->index == SW_ALERT_TH3_MASK)
{
if (status & 0x8)
{
sprintf(buf, "%sALERT_TH4 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sALERT_TH4 Mask is disabled\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_alarm_mask_set */
/* Description : This is the function to set thermal sensor alert */
/* status switch board mask 0x31 0xc3 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t switch_alarm_mask_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 result = 0;
int i = 0;
int j = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_3_data = i2c_get_clientdata(Cameo_CPLD_3_client);
i = attr->index;
j = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set i: %d\n", i));
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set j: %d\n", j));
mutex_lock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set lock\n"));
if (i >= 1 && i <= 4)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xc3); //to get register 0x31 0xc3
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set status = %x\n",status));
if( j == TURN_ON)
{
status |= (1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xc3, status); //to set register 0x31 0xc3
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_alarm_mask_%d set ON FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "switch_alarm_mask_set %02d ON\n", i));
}
}
else if( j == TURN_OFF)
{
status &= ~(1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xc3, status); //to set register 0x31 0xc3
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_alarm_mask_%d set set OFF FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "switch_alarm_mask_set %02d OFF\n", i));
}
}
else
{
printk(KERN_ALERT "switch_alarm_mask_%d set wrong value\n", i);
}
}
mutex_unlock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_alarm_mask_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : sensor_int_get */
/* Description : This is the function to get thermal sensor interrupt */
/* 0x31 0xd0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sensor_int_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xd0); //to get register 0x31 0xd0
debug_print((KERN_DEBUG "DEBUG : sensor_int_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SENSOR_INT)
{
for (i = 1; i <= 2; i++)
{
if ( i == SENSOR_INT_0)
{
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by Switch Board\n", buf);
}
}
else if( i == SENSOR_INT_1)
{
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by Carrier Board\n", buf);
}
}
res = res << 1;
}
if(status == 0x3)
{
sprintf(buf, "%sNo interrupt is triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sersor_int_mask_all_get */
/* Description : This is function to get all thermal sensor interrupt */
/* mask 0x31 0xd1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sersor_int_mask_all_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xd1); //to get register 0x31 0xd1
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_all_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SENSOR_STATUS_MASK)
{
for (i = 1; i <= 2; i++)
{
if ( i == SENSOR_INT_0)
{
if (status & res)
{
sprintf(buf, "%sSENSOR_INT_1 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSENSOR_INT_1 Mask is disabled\n", buf);
}
}
else if( i == SENSOR_INT_1)
{
if (status & res)
{
sprintf(buf, "%sSENSOR_INT_2 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSENSOR_INT_2 Mask is disabled\n", buf);
}
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sersor_int_mask_get */
/* Description : This is the function to get thermal sensor interrupt */
/* mask 0x31 0xd1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sersor_int_mask_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xd1); //to get register 0x31 0xd1
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SENSOR_INT_0_MASK)
{
if (status & 0x1)
{
sprintf(buf, "%sSENSOR_INT_1 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSENSOR_INT_1 Mask is disabled\n", buf);
}
}
else if(attr->index == SENSOR_INT_1_MASK)
{
if (status & 0x2)
{
sprintf(buf, "%sSENSOR_INT_2 Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSENSOR_INT_2 Mask is disabled\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sersor_int_mask_set */
/* Description : This is the function to set thermal sensor interrupt */
/* mask 0x31 0xd1 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t sersor_int_mask_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 result = 0;
int i = 0;
int j = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_3_data = i2c_get_clientdata(Cameo_CPLD_3_client);
i = attr->index;
j = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set i: %d\n", i));
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set j: %d\n", j));
mutex_lock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xd1); //to get register 0x31 0xd1
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set status = %x\n",status));
if( j == TURN_ON)
{
status |= (1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xd1, status); //to set register 0x31 0xd1
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sersor_int_mask_%d set ON FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "sersor_int_mask_set %02d ON\n", i));
}
}
else if( j == TURN_OFF)
{
status &= ~(1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xd1, status); //to set register 0x31 0xd1
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sersor_int_mask_%d set set OFF FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "sersor_int_mask_set %02d OFF\n", i));
}
}
else
{
printk(KERN_ALERT "sersor_int_mask_%d set wrong value\n", i);
}
mutex_unlock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sersor_int_mask_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : fan_status_get */
/* Description : This is the function to get fan status 0x30 0x00 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
/*0x30 CPLD-1 640UHC*/
static ssize_t fan_status_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 bmc_present = -EPERM;
u8 mask = 0x1;
u8 res = 0x1;
u16 fan_speed;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct i2c_client *target_client = NULL;
debug_print((KERN_DEBUG "DEBUG : fan_status_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == FAN_STATUS)
{
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0xe9); //to get register 0x14 0xe9
}
else
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_4_client, 0xa1); //to get register 0x35 0xa1
}
for (i = 1; i <= 8; i++)
{
if ( i >= 5 && i <= 8 )
{
if (status & res)
{
sprintf(buf, "%sFan module %d status is Good\n", buf, i-4);
}
else
{
sprintf(buf, "%sFan module %d status is Fail\n", buf, i-4);
}
}
res = res << 1;
}
}
else if (attr->index == FAN_SPEED_RPM)
{
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
target_client = Cameo_BMC_client;
res = i2c_smbus_read_byte_data(Cameo_BMC_client, 0xe9); //to get register 0x14 0xe9
}
else
{
target_client = Cameo_CPLD_4_client;
res = i2c_smbus_read_byte_data(Cameo_CPLD_4_client, 0xa1); //to get register 0x35 0xa1
}
if(res < 0) {
sprintf(buf, "%sCheck fan present error\n", buf);
return sprintf(buf, "%s\n",buf);
}
for(i=0; i<4; i++)
{
// skip the fan which is not present
if(!(res & (0x01<<i)))
{
sprintf(buf, "%sFanModule%i RPM : N/A\n", buf, i+1);
continue;
}
if(target_client == Cameo_BMC_client)
{
// read high byte
status = i2c_smbus_read_byte_data(target_client, 0xe0+(i*2)+1);
if(status < 0){
sprintf(buf, "%sFanModule%i RPM : read error\n", buf, i+1);
continue;
}
fan_speed = status;
// read low byte
status = i2c_smbus_read_byte_data(target_client, 0xe0+(i*2));
if(status < 0){
sprintf(buf, "%sFanModule%i RPM : read error\n", buf, i+1);
continue;
}
fan_speed = ((fan_speed<<8) + status)*30;
sprintf(buf, "%sFanModule%i : %d RPM\n", buf, i+1, fan_speed);
}
else
{
// read high byte
status = i2c_smbus_read_byte_data(target_client, 0xA3+(i*2)+1);
if(status < 0){
sprintf(buf, "%sFanModule%i RPM : read error\n", buf, i+1);
continue;
}
fan_speed = status;
// read low byte
status = i2c_smbus_read_byte_data(target_client, 0xA3+(i*2));
if(status < 0){
sprintf(buf, "%sFanModule%i RPM : read error\n", buf, i+1);
continue;
}
fan_speed = ((fan_speed<<8) + status)*30;
sprintf(buf, "%sFanModule%i : %d RPM\n", buf, i+1, fan_speed);
}
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : fan_insert_get */
/* Description : This is the function to get fan insert 0x30 0x01 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t fan_insert_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 bmc_present = -EPERM;
u8 mask = 0x1;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0xe9); //to get register 0x14 0xe9
}
else
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_4_client, 0xa1); //to get register 0x35 0xa1
}
debug_print((KERN_DEBUG "DEBUG : fan_insert_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == FAN_INSERT)
{
for (i = 1; i <= 4; i++)
{
if (status & res)
{
sprintf(buf, "%sFan module %d is Insert\n", buf, i);
}
else
{
sprintf(buf, "%sFan module %d is Absent\n", buf, i);
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : fan_power_get */
/* Description : This is the function to get fan power 0x30 0x02 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t fan_power_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 bmc_present = -EPERM;
u8 mask = 0x1;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0xea); //to get register 0x14 0xe9
}
else
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_4_client, 0xa2); //to get register 0x35 0xa1
}
debug_print((KERN_DEBUG "DEBUG : fan_power_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == FAN_POWER)
{
for (i = 1; i <= 8; i++)
{
if ( i >= 5 && i <= 8 )
{
if (status & res)
{
sprintf(buf, "%sFan module %d status is Power ON\n", buf, i-4);
}
else
{
sprintf(buf, "%sFan module %d status is Power OFF\n", buf, i-4);
}
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : fan_direct_get */
/* Description : This is the function to get fan direct 0x30 0x03 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t fan_direct_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 bmc_present = -EPERM;
u8 mask = 0x1;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0xea); //to get register 0x14 0xe9
}
else
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_4_client, 0xa2); //to get register 0x35 0xa1
}
debug_print((KERN_DEBUG "DEBUG : fan_direct_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == FAN_DIRECT)
{
for (i = 1; i <= 4; i++)
{
if (status & res)
{
sprintf(buf, "%sFan module %d direction is OUT\n", buf, i);
}
else
{
sprintf(buf, "%sFan module %d direction is IN\n", buf, i);
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : usb_power_get */
/* Description : This is the function to get usb power 0x30 0xa0 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t usb_power_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == USB_POWER)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa0); //to get register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : USB_POWER status = %x\n",status));
sprintf(buf, "");
if (status & res)
{
sprintf(buf, "%sUSB Power is ON\n", buf);
}
else
{
sprintf(buf, "%sUSB Power is OFF\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : usb_power_set */
/* Description : This is the function to set usb power 0x30 0xa0 */
/* */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t usb_power_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
mutex_lock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : usb_power_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa0); //to get register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : usb_power_set status = %x\n",status));
if (attr->index == USB_POWER)
{
i = simple_strtol(buf, NULL, 10); //get input ON or OFF
if (i == TURN_ON)
{
value = status | USB_ON;
debug_print((KERN_DEBUG "DEBUG : usb_power_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa0, value); //to set register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : usb_power_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: usb_ctrl_set ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "USB Power is ON\n"));
}
}
else if (i == TURN_OFF)
{
value = status & USB_OFF;
debug_print((KERN_DEBUG "DEBUG : usb_power_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa0, value); //to set register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : usb_power_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: usb_power_set OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "USB Power is OFF\n"));
}
}
else
{
printk(KERN_ALERT "USB_POWER set wrong Value\n");
}
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : usb_power_set unlock\n"));
return count;
}
#ifdef WDT_CTRL_WANTED
/********************************************************************************/
/* Function Name : wdt_status_get */
/* Description : This is the function to get WDT timer */
/* */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t wdt_status_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x10;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == WDT_CTRL)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa0); //to get register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : WDT status = %x\n",status));
sprintf(buf, "");
if (status & res)
{
sprintf(buf, "%sWDT is Enable\n", buf);
}
else
{
sprintf(buf, "%sWDT is Disable\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : wdt_status_set */
/* Description : This is the function to set WDT timer */
/* */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t wdt_status_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
mutex_lock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : wdt_status_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa0); //to get register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : wdt_status_set status = %x\n",status));
if (attr->index == WDT_CTRL)
{
i = simple_strtol(buf, NULL, 10); //get input ON or OFF
if (i == TURN_ON)
{
value = status | 0x10;
debug_print((KERN_DEBUG "DEBUG : wdt_status_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa0, value); //to set register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : wdt_status_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: usb_ctrl_set ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "WDT is Enable\n"));
}
}
else if (i == TURN_OFF)
{
value = status & 0xef;
debug_print((KERN_DEBUG "DEBUG : wdt_status_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa0, value); //to set register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : wdt_status_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: wdt_status_set OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "WDT is Disable\n"));
}
}
else
{
printk(KERN_ALERT "WDT set wrong Value\n");
}
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : wdt_status_set unlock\n"));
return count;
}
#endif /*WDT_CTRL_WANTED*/
/********************************************************************************/
/* Function Name : shutdown_sys_get */
/* Description : This is the function to get shutdown status */
/* */
/* Input(s) : 0. */
/* Output(s) : None. */
/* Returns : None. */
static ssize_t shutdown_sys_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x10;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == SYS_SHUTDOWN)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa1); //to get register 0x30 0xa1
debug_print((KERN_DEBUG "DEBUG : Shutdown status = %x\n",status));
sprintf(buf, "");
if (status & res)
{
sprintf(buf, "%sShutdown is triggered\n", buf);
}
else
{
sprintf(buf, "%sShutdown is not triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : shutdown_sys_set */
/* Description : This is the function to set shutdown status */
/* */
/* Input(s) : 0. */
/* Output(s) : None. */
/* Returns : None. */
static ssize_t shutdown_sys_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
mutex_lock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa1); //to get register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set status = %x\n",status));
if (attr->index == WDT_CTRL)
{
i = simple_strtol(buf, NULL, 10); //get input ON or OFF
if (i == TURN_ON)
{
value = status | 0x10;
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa1, value); //to set register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: usb_ctrl_set ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Shutdown is Enable\n"));
}
}
else if (i == TURN_OFF)
{
value = status & 0xef;
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa1, value); //to set register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: shutdown_sys_set OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Shutdown is Disable\n"));
}
}
else
{
printk(KERN_ALERT "Shutdown set wrong Value\n");
}
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : shutdown_sys_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : reset_sys_set */
/* Description : This is the function to reset system 0x30 0xa1 */
/* */
/* Input(s) : 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t reset_sys_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = 0;
u8 value = 0;
u8 result = 0;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
mutex_lock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : reset_sys_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa1); //to get register 0x30 0xa1
debug_print((KERN_DEBUG "DEBUG : SYS_RESET status = %x\n",status));
if (attr->index == SYS_RESET)
{
i = simple_strtol(buf, NULL, 10); //get input 0 to reset system
if (i == 0)
{
value = 0x0; //value 0 to reset system
debug_print((KERN_DEBUG "DEBUG : reset_sys_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa1, value); //to set register 0x30 0xa1
debug_print((KERN_DEBUG "DEBUG : reset_sys_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: reset_sys_set set FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Switch is reset\n"));
}
}
else
{
printk(KERN_ALERT "reset_sys_set set wrong Value\n");
}
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : reset_sys_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : module_reset_set */
/* Description : This is the function to reset PHY module 0x30 0xa2 */
/* */
/* Input(s) : PHY module number. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t module_reset_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 result = 0;
int card_num = 0;
int input = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
if (attr->index == MODULE_RESET)
{
input = simple_strtol(buf, NULL, 10); //get input module number
if(input <= 0 || input > 8)
{
printk(KERN_ALERT "ERROR: module_reset_%d RESET FAILED!\n", input);
}
else
{
mutex_lock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : module_reset_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa2); //to get register 0x30 0xa2
debug_print((KERN_DEBUG "DEBUG : module_reset_set status = %x\n",status));
status &= ~(1 << (input-1));
debug_print((KERN_DEBUG "DEBUG : module_reset_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa2, status); //to set register 0x30 0xa2
debug_print((KERN_DEBUG "DEBUG : module_reset_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: module_reset_%d RESET FAILED!\n", card_num);
}
else
{
debug_print((KERN_DEBUG "module_reset_%02d SUCCESS\n", card_num));
}
}
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : module_reset_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : module_insert_get */
/* Description : This is the function to get module insert 0x30 0xa3 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t module_insert_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa3); //get slot present status 0x30 0xa3
debug_print((KERN_DEBUG "DEBUG : module_insert_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == MODULE_INSERT)
{
for (i = 1; i <= 8; i++)
{
if (status & res)
{
sprintf(buf, "%sModule %d is present\n", buf , i);
}
else
{
sprintf(buf, "%sModule %d is not present\n", buf, i);
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : module_power_get */
/* Description : This is the function to get module insert 0x30 0xa3 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t module_power_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa4); //get slot present status 0x30 0xa3
debug_print((KERN_DEBUG "DEBUG : module_power_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == MODULE_POWER)
{
for (i = 1; i <= 8; i++)
{
if (status & res)
{
sprintf(buf, "%sModule %d is power good\n", buf , i);
}
else
{
sprintf(buf, "%sModule %d is not power good\n", buf, i);
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : module_12v_status_get */
/* Description : This is the function to get module insert 0x30 0xa3 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t module_12v_status_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa5); //get slot present status 0x30 0xa3
debug_print((KERN_DEBUG "DEBUG : module_12v_status_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == MODULE_12V_STAT)
{
for (i = 1; i <= 8; i++)
{
if (status & res)
{
sprintf(buf, "%sModule %d 12V is enable\n", buf , i);
}
else
{
sprintf(buf, "%sModule %d 12V is disable\n", buf, i);
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : module_enable_get */
/* Description : This is the function to get module insert 0x30 0xa3 */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t module_enable_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xa5); //get slot present status 0x30 0xa3
debug_print((KERN_DEBUG "DEBUG : module_enable_get status = %x\n",status));
if (attr->index == MODULE_ENABLE)
{
sprintf(buf, "%s0x%x\n", buf, status);
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : module_enable_set */
/* Description : This is the function to reset PHY module 0x30 0xa2 */
/* */
/* Input(s) : PHY module number. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t module_enable_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 result = 0;
int input = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
if (attr->index == MODULE_ENABLE)
{
input = simple_strtol(buf, NULL, 16); //get input module number
debug_print((KERN_DEBUG "DEBUG : module_enable_set input = %x \n",input));
mutex_lock(&CPLD_2_data->update_lock);
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xa5, input); //to set register 0x30 0xa2
debug_print((KERN_DEBUG "DEBUG : module_enable_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: module RESET FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "module enable SUCCESS\n"));
}
mdelay(1000);
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : module_enable_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : switch_int_get */
/* Description : This is the function to get switch interrupt status */
/* 0x30 0xd0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_int_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xd0); //to get register 0x30 0xd0
debug_print((KERN_DEBUG "DEBUG : switch_int_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SWITCH_INT)
{
for (i = 1; i <= 6; i++)
{
switch(i)
{
case MODULE_INS_INT:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by Module insert\n", buf);
}
break;
case MODULE_INT:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by Module\n", buf);
}
break;
case MODULE_POWER_INT:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by Module Power\n", buf);
}
break;
case THER_SENSOR_INT:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by Thermal Sensor\n", buf);
}
break;
case IO_BOARD_INT:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by IO Board\n", buf);
}
break;
case FAN_ERROR_INT:
if (!(status & res))
{
sprintf(buf, "%sInterrupt is triggered by FAN ERROR\n", buf);
}
break;
}
res = res << 1;
}
if(status == 0xf)
{
sprintf(buf, "%sNo interrupt is triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_int_mask_all_get */
/* Description : This is the function to get all switch interrupt */
/* mask status 0x30 0xd1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_int_mask_all_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xd1); //to get register 0x30 0xd1
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_all_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SWITCH_INT_MASK)
{
for (i = 1; i <= 6; i++)
{
switch(i)
{
case MODULE_INS_INT_MASK:
if (status & res)
{
sprintf(buf, "%sModule insert interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sModule insert interrupt Mask is disabled\n", buf);
}
break;
case MODULE_INT_MASK:
if (status & res)
{
sprintf(buf, "%sModule interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sModule interrupt Mask is disabled\n", buf);
}
break;
case MODULE_POW_INT_MASK:
if (status & res)
{
sprintf(buf, "%sModule power interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sModule power interrupt Mask is disabled\n", buf);
}
break;
case THER_SEN_INT_MASK:
if (status & res)
{
sprintf(buf, "%sThermal Sensor interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sThermal Sensor interrupt Mask is disabled\n", buf);
}
break;
case IO_BOARD_INT_MASK:
if (status & res)
{
sprintf(buf, "%sIO Board interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sIO Board interrupt Mask is disabled\n", buf);
}
break;
case FAN_ERROR_INT_MASK:
if (status & res)
{
sprintf(buf, "%sFan error interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sFan error interrupt Mask is disabled\n", buf);
}
break;
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_int_mask_get */
/* Description : This is the function to get switch interrupt */
/* mask status 0x30 0xd1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_int_mask_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xd1); //to get register 0x30 0xd1
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_get status = %x\n",status));
sprintf(buf, "");
switch(attr->index)
{
case MODULE_INS_INT_MASK:
if (status & 0x1)
{
sprintf(buf, "%sModule insert interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sModule insert interrupt Mask is disabled\n", buf);
}
break;
case MODULE_INT_MASK:
if (status & 0x2)
{
sprintf(buf, "%sModule interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sModule interrupt Mask is disabled\n", buf);
}
break;
case MODULE_POW_INT_MASK:
if (status & 0x4)
{
sprintf(buf, "%sModule power interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sModule power interrupt Mask is disabled\n", buf);
}
break;
case THER_SEN_INT_MASK:
if (status & 0x8)
{
sprintf(buf, "%sThermal Sensor interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sThermal Sensor interrupt Mask is disabled\n", buf);
}
break;
case IO_BOARD_INT_MASK:
if (status & 0x10)
{
sprintf(buf, "%sIO Board interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sIO Board interrupt Mask is disabled\n", buf);
}
break;
case FAN_ERROR_INT_MASK:
if (status & 0x20)
{
sprintf(buf, "%sFan error interrupt Mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sFan error interrupt Mask is disabled\n", buf);
}
break;
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_int_mask_set */
/* Description : This is the function to set switch interrupt */
/* mask status 0x30 0xd1 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None . */
/********************************************************************************/
static ssize_t switch_int_mask_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 result = 0;
int i = 0;
int j = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_2_data = i2c_get_clientdata(Cameo_CPLD_2_client);
i = attr->index;
j = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set i: %d\n", i));
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set j: %d\n", j));
mutex_lock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set lock\n"));
if (i >= 1 && i <= 6)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0xd1); //to get register 0x30 0xd1
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set status = %x\n",status));
if( j == TURN_ON)
{
status |= (1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xd1, status); //to set register 0x30 0xd1
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_int_mask_%d set ON FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "switch_int_mask_set %02d ON\n", i));
}
}
else if( j == TURN_OFF)
{
status &= ~(1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(Cameo_CPLD_2_client, 0xd1, status); //to set register 0x30 0xd1
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_int_mask_%d set set OFF FAILED!\n", i);
}
else
{
debug_print((KERN_DEBUG "switch_int_mask_set %02d OFF\n", i));
}
}
else
{
printk(KERN_ALERT "switch_int_mask_%d set wrong value\n", i);
}
}
mutex_unlock(&CPLD_2_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_int_mask_set unlock\n"));
return count;
}
/*0x33 I/O Board CPLD*/
/********************************************************************************/
/* Function Name : sfp_select_get */
/* Description : This is the function to get sfp i2c interface */
/* status 0x33 0x20 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sfp_select_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == SFP_SELECT)
{
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x60); //to get register 0x33 0x60
debug_print((KERN_DEBUG "DEBUG : SFP_SELECT status = %x\n",status));
sprintf(buf, "");
if (status & 0x1)
{
sprintf(buf, "%sI2C interface is set Port 1\n", buf);
}
else if (status & 0x2)
{
sprintf(buf, "%sI2C interface is set Port 2\n", buf);
}
else if (status & 0x3)
{
sprintf(buf, "%sI2C interface is set Port MGM\n", buf);
}
else
{
sprintf(buf, "%sI2C interface is NOT SET\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sfp_select_set */
/* Description : This is the function to set sfp i2c interface */
/* status 0x33 0x20 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t sfp_select_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sfp_select_set lock\n"));
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x60); //to get register 0x33 0x60
debug_print((KERN_DEBUG "DEBUG : sfp_select_set status = %x\n",status));
if (attr->index == SFP_SELECT)
{
i = simple_strtol(buf, NULL, 10);
if (i == 0)
{
value = 0x0;
debug_print((KERN_DEBUG "DEBUG : sfp_select_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x60, value); //to set register 0x33 0x60
debug_print((KERN_DEBUG "DEBUG : sfp_select_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: I2C interface is set Port 1 FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "I2C interface is NOT set\n"));
}
}
else if (i == 1)
{
value = 0x1;
debug_print((KERN_DEBUG "DEBUG : sfp_select_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x60, value); //to set register 0x33 0x60
debug_print((KERN_DEBUG "DEBUG : sfp_select_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: I2C interface is set Port 1 FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "I2C interface is set Port 1\n"));
}
}
else if (i == 2)
{
value = 0x2;
debug_print((KERN_DEBUG "DEBUG : sfp_select_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x60, value); //to set register 0x33 0x60
debug_print((KERN_DEBUG "DEBUG : sfp_select_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: I2C interface is set Port 2 FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "I2C interface is set Port 2\n"));
}
}
else if (i == 3)
{
value = 0x3;
debug_print((KERN_DEBUG "DEBUG : sfp_select_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x60, value); //to set register 0x33 0x60
debug_print((KERN_DEBUG "DEBUG : sfp_select_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: I2C interface is set Port MGM FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "I2C interface is set Port MGM\n"));
}
}
else
{
printk(KERN_ALERT "SFP_SELECT set wrong Value\n");
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sfp_select_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : sfp_tx_get */
/* Description : This is the function to get sfp tx status */
/* 0x33 0x70 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sfp_tx_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x70); //to get register 0x33 0x70
debug_print((KERN_DEBUG "DEBUG : sfp_tx_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SFP_TX_DISABLE)
{
for (i = 1; i <= 3; i++)
{
if ( i == SFP_PORT_1)
{
if (status & res)
{
sprintf(buf, "%sTX of SFP port 1 is disabled\n", buf);
}
else
{
sprintf(buf, "%sTX of SFP port 1 is enabled\n", buf);
}
}
else if( i == SFP_PORT_2)
{
if (status & res)
{
sprintf(buf, "%sTX of SFP port 2 is disabled\n", buf);
}
else
{
sprintf(buf, "%sTX of SFP port 2 is enabled\n", buf);
}
}
else if( i == SFP_PORT_MGM)
{
if (status & res)
{
sprintf(buf, "%sTX of SFP port MGM is disabled\n", buf);
}
else
{
sprintf(buf, "%sTX of SFP port MGM is enabled\n", buf);
}
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sfp_tx_set */
/* Description : This is the function to set sfp tx status */
/* 0x33 0x70 */
/* Input(s) : 1 ~ 4. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t sfp_tx_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set lock\n"));
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x70); //to get register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set status = %x\n",status));
if (attr->index == SFP_TX_DISABLE)
{
i = simple_strtol(buf, NULL, 10);
if (i == SFP_PORT_1_OFF) //i = 1
{
value = status | 0x1;
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x70, value); //to set register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sfp_tx_set PORT_1 OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SFP_PORT_1 is OFF\n"));
}
}
else if (i == SFP_PORT_1_ON) //i = 2
{
value = status & 0xfe;
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x70, value); //to set register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sfp_tx_set PORT_1 ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SFP_PORT_1 is ON\n"));
}
}
else if (i == SFP_PORT_2_OFF) //i = 3
{
value = status | 0x2;
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x70, value); //to set register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sfp_tx_set PORT_2 OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SFP_PORT_2 is OFF\n"));
}
}
else if (i == SFP_PORT_2_ON) //i = 4
{
value = status & 0xfd;
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x70, value); //to set register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sfp_tx_set PORT_2 ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SFP_PORT_2 is ON\n"));
}
}
else if (i == SFP_PORT_MGM_OFF) //i = 5
{
value = status | 0x4;
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x70, value); //to set register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sfp_tx_set MGM OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SFP_PORT_MGM is OFF\n"));
}
}
else if (i == SFP_PORT_MGM_ON) //i = 6
{
value = status & 0xfb;
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0x70, value); //to set register 0x33 0xa0
debug_print((KERN_DEBUG "DEBUG : sfp_tx_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sfp_tx_set MGM ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SFP_PORT_MGM is ON\n"));
}
}
else
{
printk(KERN_ALERT "SFP_TX set wrong Value\n");
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : usb_power_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : sfp_insert_get */
/* Description : This is the function to get sfp insert status */
/* 0x33 0x80 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sfp_insert_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x80); //to get register 0x33 0x80
debug_print((KERN_DEBUG "DEBUG : sfp_insert_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SFP_INSERT)
{
for (i = 1; i <= 3; i++)
{
if ( i == SFP_PORT_1)
{
if (status & res)
{
sprintf(buf, "%sSFP port 1 is not present\n", buf);
}
else
{
sprintf(buf, "%sSFP port 1 is present\n", buf);
}
}
else if( i == SFP_PORT_2)
{
if (status & res)
{
sprintf(buf, "%sSFP port 2 is not present\n", buf);
}
else
{
sprintf(buf, "%sSFP port 2 is present\n", buf);
}
}
else if( i == SFP_PORT_MGM)
{
if (status & res)
{
sprintf(buf, "%sSFP port MGM is not present\n", buf);
}
else
{
sprintf(buf, "%sSFP port MGM is present\n", buf);
}
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sfp_rx_get */
/* Description : This is the function to get sfp rx loss status */
/* 0x33 0x90 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sfp_rx_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x90); //to get register 0x33 0x90
debug_print((KERN_DEBUG "DEBUG : sfp_rx_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SFP_RX_LOSS)
{
for (i = 1; i <= 3; i++)
{
if ( i == SFP_PORT_1)
{
if (status & res)
{
sprintf(buf, "%sSFP port 1 receiver loss of signal\n", buf);
}
else
{
sprintf(buf, "%sSFP port 1 receiver signal is detceted\n", buf);
}
}
else if( i == SFP_PORT_2)
{
if (status & res)
{
sprintf(buf, "%sSFP port 2 receiver loss of signal\n", buf);
}
else
{
sprintf(buf, "%sSFP port 2 receiver signal is detceted\n", buf);
}
}
else if( i == SFP_PORT_MGM)
{
if (status & res)
{
sprintf(buf, "%sSFP port MGM receiver loss of signal\n", buf);
}
else
{
sprintf(buf, "%sSFP port MGM receiver signal is detceted\n", buf);
}
}
res = res << 1;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : psu_status_get */
/* Description : This is the function to get psu status */
/* 0x33 0xa0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t psu_status_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 bmc_present = -EPERM;
u8 res = 0x1;
u8 mask = 0x1;
int i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0xe8); //to get register 0x14 0xe8
}
else
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_4_client, 0xa0); //to get register 0x35 0xa0
}
debug_print((KERN_DEBUG "DEBUG : psu_status_get status = %x\n",status));
sprintf(buf, "");
switch (attr->index)
{
case PSU_PRESENT:
res = 0x1;
for (i = 1; i <= 4; i++)
{
if (status & res)
{
sprintf(buf, "%sPSU %d is present\n", buf, i);
}
else
{
sprintf(buf, "%sPSU %d is not present\n", buf, i);
}
res = res << 1;
}
break;
case PSU_STATUS:
res = 0x1;
for (i = 1; i <= 8; i++)
{
if (i >= 5 && i <=8)
{
if (status & res)
{
sprintf(buf, "%sPSU %d is not power good\n", buf, i - 4);
}
else
{
sprintf(buf, "%sPSU %d is power good\n", buf, i - 4);
}
}
res = res << 1;
}
break;
}
return sprintf(buf, "%s", buf);
}
#ifdef LINEAR_CONVERT_FUNCTION
static long read_reg_linear(s32 data)
{
s16 exponent;
s32 mantissa;
long val;
exponent = ((s16)data) >> 11;
mantissa = ((s16)((data & 0x7ff) << 5)) >> 5;
val = mantissa;
val = val * 1000L;
if (exponent >= 0)
val <<= exponent;
else
val >>= -exponent;
return val/1000;
}
#endif /*LINEAR_CONVERT_FUNCTION*/
/********************************************************************************/
/* Function Name : switch_button_get */
/* Description : This is the function to get switch button status */
/* 0x33 0xa1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_button_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa1); //to get register 0x33 0xa1
debug_print((KERN_DEBUG "DEBUG : switch_button_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SWITCH_BUTTON)
{
if (status & res)
{
sprintf(buf, "%sSwitch button is normal\n", buf);
}
else
{
sprintf(buf, "%sSwitch button is press and hold\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sys_led_get */
/* Description : This is the function to get switch sys LED status */
/* 0x33 0xa2 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sys_led_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
int led_a_status = 0;
int led_g_status = 0;
int led_b_status = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa2); //to get register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == SYS_LED)
{
for (i = 1; i <= 3; i++)
{
if ( i == SYS_LED_A)
{
if (status & res)
{
led_a_status = TURN_ON;
}
else
{
led_a_status = TURN_OFF;
}
}
else if( i == SYS_LED_G)
{
if (status & res)
{
led_g_status = TURN_ON;
}
else
{
led_g_status = TURN_OFF;
}
}
else if( i == SYS_LED_BLINK)
{
if (status & res)
{
led_b_status = TURN_ON;
}
else
{
led_b_status = TURN_OFF;
}
}
res = res << 1;
}
if(led_a_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSYS LED is set to amber and blink\n", buf);
}
else if(led_a_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSYS LED is set to amber\n", buf);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSYS LED is set to green and blink\n", buf);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSYS LED is set to green\n", buf);
}
else
{
sprintf(buf, "%sSYS LED is set OFF\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : sys_led_Set */
/* Description : This is the function to set switch sys LED status */
/* 0x33 0xa2 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sys_led_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sys_led_set lock\n"));
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa2); //to get register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_set status = %x\n",status));
if (attr->index == SYS_LED)
{
i = simple_strtol(buf, NULL, 10);
switch(i)
{
case SYS_LED_OFF:
value = 0x0;
debug_print((KERN_DEBUG "DEBUG : sys_led_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa2, value); //to set register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sys_led_set SYS_LED_OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SYS LED is set OFF\n"));
}
break;
case SYS_LED_A_N:
value = 0x1;
debug_print((KERN_DEBUG "DEBUG : sys_led_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa2, value); //to set register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sys_led_set SYS_LED_A_N FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SYS LED is set Amber\n"));
}
break;
case SYS_LED_A_B:
value = 0x5;
debug_print((KERN_DEBUG "DEBUG : sys_led_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa2, value); //to set register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sys_led_set SYS_LED_A_B FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SYS LED is set Amber and Blink\n"));
}
break;
case SYS_LED_G_N:
value = 0x2;
debug_print((KERN_DEBUG "DEBUG : sys_led_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa2, value); //to set register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sys_led_set SYS_LED_G_N FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SYS LED is set Green\n"));
}
break;
case SYS_LED_G_B:
value = 0x6;
debug_print((KERN_DEBUG "DEBUG : sys_led_set value = %x\n",value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa2, value); //to set register 0x33 0xa2
debug_print((KERN_DEBUG "DEBUG : sys_led_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: sys_led_set SYS_LED_G_B FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "SYS LED is set Green and Blink\n"));
}
break;
default:
printk(KERN_ALERT "SYS LED set wrong Value\n");
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : sys_led_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : switch_led_all_get */
/* Description : This is the function to get all switch LED status */
/* 0x33 0xa3 ~ 0xa8 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_led_all_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 a_shift = 0x1;
u8 g_shift = 0x2;
u8 b_shift = 0x1;
#ifdef LED_L3_CTRL_WANTED
u8 led_3_status = 0;
u8 led_3_blink = 0;
#endif /*LED_L3_CTRL_WANTED*/
u8 led_4_status = 0;
u8 led_4_blink = 0;
u8 led_5_status = 0;
u8 led_5_blink = 0;
u8 led_status_reg = 0xa3;
u8 led_blink_reg = 0xa4;
int i;
int j;
int led_status[5][4] = {{0},{0}};
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
#ifdef LED_L3_CTRL_WANTED
led_3_status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3); //to get register 0x33 0xa3
led_3_blink = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
#endif /*LED_L3_CTRL_WANTED*/
led_4_status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3);
led_4_blink = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
led_5_status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa5);
led_5_blink = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa6);
#ifdef LED_L3_CTRL_WANTED
debug_print((KERN_DEBUG "DEBUG : switch_led_all_get led_3_status = %x\n", led_3_status));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_get led_3_blink = %x\n", led_3_blink));
#endif /*LED_L3_CTRL_WANTED*/
debug_print((KERN_DEBUG "DEBUG : switch_led_all_get led_4_status = %x\n", led_4_status));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_get led_4_blink = %x\n", led_4_blink));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_get led_5_status = %x\n", led_5_status));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_get led_5_blink = %x\n", led_5_blink));
sprintf(buf, "");
if (attr->index == SWITCH_LED)
{
#ifdef LED_L3_CTRL_WANTED
for(i = 3; i<= 5; i++)
#else
for(i = 4; i<= 5; i++)
#endif /*LED_L3_CTRL_WANTED*/
{
a_shift = 0x1;
g_shift = 0x2;
b_shift = 0x1;
for(j = 1; j<= 4; j++)
{
if (i2c_smbus_read_byte_data(ESC_600_128q_client, led_status_reg) & a_shift)
{
if(i2c_smbus_read_byte_data(ESC_600_128q_client, led_blink_reg) & b_shift)
{
led_status[i][j] = SWITCH_LED_A_B;
sprintf(buf, "%sSwitch LED %d-%d is set to amber and blink\n", buf, i, j);
}
else
{
led_status[i][j] = SWITCH_LED_A_N;
sprintf(buf, "%sSwitch LED %d-%d is set to amber\n", buf, i, j);
}
}
else if (i2c_smbus_read_byte_data(ESC_600_128q_client, led_status_reg) & g_shift)
{
if(i2c_smbus_read_byte_data(ESC_600_128q_client, led_blink_reg) & b_shift)
{
led_status[i][j] = SWITCH_LED_G_B;
sprintf(buf, "%sSwitch LED %d-%d is set to green and blink\n", buf, i, j);
}
else
{
led_status[i][j] = SWITCH_LED_G_N;
sprintf(buf, "%sSwitch LED %d-%d is set to green\n", buf, i, j);
}
}
else
{
led_status[i][j] = SWITCH_LED_OFF;
sprintf(buf, "%sSwitch LED %d-%d is set OFF\n", buf, i, j);
}
a_shift = a_shift<< 2;
g_shift = g_shift<< 2;
b_shift = b_shift<< 1;
}
led_status_reg = led_status_reg + 0x2;
led_blink_reg = led_blink_reg + 0x2;
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_led_all_set */
/* Description : This is the function to set all switch LED status */
/* 0x33 0xa3 ~ 0xa8 */
/* Input(s) : 0 ~ 4. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t switch_led_all_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 led_value = -EPERM;
u8 blink_value = -EPERM;
#ifdef LED_L3_CTRL_WANTED
u8 led_3_status = 0;
u8 led_3_blink = 0;
#endif /*LED_L3_CTRL_WANTED*/
u8 led_4_status = 0;
u8 led_4_blink = 0;
u8 led_5_status = 0;
u8 led_5_blink = 0;
u8 result = 0;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set lock\n"));
#ifdef LED_L3_CTRL_WANTED
led_3_status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3); //to get register 0x33 0xa3
led_3_blink = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
#endif /*LED_L3_CTRL_WANTED*/
led_4_status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3);
led_4_blink = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
led_5_status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa5);
led_5_blink = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa6);
#ifdef LED_L3_CTRL_WANTED
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_3_status = %x\n", led_3_status));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_3_blink = %x\n", led_3_blink));
#endif /*LED_L3_CTRL_WANTED*/
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_4_status = %x\n", led_4_status));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_4_blink = %x\n", led_4_blink));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_5_status = %x\n", led_5_status));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_5_blink = %x\n", led_5_blink));
if (attr->index == SWITCH_LED)
{
i = simple_strtol(buf, NULL, 10);
switch(i)
{
case SWITCH_LED_OFF:
led_value = 0x0;
blink_value = 0x0;
break;
case SWITCH_LED_A_N:
led_value = 0x55;
blink_value = 0x0;
break;
case SWITCH_LED_A_B:
led_value = 0x55;
blink_value = 0xf;
break;
case SWITCH_LED_G_N:
led_value = 0xaa;
blink_value = 0x0;
break;
case SWITCH_LED_G_B:
led_value = 0xaa;
blink_value = 0xf;
break;
default:
printk(KERN_ALERT "switch_led_all_set set wrong Value\n");
}
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set led_value = %x\n",led_value));
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set blink_value = %x\n",blink_value));
#ifdef LED_L3_CTRL_WANTED
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa3, led_value);
#endif /*LED_L3_CTRL_WANTED*/
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa3, led_value);
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa5, led_value);
#ifdef LED_L3_CTRL_WANTED
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa4, blink_value);
#endif /*LED_L3_CTRL_WANTED*/
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa4, blink_value);
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa6, blink_value);
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_led_all_set OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Switch LED ALL set %d \n", i));
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_all_set unlock\n"));
return count;
}
#ifdef LED_L3_CTRL_WANTED
/********************************************************************************/
/* Function Name : switch_led_3_get */
/* Description : This is the function to get switch LED 3 status */
/* 0x33 0xa3 0xa4 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_led_3_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
int led_a_status = 0;
int led_g_status = 0;
int led_b_status = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3); //to get register 0x33 0xa3
debug_print((KERN_DEBUG "DEBUG : switch_led_3_get status = %x\n",status));
sprintf(buf, "");
for (i = 1; i <= 8; i++)
{
if ( i == attr->index)
{
if (status & res)
{
led_a_status = TURN_ON;
}
else
{
led_a_status = TURN_OFF;
}
}
res = res << 1;
if( i == (attr->index + 1) )
{
if (status & res)
{
led_g_status = TURN_ON;
}
else
{
led_g_status = TURN_OFF;
}
}
res = res << 1;
}
res = 0x1;
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
debug_print((KERN_DEBUG "DEBUG : switch_led_3_get status = %x\n",status));
for (i = 1; i <= 4; i++)
{
if ( i == attr->index)
{
if (status & res)
{
led_b_status = TURN_ON;
}
else
{
led_b_status = TURN_OFF;
}
}
res = res << 1;
}
if(led_a_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSwitch LED 3-%d is set to amber and blink\n", buf, attr->index);
}
else if(led_a_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSwitch LED 3-%d is set to amber\n", buf, attr->index);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSwitch LED 3-%d is set to green and blink\n", buf, attr->index);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSwitch LED 3-%d is set to green\n", buf, attr->index);
}
else
{
sprintf(buf, "%sSwitch LED 3-%d is set OFF\n", buf, attr->index);
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_led_3_set */
/* Description : This is the function to set switch LED 3 status */
/* 0x33 0xa3 0xa4 */
/* Input(s) : 0 ~ 4. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t switch_led_3_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 led_value = -EPERM;
u8 blk_value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set lock\n"));
led_value = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3); //to get register 0x33 0xa3
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set led_value = %x\n",led_value));
blk_value = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set blk_value = %x\n",blk_value));
if (attr->index != 0)
{
i = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set value = %d\n",i));
switch(i)
{
case SWITCH_LED_OFF:
led_value &= ~(1 << ((attr->index)-1));
led_value &= ~(1 << (attr->index));
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_A_N:
led_value |= (1 << ((attr->index)-1));
led_value &= ~(1 << (attr->index));
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_A_B:
led_value |= (1 << ((attr->index)-1));
led_value &= ~(1 << (attr->index));
blk_value |= (1 << ((attr->index)-1));
break;
case SWITCH_LED_G_N:
led_value |= (1 << (attr->index));
led_value &= ~(1 << ((attr->index)-1));
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_G_B:
led_value |= (1 << (attr->index));
led_value &= ~(1 << ((attr->index)-1));
blk_value |= (1 << ((attr->index)-1));
break;
default:
printk(KERN_ALERT "Switch LED set wrong Value\n");
}
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set led_value = %x\n",led_value));
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set blk_value = %x\n",blk_value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa3, led_value);
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa4, blk_value);
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_led_3_set SYS_LED_OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Switch LED is set Success\n"));
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_3_set unlock\n"));
return count;
}
#endif /*LED_L3_CTRL_WANTED*/
/********************************************************************************/
/* Function Name : switch_led_4_get */
/* Description : This is the function to get switch LED 4 status */
/* 0x33 0xa5 0xa6 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_led_4_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
int led_a_status = 0;
int led_g_status = 0;
int led_b_status = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3); //to get register 0x33 0xa5
debug_print((KERN_DEBUG "DEBUG : switch_led_4_get status = %x\n",status));
sprintf(buf, "");
for (i = 1; i <= 4; i++)
{
if ( i == attr->index)
{
if (status & res)
{
led_a_status = TURN_ON;
}
else
{
led_a_status = TURN_OFF;
}
}
res = res << 1;
if( i == (attr->index + 1) )
{
if (status & res)
{
led_g_status = TURN_ON;
}
else
{
led_g_status = TURN_OFF;
}
}
res = res << 1;
}
res = 0x1;
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
debug_print((KERN_DEBUG "DEBUG : switch_led_4_get status = %x\n",status));
for (i = 1; i <= 4; i++)
{
if ( i == attr->index)
{
if (status & res)
{
led_b_status = TURN_ON;
}
else
{
led_b_status = TURN_OFF;
}
}
res = res << 1;
}
if(led_a_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSwitch LED 4-%d is set to amber and blink\n", buf, attr->index);
}
else if(led_a_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSwitch LED 4-%d is set to amber\n", buf, attr->index);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSwitch LED 4-%d is set to green and blink\n", buf, attr->index);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSwitch LED 4-%d is set to green\n", buf, attr->index);
}
else
{
sprintf(buf, "%sSwitch LED 4-%d is set OFF\n", buf, attr->index);
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_led_4_set */
/* Description : This is the function to set switch LED 4 status */
/* 0x33 0xa5 0xa6 */
/* Input(s) : 0 ~ 4. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t switch_led_4_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 led_value = -EPERM;
u8 blk_value = -EPERM;
u8 result = -EPERM;
u8 offset = 0;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set lock\n"));
led_value = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa3); //to get register 0x33 0xa5
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set led_value = %x\n",led_value));
blk_value = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa4);
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set blk_value = %x\n",blk_value));
if (attr->index != 0)
{
i = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set value = %d\n",i));
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set led 4-%d\n",attr->index));
if(attr->index == 1)
{
offset = 0;
}
else
{
offset = 2*((attr->index)-1);
}
switch(i)
{
case SWITCH_LED_OFF: //i=0
led_value &= ~(0x03 << offset);
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_A_N: //i=1
led_value &= ~(0x03 << offset);
led_value |= (0x01 << offset);
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_A_B: //i=2
led_value &= ~(0x03 << offset);
led_value |= (0x01 << offset);
blk_value |= (1 << ((attr->index)-1));
break;
case SWITCH_LED_G_N: //i=3
led_value &= ~(0x03 << offset);
led_value |= (0x02 << offset);
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_G_B: //i=4
led_value &= ~(0x03 << offset);
led_value |= (0x02 << offset);
blk_value |= (1 << ((attr->index)-1));
break;
default:
printk(KERN_ALERT "Switch LED set wrong Value\n");
}
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set led_value = %x\n",led_value));
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set blk_value = %x\n",blk_value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa3, led_value);
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa4, blk_value);
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_led_4_set SYS_LED_OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Switch LED is set Success\n"));
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_4_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : switch_led_5_get */
/* Description : This is the function to get switch LED 5 status */
/* 0x33 0xa7 0xa8 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t switch_led_5_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x1;
int i;
int led_a_status = 0;
int led_g_status = 0;
int led_b_status = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa5); //to get register 0x33 0xa5
debug_print((KERN_DEBUG "DEBUG : switch_led_5_get status = %x\n",status));
sprintf(buf, "");
for (i = 1; i <= 8; i++)
{
if ( i == attr->index)
{
if (status & res)
{
led_a_status = TURN_ON;
}
else
{
led_a_status = TURN_OFF;
}
}
res = res << 1;
if( i == (attr->index + 1) )
{
if (status & res)
{
led_g_status = TURN_ON;
}
else
{
led_g_status = TURN_OFF;
}
}
res = res << 1;
}
res = 0x1;
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa6);
debug_print((KERN_DEBUG "DEBUG : switch_led_5_get status = %x\n",status));
for (i = 1; i <= 4; i++)
{
if ( i == attr->index)
{
if (status & res)
{
led_b_status = TURN_ON;
}
else
{
led_b_status = TURN_OFF;
}
}
res = res << 1;
}
if(led_a_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSwitch LED 5-%d is set to amber and blink\n", buf, attr->index);
}
else if(led_a_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSwitch LED 5-%d is set to amber\n", buf, attr->index);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_ON)
{
sprintf(buf, "%sSwitch LED 5-%d is set to green and blink\n", buf, attr->index);
}
else if(led_g_status == TURN_ON && led_b_status == TURN_OFF)
{
sprintf(buf, "%sSwitch LED 5-%d is set to green\n", buf, attr->index);
}
else
{
sprintf(buf, "%sSwitch LED 5-%d is set OFF\n", buf, attr->index);
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : switch_led_5_set */
/* Description : This is the function to set switch LED 5 status */
/* 0x33 0xa7 0xa8 */
/* Input(s) : 0 ~ 4. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t switch_led_5_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 led_value = -EPERM;
u8 blk_value = -EPERM;
u8 result = -EPERM;
u8 offset = 0;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set lock\n"));
led_value = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa5); //to get register 0x33 0xa5
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set led_value = %x\n",led_value));
blk_value = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xa6);
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set blk_value = %x\n",blk_value));
if (attr->index != 0)
{
i = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set value = %d\n",i));
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set led 5-%d\n",attr->index));
if(attr->index == 1)
{
offset = 0;
}
else
{
offset = 2*((attr->index)-1);
}
switch(i)
{
case SWITCH_LED_OFF: //i=0
led_value &= ~(0x03 << offset);
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_A_N: //i=1
led_value &= ~(0x03 << offset);
led_value |= (0x01 << offset);
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_A_B: //i=2
led_value &= ~(0x03 << offset);
led_value |= (0x01 << offset);
blk_value |= (1 << ((attr->index)-1));
break;
case SWITCH_LED_G_N: //i=3
led_value &= ~(0x03 << offset);
led_value |= (0x02 << offset);
blk_value &= ~(1 << ((attr->index)-1));
break;
case SWITCH_LED_G_B: //i=4
led_value &= ~(0x03 << offset);
led_value |= (0x02 << offset);
blk_value |= (1 << ((attr->index)-1));
break;
default:
printk(KERN_ALERT "Switch LED set wrong Value\n");
}
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set led_value = %x\n",led_value));
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set blk_value = %x\n",blk_value));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa5, led_value);
result |= i2c_smbus_write_byte_data(ESC_600_128q_client, 0xa6, blk_value);
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: switch_led_5_set SYS_LED_OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "Switch LED is set Success\n"));
}
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : switch_led_5_set unlock\n"));
return count;
}
/********************************************************************************/
/* Function Name : sfp_int_get */
/* Description : This is the function to get sfp interrupt status */
/* 0x33 0xd0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t sfp_int_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == SFP_INT)
{
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xd0); //to set register 0x33 0xd0
debug_print((KERN_DEBUG "DEBUG : sfp_int_get status = %x\n",status));
sprintf(buf, "");
if (status & 0x2)
{
sprintf(buf, "%sInterrupt is triggered by SFP Loss\n", buf);
}
else if (status & 0x4)
{
sprintf(buf, "%sInterrupt is triggered by SFP ABS\n", buf);
}
else
{
sprintf(buf, "%sNo interrupt is triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : psu_int_get */
/* Description : This is the function to get psu interrupt status */
/* 0x33 0xd0 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t psu_int_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == PSU_INT)
{
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xd0); //to set register 0x33 0xd0
debug_print((KERN_DEBUG "DEBUG : psu_int_get status = %x\n",status));
sprintf(buf, "");
if (status & 0x1)
{
sprintf(buf, "%sInterrupt is triggered by PSU\n", buf);
}
else
{
sprintf(buf, "%sNo interrupt is triggered\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : int_mask_get */
/* Description : This is the function to get interrupt status */
/* 0x33 0xd1 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t int_mask_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xd1); //to get register 0x33 0xd1
debug_print((KERN_DEBUG "DEBUG : int_mask_get status = %x\n",status));
sprintf(buf, "");
if (attr->index == 1)
{
if (status & 0x1)
{
sprintf(buf, "%sPSU interrupt mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sPSU interrupt mask is disabled\n", buf);
}
}
if (attr->index == 2)
{
if (status & 0x2)
{
sprintf(buf, "%sSFP Loss interrupt mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSFP Loss interrupt mask is disabled\n", buf);
}
}
if (attr->index == 3)
{
if (status & 0x4)
{
sprintf(buf, "%sSFP ABS interrupt mask is enabled\n", buf);
}
else
{
sprintf(buf, "%sSFP ABS interrupt mask is disabled\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : int_mask_set */
/* Description : This is the function to set interrupt status */
/* 0x33 0xa3 0xa4 */
/* Input(s) : 1 or 0. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t int_mask_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 result = 0;
int i = 0;
int j = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *data = i2c_get_clientdata(ESC_600_128q_client);
i = attr->index;
j = simple_strtol(buf, NULL, 10);
debug_print((KERN_DEBUG "DEBUG : int_mask_set i: %d\n", i));
debug_print((KERN_DEBUG "DEBUG : int_mask_set j: %d\n", j));
mutex_lock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : int_mask_set lock\n"));
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0xd1); //to get register 0x33 0xd1
debug_print((KERN_DEBUG "DEBUG : int_mask_set status = %x\n",status));
if( j == TURN_ON)
{
status |= (1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : int_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xd1, status); //to set register 0x33 0xd1
debug_print((KERN_DEBUG "DEBUG : int_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: int_mask_set set ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "int_mask_set ON\n"));
}
}
else if( j == TURN_OFF)
{
status &= ~(1 << (i-1));
debug_print((KERN_DEBUG "DEBUG : int_mask_set value = %x\n",status));
result = i2c_smbus_write_byte_data(ESC_600_128q_client, 0xd1, status); //to set register 0x33 0xd1
debug_print((KERN_DEBUG "DEBUG : int_mask_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: int_mask_set set OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "int_mask_set OFF\n"));
}
}
else
{
printk(KERN_ALERT " int_mask_set set wrong value\n");
}
mutex_unlock(&data->update_lock);
debug_print((KERN_DEBUG "DEBUG : int_mask_set unlock\n"));
return count;
}
#ifdef ESC_600_BMC_WANTED
static ssize_t bmc_module_detect(struct device *dev, struct device_attribute *da, char *buf)
{
u32 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
if(attr->index == BMC_DETECT)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3);
debug_print((KERN_DEBUG "DEBUG : BMC byte status = 0x%x\n", status));
}
if(status == 0x1)
{
sprintf(buf, "%sBMC module is present\n", buf);
}
else
{
sprintf(buf, "%sBMC module is not present\n", buf);
}
return sprintf(buf, "%s", buf);
}
static ssize_t themal_temp_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 bmc_present = -EPERM;
u8 status = -EPERM;
u8 mask = 0x1;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
if (attr->index == SENSOR_TEMP)
{
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
//to get 0x14 0x08 NCT7511 Temp
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x08);
if(status == 0xff)
{
sprintf(buf, "%sSensor (NCT7511) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (NCT7511) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x09 Left-Bottom:SB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x09);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Left-Bottom:SB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Left-Bottom:SB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x10 Center-Top:SB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x10);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Center-Top:SB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Center-Top:SB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x11 Center:SB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x11);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Center:SB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Center:SB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x13 Left-Top:CB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x13);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Left-Top:CB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Left-Top:CB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x14 Center:CB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x14);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Center:CB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Center:CB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x15 Right-Bottom:CB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x15);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Right-Bottom:CB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Right-Bottom:CB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x16 Left-Bottom:CB
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x16);
if(status == 0xff)
{
sprintf(buf, "%sSensor (Left-Bottom:CB) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (Left-Bottom:CB) is %d degrees (C)\n", buf, status);
}
//to get 0x14 0x17 I/O Board
status = i2c_smbus_read_byte_data(Cameo_BMC_client, 0x17);
if(status == 0xff)
{
sprintf(buf, "%sSensor (I/O Board) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (I/O Board) is %d degrees (C)\n", buf, status);
}
}
else
{
sprintf(buf, "%sBMC Module is not present\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
static ssize_t module_temp_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 bmc_present = -EPERM;
u8 up_reg [9] = {0x00, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e};
u8 down_reg [9] = {0x00, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2b, 0x2d, 0x2f};
u8 status = -EPERM;
u8 mask = 0x1;
u8 i = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
if(attr->index == MODULE_TEMP)
{
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
for(i = 1; i <= 8; i ++)
{
//to get Line Card up Temp
status = i2c_smbus_read_byte_data(Cameo_BMC_client, up_reg[i]);
if(status == 0xff)
{
sprintf(buf, "%sLine Card %d up READ FAILED\n", buf, i);
}
else
{
sprintf(buf, "%sLine Card %d up is %d degrees (C)\n", buf, i, status);
}
//to get Line Card down Temp
status = i2c_smbus_read_byte_data(Cameo_BMC_client, down_reg[i]);
if(status == 0xff)
{
sprintf(buf, "%sLine Card %d down READ FAILED\n", buf, i);
}
else
{
sprintf(buf, "%sLine Card %d down is %d degrees (C)\n", buf, i, status);
}
}
}
else
{
sprintf(buf, "%sBMC Module is not present\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
static ssize_t mac_temp_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 bmc_present = -EPERM;
u16 status = -EPERM;
u8 mask = 0x1;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
if (attr->index == MAC_TEMP)
{
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
//to get MAC Temp 0x14 0x12
status = i2c_smbus_read_word_data(Cameo_BMC_client, 0x12);
if(status == 0xffff)
{
sprintf(buf, "%sSensor (MAC MCP3425) READ FAILED\n", buf);
}
else
{
sprintf(buf, "%sSensor (MAC MCP3425) is 0x%x\n", buf, status);
}
}
else
{
sprintf(buf, "%sBMC Module is not present\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
static int two_complement_to_int(u16 data, u8 valid_bit, int mask)
{
u16 valid_data = data & mask;
bool is_negative = valid_data >> (valid_bit - 1);
return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data;
}
static ssize_t psu_module_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 bmc_present = -EPERM;
u8 module_num = 0;
u8 psu_table [5][11] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xd8},
{0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xd9},
{0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xda},
{0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xdb},
};
u32 psu_status [11] = {0};
u8 mask = 0x1;
u8 i = 0;
u16 u16_val = 0;
int exponent = 0, mantissa = 0;
int multiplier = 1000; // lm-sensor uint: mV, mA, mC
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
switch(attr->index)
{
case PSU_MODULE_1:
module_num = 1;
break;
case PSU_MODULE_2:
module_num = 2;
break;
case PSU_MODULE_3:
module_num = 3;
break;
case PSU_MODULE_4:
module_num = 4;
break;
}
for(i = 0; i < 10; i ++)
{
u16_val = i2c_smbus_read_word_data(Cameo_BMC_client, psu_table[module_num][i]);
/* word data with linear format */
if (i != 2 && i != 8) {
multiplier = 1000;
if (i == 6 || i == 7) /* pin, pout */
multiplier = 1000000; // lm-sensor unit: uW
if ( i == 5 ) /* fan_speed */
multiplier = 1;
exponent = two_complement_to_int(u16_val >> 11, 5, 0x1f);
mantissa = two_complement_to_int(u16_val & 0x7ff, 11, 0x7ff);
psu_status[i] = (exponent >= 0) ? ((mantissa << exponent)*multiplier) : \
(mantissa*multiplier / (1 << -exponent));
}
}
/* vout mode */
multiplier = 1000;
u16_val = i2c_smbus_read_byte_data(Cameo_BMC_client, psu_table[module_num][10]);
psu_status[10] = u16_val;
exponent = two_complement_to_int(u16_val & 0x1f, 5, 0x1f);
/* vout */
u16_val = i2c_smbus_read_word_data(Cameo_BMC_client, psu_table[module_num][2]);
psu_status[2] = (exponent >= 0) ? ((u16_val << exponent)*multiplier) : \
(u16_val*multiplier / (1 << -exponent));
sprintf(buf, "%sPSU %d VIN is %d\n", buf, module_num, psu_status[0]);
sprintf(buf, "%sPSU %d IIN is %d\n", buf, module_num, psu_status[1]);
sprintf(buf, "%sPSU %d VOUT is %d\n", buf, module_num, psu_status[2]);
sprintf(buf, "%sPSU %d IOUT is %d\n", buf, module_num, psu_status[3]);
sprintf(buf, "%sPSU %d TEMP_1 is %d\n", buf, module_num, psu_status[4]);
sprintf(buf, "%sPSU %d FAN_SPEED is %d\n", buf, module_num, psu_status[5]);
sprintf(buf, "%sPSU %d POUT is %d\n", buf, module_num, psu_status[6]);
sprintf(buf, "%sPSU %d PIN is %d\n", buf, module_num, psu_status[7]);
sprintf(buf, "%sPSU %d MFR_MODEL is %d\n", buf, module_num, psu_status[8]);
sprintf(buf, "%sPSU %d MFR_IOUT_MAX is %d\n", buf, module_num, psu_status[9]);
sprintf(buf, "%sPSU %d VMODE is %d\n", buf, module_num, psu_status[10]);
}
else
{
sprintf(buf, "%sBMC Module is not present\n", buf);
}
return sprintf(buf, "%s", buf);
}
static ssize_t dc_chip_switch_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 bmc_present = -EPERM;
u8 dc_table [8] = {0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
u16 dc_status [8] = {0};
u8 mask = 0x1;
u8 i = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
if (attr->index == DC_CHIP_SWITCH)
{
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
for(i = 0; i < 8; i ++)
{
dc_status[i] = i2c_smbus_read_word_data(Cameo_BMC_client, dc_table[i]);
}
sprintf(buf, "%sTPS40425 0x6e 0x88 is 0x%x\n", buf, dc_status[0]);
sprintf(buf, "%sTPS40425 0x6e 0x8c is 0x%x\n", buf, dc_status[1]);
sprintf(buf, "%sTPS40425 0x6e 0x96 is 0x%x\n", buf, dc_status[2]);
sprintf(buf, "%sTPS40425 0x70 0x88 is 0x%x\n", buf, dc_status[3]);
sprintf(buf, "%sTPS40425 0x70 0x8c is 0x%x\n", buf, dc_status[4]);
sprintf(buf, "%sTPS40425 0x70 0x96 is 0x%x\n", buf, dc_status[5]);
/*0x04 TBD*/
sprintf(buf, "%sISP1014A 0x04 0x00 is 0x%x\n", buf, dc_status[6]);
sprintf(buf, "%sISP1014A 0x04 0x00 is 0x%x\n", buf, dc_status[7]);
}
else
{
sprintf(buf, "%sBMC Module is not present\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
static ssize_t dc_chip_slot_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 bmc_present = -EPERM;
u8 module_num = 0;
u8 dc_table [9][10] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x30, 0x31, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c},
{0x40, 0x41, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4b, 0x4c},
{0x50, 0x51, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5b, 0x5c},
{0x60, 0x61, 0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6b, 0x6c},
{0x70, 0x71, 0x73, 0x74, 0x76, 0x77, 0x78, 0x79, 0x7b, 0x7c},
{0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x88, 0x89, 0x8b, 0x8c},
{0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x98, 0x99, 0x9b, 0x9c},
{0xa0, 0xa1, 0xa3, 0xa4, 0xa6, 0xa7, 0xa8, 0xa9, 0xab, 0xac},
};
u16 dc_status [10] = {0};
u8 mask = 0x1;
u8 i = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
bmc_present = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa3); //to get 0x31 0xa3
if (bmc_present & mask)
{
switch(attr->index)
{
case DC_CHIP_SLOT_1:
module_num = 1;
break;
case DC_CHIP_SLOT_2:
module_num = 2;
break;
case DC_CHIP_SLOT_3:
module_num = 3;
break;
case DC_CHIP_SLOT_4:
module_num = 4;
break;
case DC_CHIP_SLOT_5:
module_num = 5;
break;
case DC_CHIP_SLOT_6:
module_num = 6;
break;
case DC_CHIP_SLOT_7:
module_num = 7;
break;
case DC_CHIP_SLOT_8:
module_num = 8;
break;
}
for(i = 0; i < 10; i ++)
{
dc_status[i] = i2c_smbus_read_word_data(Cameo_BMC_client, dc_table[module_num][i]);
}
sprintf(buf, "%sLine Card %d Chip 1 P0_VOUT is 0x%x\n", buf, module_num, dc_status[0]);
sprintf(buf, "%sLine Card %d Chip 1 P0_IOUT is 0x%x\n", buf, module_num, dc_status[1]);
sprintf(buf, "%sLine Card %d Chip 1 P1_VOUT is 0x%x\n", buf, module_num, dc_status[2]);
sprintf(buf, "%sLine Card %d Chip 1 P1_IOUT is 0x%x\n", buf, module_num, dc_status[3]);
sprintf(buf, "%sLine Card %d Chip 2 P0_VOUT is 0x%x\n", buf, module_num, dc_status[4]);
sprintf(buf, "%sLine Card %d Chip 2 P0_IOUT is 0x%x\n", buf, module_num, dc_status[5]);
sprintf(buf, "%sLine Card %d Chip 3 P0_VOUT is 0x%x\n", buf, module_num, dc_status[6]);
sprintf(buf, "%sLine Card %d Chip 3 P0_IOUT is 0x%x\n", buf, module_num, dc_status[7]);
sprintf(buf, "%sLine Card %d Chip 3 P1_VOUT is 0x%x\n", buf, module_num, dc_status[8]);
sprintf(buf, "%sLine Card %d Chip 3 P1_IOUT is 0x%x\n", buf, module_num, dc_status[9]);
}
else
{
sprintf(buf, "%sBMC Module is not present\n", buf);
}
return sprintf(buf, "%s", buf);
}
#endif /*ESC_600_BMC_WANTED*/
/********************************************************************************/
/* Function Name : jtag_select_get */
/* Description : This is the function to get JTAG Reg 0x31 0xa1 0xa2 */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : String. */
/********************************************************************************/
static ssize_t jtag_select_get(struct device *dev, struct device_attribute *da, char *buf)
{
sprintf(buf, "");
/*TBD*/
return sprintf(buf, "%s", buf);
}
/********************************************************************************/
/* Function Name : jtag_select_set */
/* Description : This is the function to set JTAG Reg 0x31 0xa1 0xa2 */
/* Input(s) : Jtag number. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static ssize_t jtag_select_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
/*TBD*/
return count;
}
static ssize_t cpld_version_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
sprintf(buf, "");
if(attr->index == CPLD_VER)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_2_client, 0x20);
sprintf(buf, "%s0x30 CPLD version is 0x%x\n", buf, status);
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0x20);
sprintf(buf, "%s0x31 CPLD version is 0x%x\n", buf, status);
status = i2c_smbus_read_byte_data(ESC_600_128q_client, 0x20);
sprintf(buf, "%s0x33 CPLD version is 0x%x\n", buf, status);
}
return sprintf(buf, "%s", buf);
}
#ifdef EEPROM_WP_WANTED
static ssize_t eeprom_wp_status_get(struct device *dev, struct device_attribute *da, char *buf)
{
u8 status = -EPERM;
u8 res = 0x10;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
if (attr->index == EEPROM_WP_CTRL)
{
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa0); //to get register 0x30 0xa0
debug_print((KERN_DEBUG "DEBUG : eeprom_wp status = %x\n",status));
sprintf(buf, "");
if (status & res)
{
sprintf(buf, "%sEEPROM is Protected\n", buf);
}
else
{
sprintf(buf, "%sEEPROM is Not Protected\n", buf);
}
}
return sprintf(buf, "%s", buf);
}
static ssize_t eeprom_wp_status_set(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
{
u8 status = -EPERM;
u8 value = -EPERM;
u8 result = -EPERM;
u16 i;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct Cameo_i2c_data *CPLD_3_data = i2c_get_clientdata(Cameo_CPLD_3_client);
mutex_lock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : eeprom_wp_status_set lock\n"));
status = i2c_smbus_read_byte_data(Cameo_CPLD_3_client, 0xa0); //to get register 0x31 0xa0
debug_print((KERN_DEBUG "DEBUG : eeprom_wp_status_set status = %x\n",status));
if (attr->index == EEPROM_WP_CTRL)
{
i = simple_strtol(buf, NULL, 10); //get input ON or OFF
if (i == TURN_ON)
{
value = status | 0x10;
debug_print((KERN_DEBUG "DEBUG : eeprom_wp_status_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xa0, value); //to set register 0x31 0xa0
debug_print((KERN_DEBUG "DEBUG : eeprom_wp_status_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: usb_ctrl_set ON FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "EEPROM is Protected\n"));
}
}
else if (i == TURN_OFF)
{
value = status & 0xef;
debug_print((KERN_DEBUG "DEBUG : eeprom_wp_status_set value = %x\n",value));
result = i2c_smbus_write_byte_data(Cameo_CPLD_3_client, 0xa0, value); //to set register 0x31 0xa0
debug_print((KERN_DEBUG "DEBUG : eeprom_wp_status_set result = %x\n",result));
if (result < 0)
{
printk(KERN_ALERT "ERROR: eeprom_wp_status_set OFF FAILED!\n");
}
else
{
debug_print((KERN_DEBUG "EEPROM is Not Protected\n"));
}
}
else
{
printk(KERN_ALERT "EEPROM set wrong Value\n");
}
}
mutex_unlock(&CPLD_3_data->update_lock);
debug_print((KERN_DEBUG "DEBUG : usb_power_set unlock\n"));
return count;
}
#endif /*EEPROM_WP_WANTED*/
/* end of function */
/********************************************************************************/
/* Function Name : Cameo_i2c_probe */
/* Description : To probe i2c device */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static int Cameo_i2c_probe(struct i2c_client *client, const struct i2c_device_id *dev_id)
{
struct Cameo_i2c_data *data;
struct Cameo_i2c_data *CPLD_2_data;
struct Cameo_i2c_data *CPLD_3_data;
struct Cameo_i2c_data *CPLD_4_data;
struct Cameo_i2c_data *Cameo_Extpand_1_data;
struct Cameo_i2c_data *Cameo_Extpand_2_data;
struct Cameo_i2c_data *Cameo_BMC_data;
int status;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
{
status = -EIO;
goto exit;
}
data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!data)
{
printk(KERN_ALERT "data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
CPLD_2_data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!CPLD_2_data)
{
printk(KERN_ALERT "CPLD_2_data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
CPLD_3_data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!CPLD_3_data)
{
printk(KERN_ALERT "CPLD_3_data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
CPLD_4_data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!CPLD_4_data)
{
printk(KERN_ALERT "CPLD_4_data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
Cameo_Extpand_1_data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!Cameo_Extpand_1_data)
{
printk(KERN_ALERT "Cameo_Extpand_1_data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
Cameo_Extpand_2_data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!Cameo_Extpand_2_data)
{
printk(KERN_ALERT "Cameo_Extpand_2_data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
Cameo_BMC_data = kzalloc(sizeof(struct Cameo_i2c_data), GFP_KERNEL);
if (!Cameo_BMC_data)
{
printk(KERN_ALERT "Cameo_BMC_data kzalloc fail\n");
status = -ENOMEM;
goto exit;
}
i2c_set_clientdata(client , data);
i2c_set_clientdata(Cameo_CPLD_2_client , CPLD_2_data);
i2c_set_clientdata(Cameo_CPLD_3_client , CPLD_3_data);
i2c_set_clientdata(Cameo_CPLD_4_client , CPLD_4_data);
i2c_set_clientdata(Cameo_Extpand_1_client , Cameo_Extpand_1_data);
i2c_set_clientdata(Cameo_Extpand_2_client , Cameo_Extpand_2_data);
i2c_set_clientdata(Cameo_BMC_client , Cameo_BMC_data);
mutex_init(&CPLD_2_data ->update_lock);
mutex_init(&CPLD_3_data ->update_lock);
mutex_init(&CPLD_4_data ->update_lock);
mutex_init(&Cameo_Extpand_1_data ->update_lock);
mutex_init(&Cameo_Extpand_2_data ->update_lock);
mutex_init(&Cameo_BMC_data ->update_lock);
data->valid = 0;
mutex_init(&data->update_lock);
dev_info(&client->dev, "chip found\n");
/* Register sysfs hooks */
status = sysfs_create_group(&client->dev.kobj, &ESC600_SYS_group);
if (status)
{
goto exit_free;
}
status = sysfs_create_group(&client->dev.kobj, &ESC600_PSU_group);
if (status)
{
goto exit_free;
}
#ifdef ESC_600_JTAG_WANTED
status = sysfs_create_group(&client->dev.kobj, &ESC600_JTAG_group);
if (status)
{
goto exit_free;
}
#endif
status = sysfs_create_group(&client->dev.kobj, &ESC600_SFP_group);
if (status)
{
goto exit_free;
}
#ifdef ESC_600_MASK_WANTED
status = sysfs_create_group(&client->dev.kobj, &ESC600_MASK_group);
if (status)
{
goto exit_free;
}
#endif
status = sysfs_create_group(&client->dev.kobj, &ESC600_FAN_group);
if (status)
{
goto exit_free;
}
status = sysfs_create_group(&client->dev.kobj, &ESC600_USB_group);
if (status)
{
goto exit_free;
}
status = sysfs_create_group(&client->dev.kobj, &ESC600_LED_group);
if (status)
{
goto exit_free;
}
status = sysfs_create_group(&client->dev.kobj, &ESC600_Reset_group);
if (status)
{
goto exit_free;
}
status = sysfs_create_group(&client->dev.kobj, &ESC600_Sensor_group);
if (status)
{
goto exit_free;
}
#ifdef ESC_600_INT_WANTED
status = sysfs_create_group(&client->dev.kobj, &ESC600_INT_group);
if (status)
{
goto exit_free;
}
#endif
status = sysfs_create_group(&client->dev.kobj, &ESC600_Module_group);
if (status)
{
goto exit_free;
}
data->hwmon_dev = hwmon_device_register(&client->dev);
if (IS_ERR(data->hwmon_dev))
{
status = PTR_ERR(data->hwmon_dev);
goto exit_remove;
}
dev_info(&client->dev, "%s: '%s'\n", dev_name(data->hwmon_dev), client->name);
return 0;
exit_remove:
sysfs_remove_group(&client->dev.kobj, &ESC600_SYS_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_PSU_group);
#ifdef ESC_600_JTAG_WANTED
sysfs_remove_group(&client->dev.kobj, &ESC600_JTAG_group);
#endif
sysfs_remove_group(&client->dev.kobj, &ESC600_SFP_group);
#ifdef ESC_600_MASK_WANTED
sysfs_remove_group(&client->dev.kobj, &ESC600_MASK_group);
#endif
sysfs_remove_group(&client->dev.kobj, &ESC600_FAN_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_USB_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_LED_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_Reset_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_Sensor_group);
#ifdef ESC_600_INT_WANTED
sysfs_remove_group(&client->dev.kobj, &ESC600_INT_group);
#endif
sysfs_remove_group(&client->dev.kobj, &ESC600_Module_group);
exit_free:
kfree(data);
exit:
return status;
}
static int Cameo_i2c_remove(struct i2c_client *client)
{
struct Cameo_i2c_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &ESC600_SYS_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_PSU_group);
#ifdef ESC_600_JTAG_WANTED
sysfs_remove_group(&client->dev.kobj, &ESC600_JTAG_group);
#endif
sysfs_remove_group(&client->dev.kobj, &ESC600_SFP_group);
#ifdef ESC_600_MASK_WANTED
sysfs_remove_group(&client->dev.kobj, &ESC600_MASK_group);
#endif
sysfs_remove_group(&client->dev.kobj, &ESC600_FAN_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_USB_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_LED_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_Reset_group);
sysfs_remove_group(&client->dev.kobj, &ESC600_Sensor_group);
#ifdef ESC_600_INT_WANTED
sysfs_remove_group(&client->dev.kobj, &ESC600_INT_group);
#endif
sysfs_remove_group(&client->dev.kobj, &ESC600_Module_group);
kfree(data);
return 0;
}
static const struct i2c_device_id Cameo_i2c_id[] =
{
{ "ESC_600_128q", 0 },
{},
};
MODULE_DEVICE_TABLE(i2c, Cameo_i2c_id);
static struct i2c_driver Cameo_i2c_driver =
{
.class = I2C_CLASS_HWMON,
.driver =
{
.name = "ESC_600_128q",
},
.probe = Cameo_i2c_probe,
.remove = Cameo_i2c_remove,
.id_table = Cameo_i2c_id,
.address_list = normal_i2c,
};
static struct i2c_board_info ESC_600_128q_info[] __initdata =
{
{
I2C_BOARD_INFO("ESC_600_128q", 0x33),
.platform_data = NULL,
},
};
static struct i2c_board_info Cameo_CPLD_2_info[] __initdata =
{
{
I2C_BOARD_INFO("Cameo_CPLD_2", 0x30),
.platform_data = NULL,
},
};
static struct i2c_board_info Cameo_CPLD_3_info[] __initdata =
{
{
I2C_BOARD_INFO("Cameo_CPLD_3", 0x31),
.platform_data = NULL,
},
};
static struct i2c_board_info Cameo_CPLD_4_info[] __initdata =
{
{
I2C_BOARD_INFO("Cameo_CPLD_3", 0x35),
.platform_data = NULL,
},
};
static struct i2c_board_info Cameo_Extpand_1_info[] __initdata =
{
{
I2C_BOARD_INFO("Cameo_Extpand_1", 0x20),
.platform_data = NULL,
},
};
static struct i2c_board_info Cameo_Extpand_2_info[] __initdata =
{
{
I2C_BOARD_INFO("Cameo_Extpand_2", 0x21),
.platform_data = NULL,
},
};
static struct i2c_board_info Cameo_BMC_info[] __initdata =
{
{
I2C_BOARD_INFO("Cameo_BMC", 0x14),
.platform_data = NULL,
},
};
/********************************************************************************/
/* Function Name : Cameo_i2c_init */
/* Description : To init i2c driver */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static int __init Cameo_i2c_init(void)
{
int ret;
struct i2c_adapter *i2c_adap = i2c_get_adapter(0);
if (i2c_adap == NULL)
{
printk("ERROR: i2c_get_adapter FAILED!\n");
return -1;
}
ESC_600_128q_client = i2c_new_device(i2c_adap, &ESC_600_128q_info[0]);
Cameo_CPLD_2_client = i2c_new_device(i2c_adap, &Cameo_CPLD_2_info[0]);
Cameo_CPLD_3_client = i2c_new_device(i2c_adap, &Cameo_CPLD_3_info[0]);
Cameo_CPLD_4_client = i2c_new_device(i2c_adap, &Cameo_CPLD_4_info[0]);
Cameo_Extpand_1_client = i2c_new_device(i2c_adap, &Cameo_Extpand_1_info[0]);
Cameo_Extpand_2_client = i2c_new_device(i2c_adap, &Cameo_Extpand_2_info[0]);
Cameo_BMC_client = i2c_new_device(i2c_adap, &Cameo_BMC_info[0]);
if (ESC_600_128q_info == NULL || Cameo_CPLD_2_info == NULL ||
Cameo_CPLD_3_info == NULL || Cameo_Extpand_1_info == NULL ||
Cameo_Extpand_2_info == NULL || Cameo_BMC_info == NULL ||
Cameo_CPLD_4_info == NULL)
{
printk("ERROR: i2c_new_device FAILED!\n");
return -1;
}
i2c_put_adapter(i2c_adap);
ret = i2c_add_driver(&Cameo_i2c_driver);
printk(KERN_ALERT "ESC600-128Q i2c Driver ret: %d\n", ret);
printk(KERN_ALERT "ESC600-128Q i2c Driver Version: %s\n", DRIVER_VERSION);
printk(KERN_ALERT "ESC600-128Q i2c Driver INSTALL SUCCESS\n");
return ret;
}
/********************************************************************************/
/* Function Name : Cameo_i2c_exit */
/* Description : To remove i2c driver */
/* */
/* Input(s) : None. */
/* Output(s) : None. */
/* Returns : None. */
/********************************************************************************/
static void __exit Cameo_i2c_exit(void)
{
i2c_unregister_device(ESC_600_128q_client);
i2c_unregister_device(Cameo_CPLD_2_client);
i2c_unregister_device(Cameo_CPLD_3_client);
i2c_unregister_device(Cameo_CPLD_4_client);
i2c_unregister_device(Cameo_Extpand_1_client);
i2c_unregister_device(Cameo_Extpand_2_client);
i2c_unregister_device(Cameo_BMC_client);
i2c_del_driver(&Cameo_i2c_driver);
printk(KERN_ALERT "ESC600-128Q i2c driver uninstall success\n");
}
MODULE_AUTHOR("Cameo Inc.");
MODULE_DESCRIPTION("Cameo ESC600-128Q i2c driver");
MODULE_LICENSE("GPL");
module_init(Cameo_i2c_init);
module_exit(Cameo_i2c_exit);