@@ -2,10 +2,11 @@
Required properties:
- compatible : "rohm,bu21013_tp"
- - reg : I2C device address
+ - reg : I2C device address
+ - reset-gpios : GPIO pin enabling (selecting) chip (CS)
Optional properties:
- - touch-gpio : GPIO pin registering a touch event
+ - touch-gpios : GPIO pin registering a touch event
- <supply_name>-supply : Phandle to a regulator supply
- rohm,touch-max-x : Maximum outward permitted limit in the X axis
- rohm,touch-max-y : Maximum outward permitted limit in the Y axis
@@ -14,11 +14,9 @@
#include <linux/slab.h>
#include <linux/regulator/consumer.h>
#include <linux/module.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
#include <linux/of.h>
-#include <linux/of_gpio.h>
-#define PEN_DOWN_INTR 0
#define MAX_FINGERS 2
#define RESET_DELAY 30
#define PENUP_TIMEOUT (10)
@@ -143,8 +141,9 @@
* @touch_stopped: touch stop flag
* @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
+ * @cs_gpiod: chip select GPIO line
+ * @int_gpiod: touch interrupt GPIO line
*
* Touch panel device data structure
*/
@@ -154,8 +153,9 @@ struct bu21013_ts_data {
const struct bu21013_platform_device *chip;
struct input_dev *in_dev;
struct regulator *regulator;
+ struct gpio_desc *cs_gpiod;
+ struct gpio_desc *int_gpiod;
unsigned int irq;
- unsigned int intr_pin;
bool touch_stopped;
};
@@ -257,20 +257,21 @@ static irqreturn_t bu21013_gpio_irq(int irq, void *device_data)
{
struct bu21013_ts_data *data = device_data;
struct i2c_client *i2c = data->client;
+ int keep_polling;
int retval;
do {
retval = bu21013_do_touch_report(data);
if (retval < 0) {
dev_err(&i2c->dev, "bu21013_do_touch_report failed\n");
- return IRQ_NONE;
+ break;
}
- data->intr_pin = gpio_get_value(data->chip->touch_pin);
- if (data->intr_pin == PEN_DOWN_INTR)
+ keep_polling = gpiod_get_value(data->int_gpiod);
+ if (keep_polling)
wait_event_timeout(data->wait, data->touch_stopped,
msecs_to_jiffies(2));
- } while (!data->intr_pin && !data->touch_stopped);
+ } while (keep_polling && !data->touch_stopped);
return IRQ_HANDLED;
}
@@ -425,28 +426,6 @@ static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data)
free_irq(bu21013_data->irq, bu21013_data);
}
-/**
- * bu21013_cs_disable() - deconfigures the touch panel controller
- * @bu21013_data: device structure pointer
- *
- * This function is used to deconfigure the chip selection
- * for touch panel controller.
- */
-static void bu21013_cs_disable(struct bu21013_ts_data *bu21013_data)
-{
- int error;
-
- error = gpio_direction_output(bu21013_data->chip->cs_pin, 0);
- if (error < 0)
- dev_warn(&bu21013_data->client->dev,
- "%s: gpio direction failed, error: %d\n",
- __func__, error);
- else
- gpio_set_value(bu21013_data->chip->cs_pin, 0);
-
- gpio_free(bu21013_data->chip->cs_pin);
-}
-
#ifdef CONFIG_OF
static const struct bu21013_platform_device *
bu21013_parse_dt(struct device *dev)
@@ -471,9 +450,6 @@ bu21013_parse_dt(struct device *dev)
of_property_read_u32(np, "rohm,touch-max-x", &pdata->touch_x_max);
of_property_read_u32(np, "rohm,touch-max-y", &pdata->touch_y_max);
- pdata->touch_pin = of_get_named_gpio(np, "touch-gpio", 0);
- pdata->cs_pin = of_get_named_gpio(np, "reset-gpio", 0);
-
pdata->ext_clk = false;
return pdata;
@@ -516,11 +492,6 @@ static int bu21013_probe(struct i2c_client *client,
return PTR_ERR(pdata);
}
- if (!gpio_is_valid(pdata->touch_pin)) {
- dev_err(&client->dev, "invalid touch_pin supplied\n");
- return -EINVAL;
- }
-
bu21013_data = kzalloc(sizeof(struct bu21013_ts_data), GFP_KERNEL);
in_dev = input_allocate_device();
if (!bu21013_data || !in_dev) {
@@ -529,16 +500,26 @@ static int bu21013_probe(struct i2c_client *client,
goto err_free_mem;
}
+ /* Named "INT" on the chip, DT binding is "touch" */
+ bu21013_data->int_gpiod = gpiod_get(&client->dev, "touch", GPIOD_IN);
+ error = PTR_ERR_OR_ZERO(bu21013_data->int_gpiod);
+ if (error) {
+ if (error != -EPROBE_DEFER)
+ dev_err(&client->dev, "failed to get INT GPIO\n");
+ goto err_free_mem;
+ }
+ gpiod_set_consumer_name(bu21013_data->int_gpiod, "BU21013 INT");
+
bu21013_data->in_dev = in_dev;
bu21013_data->chip = pdata;
bu21013_data->client = client;
- bu21013_data->irq = gpio_to_irq(pdata->touch_pin);
+ bu21013_data->irq = gpiod_to_irq(bu21013_data->int_gpiod);
bu21013_data->regulator = regulator_get(&client->dev, "avdd");
if (IS_ERR(bu21013_data->regulator)) {
dev_err(&client->dev, "regulator_get failed\n");
error = PTR_ERR(bu21013_data->regulator);
- goto err_free_mem;
+ goto err_put_int_gpio;
}
error = regulator_enable(bu21013_data->regulator);
@@ -550,13 +531,16 @@ static int bu21013_probe(struct i2c_client *client,
bu21013_data->touch_stopped = false;
init_waitqueue_head(&bu21013_data->wait);
- /* configure the gpio pins */
- error = gpio_request_one(pdata->cs_pin, GPIOF_OUT_INIT_HIGH,
- "touchp_reset");
- if (error < 0) {
- dev_err(&client->dev, "Unable to request gpio reset_pin\n");
+ /* Named "CS" on the chip, DT binding is "reset" */
+ bu21013_data->cs_gpiod = gpiod_get(&client->dev, "reset",
+ GPIOD_OUT_HIGH);
+ error = PTR_ERR_OR_ZERO(bu21013_data->cs_gpiod);
+ if (error) {
+ if (error != -EPROBE_DEFER)
+ dev_err(&client->dev, "failed to get CS GPIO\n");
goto err_disable_regulator;
}
+ gpiod_set_consumer_name(bu21013_data->cs_gpiod, "BU21013 CS");
/* configure the touch panel controller */
error = bu21013_init_chip(bu21013_data);
@@ -604,11 +588,14 @@ static int bu21013_probe(struct i2c_client *client,
err_free_irq:
bu21013_free_irq(bu21013_data);
err_cs_disable:
- bu21013_cs_disable(bu21013_data);
+ gpiod_set_value(bu21013_data->cs_gpiod, 0);
+ gpiod_put(bu21013_data->cs_gpiod);
err_disable_regulator:
regulator_disable(bu21013_data->regulator);
err_put_regulator:
regulator_put(bu21013_data->regulator);
+err_put_int_gpio:
+ gpiod_put(bu21013_data->int_gpiod);
err_free_mem:
input_free_device(in_dev);
kfree(bu21013_data);
@@ -628,13 +615,16 @@ static int bu21013_remove(struct i2c_client *client)
bu21013_free_irq(bu21013_data);
- bu21013_cs_disable(bu21013_data);
+ gpiod_set_value(bu21013_data->cs_gpiod, 0);
+ gpiod_put(bu21013_data->cs_gpiod);
input_unregister_device(bu21013_data->in_dev);
regulator_disable(bu21013_data->regulator);
regulator_put(bu21013_data->regulator);
+ gpiod_put(bu21013_data->int_gpiod);
+
kfree(bu21013_data);
return 0;
@@ -11,8 +11,6 @@
* struct bu21013_platform_device - Handle the platform data
* @touch_x_max: touch x max
* @touch_y_max: touch y max
- * @cs_pin: chip select pin
- * @touch_pin: touch gpio pin
* @ext_clk: external clock flag
* @x_flip: x flip flag
* @y_flip: y flip flag
@@ -23,8 +21,6 @@
struct bu21013_platform_device {
int touch_x_max;
int touch_y_max;
- unsigned int cs_pin;
- unsigned int touch_pin;
bool ext_clk;
bool x_flip;
bool y_flip;