in platform/broadcom/sonic-platform-modules-delta/agc032/modules/delta_agc032_swpld.c [636:878]
static ssize_t swpld1_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_swpld1->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 USB_HUB_RST:
offset = 0x6;
shift = 6;
mask = (1 << shift);
break;
case SYNCE_RST:
offset = 0x6;
shift = 5;
mask = (1 << shift);
break;
case BMC_RST:
offset = 0x6;
shift = 4;
mask = (1 << shift);
break;
case LPC_RST:
offset = 0x6;
shift = 3;
mask = (1 << shift);
break;
case OOB_PCIE_RST:
offset = 0x6;
shift = 2;
mask = (1 << shift);
break;
case MAC_PCIE_RST:
offset = 0x6;
shift = 1;
mask = (1 << shift);
break;
case MAC_RST:
offset = 0x6;
shift = 0;
mask = (1 << shift);
break;
case VR_3V3_RST:
offset = 0x7;
shift = 3;
mask = (1 << shift);
break;
case VR_0V8_RST:
offset = 0x7;
shift = 2;
mask = (1 << shift);
break;
case FAN_MUX_RST:
offset = 0x8;
shift = 6;
mask = (1 << shift);
break;
case QSFP5_MUX_RST:
offset = 0x8;
shift = 5;
mask = (1 << shift);
break;
case QSFP4_MUX_RST:
offset = 0x8;
shift = 4;
mask = (1 << shift);
break;
case QSFP3_MUX_RST:
offset = 0x8;
shift = 3;
mask = (1 << shift);
break;
case QSFP2_MUX_RST:
offset = 0x8;
shift = 2;
mask = (1 << shift);
break;
case QSFP1_MUX_RST:
offset = 0x8;
shift = 1;
mask = (1 << shift);
break;
case PSU1_EN:
offset = 0x12;
shift = 7;
mask = (1 << shift);
break;
case PSU1_EEPROM_WP:
offset = 0x12;
shift = 6;
mask = (1 << shift);
break;
case PSU2_EN:
offset = 0x12;
shift = 3;
mask = (1 << shift);
break;
case PSU2_EEPROM_WP:
offset = 0x12;
shift = 2;
mask = (1 << shift);
break;
case VCC_5V_EN:
offset = 0x23;
shift = 7;
mask = (1 << shift);
break;
case VCC_3V3_EN:
offset = 0x23;
shift = 6;
mask = (1 << shift);
break;
case VCC_VCORE_EN:
offset = 0x23;
shift = 5;
mask = (1 << shift);
break;
case VCC_MAC_1V8_EN:
offset = 0x23;
shift = 4;
mask = (1 << shift);
break;
case VCC_MAC_1V2_EN:
offset = 0x23;
shift = 3;
mask = (1 << shift);
break;
case VCC_MAC_0V8_EN:
offset = 0x23;
shift = 2;
mask = (1 << shift);
break;
case VCC_PLL_0V8_EN:
offset = 0x23;
shift = 1;
mask = (1 << shift);
break;
case VCC_SYS_EN:
offset = 0x23;
shift = 0;
mask = (1 << shift);
break;
case OOB_OP_EN:
offset = 0x24;
shift = 6;
mask = (1 << shift);
break;
case USB1_OP_EN:
offset = 0x24;
shift = 1;
mask = (1 << shift);
break;
case PSU1_LED:
offset = 0x41;
shift = 2;
mask = 0x0C;
break;
case PSU2_LED:
offset = 0x41;
shift = 0;
mask = 0x03;
break;
case SYS_LED:
offset = 0x42;
shift = 2;
mask = 0x0C;
break;
case FAN_LED:
offset = 0x42;
shift = 0;
mask = 0x03;
break;
case FAN1_LED:
offset = 0x46;
shift = 6;
mask = 0xc0;
break;
case FAN2_LED:
offset = 0x46;
shift = 4;
mask = 0x30;
break;
case FAN3_LED:
offset = 0x46;
shift = 2;
mask = 0x0c;
break;
case FAN4_LED:
offset = 0x46;
shift = 0;
mask = 0x03;
break;
case FAN5_LED:
offset = 0x47;
shift = 6;
mask = 0xc0;
break;
case FAN6_LED:
offset = 0x47;
shift = 4;
mask = 0x30;
break;
case SYNCE_EEPROM_WB:
offset = 0x51;
shift = 5;
mask = (1 << shift);
break;
case CONSOLE_SEL:
offset = 0x51;
shift = 5;
mask = (1 << shift);
break;
case SYS_EEPROM_WB:
offset = 0x51;
shift = 5;
mask = (1 << shift);
break;
}
value = i2c_smbus_read_byte_data(pdata[swpld1].client, offset);
data = (value & ~mask) | (data << shift);
i2c_smbus_write_byte_data(pdata[swpld1].client, offset, data);
return count;
}