Example #1
0
/* 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;
}
Example #2
0
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;
}
Example #3
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;
}