On Thu, 2010-12-30 at 03:17 +0800, Kevin McNeely wrote: [...] > + > +void *cyttsp_core_init(struct cyttsp_bus_ops *bus_ops, struct device *dev) > +{ > + struct input_dev *input_device; > + > + struct cyttsp *ts = kzalloc(sizeof(*ts), GFP_KERNEL); > + > + if (!ts) { > + dev_dbg(ts->dev, "%s: Error, kzalloc\n", __func__); > + goto error_alloc_data; > + } ts->dev is not assigned yet. Thanks, Hong > + > + if (dev == NULL || bus_ops == NULL) { > + kfree(ts); > + goto error_alloc_data; > + } > + > + mutex_init(&ts->mutex); > + ts->dev = dev; > + ts->platform_data = dev->platform_data; > + ts->bus_ops = bus_ops; > + init_completion(&ts->bl_ready); > + > + if (ts->platform_data->init) { > + if (ts->platform_data->init()) { > + dev_dbg(ts->dev, "%s: Error, platform init failed!\n", > + __func__); > + goto error_init; > + } > + } > + > + ts->irq = gpio_to_irq(ts->platform_data->irq_gpio); > + if (ts->irq <= 0) { > + dev_dbg(ts->dev, "%s: Error, failed to allocate irq\n", > + __func__); > + goto error_init; > + } > + > + /* Create the input device and register it. */ > + input_device = input_allocate_device(); > + if (!input_device) { > + dev_dbg(ts->dev, "%s: Error, failed to allocate input device\n", > + __func__); > + goto error_input_allocate_device; > + } > + > + ts->input = input_device; > + input_device->name = ts->platform_data->name; > + snprintf(ts->phys, sizeof(ts->phys), "%s", dev_name(dev)); > + input_device->phys = ts->phys; > + input_device->dev.parent = ts->dev; > + ts->bus_type = bus_ops->dev->bus; > + input_device->open = cyttsp_open; > + input_device->close = cyttsp_close; > + input_set_drvdata(input_device, ts); > + > + __set_bit(EV_SYN, input_device->evbit); > + __set_bit(EV_KEY, input_device->evbit); > + __set_bit(EV_ABS, input_device->evbit); > + > + input_set_abs_params(input_device, ABS_MT_POSITION_X, > + 0, ts->platform_data->maxx, 0, 0); > + input_set_abs_params(input_device, ABS_MT_POSITION_Y, > + 0, ts->platform_data->maxy, 0, 0); > + input_set_abs_params(input_device, ABS_MT_TOUCH_MAJOR, > + 0, CY_MAXZ, 0, 0); > + > + if (input_register_device(input_device)) { > + dev_dbg(ts->dev, "%s: Error, failed to register input device\n", > + __func__); > + goto error_input_register_device; > + } > + > + goto no_error; > + > +error_input_register_device: > + input_unregister_device(input_device); > +error_input_allocate_device: > + if (ts->platform_data->exit) > + ts->platform_data->exit(); > +error_init: > + mutex_destroy(&ts->mutex); > + kfree(ts); > +error_alloc_data: > +no_error: > + return ts; > +} > +EXPORT_SYMBOL_GPL(cyttsp_core_init); > + > +MODULE_LICENSE("GPL"); > +MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard touchscreen driver core"); > +MODULE_AUTHOR("Cypress"); -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html