in platform/broadcom/sonic-platform-modules-delta/agc032/modules/delta_agc032_swpld.c [2250:2452]
static ssize_t swpld3_data_store(struct device *dev, struct device_attribute *dev_attr,
const char *buf, size_t count)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
struct device *i2cdev = kobj_to_dev(kobj_swpld3->parent);
struct platform_data *pdata = i2cdev->platform_data;
unsigned int select = 0;
unsigned char offset = 0;
int mask = 0xFF;
int shift = 0;
int value = 0;
int err = 0;
unsigned long data;
err = kstrtoul(buf, 0, &data);
if (err){
return err;
}
if (data > 0xff){
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
return count;
}
switch (attr->index) {
case QSFP_P17_RST:
offset = 0x11;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P18_RST:
offset = 0x11;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P19_RST:
offset = 0x11;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P20_RST:
offset = 0x11;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P21_RST:
offset = 0x11;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P22_RST:
offset = 0x11;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P23_RST:
offset = 0x11;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P24_RST:
offset = 0x11;
shift = 0;
mask = (1 << shift);
break;
case QSFP_P25_RST:
offset = 0x12;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P26_RST:
offset = 0x12;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P27_RST:
offset = 0x12;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P28_RST:
offset = 0x12;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P29_RST:
offset = 0x12;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P30_RST:
offset = 0x12;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P31_RST:
offset = 0x12;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P32_RST:
offset = 0x12;
shift = 0;
mask = (1 << shift);
break;
case QSFP_P17_LPMODE:
offset = 0x21;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P18_LPMODE:
offset = 0x21;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P19_LPMODE:
offset = 0x21;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P20_LPMODE:
offset = 0x21;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P21_LPMODE:
offset = 0x21;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P22_LPMODE:
offset = 0x21;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P23_LPMODE:
offset = 0x21;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P24_LPMODE:
offset = 0x21;
shift = 0;
mask = (1 << shift);
break;
case QSFP_P25_LPMODE:
offset = 0x22;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P26_LPMODE:
offset = 0x22;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P27_LPMODE:
offset = 0x22;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P28_LPMODE:
offset = 0x22;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P29_LPMODE:
offset = 0x22;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P30_LPMODE:
offset = 0x22;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P31_LPMODE:
offset = 0x22;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P32_LPMODE:
offset = 0x22;
shift = 0;
mask = (1 << shift);
break;
case SFP_P0_TXDIS:
offset = 0x72;
shift = 7;
break;
case SFP_P1_TXDIS:
offset = 0x72;
shift = 3;
mask = (1 << shift);
break;
}
value = i2c_smbus_read_byte_data(pdata[swpld3].client, offset);
data = (value & ~mask) | (data << shift);
i2c_smbus_write_byte_data(pdata[swpld3].client, offset, data);
return count;
}