static int lightsensor_probe(struct platform_device *pdev) { struct sensor_data *data = NULL; struct input_dev *input_data = NULL; int input_registered = 0, sysfs_created = 0; int rt; data = kzalloc(sizeof(struct sensor_data), GFP_KERNEL); if (!data) { rt = -ENOMEM; goto err; } data->enabled = 0; data->delay = SENSOR_DEFAULT_DELAY; data->testmode = 0; data->light_level_state =0; light_workqueue = create_singlethread_workqueue("klightd"); if (!light_workqueue) { rt = -ENOMEM; printk(KERN_ERR "%s: Failed to allocate work queue\n", __func__); goto err; } INIT_DELAYED_WORK(&data->work, gp2a_work_func_light); input_data = input_allocate_device(); if (!input_data) { rt = -ENOMEM; printk(KERN_ERR "sensor_probe: Failed to allocate input_data device\n"); goto err; } set_bit(EV_ABS, input_data->evbit); input_set_capability(input_data, EV_ABS, ABS_X); input_set_capability(input_data, EV_ABS, ABS_MISC); input_set_capability(input_data, EV_ABS, ABS_WAKE); /* wake */ input_set_capability(input_data, EV_ABS, ABS_CONTROL_REPORT); /* enabled/delay */ input_data->name = SENSOR_NAME; rt = input_register_device(input_data); if (rt) { printk(KERN_ERR "sensor_probe: Unable to register input_data device: %s\n", input_data->name); goto err; } input_set_drvdata(input_data, data); input_registered = 1; rt = sysfs_create_group(&input_data->dev.kobj, &lightsensor_attribute_group); if (rt) { printk(KERN_ERR "sensor_probe: sysfs_create_group failed[%s]\n", input_data->name); goto err; } sysfs_created = 1; mutex_init(&data->mutex); this_data = input_data; #if 0 //def MSM_LIGHTSENSOR_ADC_READ lightsensor_rpc_init(); #endif data->lightsensor_class = class_create(THIS_MODULE, "lightsensor"); if (IS_ERR(data->lightsensor_class)) { pr_err("%s: could not create lightsensor_class\n", __func__); goto err; } data->switch_cmd_dev = device_create(data->lightsensor_class, NULL, 0, NULL, "switch_cmd"); if (IS_ERR(data->switch_cmd_dev)) { pr_err("%s: could not create switch_cmd_dev\n", __func__); goto err_light_device_create; } if (device_create_file(data->switch_cmd_dev, &dev_attr_lightsensor_file_state) < 0) { pr_err("%s: could not create device file(%s)!\n", __func__, dev_attr_lightsensor_file_state.attr.name); goto err_light_device_create_file; } dev_set_drvdata(data->switch_cmd_dev, data); return 0; err_light_device_create_file: device_destroy(data->lightsensor_class, 0); err_light_device_create: class_destroy(data->lightsensor_class); err: if (data != NULL) { if (input_data != NULL) { if (sysfs_created) { sysfs_remove_group(&input_data->dev.kobj, &lightsensor_attribute_group); } if (input_registered) input_unregister_device(input_data); else input_free_device(input_data); input_data = NULL; } kfree(data); } return rt; }
static int lightsensor_probe(struct platform_device *pdev) { struct sensor_data *data = NULL; struct input_dev *input_data = NULL; int input_registered = 0, sysfs_created = 0; int rt; gprintk("\n"); data = (struct sensor_data *) kzalloc(sizeof(struct sensor_data), GFP_KERNEL); if (!data) { rt = -ENOMEM; goto err; } data->enabled = 0; data->delay = SENSOR_DEFAULT_DELAY; data->testmode = 0; INIT_DELAYED_WORK(&data->work, gp2a_work_func_light); input_data = input_allocate_device(); if (!input_data) { rt = -ENOMEM; printk(KERN_ERR "sensor_probe: Failed to allocate input_data device\n"); goto err; } set_bit(EV_ABS, input_data->evbit); input_set_capability(input_data, EV_ABS, ABS_X); input_set_capability(input_data, EV_ABS, ABS_Y); input_set_capability(input_data, EV_ABS, ABS_WAKE); /* wake */ input_set_capability(input_data, EV_ABS, ABS_CONTROL_REPORT); /* enabled/delay */ input_data->name = SENSOR_NAME; rt = input_register_device(input_data); if (rt) { printk(KERN_ERR "sensor_probe: Unable to register input_data device: %s\n", input_data->name); goto err; } input_set_drvdata(input_data, data); input_registered = 1; rt = sysfs_create_group(&input_data->dev.kobj, &lightsensor_attribute_group); if (rt) { printk(KERN_ERR "sensor_probe: sysfs_create_group failed[%s]\n", input_data->name); goto err; } sysfs_created = 1; mutex_init(&data->mutex); this_data = input_data; #ifdef MSM_LIGHTSENSOR_ADC_READ lightsensor_rpc_init(); #endif return 0; err: if (data != NULL) { if (input_data != NULL) { if (sysfs_created) { sysfs_remove_group(&input_data->dev.kobj, &lightsensor_attribute_group); } if (input_registered) { input_unregister_device(input_data); } else { input_free_device(input_data); } input_data = NULL; } kfree((void*) data); } return rt; }