[Delta ag9032v1]Add attributes for cpupld and swpld. (#1437)

Signed-off-by: Stanley Chi <stanley.chi@deltaww.com>
This commit is contained in:
StanleyCi 2018-03-02 13:15:27 +08:00 committed by lguohan
parent 1e6576c5b8
commit 571a18add4

View File

@ -583,7 +583,6 @@ enum cpld_type {
struct cpld_platform_data { struct cpld_platform_data {
int reg_addr; int reg_addr;
struct i2c_client *client; struct i2c_client *client;
//struct kobject *kobj;
}; };
enum swpld_attributes { enum swpld_attributes {
@ -672,7 +671,7 @@ static struct platform_device ag9032v1_cpld = {
.id = 0, .id = 0,
.dev = { .dev = {
.platform_data = ag9032v1_cpld_platform_data, .platform_data = ag9032v1_cpld_platform_data,
.release = device_release .release = device_release,
}, },
}; };
@ -1547,6 +1546,7 @@ static struct attribute_group ag9032v1_cpld_attr_grp = {
.attrs = ag9032v1_cpld_attrs, .attrs = ag9032v1_cpld_attrs,
}; };
static struct kobject *kobj_swpld;
static struct kobject *kobj_board; static struct kobject *kobj_board;
static struct kobject *kobj_psu; static struct kobject *kobj_psu;
static struct kobject *kobj_hot_swap; static struct kobject *kobj_hot_swap;
@ -1557,8 +1557,10 @@ static ssize_t get_swpld_data(struct device *dev, struct device_attribute *dev_a
{ {
int ret; int ret;
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
struct device *i2cdev = kobj_to_dev(kobj_board->parent); struct device *i2cdev = kobj_to_dev(kobj_swpld);
struct cpld_platform_data *pdata = i2cdev->platform_data; struct cpld_platform_data *pdata = i2cdev->platform_data;
unsigned char reg; unsigned char reg;
int mask; int mask;
int value; int value;
@ -1572,33 +1574,29 @@ static ssize_t get_swpld_data(struct device *dev, struct device_attribute *dev_a
value = ret >> 4; value = ret >> 4;
sprintf(note, "\n“0x00”: L9032NB-AL-R\n“0x01”: AK9032-R\n“0x02”: AG9032-R\n“0x03”: AG9032R-R\n“0x04”: AG9032 V1-R\n"); sprintf(note, "\n“0x00”: L9032NB-AL-R\n“0x01”: AK9032-R\n“0x02”: AG9032-R\n“0x03”: AG9032R-R\n“0x04”: AG9032 V1-R\n");
return sprintf(buf, "0x%02x%s", value, note); return sprintf(buf, "0x%02x%s", value, note);
break;
case SW_BOARD_VER: case SW_BOARD_VER:
reg = 0x00; reg = 0x00;
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, reg); ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, reg);
value = ret & 0x0F; value = ret & 0x0F;
sprintf(note, "\n“0x00”: proto-A\n“0x01”: proto-B\n"); sprintf(note, "\n“0x00”: proto-A\n“0x01”: proto-B\n");
return sprintf(buf, "0x%02x%s", value, note); return sprintf(buf, "0x%02x%s", value, note);
break;
case SWPLD_VER: case SWPLD_VER:
reg = 0x01; reg = 0x01;
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, reg); ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, reg);
value = ret & 0xFF; value = ret & 0xFF;
sprintf(note, " "); sprintf(note, " ");
return sprintf(buf, "0x%02x%s", value, note); return sprintf(buf, "0x%02x%s", value, note);
break;
//other attributes //other attributes
case SYS_RST ... QSFP32_MOD_INT: case SYS_RST ... QSFP32_MOD_INT:
reg = controller_interrupt_data[attr->index].reg_addr; reg = controller_interrupt_data[attr->index].reg_addr;
mask = controller_interrupt_data[attr->index].reg_mask; mask = controller_interrupt_data[attr->index].reg_mask;
sprintf(note, "\n%s\n",controller_interrupt_data[attr->index].reg_note); sprintf(note, "\n%s\n",controller_interrupt_data[attr->index].reg_note);
break; ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, reg);
value = (ret & (1 << mask)) >> mask;
return sprintf(buf, "%d%s", value, note);
default: default:
return sprintf(buf, "%d not found", attr->index); return sprintf(buf, "%d not found", attr->index);
} }
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, reg);
value = (ret & (1 << mask)) >> mask;
return sprintf(buf, "%d%s", value, note);
} }
static ssize_t set_swpld_data(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count) static ssize_t set_swpld_data(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count)
@ -1633,7 +1631,6 @@ static ssize_t set_swpld_data(struct device *dev, struct device_attribute *dev_a
case QSFP_01TO08_MASK_INT... QSFP_25TO32_MASK_ABS: case QSFP_01TO08_MASK_INT... QSFP_25TO32_MASK_ABS:
reg = controller_interrupt_data[attr->index].reg_addr; reg = controller_interrupt_data[attr->index].reg_addr;
mask = controller_interrupt_data[attr->index].reg_mask; mask = controller_interrupt_data[attr->index].reg_mask;
sprintf(note, "\n%s\n",controller_interrupt_data[attr->index].reg_note);
break; break;
default: default:
return sprintf(buf, "%d not found", attr->index); return sprintf(buf, "%d not found", attr->index);
@ -1856,6 +1853,7 @@ static int __init cpld_probe(struct platform_device *pdev)
goto error; goto error;
} }
kobj_swpld = &pdev->dev.kobj;
kobj_board = kobject_create_and_add("Board", &pdev->dev.kobj); kobj_board = kobject_create_and_add("Board", &pdev->dev.kobj);
if (!kobj_board){ if (!kobj_board){
printk(KERN_WARNING "Fail to create directory"); printk(KERN_WARNING "Fail to create directory");
@ -1925,6 +1923,7 @@ static int __init cpld_probe(struct platform_device *pdev)
return 0; return 0;
error: error:
kobject_put(kobj_swpld);
kobject_put(kobj_board); kobject_put(kobj_board);
kobject_put(kobj_psu); kobject_put(kobj_psu);
kobject_put(kobj_hot_swap); kobject_put(kobj_hot_swap);
@ -1947,6 +1946,7 @@ static int __exit cpld_remove(struct platform_device *pdev)
dev_err(&pdev->dev, "Missing platform data\n"); dev_err(&pdev->dev, "Missing platform data\n");
} }
else { else {
kobject_put(kobj_swpld);
kobject_put(kobj_board); kobject_put(kobj_board);
kobject_put(kobj_psu); kobject_put(kobj_psu);
kobject_put(kobj_hot_swap); kobject_put(kobj_hot_swap);
@ -2266,7 +2266,7 @@ static void __init delta_ag9032v1_platform_init(void)
struct i2c_client *client; struct i2c_client *client;
struct i2c_adapter *adapter; struct i2c_adapter *adapter;
struct cpld_platform_data *cpld_pdata; struct cpld_platform_data *cpld_pdata;
struct swpld_mux_platform_data *swpld_pdata; struct swpld_mux_platform_data *swpld_mux_pdata;
int ret,i = 0; int ret,i = 0;
printk("ag9032v1_platform module initialization\n"); printk("ag9032v1_platform module initialization\n");
@ -2308,8 +2308,8 @@ static void __init delta_ag9032v1_platform_init(void)
for (i = 0; i < ARRAY_SIZE(ag9032v1_swpld_mux); i++) for (i = 0; i < ARRAY_SIZE(ag9032v1_swpld_mux); i++)
{ {
swpld_pdata = ag9032v1_swpld_mux[i].dev.platform_data; swpld_mux_pdata = ag9032v1_swpld_mux[i].dev.platform_data;
swpld_pdata->cpld = cpld_pdata[system_cpld].client; swpld_mux_pdata->cpld = cpld_pdata[system_cpld].client;
ret = platform_device_register(&ag9032v1_swpld_mux[i]); ret = platform_device_register(&ag9032v1_swpld_mux[i]);
if (ret) { if (ret) {
printk(KERN_WARNING "Fail to create swpld mux %d\n", i); printk(KERN_WARNING "Fail to create swpld mux %d\n", i);