static struct as7716_24xc_psu_data *as7716_24xc_psu_update_device(struct device *dev)
{
    struct i2c_client *client = to_i2c_client(dev);
    struct as7716_24xc_psu_data *data = i2c_get_clientdata(client);
    
    mutex_lock(&data->update_lock);

    if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
        || !data->valid) {
        int status;

        data->valid = 0;
        dev_dbg(&client->dev, "Starting as7716_24xc update\n");

        /* Read psu status */
        status = accton_i2c_cpld_read(PSU_STATUS_I2C_ADDR, PSU_STATUS_I2C_REG_OFFSET);
        
        if (status < 0) {
            dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status);
            goto exit;
        }
        else {
            data->status = status;
        }

        data->last_updated = jiffies;
        data->valid = 1;
    }

exit:
    mutex_unlock(&data->update_lock);

    return data;
}
static struct as7716_24sc_expansion_card_data *update_device(struct device *dev, int update_all)
{
    struct i2c_client *client = to_i2c_client(dev);
    struct as7716_24sc_expansion_card_data *data = i2c_get_clientdata(client);
    
    mutex_lock(&data->update_lock);

    if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
        || !data->valid) {
        int status, i;
		u8  regs[] = {0x00, 0x02}; /* 0x00: type, 0x02: slot */

        data->valid = 0;
        dev_dbg(&client->dev, "Starting as7716_24sc update\n");

        /* Read present status */
        status = accton_i2c_cpld_read(CPLD_I2C_ADDR, EXPANSION_CARD_PRESENT_REG);
        
        if (status < 0) {
            dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status);
            goto exit;
        }
        else {
            data->status[CARD_PRESENT] = status;
        }

		/* Update card type and slot if card is present */
		if (!(data->status[CARD_PRESENT] & BIT(data->driver_slot))) {
		    for (i = 0; i < ARRAY_SIZE(regs); i++) {
		        status = i2c_smbus_read_byte_data(client, regs[i]);

		        if (status < 0) {
		            goto exit;
		        }
		
		        data->status[i] = status;
		    }	
		}

        data->last_updated = jiffies;
        data->valid = 1;
    }

exit:
    mutex_unlock(&data->update_lock);

    return data;
}
Пример #3
0
static int accton_as6700_32x_fan_read_value(u8 reg)
{
    return accton_i2c_cpld_read(0x35, reg);
}
static int accton_as5512_54x_led_read_value(u8 reg)
{
    return accton_i2c_cpld_read(0x60, reg);
}