in platform/broadcom/sonic-platform-modules-delta/agc032/modules/delta_agc032_swpld.c [1438:1630]
static ssize_t swpld2_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_swpld2->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_P01_RST:
offset = 0x11;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P02_RST:
offset = 0x11;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P03_RST:
offset = 0x11;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P04_RST:
offset = 0x11;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P05_RST:
offset = 0x11;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P06_RST:
offset = 0x11;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P07_RST:
offset = 0x11;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P08_RST:
offset = 0x11;
shift = 0;
mask = (1 << shift);
break;
case QSFP_P09_RST:
offset = 0x12;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P10_RST:
offset = 0x12;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P11_RST:
offset = 0x12;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P12_RST:
offset = 0x12;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P13_RST:
offset = 0x12;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P14_RST:
offset = 0x12;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P15_RST:
offset = 0x12;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P16_RST:
offset = 0x12;
shift = 0;
mask = (1 << shift);
break;
case QSFP_P01_LPMODE:
offset = 0x21;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P02_LPMODE:
offset = 0x21;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P03_LPMODE:
offset = 0x21;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P04_LPMODE:
offset = 0x21;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P05_LPMODE:
offset = 0x21;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P06_LPMODE:
offset = 0x21;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P07_LPMODE:
offset = 0x21;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P08_LPMODE:
offset = 0x21;
shift = 0;
mask = (1 << shift);
break;
case QSFP_P09_LPMODE:
offset = 0x22;
shift = 7;
mask = (1 << shift);
break;
case QSFP_P10_LPMODE:
offset = 0x22;
shift = 6;
mask = (1 << shift);
break;
case QSFP_P11_LPMODE:
offset = 0x22;
shift = 5;
mask = (1 << shift);
break;
case QSFP_P12_LPMODE:
offset = 0x22;
shift = 4;
mask = (1 << shift);
break;
case QSFP_P13_LPMODE:
offset = 0x22;
shift = 3;
mask = (1 << shift);
break;
case QSFP_P14_LPMODE:
offset = 0x22;
shift = 2;
mask = (1 << shift);
break;
case QSFP_P15_LPMODE:
offset = 0x22;
shift = 1;
mask = (1 << shift);
break;
case QSFP_P16_LPMODE:
offset = 0x22;
shift = 0;
mask = (1 << shift);
break;
}
value = i2c_smbus_read_byte_data(pdata[swpld2].client, offset);
data = (value & ~mask) | (data << shift);
i2c_smbus_write_byte_data(pdata[swpld2].client, offset, data);
return count;
}