static int gp2a_opt_probe(struct platform_device *pdev) { struct gp2a_data *gp2a; struct gp2a_platform_data *pdata = pdev->dev.platform_data; u8 value = 0; int err = 0; gprintk("probe start!\n"); if (!pdata) { pr_err("%s: missing pdata!\n", __func__); return err; } if (!pdata->gp2a_led_on) { pr_err("%s: incomplete pdata!\n", __func__); return err; } /* gp2a power on */ pdata->gp2a_led_on(true); if (pdata->gp2a_get_threshold) { gp2a_update_threshold(is_gp2a030a() ? gp2a_original_image_030a : gp2a_original_image, pdata->gp2a_get_threshold(), false); } /* allocate driver_data */ gp2a = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); if (!gp2a) { pr_err("kzalloc error\n"); return -ENOMEM; } proximity_enable = 0; proximity_sensor_detection = 0; proximity_avg_on = 0; gp2a->enabled = 0; gp2a->pdata = pdata; /* prox_timer settings. we poll for prox_avg values using a timer. */ hrtimer_init(&gp2a->prox_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); gp2a->prox_poll_delay = ns_to_ktime(2000 * NSEC_PER_MSEC); gp2a->prox_timer.function = gp2a_prox_timer_func; gp2a->prox_wq = create_singlethread_workqueue("gp2a_prox_wq"); if (!gp2a->prox_wq) { err = -ENOMEM; pr_err("%s: could not create prox workqueue\n", __func__); goto err_create_prox_workqueue; } INIT_WORK(&gp2a->work_prox, gp2a_work_func_prox_avg); INIT_WORK(&gp2a->work, gp2a_work_func_prox); err = proximity_input_init(gp2a); if (err < 0) goto error_setup_reg; err = sysfs_create_group(&gp2a->input_dev->dev.kobj, &proximity_attribute_group); if (err < 0) goto err_sysfs_create_group_proximity; /* set platdata */ platform_set_drvdata(pdev, gp2a); /* wake lock init */ wake_lock_init(&gp2a->prx_wake_lock, WAKE_LOCK_SUSPEND, "prx_wake_lock"); /* init i2c */ opt_i2c_init(); if (opt_i2c_client == NULL) { pr_err("opt_probe failed : i2c_client is NULL\n"); goto err_no_device; } else printk(KERN_INFO "opt_i2c_client : (0x%p), address = %x\n", opt_i2c_client, opt_i2c_client->addr); /* GP2A Regs INIT SETTINGS and Check I2C communication */ value = 0x00; /* shutdown mode op[3]=0 */ err = opt_i2c_write((u8) (COMMAND1), &value); if (err < 0) { pr_err("%s failed : threre is no such device.\n", __func__); goto err_no_device; } /* Setup irq */ err = gp2a_setup_irq(gp2a); if (err) { pr_err("%s: could not setup irq\n", __func__); goto err_setup_irq; } /* set sysfs for proximity sensor */ gp2a->proximity_dev = sensors_classdev_register("proximity_sensor"); if (IS_ERR(gp2a->proximity_dev)) { pr_err("%s: could not create proximity_dev\n", __func__); goto err_proximity_device_create; } if (device_create_file(gp2a->proximity_dev, &dev_attr_state) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_state.attr.name); goto err_proximity_device_create_file1; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_avg) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_avg.attr.name); goto err_proximity_device_create_file2; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_thresh) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_thresh.attr.name); goto err_proximity_device_create_file3; } if (device_create_file(gp2a->proximity_dev, &dev_attr_vendor) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_vendor.attr.name); goto err_proximity_device_create_file4; } if (device_create_file(gp2a->proximity_dev, &dev_attr_name) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_name.attr.name); goto err_proximity_device_create_file5; } if (device_create_file(gp2a->proximity_dev, &dev_attr_raw_data) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_raw_data.attr.name); goto err_proximity_device_create_file6; } #ifdef CONFIG_SLP device_init_wakeup(gp2a->proximity_dev, true); #endif dev_set_drvdata(gp2a->proximity_dev, gp2a); device_init_wakeup(&pdev->dev, 1); gprintk("probe success!\n"); return 0; err_proximity_device_create_file6: device_remove_file(gp2a->proximity_dev, &dev_attr_raw_data); err_proximity_device_create_file5: device_remove_file(gp2a->proximity_dev, &dev_attr_name); err_proximity_device_create_file4: device_remove_file(gp2a->proximity_dev, &dev_attr_vendor); err_proximity_device_create_file3: device_remove_file(gp2a->proximity_dev, &dev_attr_prox_avg); err_proximity_device_create_file2: device_remove_file(gp2a->proximity_dev, &dev_attr_state); err_proximity_device_create_file1: sensors_classdev_unregister(gp2a->proximity_dev); err_proximity_device_create: gpio_free(pdata->p_out); err_setup_irq: err_no_device: sysfs_remove_group(&gp2a->input_dev->dev.kobj, &proximity_attribute_group); wake_lock_destroy(&gp2a->prx_wake_lock); err_sysfs_create_group_proximity: input_unregister_device(gp2a->input_dev); error_setup_reg: destroy_workqueue(gp2a->prox_wq); err_create_prox_workqueue: kfree(gp2a); return err; }
static int gp2a_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct gp2a_data *gp2a; struct gp2ap020_pdata *pdata = client->dev.platform_data; u8 value = 0; int err = 0; pr_info("%s : probe start!\n", __func__); if (!pdata) { pr_err("%s: missing pdata!\n", __func__); err = -EINVAL; goto done; } /* if (!pdata->power_on) { pr_err("%s: incomplete pdata!\n", __func__); err = -EINVAL; goto done; } */ /* allocate driver_data */ gp2a = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); if (!gp2a) { pr_err("kzalloc error\n"); err = -ENOMEM; goto done; } gp2a->pdata = pdata; gp2a->client = client; gp2a->proximity_enabled = 0; gp2a->light_enabled = 0; gp2a->light_delay = SENSOR_DEFAULT_DELAY; i2c_set_clientdata(client, gp2a); if (pdata->power_on) pdata->power_on(true); if (pdata->version) { /* GP2AP030 */ gp2a_reg[1][1] = 0x1A; if (pdata->thresh[0]) gp2a_reg[3][1] = pdata->thresh[0]; else gp2a_reg[3][1] = 0x08; if (pdata->thresh[1]) gp2a_reg[5][1] = pdata->thresh[1]; else gp2a_reg[5][1] = 0x0A; } INIT_DELAYED_WORK(&gp2a->light_work, gp2a_work_func_light); INIT_WORK(&gp2a->proximity_work, gp2a_work_func_prox); err = proximity_input_init(gp2a); if (err < 0) goto error_setup_reg_prox; err = light_input_init(gp2a); if (err < 0) goto error_setup_reg_light; err = sysfs_create_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); if (err < 0) goto err_sysfs_create_group_proximity; err = sysfs_create_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); if (err) goto err_sysfs_create_group_light; mutex_init(&gp2a->light_mutex); mutex_init(&gp2a->data_mutex); /* wake lock init */ wake_lock_init(&gp2a->prx_wake_lock, WAKE_LOCK_SUSPEND, "prx_wake_lock"); /* GP2A Regs INIT SETTINGS and Check I2C communication */ /* shutdown mode op[3]=0 */ value = 0x00; err = gp2a_i2c_write(gp2a, (u8) (COMMAND1), &value); if (err < 0) { pr_err("%s failed : threre is no such device.\n", __func__); goto err_no_device; } /* Setup irq */ err = gp2a_setup_irq(gp2a); if (err) { pr_err("%s: could not setup irq\n", __func__); goto err_setup_irq; } err = sensors_register(gp2a->light_sensor_device, gp2a, additional_light_attrs, "light_sensor"); if (err) { pr_err("%s: cound not register sensor device\n", __func__); goto err_sysfs_create_factory_light; } err = sensors_register(gp2a->proximity_sensor_device, gp2a, additional_proximity_attrs, "proximity_sensor"); if (err) { pr_err("%s: cound not register sensor device\n", __func__); goto err_sysfs_create_factory_proximity; } #ifdef CONFIG_SENSOR_USE_SYMLINK err = sensors_initialize_symlink(gp2a->proximity_input_dev); if (err) { pr_err("%s: cound not make proximity sensor symlink(%d).\n", __func__, err); goto err_sensors_initialize_symlink_proximity; } err = sensors_initialize_symlink(gp2a->light_input_dev); if (err) { pr_err("%s: cound not make light sensor symlink(%d).\n", __func__, err); goto err_sensors_initialize_symlink_light; } #endif input_report_abs(gp2a->proximity_input_dev, ABS_DISTANCE, 1); pr_info("%s : probe success!\n", __func__); return 0; #ifdef CONFIG_SENSOR_USE_SYMLINK err_sensors_initialize_symlink_light: sensors_delete_symlink(gp2a->proximity_input_dev); err_sensors_initialize_symlink_proximity: #endif err_sysfs_create_factory_proximity: err_sysfs_create_factory_light: free_irq(gp2a->irq, gp2a); gpio_free(gp2a->pdata->p_out); err_setup_irq: err_no_device: wake_lock_destroy(&gp2a->prx_wake_lock); mutex_destroy(&gp2a->light_mutex); mutex_destroy(&gp2a->data_mutex); sysfs_remove_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); err_sysfs_create_group_light: sysfs_remove_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); err_sysfs_create_group_proximity: input_unregister_device(gp2a->light_input_dev); error_setup_reg_light: input_unregister_device(gp2a->proximity_input_dev); error_setup_reg_prox: if (pdata->power_on) pdata->power_on(false); kfree(gp2a); done: return err; }
static int gp2a_opt_probe( struct platform_device* pdev ) { struct gp2a_data *gp2a; u8 value; int err = 0; /* allocate driver_data */ gp2a = (struct gp2a_data*) kzalloc(sizeof(struct gp2a_data),GFP_KERNEL); if(!gp2a) { pr_err("kzalloc error\n"); return -ENOMEM; } gp2a->enabled = 0; gp2a->delay = SENSOR_DEFAULT_DELAY; prox_data = gp2a; mutex_init(&gp2a->enable_mutex); mutex_init(&gp2a->data_mutex); INIT_WORK(&gp2a->work, gp2a_work_func_prox); err = proximity_input_init(gp2a); if(err < 0) { goto error_1; } err = sysfs_create_group(&gp2a->input_dev->dev.kobj, &proximity_attribute_group); if(err < 0) { goto error_2; } /* set platdata */ platform_set_drvdata(pdev, gp2a); gp2a->uevent_kobj = &pdev->dev.kobj; /* wake lock init */ wake_lock_init(&prx_wake_lock, WAKE_LOCK_SUSPEND, "prx_wake_lock"); /* init i2c */ opt_i2c_init(); if(opt_i2c_client == NULL) { pr_err("opt_probe failed : i2c_client is NULL\n"); return -ENODEV; } else printk("opt_i2c_client : (0x%p)\n",opt_i2c_client); /* GP2A Regs INIT SETTINGS */ #ifdef PROX_MODE_A value = 0x00; #else value = 0x02; #endif //PROX_MODE_A opt_i2c_write((u8)(REGS_OPMOD),&value); printk("gp2a_opt_probe is OK!!\n"); /* INT Settings */ err = request_threaded_irq( IRQ_GP2A_INT , NULL, gp2a_irq_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING , "proximity_int", gp2a); if (err < 0) { printk(KERN_ERR "failed to request proximity_irq\n"); goto error_2; } disable_irq(IRQ_GP2A_INT); return 0; error_2: input_unregister_device(gp2a->input_dev); input_free_device(gp2a->input_dev); error_1: kfree((void*)gp2a); return err; }
static int gp2a_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct gp2a_data *gp2a; struct gp2ap030_pdata *pdata = client->dev.platform_data; u8 value = 0; int err = 0; printk(KERN_INFO "[GP2A] %s : probe start!\n", __func__); if (!pdata) { pr_err("%s: missing pdata!\n", __func__); err = -EINVAL; goto done; } /*PROXY_EN*/ if (gpio_request(pdata ->power_gpio, "PROXY_EN")) { printk(KERN_ERR "Request GPIO_%d failed!\n", pdata ->power_gpio); } if (pdata->led_on) pdata->led_on(1); /* allocate driver_data */ gp2a = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); if (!gp2a) { pr_err("kzalloc error\n"); err = -ENOMEM; goto done; } gp2a->pdata = pdata; gp2a->client = client; gp2a->proximity_enabled = 0; gp2a->light_enabled = 0; gp2a->light_delay = SENSOR_DEFAULT_DELAY; i2c_set_clientdata(client, gp2a); opt_i2c_client = client; if (pdata->version) { /* GP2AP030 */ gp2a_reg[1][1] = 0x1A; #if defined(CONFIG_MACH_CAPRI_SS_BAFFIN_CMCC) || defined(CONFIG_MACH_CAPRI_SS_BAFFIN_CHU) if (pdata->thresh[0]) gp2a_reg[3][1] = pdata->thresh[0]; else gp2a_reg[3][1] = 0x0B; if (pdata->thresh[1]) gp2a_reg[5][1] = pdata->thresh[1]; else gp2a_reg[5][1] = 0x0D; #else if (pdata->thresh[0]) gp2a_reg[3][1] = pdata->thresh[0]; else gp2a_reg[3][1] = 0x09; if (pdata->thresh[1]) gp2a_reg[5][1] = pdata->thresh[1]; else gp2a_reg[5][1] = 0x0C; #endif } INIT_DELAYED_WORK(&gp2a->light_work, gp2a_work_func_light); INIT_WORK(&gp2a->proximity_work, gp2a_work_func_prox); /*misc device registration*/ err = misc_register(&gp2a_opt_misc_device); if( err < 0 ) goto error_setup_reg_misc; err = proximity_input_init(gp2a); if (err < 0) goto error_setup_reg_prox; err = light_input_init(gp2a); if (err < 0) goto error_setup_reg_light; err = sysfs_create_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); if (err < 0) goto err_sysfs_create_group_proximity; err = sysfs_create_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); if (err) goto err_sysfs_create_group_light; mutex_init(&gp2a->light_mutex); mutex_init(&gp2a->data_mutex); /* wake lock init */ wake_lock_init(&gp2a->prx_wake_lock, WAKE_LOCK_SUSPEND, "prx_wake_lock"); /* GP2A Regs INIT SETTINGS and Check I2C communication */ /* shutdown mode op[3]=0 */ value = 0x00; err = gp2a_i2c_write((u8) (COMMAND1), &value); if (err < 0) { pr_err("%s failed : threre is no such device.\n", __func__); goto err_no_device; } /* Setup irq */ err = gp2a_setup_irq(gp2a); if (err) { pr_err("%s: could not setup irq\n", __func__); goto err_setup_irq; } err = sensors_register(gp2a->light_sensor_device, gp2a, additional_light_attrs, "light_sensor"); if (err) { pr_err("%s: cound not register sensor device\n", __func__); goto err_sysfs_create_factory_light; } err = sensors_register(gp2a->proximity_sensor_device, gp2a, additional_proximity_attrs, "proximity_sensor"); if (err) { pr_err("%s: cound not register sensor device\n", __func__); goto err_sysfs_create_factory_proximity; } gp2a_opt_data = gp2a; if (pdata->led_on) { pdata->led_on(0); printk(KERN_INFO "[GP2A] gpio_get_value of GPIO(%d) is %d\n",pdata ->power_gpio, gpio_get_value(pdata ->power_gpio)); } /* set initial proximity value as 1 */ input_report_abs(gp2a->proximity_input_dev, ABS_DISTANCE, 1); input_sync(gp2a->proximity_input_dev); printk(KERN_INFO "[GP2A] %s: probe success!\n", __func__); return 0; err_sysfs_create_factory_proximity: err_sysfs_create_factory_light: free_irq(gp2a->irq, gp2a); gpio_free(gp2a->pdata->p_out); err_setup_irq: err_no_device: wake_lock_destroy(&gp2a->prx_wake_lock); mutex_destroy(&gp2a->light_mutex); mutex_destroy(&gp2a->data_mutex); sysfs_remove_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); err_sysfs_create_group_light: sysfs_remove_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); err_sysfs_create_group_proximity: input_unregister_device(gp2a->light_input_dev); error_setup_reg_light: input_unregister_device(gp2a->proximity_input_dev); error_setup_reg_prox: misc_deregister(&gp2a_opt_misc_device); error_setup_reg_misc: kfree(gp2a); done: return err; }
static int gp2a_opt_probe(struct platform_device *pdev) { struct gp2a_data *gp2a; struct gp2a_platform_data *pdata = pdev->dev.platform_data; u8 value = 0; int err = 0; printk(KERN_INFO"[GP2A] %s : probe start!\n", __func__); if (!pdata) { pr_err("%s: missing pdata!\n", __func__); return err; } /*PROXY_EN*/ if (gpio_request(pdata ->power_gpio, "PROXY_EN")) { printk(KERN_ERR "Request GPIO_%d failed!\n", pdata ->power_gpio); } if (pdata->gp2a_led_on) pdata->gp2a_led_on(1); if (pdata->gp2a_get_threshold) { gp2a_update_threshold(pdata->gp2a_get_threshold(), false); } /* allocate driver_data */ gp2a = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); if (!gp2a) { pr_err("kzalloc error\n"); return -ENOMEM; } gp2a->proximity_enabled = 0; gp2a->pdata = pdata; gp2a->light_enabled = 0; gp2a->light_delay = SENSOR_DEFAULT_DELAY; gp2a->testmode = 0; gp2a->light_level_state = 0; if (pdata->power_on) { pdata->power_on(1); msleep(5); } INIT_DELAYED_WORK(&gp2a->light_work, gp2a_work_func_light); INIT_WORK(&gp2a->proximity_work, gp2a_work_func_prox); /*misc device registration*/ err = misc_register(&gp2a_opt_misc_device); if( err < 0 ) goto error_setup_reg_misc; err = proximity_input_init(gp2a); if (err < 0) goto error_setup_reg_prox; err = light_input_init(gp2a); if (err < 0) goto error_setup_reg_light; err = sysfs_create_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); if (err < 0) goto err_sysfs_create_group_proximity; err = sysfs_create_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); if (err) goto err_sysfs_create_group_light; mutex_init(&gp2a->light_mutex); mutex_init(&gp2a->data_mutex); /* set platdata */ platform_set_drvdata(pdev, gp2a); /* wake lock init */ wake_lock_init(&gp2a->prx_wake_lock, WAKE_LOCK_SUSPEND, "prx_wake_lock"); /* init i2c */ err = opt_i2c_init(); if(err < 0) { pr_err("opt_probe failed : i2c_client is NULL\n"); goto err_no_device; } else printk(KERN_INFO "[GP2A] opt_i2c_client : (0x%p)\n",opt_i2c_client); /* GP2A Regs INIT SETTINGS and Check I2C communication */ value = 0x00; err = opt_i2c_write((u8) (COMMAND1), &value); /* shutdown mode op[3]=0 */ if (err < 0) { pr_err("%s failed : threre is no such device.\n", __func__); goto err_no_device; } /* Setup irq */ err = gp2a_setup_irq(gp2a); if (err) { pr_err("%s: could not setup irq\n", __func__); goto err_setup_irq; } /* set sysfs for proximity sensor */ gp2a->proximity_dev = device_create(sensors_class, NULL, 0, NULL, "proximity_sensor"); if (IS_ERR(gp2a->proximity_dev)) { pr_err("%s: could not create proximity_dev\n", __func__); goto err_proximity_device_create; } gp2a->light_dev = device_create(sensors_class, NULL, 0, NULL, "light_sensor"); if (IS_ERR(gp2a->light_dev)) { pr_err("%s: could not create light_dev\n", __func__); goto err_light_device_create; } if (device_create_file(gp2a->proximity_dev, &dev_attr_state) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_state.attr.name); goto err_proximity_device_create_file1; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_avg) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_avg.attr.name); goto err_proximity_device_create_file2; } if (device_create_file(gp2a->proximity_dev, &dev_attr_proximity_enable) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_proximity_enable.attr.name); goto err_proximity_device_create_file3; } if (device_create_file(gp2a->proximity_dev, &dev_attr_vendor) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_vendor.attr.name); goto err_proximity_device_create_file4; } if (device_create_file(gp2a->proximity_dev, &dev_attr_name) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_name.attr.name); goto err_proximity_device_create_file5; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_cal) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_cal.attr.name); goto err_proximity_device_create_file6; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_offset_pass) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_offset_pass.attr.name); goto err_proximity_device_create_file7; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_thresh) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_thresh.attr.name); goto err_proximity_device_create_file8; } if (device_create_file(gp2a->light_dev, &dev_attr_lux) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_lux.attr.name); goto err_light_device_create_file1; } if (device_create_file(gp2a->light_dev, &dev_attr_light_enable) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_light_enable.attr.name); goto err_light_device_create_file2; } if (device_create_file(gp2a->light_dev, &dev_attr_vendor) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_vendor.attr.name); goto err_light_device_create_file3; } if (device_create_file(gp2a->light_dev, &dev_attr_name) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_name.attr.name); goto err_light_device_create_file4; } if (device_create_file(gp2a->light_dev, &dev_attr_raw_data) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_raw_data.attr.name); goto err_light_device_create_file5; } dev_set_drvdata(gp2a->proximity_dev, gp2a); dev_set_drvdata(gp2a->light_dev, gp2a); device_init_wakeup(&pdev->dev, 1); if (pdata->gp2a_led_on) { pdata->gp2a_led_on(0); printk(KERN_INFO "[GP2A] gpio_get_value of GPIO(%d) is %d\n",pdata ->power_gpio, gpio_get_value(pdata ->power_gpio)); } /* set initial proximity value as 1 */ input_report_abs(gp2a->proximity_input_dev, ABS_DISTANCE, 1); input_sync(gp2a->proximity_input_dev); gp2a_opt_data = gp2a; printk(KERN_INFO"[GP2A] %s : probe success!\n", __func__); return 0; err_light_device_create_file5: device_remove_file(gp2a->light_dev, &dev_attr_name); err_light_device_create_file4: device_remove_file(gp2a->light_dev, &dev_attr_vendor); err_light_device_create_file3: device_remove_file(gp2a->light_dev, &dev_attr_light_enable); err_light_device_create_file2: device_remove_file(gp2a->light_dev, &dev_attr_lux); err_light_device_create_file1: device_remove_file(gp2a->proximity_dev, &dev_attr_prox_thresh); err_proximity_device_create_file8: device_remove_file(gp2a->proximity_dev, &dev_attr_prox_offset_pass); err_proximity_device_create_file7: device_remove_file(gp2a->proximity_dev, &dev_attr_prox_cal); err_proximity_device_create_file6: device_remove_file(gp2a->proximity_dev, &dev_attr_name); err_proximity_device_create_file5: device_remove_file(gp2a->proximity_dev, &dev_attr_vendor); err_proximity_device_create_file4: device_remove_file(gp2a->proximity_dev, &dev_attr_proximity_enable); err_proximity_device_create_file3: device_remove_file(gp2a->proximity_dev, &dev_attr_prox_avg); err_proximity_device_create_file2: device_remove_file(gp2a->proximity_dev, &dev_attr_state); err_proximity_device_create_file1: err_light_device_create: device_destroy(sensors_class, 0); err_proximity_device_create: gpio_free(pdata->p_out); err_setup_irq: err_no_device: wake_lock_destroy(&gp2a->prx_wake_lock); mutex_destroy(&gp2a->light_mutex); mutex_destroy(&gp2a->data_mutex); sysfs_remove_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); err_sysfs_create_group_light: sysfs_remove_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); err_sysfs_create_group_proximity: input_unregister_device(gp2a->light_input_dev); error_setup_reg_light: input_unregister_device(gp2a->proximity_input_dev); error_setup_reg_prox: misc_deregister(&gp2a_opt_misc_device); error_setup_reg_misc: if (pdata->power_on) pdata->power_on(0); kfree(gp2a); return err; }
static int gp2a_opt_probe(struct platform_device *pdev) { struct gp2a_data *gp2a; u8 value; int err = 0; int wakeup = 0; struct opt_gp2a_platform_data *pdata = pdev->dev.platform_data; /* allocate driver_data */ gp2a = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); if (!gp2a) { pr_err("kzalloc error\n"); return -ENOMEM; } gp2a->enabled = 0; gp2a->delay = SENSOR_DEFAULT_DELAY; if (pdata) { if (pdata->power_on) gp2a->power_on = pdata->power_on; if (pdata->gp2a_led_on) gp2a->gp2a_led_on = pdata->gp2a_led_on; if (pdata->irq) gp2a->irq = pdata->irq; if (pdata->ps_status) gp2a->ps_status = pdata->ps_status; } if (gp2a->power_on) gp2a->power_on(1); mutex_init(&gp2a->enable_mutex); mutex_init(&gp2a->data_mutex); wakeup = 1; err = proximity_input_init(gp2a); if (err < 0) goto error_setup_reg; err = sysfs_create_group(&gp2a->input_dev->dev.kobj, &proximity_attribute_group); if (err < 0) goto err_sysfs_create_group_proximity; /* set platdata */ platform_set_drvdata(pdev, gp2a); gp2a->uevent_kobj = &pdev->dev.kobj; spin_lock_init(&gp2a->prox_lock); /* init i2c */ opt_i2c_init(); if (opt_i2c_client == NULL) { pr_err("opt_probe failed : i2c_client is NULL\n"); return -ENODEV; } else printk(KERN_ERR "opt_i2c_client : (0x%p)\n", opt_i2c_client); /* GP2A Regs INIT SETTINGS */ #ifdef PROX_MODE_A value = 0x00; #else value = 0x02; #endif opt_i2c_write((u8)(REGS_OPMOD), &value); /* INT Settings */ err = request_threaded_irq(gp2a->irq, NULL, gp2a_irq_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "proximity_int", gp2a); if (err < 0) { printk(KERN_ERR "failed to request proximity_irq\n"); goto error_setup_reg; } disable_irq(gp2a->irq); /* set sysfs for proximity sensor */ err = sensors_register(proximity_sensor_device, gp2a, prox_sensor_attrs, "proximity_sensor"); if (err) { printk(KERN_ERR "%s: cound not register barometer_sensor(%d).\n", __func__, err); goto err_sysfs_create_group_proximity; } device_init_wakeup(&pdev->dev, wakeup); return 0; dev_set_drvdata(gp2a->proximity_dev, gp2a); err_sysfs_create_group_proximity: input_unregister_device(gp2a->input_dev); input_free_device(gp2a->input_dev); error_setup_reg: if (gp2a->power_on) gp2a->power_on(0); kfree(gp2a); return err; }
static int gp2a_opt_probe(struct platform_device *pdev) { struct gp2a_data *gp2a; struct gp2a_platform_data *pdata = pdev->dev.platform_data; u8 value = 0; int err = 0; pr_info("%s : probe start!\n", __func__); if (!pdata) { pr_err("%s: missing pdata!\n", __func__); return err; } if (!pdata->gp2a_led_on) { pr_err("%s: incomplete pdata!\n", __func__); return err; } /* allocate driver_data */ gp2a = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); if (!gp2a) { pr_err("kzalloc error\n"); return -ENOMEM; } gp2a->proximity_enabled = 0; gp2a->pdata = pdata; gp2a->light_enabled = 0; gp2a->light_delay = SENSOR_DEFAULT_DELAY; gp2a->testmode = 0; gp2a->light_level_state = 0; if (pdata->power_on) pdata->power_on(1); if (pdata->version) { /* GP2AP030 */ gp2a_original_image[1][1] = 0x1A; gp2a_original_image[3][1] = 0x08; gp2a_original_image[5][1] = 0x0A; } INIT_DELAYED_WORK(&gp2a->light_work, gp2a_work_func_light); INIT_WORK(&gp2a->proximity_work, gp2a_work_func_prox); err = proximity_input_init(gp2a); if (err < 0) goto error_setup_reg_prox; err = light_input_init(gp2a); if (err < 0) goto error_setup_reg_light; err = sysfs_create_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); if (err < 0) goto err_sysfs_create_group_proximity; err = sysfs_create_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); if (err) goto err_sysfs_create_group_light; mutex_init(&gp2a->light_mutex); mutex_init(&gp2a->data_mutex); /* set platdata */ platform_set_drvdata(pdev, gp2a); /* wake lock init */ wake_lock_init(&gp2a->prx_wake_lock, WAKE_LOCK_SUSPEND, "prx_wake_lock"); /* init i2c */ opt_i2c_init(); /* GP2A Regs INIT SETTINGS and Check I2C communication */ value = 0x00; err = opt_i2c_write((u8) (COMMAND1), &value, pdata->addr, pdata->adapt_num); /* shutdown mode op[3]=0 */ if (err < 0) { pr_err("%s failed : threre is no such device.\n", __func__); goto err_no_device; } /* Setup irq */ err = gp2a_setup_irq(gp2a); if (err) { pr_err("%s: could not setup irq\n", __func__); goto err_setup_irq; } /* set sysfs for proximity sensor */ gp2a->proximity_dev = device_create(sensors_class, NULL, 0, NULL, "proximity_sensor"); if (IS_ERR(gp2a->proximity_dev)) { pr_err("%s: could not create proximity_dev\n", __func__); goto err_proximity_device_create; } gp2a->light_dev = device_create(sensors_class, NULL, 0, NULL, "light_sensor"); if (IS_ERR(gp2a->light_dev)) { pr_err("%s: could not create light_dev\n", __func__); goto err_light_device_create; } if (device_create_file(gp2a->proximity_dev, &dev_attr_state) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_state.attr.name); goto err_proximity_device_create_file1; } if (device_create_file(gp2a->proximity_dev, &dev_attr_prox_avg) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_prox_avg.attr.name); goto err_proximity_device_create_file2; } if (device_create_file(gp2a->proximity_dev, &dev_attr_proximity_enable) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_proximity_enable.attr.name); goto err_proximity_device_create_file3; } if (device_create_file(gp2a->proximity_dev, &dev_attr_vendor) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_vendor.attr.name); goto err_proximity_device_create_file4; } if (device_create_file(gp2a->proximity_dev, &dev_attr_name) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_name.attr.name); goto err_proximity_device_create_file5; } if (device_create_file(gp2a->light_dev, &dev_attr_lux) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_lux.attr.name); goto err_light_device_create_file1; } if (device_create_file(gp2a->light_dev, &dev_attr_light_enable) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_light_enable.attr.name); goto err_light_device_create_file2; } if (device_create_file(gp2a->light_dev, &dev_attr_vendor) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_vendor.attr.name); goto err_light_device_create_file3; } if (device_create_file(gp2a->light_dev, &dev_attr_name) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_name.attr.name); goto err_light_device_create_file4; } if (device_create_file(gp2a->light_dev, &dev_attr_raw_data) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_name.attr.name); goto err_light_device_create_file5; } dev_set_drvdata(gp2a->proximity_dev, gp2a); dev_set_drvdata(gp2a->light_dev, gp2a); device_init_wakeup(&pdev->dev, 1); pr_info("%s : probe success!\n", __func__); return 0; err_light_device_create_file5: device_remove_file(gp2a->light_dev, &dev_attr_name); err_light_device_create_file4: device_remove_file(gp2a->light_dev, &dev_attr_vendor); err_light_device_create_file3: device_remove_file(gp2a->light_dev, &dev_attr_light_enable); err_light_device_create_file2: device_remove_file(gp2a->light_dev, &dev_attr_lux); err_light_device_create_file1: device_remove_file(gp2a->proximity_dev, &dev_attr_name); err_proximity_device_create_file5: device_remove_file(gp2a->proximity_dev, &dev_attr_vendor); err_proximity_device_create_file4: device_remove_file(gp2a->proximity_dev, &dev_attr_proximity_enable); err_proximity_device_create_file3: device_remove_file(gp2a->proximity_dev, &dev_attr_prox_avg); err_proximity_device_create_file2: device_remove_file(gp2a->proximity_dev, &dev_attr_state); err_proximity_device_create_file1: err_light_device_create: device_destroy(sensors_class, 0); err_proximity_device_create: gpio_free(pdata->p_out); err_setup_irq: err_no_device: wake_lock_destroy(&gp2a->prx_wake_lock); mutex_destroy(&gp2a->light_mutex); mutex_destroy(&gp2a->data_mutex); sysfs_remove_group(&gp2a->light_input_dev->dev.kobj, &lightsensor_attribute_group); err_sysfs_create_group_light: sysfs_remove_group(&gp2a->proximity_input_dev->dev.kobj, &proximity_attribute_group); err_sysfs_create_group_proximity: input_unregister_device(gp2a->light_input_dev); error_setup_reg_light: input_unregister_device(gp2a->proximity_input_dev); error_setup_reg_prox: if (pdata->power_on) pdata->power_on(0); kfree(gp2a); return err; }