/**************sys interface end ****************/ static int al3006_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = 0; struct al3006_info *lpi; struct al3006_platform_data *pdata; D("[AL3006] %s\n", __func__); lpi = kzalloc(sizeof(struct al3006_info), GFP_KERNEL); if (!lpi) return -ENOMEM; /*D("[AL3006] %s: client->irq = %d\n", __func__, client->irq);*/ lpi->i2c_client = client; pdata = client->dev.platform_data; if (!pdata) { pr_err("[AL3006 error]%s: Assign platform_data error!!\n", __func__); ret = -EBUSY; goto err_platform_data_null; } /*start to declare regulator and enable power*/ lpi->ls_regulator = regulator_get(NULL, "hcldo1_3v3"); if (!lpi->ls_regulator || IS_ERR(lpi->ls_regulator)) { printk(KERN_ERR "al3006 No Regulator available\n"); ret = -EFAULT; goto err_platform_data_null; } if(lpi->ls_regulator){ regulator_set_voltage(lpi->ls_regulator,3300000,3300000); regulator_enable(lpi->ls_regulator);/*enable power*/ } lpi->irq = client->irq; //lpi->mfg_mode = board_mfg_mode(); i2c_set_clientdata(client, lpi); //lpi->intr_pin = pdata->intr; pdata->init();/*init sensor gpio interrupt pin*/ lp_info = lpi; mutex_init(&als_enable_mutex); mutex_init(&als_disable_mutex); mutex_init(&als_get_adc_mutex); ret = lightsensor_setup(lpi); if (ret < 0) { pr_err("[AL3006 error]%s: lightsensor_setup error!!\n", __func__); goto err_lightsensor_setup; } ret = psensor_setup(lpi); if (ret < 0) { pr_err("[AL3006 error]%s: psensor_setup error!!\n", __func__); goto err_psensor_setup; } lpi->lp_wq = create_singlethread_workqueue("al3006_wq"); if (!lpi->lp_wq) { pr_err("[AL3006 error]%s: can't create workqueue\n", __func__); ret = -ENOMEM; goto err_create_singlethread_workqueue; } wake_lock_init(&(lpi->ps_wake_lock), WAKE_LOCK_SUSPEND, "proximity"); #if 0 psensor_set_kvalue(lpi); #ifdef POLLING_PROXIMITY lpi->original_ps_thd_set = lpi->ps_thd_set; #endif #endif ret = al3006_setup(lpi); if (ret < 0) { pr_err("[AL3006 error]%s: al3006_setup error!\n", __func__); goto err_al3006_setup; } lpi->al3006_class = class_create(THIS_MODULE, "optical_sensors"); if (IS_ERR(lpi->al3006_class)) { ret = PTR_ERR(lpi->al3006_class); lpi->al3006_class = NULL; goto err_create_class; } lpi->ls_dev = device_create(lpi->al3006_class, NULL, 0, "%s", "lightsensor"); if (unlikely(IS_ERR(lpi->ls_dev))) { ret = PTR_ERR(lpi->ls_dev); lpi->ls_dev = NULL; goto err_create_ls_device; } /* register the attributes */ ret = device_create_file(lpi->ls_dev, &dev_attr_als_enable); if (ret) goto err_create_ls_device_file; lpi->ps_dev = device_create(lpi->al3006_class, NULL, 0, "%s", "proximity"); if (unlikely(IS_ERR(lpi->ps_dev))) { ret = PTR_ERR(lpi->ps_dev); lpi->ps_dev = NULL; goto err_create_ps_device; } /* register the attributes */ ret = device_create_file(lpi->ps_dev, &dev_attr_ps_enable); if (ret) goto err_create_ps_device_file1; /* register the attributes */ ret = device_create_file(lpi->ps_dev, &dev_attr_dump_register); if (ret) goto err_create_ps_device_file2; #if 0 /* register the attributes */ ret = device_create_file(lpi->ps_dev, &dev_attr_ps_led); if (ret) goto err_create_ps_device; #endif lpi->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; lpi->early_suspend.suspend = al3006_early_suspend; lpi->early_suspend.resume = al3006_late_resume; register_early_suspend(&lpi->early_suspend); lpi->als_enable = 0; lpi->ps_enable = 0; lpi->ps_irq_flag = 0; D("[AL3006] %s: Probe success!\n", __func__); printk("[AL3006] Probe and setup success!\n"); return ret; err_create_ps_device_file2: device_remove_file(lpi->ps_dev, &dev_attr_ps_enable); err_create_ps_device_file1: device_unregister(lpi->ps_dev); err_create_ps_device: device_remove_file(lpi->ls_dev, &dev_attr_als_enable); err_create_ls_device_file: device_unregister(lpi->ls_dev); err_create_ls_device: class_destroy(lpi->al3006_class); err_create_class: err_al3006_setup: wake_lock_destroy(&(lpi->ps_wake_lock)); destroy_workqueue(lpi->lp_wq); err_create_singlethread_workqueue: free_irq(lpi->irq, lpi); input_unregister_device(lpi->ps_input_dev); input_free_device(lpi->ps_input_dev); misc_deregister(&psensor_misc); err_psensor_setup: regulator_disable(lpi->ls_regulator);/*disable power*/ input_unregister_device(lpi->ls_input_dev); input_free_device(lpi->ls_input_dev); misc_deregister(&lightsensor_misc); err_lightsensor_setup: mutex_destroy(&als_enable_mutex); mutex_destroy(&als_disable_mutex); mutex_destroy(&als_get_adc_mutex); pdata->exit(NULL); /* free gpio request */ err_platform_data_null: kfree(lpi); return ret; }
static int ltr558_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = 0; struct ltr558_info *lpi; struct ltr558_platform_data *pdata; D("[ltr558] %s\n", __func__); lpi = kzalloc(sizeof(struct ltr558_info), GFP_KERNEL); if (!lpi) return -ENOMEM; /*D("[ltr558] %s: client->irq = %d\n", __func__, client->irq);*/ lpi->i2c_client = client; pdata = client->dev.platform_data; if (!pdata) { pr_err("[ltr558 error]%s: Assign platform_data error!!\n",__func__); ret = -EBUSY; goto err_platform_data_null; } /*start to declare regulator and enable power*/ lpi->ls_regulator = regulator_get(NULL, "hcldo1_3v3"); if (!lpi->ls_regulator || IS_ERR(lpi->ls_regulator)) { printk(KERN_ERR "ltr558 No Regulator available\n"); ret = -EFAULT; goto err_platform_data_null; } if(lpi->ls_regulator){ regulator_set_voltage(lpi->ls_regulator,3300000,3300000); regulator_enable(lpi->ls_regulator);/*enable power*/ } //[email protected] 2011.12.21 begin //check device ID uint8_t device_id = 0; ret = ltr558_i2c_read(LTR558_MANUFACTURER_ID,&device_id); if((device_id == 0x05)||(!ret)) { printk("=====ltr558 device found!!====\n"); } else { printk("ltr558 device no found error!! id = %x\n",device_id); goto err_platform_data_null; } //[email protected] 2011.12.21 end lpi->irq = client->irq; i2c_set_clientdata(client, lpi); //ltr558_devinit(); // if (ret) { // printk("ltr558 device init failed.\n"); //} pdata->init();/*init sensor gpio interrupt pin*/ lp_info = lpi; mutex_init(&als_enable_mutex); mutex_init(&als_disable_mutex); mutex_init(&als_get_adc_mutex); ret = lightsensor_setup(lpi); if (ret < 0) { pr_err("[ltr558 error]%s: lightsensor_setup error!!\n",__func__); goto err_lightsensor_setup; } ret = psensor_setup(lpi); if (ret < 0) { pr_err("[ltr558 error]%s: psensor_setup error!!\n",__func__); goto err_psensor_setup; } lpi->lp_wq = create_singlethread_workqueue("ltr558_wq"); if (!lpi->lp_wq) { pr_err("[ltr558 error]%s: can't create workqueue\n", __func__); ret = -ENOMEM; goto err_create_singlethread_workqueue; } wake_lock_init(&(lpi->ps_wake_lock), WAKE_LOCK_SUSPEND, "proximity"); ret = ltr558_setup(lpi); if (ret < 0) { pr_err("[ltr558 error]%s: ltr558_setup error!\n", __func__); goto err_ltr558_setup; } lpi->ltr558_class = class_create(THIS_MODULE, "optical_sensors"); if (IS_ERR(lpi->ltr558_class)) { ret = PTR_ERR(lpi->ltr558_class); lpi->ltr558_class = NULL; goto err_create_class; } lpi->ls_dev = device_create(lpi->ltr558_class, NULL, 0, "%s", "lightsensor"); if (unlikely(IS_ERR(lpi->ls_dev))) { ret = PTR_ERR(lpi->ls_dev); lpi->ls_dev = NULL; goto err_create_ls_device; } /* register the attributes */ ret = device_create_file(lpi->ls_dev, &dev_attr_als_enable); if (ret) goto err_create_ls_device_file; lpi->ps_dev = device_create(lpi->ltr558_class, NULL, 0, "%s", "proximity"); if (unlikely(IS_ERR(lpi->ps_dev))) { ret = PTR_ERR(lpi->ps_dev); lpi->ps_dev = NULL; goto err_create_ps_device; } /* register the attributes */ ret = device_create_file(lpi->ps_dev, &dev_attr_ps_enable); if (ret) goto err_create_ps_device_file1; /* register the attributes */ lpi->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; lpi->early_suspend.suspend = ltr558_early_suspend; lpi->early_suspend.resume = ltr558_late_resume; register_early_suspend(&lpi->early_suspend); lpi->als_enable = 1; lpi->ps_enable = 1; lpi->ps_irq_flag = 0; ltr558_devinit(); D("[ltr558] %s: Probe success!\n", __func__); printk("[ltr558] Probe and setup success!\n"); return ret; err_create_ps_device_file1: device_unregister(lpi->ps_dev); err_create_ps_device: device_remove_file(lpi->ls_dev, &dev_attr_als_enable); err_create_ls_device_file: device_unregister(lpi->ls_dev); err_create_ls_device: class_destroy(lpi->ltr558_class); err_create_class: err_ltr558_setup: wake_lock_destroy(&(lpi->ps_wake_lock)); destroy_workqueue(lpi->lp_wq); err_create_singlethread_workqueue: free_irq(lpi->irq, lpi); input_unregister_device(lpi->ps_input_dev); input_free_device(lpi->ps_input_dev); misc_deregister(<r558_psensor_misc); err_psensor_setup: regulator_disable(lpi->ls_regulator);/*disable power*/ input_unregister_device(lpi->ls_input_dev); input_free_device(lpi->ls_input_dev); misc_deregister(&lightsensor_misc); err_lightsensor_setup: mutex_destroy(&als_enable_mutex); mutex_destroy(&als_disable_mutex); mutex_destroy(&als_get_adc_mutex); pdata->exit(NULL); /* free gpio request */ err_platform_data_null: kfree(lpi); return ret; }