//[*]--------------------------------------------------------------------------------------------------[*] static int bh1780_suspend(struct i2c_client *client, pm_message_t mesg) { struct bh1780_data *bh1780 = i2c_get_clientdata(client); if(bh1780->enabled) cancel_delayed_work_sync(&bh1780->work); bh1780_power_down(bh1780); return 0; }
static int bh1780_suspend(struct i2c_client *client, pm_message_t mesg) { struct bh1780_data *bh1780 = i2c_get_clientdata(client); mutex_lock(&bh1780->enable_mutex); if (bh1780_get_enable(&client->dev)) { cancel_delayed_work_sync(&bh1780->work); bh1780_power_down(bh1780); } mutex_unlock(&bh1780->enable_mutex); return 0; }
static void bh1780_set_enable(struct device *dev, int enable) { struct i2c_client *client = to_i2c_client(dev); struct bh1780_data *bh1780 = i2c_get_clientdata(client); int delay = atomic_read(&bh1780->delay); mutex_lock(&bh1780->enable_mutex); if (enable) { /* enable if state will be changed */ if (!atomic_cmpxchg(&bh1780->enable, 0, 1)) { bh1780_power_up(bh1780); schedule_delayed_work(&bh1780->work, delay_to_jiffies(delay) + 1); } } else { /* disable if state will be changed */ if (atomic_cmpxchg(&bh1780->enable, 1, 0)) { cancel_delayed_work_sync(&bh1780->work); bh1780_power_down(bh1780); } } atomic_set(&bh1780->enable, enable); mutex_unlock(&bh1780->enable_mutex); }