Skip to content

Commit

Permalink
[PATCH] drivers/input/touchscreen: convert to dynamic input_dev alloc…
Browse files Browse the repository at this point in the history
…ation

Input: convert drivers/input/touchscreen to dynamic input_dev allocation

This is required for input_dev sysfs integration

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Dmitry Torokhov authored and Greg Kroah-Hartman committed Oct 28, 2005
1 parent bd62266 commit eca1ed1
Show file tree
Hide file tree
Showing 7 changed files with 279 additions and 308 deletions.
89 changes: 45 additions & 44 deletions drivers/input/touchscreen/corgi_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ struct ts_event {
};

struct corgi_ts {
char phys[32];
struct input_dev input;
struct input_dev *input;
struct timer_list timer;
struct ts_event tc;
int pendown;
Expand Down Expand Up @@ -182,14 +181,12 @@ static void new_data(struct corgi_ts *corgi_ts, struct pt_regs *regs)
if (!corgi_ts->tc.pressure && corgi_ts->pendown == 0)
return;

if (regs)
input_regs(&corgi_ts->input, regs);

input_report_abs(&corgi_ts->input, ABS_X, corgi_ts->tc.x);
input_report_abs(&corgi_ts->input, ABS_Y, corgi_ts->tc.y);
input_report_abs(&corgi_ts->input, ABS_PRESSURE, corgi_ts->tc.pressure);
input_report_key(&corgi_ts->input, BTN_TOUCH, (corgi_ts->pendown != 0));
input_sync(&corgi_ts->input);
input_regs(corgi_ts->input, regs);
input_report_abs(corgi_ts->input, ABS_X, corgi_ts->tc.x);
input_report_abs(corgi_ts->input, ABS_Y, corgi_ts->tc.y);
input_report_abs(corgi_ts->input, ABS_PRESSURE, corgi_ts->tc.pressure);
input_report_key(corgi_ts->input, BTN_TOUCH, (corgi_ts->pendown != 0));
input_sync(corgi_ts->input);
}

static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer, struct pt_regs *regs)
Expand Down Expand Up @@ -273,39 +270,44 @@ static int __init corgits_probe(struct device *dev)
{
struct corgi_ts *corgi_ts;
struct platform_device *pdev = to_platform_device(dev);
struct input_dev *input_dev;
int err = -ENOMEM;

if (!(corgi_ts = kmalloc(sizeof(struct corgi_ts), GFP_KERNEL)))
return -ENOMEM;
corgi_ts = kzalloc(sizeof(struct corgi_ts), GFP_KERNEL);
input_dev = input_allocate_device();
if (!corgi_ts || !input_dev)
goto fail;

dev_set_drvdata(dev, corgi_ts);

memset(corgi_ts, 0, sizeof(struct corgi_ts));

corgi_ts->machinfo = dev->platform_data;
corgi_ts->irq_gpio = platform_get_irq(pdev, 0);

if (corgi_ts->irq_gpio < 0) {
kfree(corgi_ts);
return -ENODEV;
err = -ENODEV;
goto fail;
}

init_input_dev(&corgi_ts->input);
corgi_ts->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
corgi_ts->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
input_set_abs_params(&corgi_ts->input, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);
input_set_abs_params(&corgi_ts->input, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);
input_set_abs_params(&corgi_ts->input, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);
corgi_ts->input = input_dev;

strcpy(corgi_ts->phys, "corgits/input0");
init_timer(&corgi_ts->timer);
corgi_ts->timer.data = (unsigned long) corgi_ts;
corgi_ts->timer.function = corgi_ts_timer;

corgi_ts->input.private = corgi_ts;
corgi_ts->input.name = "Corgi Touchscreen";
corgi_ts->input.dev = dev;
corgi_ts->input.phys = corgi_ts->phys;
corgi_ts->input.id.bustype = BUS_HOST;
corgi_ts->input.id.vendor = 0x0001;
corgi_ts->input.id.product = 0x0002;
corgi_ts->input.id.version = 0x0100;
input_dev->name = "Corgi Touchscreen";
input_dev->phys = "corgits/input0";
input_dev->id.bustype = BUS_HOST;
input_dev->id.vendor = 0x0001;
input_dev->id.product = 0x0002;
input_dev->id.version = 0x0100;
input_dev->cdev.dev = dev;
input_dev->private = corgi_ts;

input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
input_set_abs_params(input_dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);
input_set_abs_params(input_dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);
input_set_abs_params(input_dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);

pxa_gpio_mode(IRQ_TO_GPIO(corgi_ts->irq_gpio) | GPIO_IN);

Expand All @@ -319,25 +321,24 @@ static int __init corgits_probe(struct device *dev)
corgi_ssp_ads7846_putget((5u << ADSCTRL_ADR_SH) | ADSCTRL_STS);
mdelay(5);

init_timer(&corgi_ts->timer);
corgi_ts->timer.data = (unsigned long) corgi_ts;
corgi_ts->timer.function = corgi_ts_timer;

input_register_device(&corgi_ts->input);
corgi_ts->power_mode = PWR_MODE_ACTIVE;

if (request_irq(corgi_ts->irq_gpio, ts_interrupt, SA_INTERRUPT, "ts", corgi_ts)) {
input_unregister_device(&corgi_ts->input);
kfree(corgi_ts);
return -EBUSY;
err = -EBUSY;
goto fail;
}

input_register_device(corgi_ts->input);

corgi_ts->power_mode = PWR_MODE_ACTIVE;

/* Enable Falling Edge */
set_irq_type(corgi_ts->irq_gpio, IRQT_FALLING);

printk(KERN_INFO "input: Corgi Touchscreen Registered\n");

return 0;

fail: input_free_device(input_dev);
kfree(corgi_ts);
return err;

}

static int corgits_remove(struct device *dev)
Expand All @@ -347,7 +348,7 @@ static int corgits_remove(struct device *dev)
free_irq(corgi_ts->irq_gpio, NULL);
del_timer_sync(&corgi_ts->timer);
corgi_ts->machinfo->put_hsync();
input_unregister_device(&corgi_ts->input);
input_unregister_device(corgi_ts->input);
kfree(corgi_ts);
return 0;
}
Expand Down
89 changes: 44 additions & 45 deletions drivers/input/touchscreen/elo.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,12 @@ MODULE_LICENSE("GPL");

#define ELO_MAX_LENGTH 10

static char *elo_name = "Elo Serial TouchScreen";

/*
* Per-touchscreen data.
*/

struct elo {
struct input_dev dev;
struct input_dev *dev;
struct serio *serio;
int id;
int idx;
Expand All @@ -54,7 +52,7 @@ struct elo {

static void elo_process_data_10(struct elo* elo, unsigned char data, struct pt_regs *regs)
{
struct input_dev *dev = &elo->dev;
struct input_dev *dev = elo->dev;

elo->csum += elo->data[elo->idx] = data;

Expand All @@ -80,7 +78,7 @@ static void elo_process_data_10(struct elo* elo, unsigned char data, struct pt_r
input_report_abs(dev, ABS_X, (elo->data[4] << 8) | elo->data[3]);
input_report_abs(dev, ABS_Y, (elo->data[6] << 8) | elo->data[5]);
input_report_abs(dev, ABS_PRESSURE, (elo->data[8] << 8) | elo->data[7]);
input_report_key(dev, BTN_TOUCH, elo->data[2] & 3);
input_report_key(dev, BTN_TOUCH, elo->data[8] || elo->data[7]);
input_sync(dev);
}
elo->idx = 0;
Expand All @@ -91,7 +89,7 @@ static void elo_process_data_10(struct elo* elo, unsigned char data, struct pt_r

static void elo_process_data_6(struct elo* elo, unsigned char data, struct pt_regs *regs)
{
struct input_dev *dev = &elo->dev;
struct input_dev *dev = elo->dev;

elo->data[elo->idx] = data;

Expand Down Expand Up @@ -129,7 +127,7 @@ static void elo_process_data_6(struct elo* elo, unsigned char data, struct pt_re
case 5:
if ((data & 0xf0) == 0) {
input_report_abs(dev, ABS_PRESSURE, elo->data[5]);
input_report_key(dev, BTN_TOUCH, elo->data[5]);
input_report_key(dev, BTN_TOUCH, !!elo->data[5]);
}
input_sync(dev);
elo->idx = 0;
Expand All @@ -139,7 +137,7 @@ static void elo_process_data_6(struct elo* elo, unsigned char data, struct pt_re

static void elo_process_data_3(struct elo* elo, unsigned char data, struct pt_regs *regs)
{
struct input_dev *dev = &elo->dev;
struct input_dev *dev = elo->dev;

elo->data[elo->idx] = data;

Expand Down Expand Up @@ -191,7 +189,7 @@ static void elo_disconnect(struct serio *serio)
{
struct elo* elo = serio_get_drvdata(serio);

input_unregister_device(&elo->dev);
input_unregister_device(elo->dev);
serio_close(serio);
serio_set_drvdata(serio, NULL);
kfree(elo);
Expand All @@ -206,67 +204,68 @@ static void elo_disconnect(struct serio *serio)
static int elo_connect(struct serio *serio, struct serio_driver *drv)
{
struct elo *elo;
struct input_dev *input_dev;
int err;

if (!(elo = kmalloc(sizeof(struct elo), GFP_KERNEL)))
return -ENOMEM;
elo = kzalloc(sizeof(struct elo), GFP_KERNEL);
input_dev = input_allocate_device();
if (!elo || !input_dev) {
err = -ENOMEM;
goto fail;
}

memset(elo, 0, sizeof(struct elo));
elo->serio = serio;
elo->id = serio->id.id;
elo->dev = input_dev;
snprintf(elo->phys, sizeof(elo->phys), "%s/input0", serio->phys);

init_input_dev(&elo->dev);
elo->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
elo->dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
input_dev->private = elo;
input_dev->name = "Elo Serial TouchScreen";
input_dev->phys = elo->phys;
input_dev->id.bustype = BUS_RS232;
input_dev->id.vendor = SERIO_ELO;
input_dev->id.product = elo->id;
input_dev->id.version = 0x0100;
input_dev->cdev.dev = &serio->dev;

elo->id = serio->id.id;
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);

switch (elo->id) {

case 0: /* 10-byte protocol */
input_set_abs_params(&elo->dev, ABS_X, 96, 4000, 0, 0);
input_set_abs_params(&elo->dev, ABS_Y, 96, 4000, 0, 0);
input_set_abs_params(&elo->dev, ABS_PRESSURE, 0, 255, 0, 0);
input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0);
input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0);
input_set_abs_params(input_dev, ABS_PRESSURE, 0, 255, 0, 0);
break;

case 1: /* 6-byte protocol */
input_set_abs_params(&elo->dev, ABS_PRESSURE, 0, 15, 0, 0);
input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0);

case 2: /* 4-byte protocol */
input_set_abs_params(&elo->dev, ABS_X, 96, 4000, 0, 0);
input_set_abs_params(&elo->dev, ABS_Y, 96, 4000, 0, 0);
input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0);
input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0);
break;

case 3: /* 3-byte protocol */
input_set_abs_params(&elo->dev, ABS_X, 0, 255, 0, 0);
input_set_abs_params(&elo->dev, ABS_Y, 0, 255, 0, 0);
input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0);
input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0);
break;
}

elo->serio = serio;

sprintf(elo->phys, "%s/input0", serio->phys);

elo->dev.private = elo;
elo->dev.name = elo_name;
elo->dev.phys = elo->phys;
elo->dev.id.bustype = BUS_RS232;
elo->dev.id.vendor = SERIO_ELO;
elo->dev.id.product = elo->id;
elo->dev.id.version = 0x0100;

serio_set_drvdata(serio, elo);

err = serio_open(serio, drv);
if (err) {
serio_set_drvdata(serio, NULL);
kfree(elo);
return err;
}

input_register_device(&elo->dev);

printk(KERN_INFO "input: %s on %s\n", elo_name, serio->phys);
if (err)
goto fail;

input_register_device(elo->dev);
return 0;

fail: serio_set_drvdata(serio, NULL);
input_free_device(input_dev);
kfree(elo);
return err;
}

/*
Expand Down
Loading

0 comments on commit eca1ed1

Please sign in to comment.