static int yas_acc_set_delay(struct yas_acc_driver *driver, int delay) { struct yas_acc_private_data *data = yas_acc_get_data(); if (driver->get_enable()) { cancel_delayed_work_sync(&data->work); driver->set_delay(actual_delay(delay)); schedule_delayed_work(&data->work, delay_to_jiffies(delay) + 1); } else { driver->set_delay(actual_delay(delay)); } return 0; }
static void bma023_set_delay(struct device *dev, int delay) { struct bma023_data *bma023 = dev_get_drvdata(dev); int i; u8 odr; /* determine optimum ODR */ for (i = 1; (i < ARRAY_SIZE(bma023_odr_table)) && (actual_delay(delay) >= bma023_odr_table[i].delay); i++) ; odr = bma023_odr_table[i-1].odr; atomic_set(&bma023->delay, delay); mutex_lock(&bma023->enable_mutex); if (bma023_get_enable(dev)) { cancel_delayed_work_sync(&bma023->work); bma023_update_bits(bma023, BMA023_BANDWIDTH, odr); schedule_delayed_work(&bma023->work, delay_to_jiffies(delay) + 1); } else { bma023_power_up(bma023); bma023_update_bits(bma023, BMA023_BANDWIDTH, odr); bma023_power_down(bma023); } mutex_unlock(&bma023->enable_mutex); }
static void adxl345_set_delay(struct device *dev, int delay) { struct i2c_client *client = to_i2c_client(dev); struct adxl345_data *adxl345 = i2c_get_clientdata(client); u8 odr; int i; /* determine optimum ODR */ for (i = 1; (i < ARRAY_SIZE(adxl345_odr_table)) && (actual_delay(delay) >= adxl345_odr_table[i].delay); i++) ; odr = adxl345_odr_table[i-1].odr; atomic_set(&adxl345->delay, delay); mutex_lock(&adxl345->enable_mutex); if (adxl345_get_enable(dev)) { cancel_delayed_work_sync(&adxl345->work); adxl345_update_bits(adxl345, ADXL345_BANDWIDTH, odr); schedule_delayed_work(&adxl345->work, delay_to_jiffies(delay) + 1); } else { adxl345_power_up(adxl345); adxl345_update_bits(adxl345, ADXL345_BANDWIDTH, odr); adxl345_power_down(adxl345); } mutex_unlock(&adxl345->enable_mutex); }
static int yas_acc_set_delay(struct yas_acc_driver *driver, int delay) { #ifdef PANTECH_AVOID_DEADLOCK driver->set_delay(actual_delay(delay)); #else struct yas_acc_private_data *data = yas_acc_get_data(); if (driver->get_enable()) { cancel_delayed_work_sync(&data->work); driver->set_delay(actual_delay(delay)); schedule_delayed_work(&data->work, delay_to_jiffies(delay) + 1); } else { driver->set_delay(actual_delay(delay)); } #endif return 0; }