/* assume this is ISR */ static irqreturn_t apds990x_interrupt(int vec, void *info) { struct i2c_client *client=(struct i2c_client *)info; struct apds990x_data *data = i2c_get_clientdata(client); //APDSDBG("==> apds990x_interrupt\n"); pr_info("[APDS990x]==> apds990x_interrupt\n"); wake_lock(&apds990x_wake_lock); apds990x_reschedule_work(data, 0); return IRQ_HANDLED; }
static int apds990x_resume(struct i2c_client *client) { struct apds990x_data *data = i2c_get_clientdata(client); uint32_t dev_status_tmp = 0; APDS_DEBUG_LOG("[IN]%s\n", __func__); if(device_may_wakeup(&client->dev)) { disable_irq_wake(data->ps_irq); } else { printk("%s:failed device_may_wakeup\n",__func__); } data->als_polling_cnt_reset |= ALS_POLLING_CNT_RESET_RESUME; #if 1 if (data->enable_ps_sensor > 0){ dev_status_tmp = (atomic_read(&g_dev_status) & APDS990X_DEV_STATUS_SUSPEND_INT); atomic_set(&g_dev_status, APDS990X_DEV_STATUS_INIT | APDS990X_DEV_STATUS_RESUME | dev_status_tmp); apds990x_reschedule_work(data, 0); }else{ atomic_set(&g_dev_status, APDS990X_DEV_STATUS_INIT); } #else if(atomic_read(&g_dev_status) & APDS990X_DEV_STATUS_SUSPEND_INT) { apds990x_reschedule_work(data, 0); } #endif /* dev_status_tmp = (atomic_read(&g_dev_status) & APDS990X_DEV_STATUS_SUSPEND_INT); */ /* atomic_set(&g_dev_status, APDS990X_DEV_STATUS_INIT | APDS990X_DEV_STATUS_RESUME | dev_status_tmp ); */ APDS_DEBUG_LOG("[OUT]%s\n", __func__); return 0; }
static irqreturn_t apds990x_interrupt(int vec, void *info) { struct i2c_client *client=(struct i2c_client *)info; struct apds990x_data *data = i2c_get_clientdata(client); uint32_t dev_status = 0; APDS_DEBUG_LOG("==> apds990x_interrupt\n"); disable_irq_nosync(data->ps_irq); dev_status = atomic_read(&g_dev_status); if( dev_status & APDS990X_DEV_STATUS_SUSPEND ) { atomic_set(&g_dev_status, dev_status|APDS990X_DEV_STATUS_SUSPEND_INT); wake_lock_timeout( &apds_wake_lock, APDS_WAKE_LOCK_TIME ); } else { apds990x_reschedule_work(data, 0); } return IRQ_HANDLED; }