Merge commit 'v2.6.39-rc4' into next
This commit is contained in:
@@ -653,7 +653,7 @@ config TOUCHSCREEN_TOUCHIT213
|
||||
|
||||
config TOUCHSCREEN_TSC2005
|
||||
tristate "TSC2005 based touchscreens"
|
||||
depends on SPI_MASTER
|
||||
depends on SPI_MASTER && GENERIC_HARDIRQS
|
||||
help
|
||||
Say Y here if you have a TSC2005 based touchscreen.
|
||||
|
||||
|
@@ -946,28 +946,29 @@ static int __devinit ads7846_setup_pendown(struct spi_device *spi, struct ads784
|
||||
struct ads7846_platform_data *pdata = spi->dev.platform_data;
|
||||
int err;
|
||||
|
||||
/* REVISIT when the irq can be triggered active-low, or if for some
|
||||
/*
|
||||
* REVISIT when the irq can be triggered active-low, or if for some
|
||||
* reason the touchscreen isn't hooked up, we don't need to access
|
||||
* the pendown state.
|
||||
*/
|
||||
if (!pdata->get_pendown_state && !gpio_is_valid(pdata->gpio_pendown)) {
|
||||
dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (pdata->get_pendown_state) {
|
||||
ts->get_pendown_state = pdata->get_pendown_state;
|
||||
return 0;
|
||||
}
|
||||
} else if (gpio_is_valid(pdata->gpio_pendown)) {
|
||||
|
||||
err = gpio_request(pdata->gpio_pendown, "ads7846_pendown");
|
||||
if (err) {
|
||||
dev_err(&spi->dev, "failed to request pendown GPIO%d\n",
|
||||
pdata->gpio_pendown);
|
||||
return err;
|
||||
}
|
||||
err = gpio_request(pdata->gpio_pendown, "ads7846_pendown");
|
||||
if (err) {
|
||||
dev_err(&spi->dev, "failed to request pendown GPIO%d\n",
|
||||
pdata->gpio_pendown);
|
||||
return err;
|
||||
}
|
||||
|
||||
ts->gpio_pendown = pdata->gpio_pendown;
|
||||
ts->gpio_pendown = pdata->gpio_pendown;
|
||||
|
||||
} else {
|
||||
dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1358,7 +1359,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
||||
err_put_regulator:
|
||||
regulator_put(ts->reg);
|
||||
err_free_gpio:
|
||||
if (ts->gpio_pendown != -1)
|
||||
if (!ts->get_pendown_state)
|
||||
gpio_free(ts->gpio_pendown);
|
||||
err_cleanup_filter:
|
||||
if (ts->filter_cleanup)
|
||||
@@ -1388,8 +1389,13 @@ static int __devexit ads7846_remove(struct spi_device *spi)
|
||||
regulator_disable(ts->reg);
|
||||
regulator_put(ts->reg);
|
||||
|
||||
if (ts->gpio_pendown != -1)
|
||||
if (!ts->get_pendown_state) {
|
||||
/*
|
||||
* If we are not using specialized pendown method we must
|
||||
* have been relying on gpio we set up ourselves.
|
||||
*/
|
||||
gpio_free(ts->gpio_pendown);
|
||||
}
|
||||
|
||||
if (ts->filter_cleanup)
|
||||
ts->filter_cleanup(ts->filter_data);
|
||||
|
@@ -62,7 +62,7 @@ MODULE_LICENSE("GPL");
|
||||
Programmer has no control over these numbers.
|
||||
TODO there are holes - specifically 1,7,0x0a
|
||||
*/
|
||||
#define VERSION_ID 0 /* Get Version (request/respose) */
|
||||
#define VERSION_ID 0 /* Get Version (request/response) */
|
||||
#define KEYBD_ID 2 /* Keyboard (event) */
|
||||
#define TOUCHS_ID 3 /* Touch Screen (event)*/
|
||||
#define EEPROM_READ_ID 4 /* (request/response) */
|
||||
@@ -399,31 +399,34 @@ static int h3600ts_connect(struct serio *serio, struct serio_driver *drv)
|
||||
IRQF_SHARED | IRQF_DISABLED, "h3600_action", &ts->dev)) {
|
||||
printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n");
|
||||
err = -EBUSY;
|
||||
goto fail2;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler,
|
||||
IRQF_SHARED | IRQF_DISABLED, "h3600_suspend", &ts->dev)) {
|
||||
printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n");
|
||||
err = -EBUSY;
|
||||
goto fail3;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
serio_set_drvdata(serio, ts);
|
||||
|
||||
err = serio_open(serio, drv);
|
||||
if (err)
|
||||
return err;
|
||||
goto fail3;
|
||||
|
||||
//h3600_flite_control(1, 25); /* default brightness */
|
||||
input_register_device(ts->dev);
|
||||
err = input_register_device(ts->dev);
|
||||
if (err)
|
||||
goto fail4;
|
||||
|
||||
return 0;
|
||||
|
||||
fail3: free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev);
|
||||
fail4: serio_close(serio);
|
||||
fail3: serio_set_drvdata(serio, NULL);
|
||||
free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev);
|
||||
fail2: free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev);
|
||||
fail1: serio_set_drvdata(serio, NULL);
|
||||
input_free_device(input_dev);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(ts);
|
||||
return err;
|
||||
}
|
||||
|
@@ -542,7 +542,7 @@ static int __devinit mrstouch_adc_init(struct mrstouch_dev *tsdev)
|
||||
* ADC power on, start, enable PENDET and set loop delay
|
||||
* ADC loop delay is set to 4.5 ms approximately
|
||||
* Loop delay more than this results in jitter in adc readings
|
||||
* Setting loop delay to 0 (continous loop) in MAXIM stops PENDET
|
||||
* Setting loop delay to 0 (continuous loop) in MAXIM stops PENDET
|
||||
* interrupt generation sometimes.
|
||||
*/
|
||||
|
||||
|
@@ -219,7 +219,7 @@ static int wm97xx_acc_startup(struct wm97xx *wm)
|
||||
}
|
||||
|
||||
wm->pen_irq = gpio_to_irq(irq);
|
||||
set_irq_type(wm->pen_irq, IRQ_TYPE_EDGE_BOTH);
|
||||
irq_set_irq_type(wm->pen_irq, IRQ_TYPE_EDGE_BOTH);
|
||||
} else /* pen irq not supported */
|
||||
pen_int = 0;
|
||||
|
||||
|
@@ -43,7 +43,6 @@ struct tps6507x_ts {
|
||||
struct input_dev *input_dev;
|
||||
struct device *dev;
|
||||
char phys[32];
|
||||
struct workqueue_struct *wq;
|
||||
struct delayed_work work;
|
||||
unsigned polling; /* polling is active */
|
||||
struct ts_event tc;
|
||||
@@ -220,8 +219,8 @@ done:
|
||||
poll = 1;
|
||||
|
||||
if (poll) {
|
||||
schd = queue_delayed_work(tsc->wq, &tsc->work,
|
||||
msecs_to_jiffies(tsc->poll_period));
|
||||
schd = schedule_delayed_work(&tsc->work,
|
||||
msecs_to_jiffies(tsc->poll_period));
|
||||
if (schd)
|
||||
tsc->polling = 1;
|
||||
else {
|
||||
@@ -303,7 +302,6 @@ static int tps6507x_ts_probe(struct platform_device *pdev)
|
||||
tsc->input_dev = input_dev;
|
||||
|
||||
INIT_DELAYED_WORK(&tsc->work, tps6507x_ts_handler);
|
||||
tsc->wq = create_workqueue("TPS6507x Touchscreen");
|
||||
|
||||
if (init_data) {
|
||||
tsc->poll_period = init_data->poll_period;
|
||||
@@ -325,8 +323,8 @@ static int tps6507x_ts_probe(struct platform_device *pdev)
|
||||
if (error)
|
||||
goto err2;
|
||||
|
||||
schd = queue_delayed_work(tsc->wq, &tsc->work,
|
||||
msecs_to_jiffies(tsc->poll_period));
|
||||
schd = schedule_delayed_work(&tsc->work,
|
||||
msecs_to_jiffies(tsc->poll_period));
|
||||
|
||||
if (schd)
|
||||
tsc->polling = 1;
|
||||
@@ -341,7 +339,6 @@ static int tps6507x_ts_probe(struct platform_device *pdev)
|
||||
|
||||
err2:
|
||||
cancel_delayed_work_sync(&tsc->work);
|
||||
destroy_workqueue(tsc->wq);
|
||||
input_free_device(input_dev);
|
||||
err1:
|
||||
kfree(tsc);
|
||||
@@ -357,7 +354,6 @@ static int __devexit tps6507x_ts_remove(struct platform_device *pdev)
|
||||
struct input_dev *input_dev = tsc->input_dev;
|
||||
|
||||
cancel_delayed_work_sync(&tsc->work);
|
||||
destroy_workqueue(tsc->wq);
|
||||
|
||||
input_unregister_device(input_dev);
|
||||
|
||||
|
@@ -358,7 +358,7 @@ static void __tsc2005_enable(struct tsc2005 *ts)
|
||||
if (ts->esd_timeout && ts->set_reset) {
|
||||
ts->last_valid_interrupt = jiffies;
|
||||
schedule_delayed_work(&ts->esd_work,
|
||||
round_jiffies(jiffies +
|
||||
round_jiffies_relative(
|
||||
msecs_to_jiffies(ts->esd_timeout)));
|
||||
}
|
||||
|
||||
@@ -477,7 +477,14 @@ static void tsc2005_esd_work(struct work_struct *work)
|
||||
int error;
|
||||
u16 r;
|
||||
|
||||
mutex_lock(&ts->mutex);
|
||||
if (!mutex_trylock(&ts->mutex)) {
|
||||
/*
|
||||
* If the mutex is taken, it means that disable or enable is in
|
||||
* progress. In that case just reschedule the work. If the work
|
||||
* is not needed, it will be canceled by disable.
|
||||
*/
|
||||
goto reschedule;
|
||||
}
|
||||
|
||||
if (time_is_after_jiffies(ts->last_valid_interrupt +
|
||||
msecs_to_jiffies(ts->esd_timeout)))
|
||||
@@ -510,11 +517,12 @@ static void tsc2005_esd_work(struct work_struct *work)
|
||||
tsc2005_start_scan(ts);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ts->mutex);
|
||||
reschedule:
|
||||
/* re-arm the watchdog */
|
||||
schedule_delayed_work(&ts->esd_work,
|
||||
round_jiffies(jiffies +
|
||||
round_jiffies_relative(
|
||||
msecs_to_jiffies(ts->esd_timeout)));
|
||||
mutex_unlock(&ts->mutex);
|
||||
}
|
||||
|
||||
static int tsc2005_open(struct input_dev *input)
|
||||
@@ -663,7 +671,7 @@ static int __devinit tsc2005_probe(struct spi_device *spi)
|
||||
goto err_remove_sysfs;
|
||||
}
|
||||
|
||||
set_irq_wake(spi->irq, 1);
|
||||
irq_set_irq_wake(spi->irq, 1);
|
||||
return 0;
|
||||
|
||||
err_remove_sysfs:
|
||||
|
@@ -6,7 +6,7 @@
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* Spliting done by: Marek Vasut <marek.vasut@gmail.com>
|
||||
* If something doesnt work and it worked before spliting, e-mail me,
|
||||
* If something doesn't work and it worked before spliting, e-mail me,
|
||||
* dont bother Nicolas please ;-)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -51,6 +51,10 @@ MODULE_LICENSE("GPL");
|
||||
#define W8001_PKTLEN_TPCCTL 11 /* control packet */
|
||||
#define W8001_PKTLEN_TOUCH2FG 13
|
||||
|
||||
/* resolution in points/mm */
|
||||
#define W8001_PEN_RESOLUTION 100
|
||||
#define W8001_TOUCH_RESOLUTION 10
|
||||
|
||||
struct w8001_coord {
|
||||
u8 rdy;
|
||||
u8 tsw;
|
||||
@@ -198,7 +202,7 @@ static void parse_touchquery(u8 *data, struct w8001_touch_query *query)
|
||||
query->y = 1024;
|
||||
if (query->panel_res)
|
||||
query->x = query->y = (1 << query->panel_res);
|
||||
query->panel_res = 10;
|
||||
query->panel_res = W8001_TOUCH_RESOLUTION;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,6 +398,8 @@ static int w8001_setup(struct w8001 *w8001)
|
||||
|
||||
input_set_abs_params(dev, ABS_X, 0, coord.x, 0, 0);
|
||||
input_set_abs_params(dev, ABS_Y, 0, coord.y, 0, 0);
|
||||
input_abs_set_res(dev, ABS_X, W8001_PEN_RESOLUTION);
|
||||
input_abs_set_res(dev, ABS_Y, W8001_PEN_RESOLUTION);
|
||||
input_set_abs_params(dev, ABS_PRESSURE, 0, coord.pen_pressure, 0, 0);
|
||||
if (coord.tilt_x && coord.tilt_y) {
|
||||
input_set_abs_params(dev, ABS_TILT_X, 0, coord.tilt_x, 0, 0);
|
||||
@@ -418,14 +424,17 @@ static int w8001_setup(struct w8001 *w8001)
|
||||
w8001->max_touch_x = touch.x;
|
||||
w8001->max_touch_y = touch.y;
|
||||
|
||||
/* scale to pen maximum */
|
||||
if (w8001->max_pen_x && w8001->max_pen_y) {
|
||||
/* if pen is supported scale to pen maximum */
|
||||
touch.x = w8001->max_pen_x;
|
||||
touch.y = w8001->max_pen_y;
|
||||
touch.panel_res = W8001_PEN_RESOLUTION;
|
||||
}
|
||||
|
||||
input_set_abs_params(dev, ABS_X, 0, touch.x, 0, 0);
|
||||
input_set_abs_params(dev, ABS_Y, 0, touch.y, 0, 0);
|
||||
input_abs_set_res(dev, ABS_X, touch.panel_res);
|
||||
input_abs_set_res(dev, ABS_Y, touch.panel_res);
|
||||
|
||||
switch (touch.sensor_id) {
|
||||
case 0:
|
||||
|
@@ -306,7 +306,7 @@ static int wm9705_acc_enable(struct wm97xx *wm, int enable)
|
||||
dig2 = wm->dig[2];
|
||||
|
||||
if (enable) {
|
||||
/* continous mode */
|
||||
/* continuous mode */
|
||||
if (wm->mach_ops->acc_startup &&
|
||||
(ret = wm->mach_ops->acc_startup(wm)) < 0)
|
||||
return ret;
|
||||
|
@@ -419,7 +419,7 @@ static int wm9712_acc_enable(struct wm97xx *wm, int enable)
|
||||
dig2 = wm->dig[2];
|
||||
|
||||
if (enable) {
|
||||
/* continous mode */
|
||||
/* continuous mode */
|
||||
if (wm->mach_ops->acc_startup) {
|
||||
ret = wm->mach_ops->acc_startup(wm);
|
||||
if (ret < 0)
|
||||
|
@@ -431,7 +431,7 @@ static int wm9713_acc_enable(struct wm97xx *wm, int enable)
|
||||
dig3 = wm->dig[2];
|
||||
|
||||
if (enable) {
|
||||
/* continous mode */
|
||||
/* continuous mode */
|
||||
if (wm->mach_ops->acc_startup &&
|
||||
(ret = wm->mach_ops->acc_startup(wm)) < 0)
|
||||
return ret;
|
||||
|
@@ -335,7 +335,7 @@ static void wm97xx_pen_irq_worker(struct work_struct *work)
|
||||
*/
|
||||
if (!wm->mach_ops->acc_enabled || wm->mach_ops->acc_pen_down) {
|
||||
if (wm->pen_is_down && !pen_was_down) {
|
||||
/* Data is not availiable immediately on pen down */
|
||||
/* Data is not available immediately on pen down */
|
||||
queue_delayed_work(wm->ts_workq, &wm->ts_reader, 1);
|
||||
}
|
||||
|
||||
@@ -354,7 +354,7 @@ static void wm97xx_pen_irq_worker(struct work_struct *work)
|
||||
* Codec PENDOWN irq handler
|
||||
*
|
||||
* We have to disable the codec interrupt in the handler because it
|
||||
* can take upto 1ms to clear the interrupt source. We schedule a task
|
||||
* can take up to 1ms to clear the interrupt source. We schedule a task
|
||||
* in a work queue to do the actual interaction with the chip. The
|
||||
* interrupt is then enabled again in the slow handler when the source
|
||||
* has been cleared.
|
||||
|
@@ -193,7 +193,7 @@ static int zylonite_wm97xx_probe(struct platform_device *pdev)
|
||||
gpio_touch_irq = mfp_to_gpio(MFP_PIN_GPIO26);
|
||||
|
||||
wm->pen_irq = IRQ_GPIO(gpio_touch_irq);
|
||||
set_irq_type(IRQ_GPIO(gpio_touch_irq), IRQ_TYPE_EDGE_BOTH);
|
||||
irq_set_irq_type(IRQ_GPIO(gpio_touch_irq), IRQ_TYPE_EDGE_BOTH);
|
||||
|
||||
wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN,
|
||||
WM97XX_GPIO_POL_HIGH,
|
||||
|
Reference in New Issue
Block a user