3 PS sensor driver
static int ltr559_i2c_probe(struct i2c_client*client, const struct i2c_device_id *id)
{
structltr559_priv *obj;
structhwmsen_object obj_ps, obj_als;
interr = 0;
if(!(obj= kzalloc(sizeof(*obj), GFP_KERNEL)))
{
err= -ENOMEM;
gotoexit;
}
memset(obj,0, sizeof(*obj));
ltr559_obj= obj;
obj->hw= get_cust_alsps_hw();
//ltr559_get_addr(obj->hw,&obj->addr);
INIT_WORK(&obj->eint_work,ltr559_eint_work); //初始化ps eintwork
obj->client= client;
i2c_set_clientdata(client,obj);
atomic_set(&obj->als_debounce,300);
atomic_set(&obj->als_deb_on,0);
atomic_set(&obj->als_deb_end,0);
atomic_set(&obj->ps_debounce,300);
atomic_set(&obj->ps_deb_on,0);
atomic_set(&obj->ps_deb_end,0);
atomic_set(&obj->ps_mask,0);
atomic_set(&obj->als_suspend,0);
atomic_set(&obj->ps_thd_val_high, obj->hw->ps_threshold_high);
atomic_set(&obj->ps_thd_val_low, obj->hw->ps_threshold_low);
atomic_set(&obj->ps_thd_val, obj->hw->ps_threshold);
obj->enable= 0;
obj->pending_intr= 0;
obj->als_level_num= sizeof(obj->hw->als_level)/sizeof(obj->hw->als_level[0]);
obj->als_value_num= sizeof(obj->hw->als_value)/sizeof(obj->hw->als_value[0]);
obj->als_modulus= (400*100)/(16*150);
BUG_ON(sizeof(obj->als_level)!= sizeof(obj->hw->als_level));
memcpy(obj->als_level,obj->hw->als_level, sizeof(obj->als_level));
BUG_ON(sizeof(obj->als_value)!= sizeof(obj->hw->als_value));
memcpy(obj->als_value,obj->hw->als_value, sizeof(obj->als_value));
atomic_set(&obj->i2c_retry,3);
set_bit(CMC_BIT_ALS,&obj->enable);
set_bit(CMC_BIT_PS,&obj->enable);
APS_LOG("ltr559_devinit()start...!\n");
ltr559_i2c_client= client;
if(ltr559_check_alive()< 0) //check ps sensorid ,verify i2c communication
return-1;
if(err= ltr559_devinit()) //pssensor 初始化,注册中断函数
{
gotoexit_init_failed;
}
APS_LOG("ltr559_devinit()...OK!\n");
obj_ps.self= ltr559_obj;
if(1== obj->hw->polling_mode_ps)
{
obj_ps.polling= 1;
}
else
{
obj_ps.polling= 0;
}
obj_ps.sensor_operate= ltr559_ps_operate; //ops
if(err= hwmsen_attach(ID_PROXIMITY, &obj_ps)) //ps sensor 注册到sensor系统
{
APS_ERR("attachfail = %d\n", err);
gotoexit_create_attr_failed;
}
obj_als.self= ltr559_obj;
obj_als.polling= 1;
obj_als.sensor_operate= ltr559_als_operate;
if(err= hwmsen_attach(ID_LIGHT, &obj_als))// //als sensor 注册到sensor系统
{
APS_ERR("attachfail = %d\n", err);
gotoexit_create_attr_failed;
}
#if defined(CONFIG_HAS_EARLYSUSPEND)
obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1,
obj->early_drv.suspend = ltr559_early_suspend,
obj->early_drv.resume = ltr559_late_resume,
register_early_suspend(&obj->early_drv);
#endif
APS_LOG("%s:OK\n", __func__);
return0;
exit_create_attr_failed:
exit_misc_device_register_failed:
exit_init_failed:
exit_kfree:
kfree(obj);
exit:
ltr559_i2c_client= NULL;
APS_ERR("%s:err = %d\n", __func__, err);
returnerr;
}
/*中断函数*/
void ltr559_eint_func(void)