static void ad7879_enable(struct ad7879 *ts) { mutex_lock(&ts->mutex); if (ts->disabled) { ad7879_setup(ts); ts->disabled = 0; enable_irq(ts->bus->irq); } mutex_unlock(&ts->mutex); }
static int __devinit ad7879_construct(bus_device *bus, struct ad7879 *ts) { struct input_dev *input_dev; struct ad7879_platform_data *pdata = bus->dev.platform_data; int err; u16 revid; if (!bus->irq) { dev_err(&bus->dev, "no IRQ?\n"); return -ENODEV; } if (!pdata) { dev_err(&bus->dev, "no platform data?\n"); return -ENODEV; } input_dev = input_allocate_device(); if (!input_dev) return -ENOMEM; ts->input = input_dev; setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts); INIT_WORK(&ts->work, ad7879_work); mutex_init(&ts->mutex); ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; ts->pressure_max = pdata->pressure_max ? : ~0; ts->first_conversion_delay = pdata->first_conversion_delay; ts->acquisition_time = pdata->acquisition_time; ts->averaging = pdata->averaging; ts->pen_down_acc_interval = pdata->pen_down_acc_interval; ts->median = pdata->median; if (pdata->gpio_output) ts->gpio_init = AD7879_GPIO_EN | (pdata->gpio_default ? 0 : AD7879_GPIO_DATA); else ts->gpio_init = AD7879_GPIO_EN | AD7879_GPIODIR; snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&bus->dev)); input_dev->name = "AD7879 Touchscreen"; input_dev->phys = ts->phys; input_dev->dev.parent = &bus->dev; __set_bit(EV_ABS, input_dev->evbit); __set_bit(ABS_X, input_dev->absbit); __set_bit(ABS_Y, input_dev->absbit); __set_bit(ABS_PRESSURE, input_dev->absbit); input_set_abs_params(input_dev, ABS_X, pdata->x_min ? : 0, pdata->x_max ? : MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_Y, pdata->y_min ? : 0, pdata->y_max ? : MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_PRESSURE, pdata->pressure_min, pdata->pressure_max, 0, 0); err = ad7879_write(bus, AD7879_REG_CTRL2, AD7879_RESET); if (err < 0) { dev_err(&bus->dev, "Failed to write %s\n", input_dev->name); goto err_free_mem; } revid = ad7879_read(bus, AD7879_REG_REVID); if ((revid & 0xFF) != AD7879_DEVID) { dev_err(&bus->dev, "Failed to probe %s\n", input_dev->name); err = -ENODEV; goto err_free_mem; } ad7879_setup(ts); err = request_irq(bus->irq, ad7879_irq, IRQF_TRIGGER_FALLING | IRQF_SAMPLE_RANDOM, bus->dev.driver->name, ts); if (err) { dev_err(&bus->dev, "irq %d busy?\n", bus->irq); goto err_free_mem; } err = sysfs_create_group(&bus->dev.kobj, &ad7879_attr_group); if (err) goto err_free_irq; err = input_register_device(input_dev); if (err) goto err_remove_attr; dev_info(&bus->dev, "Rev.%d touchscreen, irq %d\n", revid >> 8, bus->irq); return 0; err_remove_attr: sysfs_remove_group(&bus->dev.kobj, &ad7879_attr_group); err_free_irq: free_irq(bus->irq, ts); err_free_mem: input_free_device(input_dev); return err; }
static int __devinit ad7879_construct(bus_device *bus, struct ad7879 *ts) { struct input_dev *input_dev; struct ad7879_platform_data *pdata = bus->dev.platform_data; int err; u16 revid; if (!bus->irq) { dev_err(&bus->dev, "no IRQ?\n"); return -ENODEV; } if (!pdata) { dev_err(&bus->dev, "no platform data?\n"); return -ENODEV; } input_dev = input_allocate_device(); if (!input_dev) return -ENOMEM; ts->input = input_dev; setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts); INIT_WORK(&ts->work, ad7879_work); mutex_init(&ts->mutex); ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; ts->pressure_max = pdata->pressure_max ? : ~0; ts->first_conversion_delay = pdata->first_conversion_delay; ts->acquisition_time = pdata->acquisition_time; ts->averaging = pdata->averaging; ts->pen_down_acc_interval = pdata->pen_down_acc_interval; ts->median = pdata->median; snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&bus->dev)); input_dev->name = "AD7879 Touchscreen"; input_dev->phys = ts->phys; input_dev->dev.parent = &bus->dev; __set_bit(EV_ABS, input_dev->evbit); __set_bit(ABS_X, input_dev->absbit); __set_bit(ABS_Y, input_dev->absbit); __set_bit(ABS_PRESSURE, input_dev->absbit); input_set_abs_params(input_dev, ABS_X, pdata->x_min ? : 0, pdata->x_max ? : MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_Y, pdata->y_min ? : 0, pdata->y_max ? : MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_PRESSURE, pdata->pressure_min, pdata->pressure_max, 0, 0); err = ad7879_write(bus, AD7879_REG_CTRL2, AD7879_RESET); if (err < 0) { dev_err(&bus->dev, "Failed to write %s\n", input_dev->name); goto err_free_mem; } revid = ad7879_read(bus, AD7879_REG_REVID); if ((revid & 0xFF) != AD7879_DEVID) { dev_err(&bus->dev, "Failed to probe %s\n", input_dev->name); err = -ENODEV; goto err_free_mem; } ts->cmd_crtl3 = AD7879_YPLUS_BIT | AD7879_XPLUS_BIT | AD7879_Z2_BIT | AD7879_Z1_BIT | AD7879_TEMPMASK_BIT | AD7879_AUXVBATMASK_BIT | AD7879_GPIOALERTMASK_BIT; ts->cmd_crtl2 = AD7879_PM(AD7879_PM_DYN) | AD7879_DFR | AD7879_AVG(ts->averaging) | AD7879_MFS(ts->median) | AD7879_FCD(ts->first_conversion_delay); ts->cmd_crtl1 = AD7879_MODE_INT | AD7879_MODE_SEQ1 | AD7879_ACQ(ts->acquisition_time) | AD7879_TMR(ts->pen_down_acc_interval); ad7879_setup(ts); err = request_irq(bus->irq, ad7879_irq, IRQF_TRIGGER_FALLING, bus->dev.driver->name, ts); if (err) { dev_err(&bus->dev, "irq %d busy?\n", bus->irq); goto err_free_mem; } err = sysfs_create_group(&bus->dev.kobj, &ad7879_attr_group); if (err) goto err_free_irq; err = ad7879_gpio_add(&bus->dev); if (err) goto err_remove_attr; err = input_register_device(input_dev); if (err) goto err_remove_gpio; dev_info(&bus->dev, "Rev.%d touchscreen, irq %d\n", revid >> 8, bus->irq); return 0; err_remove_gpio: ad7879_gpio_remove(&bus->dev); err_remove_attr: sysfs_remove_group(&bus->dev.kobj, &ad7879_attr_group); err_free_irq: free_irq(bus->irq, ts); err_free_mem: input_free_device(input_dev); return err; }