[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 += delta_ag9064_swpld.o
|
||||||
obj-m += i2c-mei.o
|
obj-m += i2c-mei.o
|
||||||
i2c-mei-objs := i2c-mei_io.o i2c-mei_main.o i2c-mei_rw.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 err;
|
||||||
int value;
|
int value;
|
||||||
int set_data;
|
int set_data;
|
||||||
|
unsigned long set_data_ul;
|
||||||
unsigned char reg;
|
unsigned char reg;
|
||||||
unsigned char mask;
|
unsigned char mask;
|
||||||
unsigned char mask_out;
|
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 sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
|
||||||
struct cpld_platform_data *pdata = dev->platform_data;
|
struct cpld_platform_data *pdata = dev->platform_data;
|
||||||
|
|
||||||
err = kstrtoul(buf, 0, &set_data);
|
err = kstrtoul(buf, 0, &set_data_ul);
|
||||||
if (err){
|
if (err){
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_data = (int)set_data_ul;
|
||||||
if (set_data > 0xff){
|
if (set_data > 0xff){
|
||||||
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
|
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
|
||||||
return count;
|
return count;
|
||||||
@ -816,7 +818,7 @@ static struct platform_driver cpld_driver = {
|
|||||||
/*---------------- CPLD - end ------------- */
|
/*---------------- CPLD - end ------------- */
|
||||||
|
|
||||||
/*---------------- module initialization ------------- */
|
/*---------------- module initialization ------------- */
|
||||||
static void __init delta_ag9064_cpupld_init(void)
|
static int __init delta_ag9064_cpupld_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
printk(KERN_WARNING "ag9064_platform_cpupld module initialization\n");
|
printk(KERN_WARNING "ag9064_platform_cpupld module initialization\n");
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
struct i2c_client * i2c_client_9548;
|
struct i2c_client * i2c_client_9548;
|
||||||
|
|
||||||
|
|
||||||
/* pca9548 - add 8 bus */
|
/* pca9548 - add 8 bus */
|
||||||
static struct pca954x_platform_mode pca954x_mode[] =
|
static struct pca954x_platform_mode pca954x_mode[] =
|
||||||
{
|
{
|
||||||
@ -150,7 +151,6 @@ void device_release(struct device *dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(device_release);
|
EXPORT_SYMBOL(device_release);
|
||||||
|
|
||||||
void msg_handler(struct ipmi_recv_msg *recv_msg, void* handler_data)
|
void msg_handler(struct ipmi_recv_msg *recv_msg, void* handler_data)
|
||||||
{
|
{
|
||||||
struct completion *comp = recv_msg->user_msg_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;
|
return;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(msg_handler);
|
EXPORT_SYMBOL(msg_handler);
|
||||||
|
|
||||||
void dummy_smi_free(struct ipmi_smi_msg *msg)
|
void dummy_smi_free(struct ipmi_smi_msg *msg)
|
||||||
{
|
{
|
||||||
atomic_dec(&dummy_count);
|
atomic_dec(&dummy_count);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dummy_smi_free);
|
EXPORT_SYMBOL(dummy_smi_free);
|
||||||
|
|
||||||
void dummy_recv_free(struct ipmi_recv_msg *msg)
|
void dummy_recv_free(struct ipmi_recv_msg *msg)
|
||||||
{
|
{
|
||||||
atomic_dec(&dummy_count);
|
atomic_dec(&dummy_count);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dummy_recv_free);
|
EXPORT_SYMBOL(dummy_recv_free);
|
||||||
|
|
||||||
unsigned char dni_log2 (unsigned char num){
|
unsigned char dni_log2 (unsigned char num){
|
||||||
unsigned char num_log2 = 0;
|
unsigned char num_log2 = 0;
|
||||||
while(num > 0){
|
while(num > 0){
|
||||||
@ -183,7 +180,9 @@ unsigned char dni_log2 (unsigned char num){
|
|||||||
return num_log2 -1;
|
return num_log2 -1;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dni_log2);
|
EXPORT_SYMBOL(dni_log2);
|
||||||
|
|
||||||
/*---------------- IPMI - start ------------- */
|
/*---------------- IPMI - start ------------- */
|
||||||
|
|
||||||
int dni_create_user(void)
|
int dni_create_user(void)
|
||||||
{
|
{
|
||||||
int rv, i;
|
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;
|
msg.data = cmd_data;
|
||||||
|
|
||||||
init_completion(&comp);
|
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) {
|
if (rv) {
|
||||||
return -6;
|
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[2] = QSFP_PORT_MUX_REG;
|
||||||
cmd_data[3] = chan + 1;
|
cmd_data[3] = chan + 1;
|
||||||
cmd_data_len = sizeof(cmd_data);
|
cmd_data_len = sizeof(cmd_data);
|
||||||
// return 0;
|
|
||||||
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -869,7 +867,6 @@ static int swpld_mux_select(struct i2c_mux_core *muxc, u32 chan)
|
|||||||
cmd_data[3] = chan + 1;
|
cmd_data[3] = chan + 1;
|
||||||
cmd_data_len = sizeof(cmd_data);
|
cmd_data_len = sizeof(cmd_data);
|
||||||
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1085,629 +1082,17 @@ static struct platform_driver swpld_mux_driver = {
|
|||||||
.name = "delta-ag9064-swpld-mux",
|
.name = "delta-ag9064-swpld-mux",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*---------------- MUX - end ------------- */
|
/*---------------- 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 ------------- */
|
/*---------------- module initialization ------------- */
|
||||||
|
|
||||||
static int __init delta_ag9064_platform_init(void)
|
static int __init delta_ag9064_platform_init(void)
|
||||||
{
|
{
|
||||||
struct i2c_client *client;
|
// struct i2c_client *client;
|
||||||
struct i2c_adapter *adapter;
|
struct i2c_adapter *adapter;
|
||||||
struct swpld_mux_platform_data *swpld_pdata;
|
struct swpld_mux_platform_data *swpld_pdata;
|
||||||
struct cpld_platform_data * cpld_pdata;
|
// struct cpld_platform_data * cpld_pdata;
|
||||||
int ret,i = 0;
|
int ret,i = 0;
|
||||||
|
|
||||||
printk("ag9064_platform module initialization\n");
|
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");
|
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
|
// register the mux prob which call the SWPLD
|
||||||
ret = platform_driver_register(&swpld_mux_driver);
|
ret = platform_driver_register(&swpld_mux_driver);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -1741,13 +1120,6 @@ static int __init delta_ag9064_platform_init(void)
|
|||||||
goto error_i2c_device_driver;
|
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;
|
swpld_pdata = ag9064_swpld_mux[0].dev.platform_data;
|
||||||
ret = platform_device_register(&ag9064_swpld_mux[0]);
|
ret = platform_device_register(&ag9064_swpld_mux[0]);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -1776,18 +1148,11 @@ error_ag9064_i2c_device:
|
|||||||
}
|
}
|
||||||
i = ARRAY_SIZE(ag9064_swpld_mux);
|
i = ARRAY_SIZE(ag9064_swpld_mux);
|
||||||
error_ag9064_swpld_mux:
|
error_ag9064_swpld_mux:
|
||||||
i--;
|
platform_device_unregister(&ag9064_swpld_mux[0]);
|
||||||
for (; i >= 0; i--) {
|
|
||||||
platform_device_unregister(&ag9064_swpld_mux);
|
|
||||||
}
|
|
||||||
platform_driver_unregister(&ag9064_cpld);
|
|
||||||
error_ag9064_cpld:
|
|
||||||
platform_driver_unregister(&i2c_device_driver);
|
platform_driver_unregister(&i2c_device_driver);
|
||||||
error_i2c_device_driver:
|
error_i2c_device_driver:
|
||||||
platform_driver_unregister(&swpld_mux_driver);
|
platform_driver_unregister(&swpld_mux_driver);
|
||||||
error_swpld_mux_driver:
|
error_swpld_mux_driver:
|
||||||
platform_driver_unregister(&cpld_driver);
|
|
||||||
error_cpld_driver:
|
|
||||||
return ret;
|
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_i2c_device[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
platform_device_unregister(&ag9064_swpld_mux);
|
platform_device_unregister(&ag9064_swpld_mux[0]);
|
||||||
platform_device_unregister(&ag9064_cpld);
|
|
||||||
platform_driver_unregister(&i2c_device_driver);
|
platform_driver_unregister(&i2c_device_driver);
|
||||||
platform_driver_unregister(&swpld_mux_driver);
|
platform_driver_unregister(&swpld_mux_driver);
|
||||||
platform_driver_unregister(&cpld_driver);
|
|
||||||
i2c_unregister_device(i2c_client_9548);
|
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 cmd_data[4]={0};
|
||||||
uint8_t set_cmd;
|
uint8_t set_cmd;
|
||||||
uint8_t get_cmd;
|
uint8_t get_cmd;
|
||||||
|
unsigned long set_data_ul;
|
||||||
unsigned char mask;
|
unsigned char mask;
|
||||||
unsigned char mask_out;
|
unsigned char mask_out;
|
||||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
|
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;
|
set_cmd = CMD_SETDATA;
|
||||||
get_cmd = CMD_GETDATA;
|
get_cmd = CMD_GETDATA;
|
||||||
|
|
||||||
err = kstrtoul(buf, 0, &set_data);
|
err = kstrtoul(buf, 0, &set_data_ul);
|
||||||
if (err){
|
if (err){
|
||||||
return 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");
|
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_data = (int)set_data_ul;
|
||||||
if (attr->index <= SWPLD4_REG_VALUE){
|
if (attr->index <= SWPLD4_REG_VALUE){
|
||||||
cmd_data[0] = BMC_BUS_5;
|
cmd_data[0] = BMC_BUS_5;
|
||||||
cmd_data[3] = set_data;
|
cmd_data[3] = set_data;
|
||||||
@ -516,7 +519,7 @@ static struct platform_driver swpld4_driver = {
|
|||||||
/*---------------- CPLD - end ------------- */
|
/*---------------- CPLD - end ------------- */
|
||||||
|
|
||||||
/*---------------- module initialization ------------- */
|
/*---------------- module initialization ------------- */
|
||||||
static void __init delta_ag9064_swpld_init(void)
|
static int __init delta_ag9064_swpld_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
printk(KERN_WARNING "ag9064_platform_swpld module initialization\n");
|
printk(KERN_WARNING "ag9064_platform_swpld module initialization\n");
|
||||||
@ -586,15 +589,15 @@ static void __init delta_ag9064_swpld_init(void)
|
|||||||
error_swpld4_device:
|
error_swpld4_device:
|
||||||
platform_driver_unregister(&swpld4_driver);
|
platform_driver_unregister(&swpld4_driver);
|
||||||
error_swpld4_driver:
|
error_swpld4_driver:
|
||||||
platform_driver_unregister(&swpld3_device);
|
platform_device_unregister(&swpld3_device);
|
||||||
error_swpld3_device:
|
error_swpld3_device:
|
||||||
platform_driver_unregister(&swpld3_driver);
|
platform_driver_unregister(&swpld3_driver);
|
||||||
error_swpld3_driver:
|
error_swpld3_driver:
|
||||||
platform_driver_unregister(&swpld2_device);
|
platform_device_unregister(&swpld2_device);
|
||||||
error_swpld2_device:
|
error_swpld2_device:
|
||||||
platform_driver_unregister(&swpld2_driver);
|
platform_driver_unregister(&swpld2_driver);
|
||||||
error_swpld2_driver:
|
error_swpld2_driver:
|
||||||
platform_driver_unregister(&swpld1_device);
|
platform_device_unregister(&swpld1_device);
|
||||||
error_swpld1_device:
|
error_swpld1_device:
|
||||||
platform_driver_unregister(&swpld1_driver);
|
platform_driver_unregister(&swpld1_driver);
|
||||||
error_swpld1_driver:
|
error_swpld1_driver:
|
||||||
|
Reference in New Issue
Block a user