[devices]: modified and fixed delta ag9064 modules (#28)
2. enable build ag9064 Signed-off-by: neal tai <neal.tai@deltaww.com>
This commit is contained in:
parent
b53fa5ee67
commit
c77ddbc79e
@ -3,4 +3,3 @@ obj-m += delta_ag9064_cpld.o
|
||||
obj-m += delta_ag9064_swpld.o
|
||||
obj-m += i2c-mei.o
|
||||
i2c-mei-objs := i2c-mei_io.o i2c-mei_main.o i2c-mei_rw.o
|
||||
|
||||
|
@ -632,6 +632,7 @@ static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_att
|
||||
int err;
|
||||
int value;
|
||||
int set_data;
|
||||
unsigned long set_data_ul;
|
||||
unsigned char reg;
|
||||
unsigned char mask;
|
||||
unsigned char mask_out;
|
||||
@ -639,11 +640,12 @@ static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_att
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
|
||||
struct cpld_platform_data *pdata = dev->platform_data;
|
||||
|
||||
err = kstrtoul(buf, 0, &set_data);
|
||||
err = kstrtoul(buf, 0, &set_data_ul);
|
||||
if (err){
|
||||
return err;
|
||||
}
|
||||
|
||||
set_data = (int)set_data_ul;
|
||||
if (set_data > 0xff){
|
||||
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
|
||||
return count;
|
||||
@ -816,7 +818,7 @@ static struct platform_driver cpld_driver = {
|
||||
/*---------------- CPLD - end ------------- */
|
||||
|
||||
/*---------------- module initialization ------------- */
|
||||
static void __init delta_ag9064_cpupld_init(void)
|
||||
static int __init delta_ag9064_cpupld_init(void)
|
||||
{
|
||||
int ret;
|
||||
printk(KERN_WARNING "ag9064_platform_cpupld module initialization\n");
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
struct i2c_client * i2c_client_9548;
|
||||
|
||||
|
||||
/* pca9548 - add 8 bus */
|
||||
static struct pca954x_platform_mode pca954x_mode[] =
|
||||
{
|
||||
@ -150,7 +151,6 @@ void device_release(struct device *dev)
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(device_release);
|
||||
|
||||
void msg_handler(struct ipmi_recv_msg *recv_msg, void* handler_data)
|
||||
{
|
||||
struct completion *comp = recv_msg->user_msg_data;
|
||||
@ -161,19 +161,16 @@ void msg_handler(struct ipmi_recv_msg *recv_msg, void* handler_data)
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(msg_handler);
|
||||
|
||||
void dummy_smi_free(struct ipmi_smi_msg *msg)
|
||||
{
|
||||
atomic_dec(&dummy_count);
|
||||
}
|
||||
EXPORT_SYMBOL(dummy_smi_free);
|
||||
|
||||
void dummy_recv_free(struct ipmi_recv_msg *msg)
|
||||
{
|
||||
atomic_dec(&dummy_count);
|
||||
}
|
||||
EXPORT_SYMBOL(dummy_recv_free);
|
||||
|
||||
unsigned char dni_log2 (unsigned char num){
|
||||
unsigned char num_log2 = 0;
|
||||
while(num > 0){
|
||||
@ -183,7 +180,9 @@ unsigned char dni_log2 (unsigned char num){
|
||||
return num_log2 -1;
|
||||
}
|
||||
EXPORT_SYMBOL(dni_log2);
|
||||
|
||||
/*---------------- IPMI - start ------------- */
|
||||
|
||||
int dni_create_user(void)
|
||||
{
|
||||
int rv, i;
|
||||
@ -217,7 +216,7 @@ int dni_bmc_cmd(char set_cmd, char *cmd_data, int cmd_data_len)
|
||||
msg.data = cmd_data;
|
||||
|
||||
init_completion(&comp);
|
||||
rv = ipmi_request_supply_msgs(ipmi_mh_user, (struct ipmi_addr*)&addr, 0, &msg, &comp, &halt_smi_msg, &halt_recv_msg, 0);
|
||||
rv = ipmi_request_supply_msgs(ipmi_mh_user, (struct ipmi_addr*)&addr, 0,&msg, &comp, &halt_smi_msg, &halt_recv_msg, 0);
|
||||
if (rv) {
|
||||
return -6;
|
||||
}
|
||||
@ -843,7 +842,6 @@ static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan)
|
||||
cmd_data[2] = QSFP_PORT_MUX_REG;
|
||||
cmd_data[3] = chan + 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
// return 0;
|
||||
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
}
|
||||
else
|
||||
@ -869,7 +867,6 @@ static int swpld_mux_select(struct i2c_mux_core *muxc, u32 chan)
|
||||
cmd_data[3] = chan + 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1085,629 +1082,17 @@ static struct platform_driver swpld_mux_driver = {
|
||||
.name = "delta-ag9064-swpld-mux",
|
||||
},
|
||||
};
|
||||
|
||||
/*---------------- MUX - end ------------- */
|
||||
|
||||
/*---------------- CPLD - start ------------- */
|
||||
|
||||
/* CPLD -- device */
|
||||
|
||||
static ssize_t get_present(struct device *dev, struct device_attribute \
|
||||
*dev_attr, char *buf)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
int ret;
|
||||
u64 data = 0;
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_GETDATA;
|
||||
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_1;
|
||||
cmd_data[3] = 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
ret=0;
|
||||
data = (u64)(ret & 0xff);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_2;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
// ret=0;
|
||||
data |= (u64)(ret & 0xff) << 8;
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_3;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 16;
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_4;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 24;
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_5;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 32;
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_6;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 40;
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_7;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 48;
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_PRESENCE_8;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 56;
|
||||
|
||||
return sprintf(buf, "0x%016llx\n", data);
|
||||
}
|
||||
|
||||
static ssize_t get_lpmode(struct device *dev, struct device_attribute \
|
||||
*dev_attr, char *buf)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
int ret;
|
||||
u64 data = 0;
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_GETDATA;
|
||||
ret=0;
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_1;
|
||||
cmd_data[3] = 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data = (u64)(ret & 0xff);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_2;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 8;
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_3;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 16;
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_4;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 24;
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_5;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 32;
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_6;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 40;
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_7;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 48;
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_8;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 56;
|
||||
|
||||
return sprintf(buf, "0x%016llx\n", data);
|
||||
}
|
||||
|
||||
static ssize_t get_reset(struct device *dev, struct device_attribute \
|
||||
*dev_attr, char *buf)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
int ret;
|
||||
u64 data = 0;
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_GETDATA;
|
||||
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_1;
|
||||
cmd_data[3] = 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
ret=0;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data = (u64)(ret & 0xff);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_2;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 8;
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_3;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 16;
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_4;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 24;
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_5;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 32;
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_6;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 40;
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_7;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 48;
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_8;
|
||||
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||
data |= (u64)(ret & 0xff) << 56;
|
||||
|
||||
return sprintf(buf, "0x%016llx\n", data);
|
||||
}
|
||||
|
||||
static ssize_t get_response(struct device *dev, struct device_attribute \
|
||||
*dev_attr, char *buf)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
int ret;
|
||||
u64 data = 0;
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_GETDATA;
|
||||
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_1;
|
||||
cmd_data[3] = 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
ret = 0;
|
||||
data = (u64)(ret & 0xff);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_2;
|
||||
data |= (u64)(ret & 0xff) << 8;
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_3;
|
||||
data |= (u64)(ret & 0xff) << 16;
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_4;
|
||||
data |= (u64)(ret & 0xff) << 24;
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_5;
|
||||
data |= (u64)(ret & 0xff) << 32;
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_6;
|
||||
data |= (u64)(ret & 0xff) << 40;
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_7;
|
||||
data |= (u64)(ret & 0xff) << 48;
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_8;
|
||||
data |= (u64)(ret & 0xff) << 56;
|
||||
|
||||
return sprintf(buf, "0x%016llx\n", data);
|
||||
}
|
||||
|
||||
static ssize_t get_interrupt(struct device *dev, struct device_attribute \
|
||||
*dev_attr, char *buf)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
int ret;
|
||||
u64 data = 0;
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_GETDATA;
|
||||
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_1;
|
||||
cmd_data[3] = 1;
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
ret=0;
|
||||
data = (u64)(ret & 0xff);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_2;
|
||||
data |= (u64)(ret & 0xff) << 8;
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_3;
|
||||
data |= (u64)(ret & 0xff) << 16;
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_4;
|
||||
data |= (u64)(ret & 0xff) << 24;
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_5;
|
||||
data |= (u64)(ret & 0xff) << 32;
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_6;
|
||||
data |= (u64)(ret & 0xff) << 40;
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_7;
|
||||
data |= (u64)(ret & 0xff) << 48;
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_INTERRUPT_8;
|
||||
data |= (u64)(ret & 0xff) << 56;
|
||||
|
||||
return sprintf(buf, "0x%016llx\n", data);
|
||||
}
|
||||
|
||||
|
||||
static ssize_t set_lpmode(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
unsigned long long set_data;
|
||||
int err;
|
||||
|
||||
err = kstrtoull(buf, 16, &set_data);
|
||||
if (err){
|
||||
return err;
|
||||
}
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_SETDATA;
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_1;
|
||||
cmd_data[3] = (set_data & 0xff);
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_2;
|
||||
cmd_data[3] = ((set_data >> 8 ) & 0xff);
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_3;
|
||||
cmd_data[3] = ((set_data >> 16 ) & 0xff);
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_4;
|
||||
cmd_data[3] = ((set_data >> 24 ) & 0xff);
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_5;
|
||||
cmd_data[3] = ((set_data >> 32 ) & 0xff);
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_6;
|
||||
cmd_data[3] = ((set_data >> 40 ) & 0xff);
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_7;
|
||||
cmd_data[3] = ((set_data >> 48 ) & 0xff);
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_LP_MODE_8;
|
||||
cmd_data[3] = ((set_data >> 56 ) & 0xff);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t set_reset(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
unsigned long long set_data;
|
||||
int err;
|
||||
|
||||
err = kstrtoull(buf, 16, &set_data);
|
||||
if (err){
|
||||
return err;
|
||||
}
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_SETDATA;
|
||||
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_1;
|
||||
cmd_data[3] = (set_data & 0xff);
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_2;
|
||||
cmd_data[3] = ((set_data >> 8 ) & 0xff);
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_3;
|
||||
cmd_data[3] = ((set_data >> 16 ) & 0xff);
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_4;
|
||||
cmd_data[3] = ((set_data >> 24 ) & 0xff);
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_5;
|
||||
cmd_data[3] = ((set_data >> 32 ) & 0xff);
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_6;
|
||||
cmd_data[3] = ((set_data >> 40 ) & 0xff);
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_7;
|
||||
cmd_data[3] = ((set_data >> 48 ) & 0xff);
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESET_8;
|
||||
cmd_data[3] = ((set_data >> 56 ) & 0xff);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t set_response(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)
|
||||
{
|
||||
uint8_t cmd_data[4]={0};
|
||||
unsigned long long set_data;
|
||||
int err;
|
||||
|
||||
err = kstrtoull(buf, 16, &set_data);
|
||||
if (err){
|
||||
return err;
|
||||
}
|
||||
uint8_t set_cmd;
|
||||
int cmd_data_len;
|
||||
|
||||
set_cmd = CMD_SETDATA;
|
||||
|
||||
/*QSFP1~8*/
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_1;
|
||||
cmd_data[3] = (set_data & 0xff);
|
||||
cmd_data_len = sizeof(cmd_data);
|
||||
|
||||
/*QSFP9~16*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_2;
|
||||
cmd_data[3] = ((set_data >> 8 ) & 0xff);
|
||||
|
||||
/*QSFP17~24*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_3;
|
||||
cmd_data[3] = ((set_data >> 16 ) & 0xff);
|
||||
|
||||
/*QSFP25~32*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_4;
|
||||
cmd_data[3] = ((set_data >> 24 ) & 0xff);
|
||||
|
||||
/*QSFP33~40*/
|
||||
cmd_data[1] = SWPLD1_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_5;
|
||||
cmd_data[3] = ((set_data >> 32 ) & 0xff);
|
||||
|
||||
/*QSFP41~48*/
|
||||
cmd_data[1] = SWPLD2_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_6;
|
||||
cmd_data[3] = ((set_data >> 40 ) & 0xff);
|
||||
|
||||
/*QSFP49~56*/
|
||||
cmd_data[1] = SWPLD4_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_7;
|
||||
cmd_data[3] = ((set_data >> 48 ) & 0xff);
|
||||
|
||||
/*QSFP57~64*/
|
||||
cmd_data[1] = SWPLD3_ADDR;
|
||||
cmd_data[2] = QSFP_RESPONSE_8;
|
||||
cmd_data[3] = ((set_data >> 56 ) & 0xff);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(qsfp_present, S_IRUGO, get_present, NULL);
|
||||
static DEVICE_ATTR(qsfp_lpmode, S_IWUSR | S_IRUGO, get_lpmode, set_lpmode);
|
||||
static DEVICE_ATTR(qsfp_reset, S_IWUSR | S_IRUGO, get_reset, set_reset);
|
||||
static DEVICE_ATTR(qsfp_modsel, S_IWUSR | S_IRUGO, get_response, set_response);
|
||||
static DEVICE_ATTR(qsfp_interrupt, S_IRUGO, get_interrupt, NULL);
|
||||
|
||||
static struct attribute *ag9064_cpld_attrs[] = {
|
||||
&dev_attr_qsfp_present.attr,
|
||||
&dev_attr_qsfp_lpmode.attr,
|
||||
&dev_attr_qsfp_reset.attr,
|
||||
&dev_attr_qsfp_modsel.attr,
|
||||
&dev_attr_qsfp_interrupt.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group ag9064_cpld_attr_grp = {
|
||||
.attrs = ag9064_cpld_attrs,
|
||||
};
|
||||
|
||||
enum cpld_type {
|
||||
system_cpld,
|
||||
};
|
||||
|
||||
struct cpld_platform_data {
|
||||
int reg_addr;
|
||||
struct i2c_client *client;
|
||||
};
|
||||
|
||||
static struct cpld_platform_data ag9064_cpld_platform_data[] = {
|
||||
[system_cpld] = {
|
||||
.reg_addr = CPLD_REG,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device ag9064_cpld = {
|
||||
.name = "delta-ag9064-cpld",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = ag9064_cpld_platform_data,
|
||||
.release = device_release
|
||||
},
|
||||
};
|
||||
|
||||
static int __init cpld_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct cpld_platform_data *pdata;
|
||||
struct i2c_adapter *parent;
|
||||
int ret;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "CPLD platform data not found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
parent = i2c_get_adapter(BUS7);
|
||||
if (!parent) {
|
||||
printk(KERN_WARNING "Parent adapter (%d) not found\n",BUS7);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pdata[system_cpld].client = i2c_new_dummy(parent, pdata[system_cpld].reg_addr);
|
||||
if (!pdata[system_cpld].client) {
|
||||
printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[system_cpld].reg_addr);
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = sysfs_create_group(&pdev->dev.kobj, &ag9064_cpld_attr_grp);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING "Fail to create cpld attribute group");
|
||||
goto error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
i2c_unregister_device(pdata[system_cpld].client);
|
||||
i2c_put_adapter(parent);
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int __exit cpld_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct i2c_adapter *parent = NULL;
|
||||
struct cpld_platform_data *pdata = pdev->dev.platform_data;
|
||||
sysfs_remove_group(&pdev->dev.kobj, &ag9064_cpld_attr_grp);
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "Missing platform data\n");
|
||||
}
|
||||
else {
|
||||
if (pdata[system_cpld].client) {
|
||||
if (!parent) {
|
||||
parent = (pdata[system_cpld].client)->adapter;
|
||||
}
|
||||
i2c_unregister_device(pdata[system_cpld].client);
|
||||
}
|
||||
}
|
||||
i2c_put_adapter(parent);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver cpld_driver = {
|
||||
.probe = cpld_probe,
|
||||
.remove = __exit_p(cpld_remove),
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "delta-ag9064-cpld",
|
||||
},
|
||||
};
|
||||
|
||||
/*---------------- CPLD - end ------------- */
|
||||
|
||||
/*---------------- module initialization ------------- */
|
||||
|
||||
static int __init delta_ag9064_platform_init(void)
|
||||
{
|
||||
struct i2c_client *client;
|
||||
// struct i2c_client *client;
|
||||
struct i2c_adapter *adapter;
|
||||
struct swpld_mux_platform_data *swpld_pdata;
|
||||
struct cpld_platform_data * cpld_pdata;
|
||||
// struct cpld_platform_data * cpld_pdata;
|
||||
int ret,i = 0;
|
||||
|
||||
printk("ag9064_platform module initialization\n");
|
||||
@ -1721,12 +1106,6 @@ static int __init delta_ag9064_platform_init(void)
|
||||
printk(KERN_WARNING "Fail to create IPMI user\n");
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&cpld_driver);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING "Fail to register cpld driver\n");
|
||||
goto error_cpld_driver;
|
||||
}
|
||||
|
||||
// register the mux prob which call the SWPLD
|
||||
ret = platform_driver_register(&swpld_mux_driver);
|
||||
if (ret) {
|
||||
@ -1741,13 +1120,6 @@ static int __init delta_ag9064_platform_init(void)
|
||||
goto error_i2c_device_driver;
|
||||
}
|
||||
|
||||
// register the CPLD
|
||||
ret = platform_device_register(&ag9064_cpld);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING "Fail to create cpld device\n");
|
||||
goto error_ag9064_cpld;
|
||||
}
|
||||
|
||||
swpld_pdata = ag9064_swpld_mux[0].dev.platform_data;
|
||||
ret = platform_device_register(&ag9064_swpld_mux[0]);
|
||||
if (ret) {
|
||||
@ -1776,18 +1148,11 @@ error_ag9064_i2c_device:
|
||||
}
|
||||
i = ARRAY_SIZE(ag9064_swpld_mux);
|
||||
error_ag9064_swpld_mux:
|
||||
i--;
|
||||
for (; i >= 0; i--) {
|
||||
platform_device_unregister(&ag9064_swpld_mux);
|
||||
}
|
||||
platform_driver_unregister(&ag9064_cpld);
|
||||
error_ag9064_cpld:
|
||||
platform_device_unregister(&ag9064_swpld_mux[0]);
|
||||
platform_driver_unregister(&i2c_device_driver);
|
||||
error_i2c_device_driver:
|
||||
platform_driver_unregister(&swpld_mux_driver);
|
||||
error_swpld_mux_driver:
|
||||
platform_driver_unregister(&cpld_driver);
|
||||
error_cpld_driver:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1799,11 +1164,9 @@ static void __exit delta_ag9064_platform_exit(void)
|
||||
platform_device_unregister(&ag9064_i2c_device[i]);
|
||||
}
|
||||
|
||||
platform_device_unregister(&ag9064_swpld_mux);
|
||||
platform_device_unregister(&ag9064_cpld);
|
||||
platform_device_unregister(&ag9064_swpld_mux[0]);
|
||||
platform_driver_unregister(&i2c_device_driver);
|
||||
platform_driver_unregister(&swpld_mux_driver);
|
||||
platform_driver_unregister(&cpld_driver);
|
||||
i2c_unregister_device(i2c_client_9548);
|
||||
}
|
||||
|
||||
|
@ -143,6 +143,7 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at
|
||||
uint8_t cmd_data[4]={0};
|
||||
uint8_t set_cmd;
|
||||
uint8_t get_cmd;
|
||||
unsigned long set_data_ul;
|
||||
unsigned char mask;
|
||||
unsigned char mask_out;
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
|
||||
@ -151,7 +152,7 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at
|
||||
set_cmd = CMD_SETDATA;
|
||||
get_cmd = CMD_GETDATA;
|
||||
|
||||
err = kstrtoul(buf, 0, &set_data);
|
||||
err = kstrtoul(buf, 0, &set_data_ul);
|
||||
if (err){
|
||||
return err;
|
||||
}
|
||||
@ -160,6 +161,8 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at
|
||||
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
|
||||
return count;
|
||||
}
|
||||
|
||||
set_data = (int)set_data_ul;
|
||||
if (attr->index <= SWPLD4_REG_VALUE){
|
||||
cmd_data[0] = BMC_BUS_5;
|
||||
cmd_data[3] = set_data;
|
||||
@ -516,7 +519,7 @@ static struct platform_driver swpld4_driver = {
|
||||
/*---------------- CPLD - end ------------- */
|
||||
|
||||
/*---------------- module initialization ------------- */
|
||||
static void __init delta_ag9064_swpld_init(void)
|
||||
static int __init delta_ag9064_swpld_init(void)
|
||||
{
|
||||
int ret;
|
||||
printk(KERN_WARNING "ag9064_platform_swpld module initialization\n");
|
||||
@ -586,15 +589,15 @@ static void __init delta_ag9064_swpld_init(void)
|
||||
error_swpld4_device:
|
||||
platform_driver_unregister(&swpld4_driver);
|
||||
error_swpld4_driver:
|
||||
platform_driver_unregister(&swpld3_device);
|
||||
platform_device_unregister(&swpld3_device);
|
||||
error_swpld3_device:
|
||||
platform_driver_unregister(&swpld3_driver);
|
||||
error_swpld3_driver:
|
||||
platform_driver_unregister(&swpld2_device);
|
||||
platform_device_unregister(&swpld2_device);
|
||||
error_swpld2_device:
|
||||
platform_driver_unregister(&swpld2_driver);
|
||||
error_swpld2_driver:
|
||||
platform_driver_unregister(&swpld1_device);
|
||||
platform_device_unregister(&swpld1_device);
|
||||
error_swpld1_device:
|
||||
platform_driver_unregister(&swpld1_driver);
|
||||
error_swpld1_driver:
|
||||
|
Reference in New Issue
Block a user