static ssize_t swpld1_data_store()

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;
}