Merge branch 'master' into for-2.6.39
This commit is contained in:
@@ -941,28 +941,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;
|
||||
}
|
||||
@@ -1353,7 +1354,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)
|
||||
@@ -1383,8 +1384,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);
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/bu21013.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#define PEN_DOWN_INTR 0
|
||||
#define MAX_FINGERS 2
|
||||
@@ -139,6 +140,7 @@
|
||||
* @chip: pointer to the touch panel controller
|
||||
* @in_dev: pointer to the input device structure
|
||||
* @intr_pin: interrupt pin value
|
||||
* @regulator: pointer to the Regulator used for touch screen
|
||||
*
|
||||
* Touch panel device data structure
|
||||
*/
|
||||
@@ -149,6 +151,7 @@ struct bu21013_ts_data {
|
||||
const struct bu21013_platform_device *chip;
|
||||
struct input_dev *in_dev;
|
||||
unsigned int intr_pin;
|
||||
struct regulator *regulator;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -456,6 +459,20 @@ static int __devinit bu21013_probe(struct i2c_client *client,
|
||||
bu21013_data->in_dev = in_dev;
|
||||
bu21013_data->chip = pdata;
|
||||
bu21013_data->client = client;
|
||||
|
||||
bu21013_data->regulator = regulator_get(&client->dev, "V-TOUCH");
|
||||
if (IS_ERR(bu21013_data->regulator)) {
|
||||
dev_err(&client->dev, "regulator_get failed\n");
|
||||
error = PTR_ERR(bu21013_data->regulator);
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
error = regulator_enable(bu21013_data->regulator);
|
||||
if (error < 0) {
|
||||
dev_err(&client->dev, "regulator enable failed\n");
|
||||
goto err_put_regulator;
|
||||
}
|
||||
|
||||
bu21013_data->touch_stopped = false;
|
||||
init_waitqueue_head(&bu21013_data->wait);
|
||||
|
||||
@@ -464,7 +481,7 @@ static int __devinit bu21013_probe(struct i2c_client *client,
|
||||
error = pdata->cs_en(pdata->cs_pin);
|
||||
if (error < 0) {
|
||||
dev_err(&client->dev, "chip init failed\n");
|
||||
goto err_free_mem;
|
||||
goto err_disable_regulator;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -485,9 +502,9 @@ static int __devinit bu21013_probe(struct i2c_client *client,
|
||||
__set_bit(EV_ABS, in_dev->evbit);
|
||||
|
||||
input_set_abs_params(in_dev, ABS_MT_POSITION_X, 0,
|
||||
pdata->x_max_res, 0, 0);
|
||||
pdata->touch_x_max, 0, 0);
|
||||
input_set_abs_params(in_dev, ABS_MT_POSITION_Y, 0,
|
||||
pdata->y_max_res, 0, 0);
|
||||
pdata->touch_y_max, 0, 0);
|
||||
input_set_drvdata(in_dev, bu21013_data);
|
||||
|
||||
error = request_threaded_irq(pdata->irq, NULL, bu21013_gpio_irq,
|
||||
@@ -513,6 +530,10 @@ err_free_irq:
|
||||
bu21013_free_irq(bu21013_data);
|
||||
err_cs_disable:
|
||||
pdata->cs_dis(pdata->cs_pin);
|
||||
err_disable_regulator:
|
||||
regulator_disable(bu21013_data->regulator);
|
||||
err_put_regulator:
|
||||
regulator_put(bu21013_data->regulator);
|
||||
err_free_mem:
|
||||
input_free_device(in_dev);
|
||||
kfree(bu21013_data);
|
||||
@@ -535,6 +556,10 @@ static int __devexit bu21013_remove(struct i2c_client *client)
|
||||
bu21013_data->chip->cs_dis(bu21013_data->chip->cs_pin);
|
||||
|
||||
input_unregister_device(bu21013_data->in_dev);
|
||||
|
||||
regulator_disable(bu21013_data->regulator);
|
||||
regulator_put(bu21013_data->regulator);
|
||||
|
||||
kfree(bu21013_data);
|
||||
|
||||
device_init_wakeup(&client->dev, false);
|
||||
@@ -561,6 +586,8 @@ static int bu21013_suspend(struct device *dev)
|
||||
else
|
||||
disable_irq(bu21013_data->chip->irq);
|
||||
|
||||
regulator_disable(bu21013_data->regulator);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -577,6 +604,12 @@ static int bu21013_resume(struct device *dev)
|
||||
struct i2c_client *client = bu21013_data->client;
|
||||
int retval;
|
||||
|
||||
retval = regulator_enable(bu21013_data->regulator);
|
||||
if (retval < 0) {
|
||||
dev_err(&client->dev, "bu21013 regulator enable failed\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
retval = bu21013_init_chip(bu21013_data);
|
||||
if (retval < 0) {
|
||||
dev_err(&client->dev, "bu21013 controller config failed\n");
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -289,9 +290,9 @@ static int __devinit tsc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
ts->clk = clk_get(dev, NULL);
|
||||
if (!ts->clk) {
|
||||
if (IS_ERR(ts->clk)) {
|
||||
dev_err(dev, "cannot claim device clock\n");
|
||||
error = -EINVAL;
|
||||
error = PTR_ERR(ts->clk);
|
||||
goto error_clk;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user