* [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse
@ 2017-09-25 16:34 Linus Walleij
2017-09-25 16:34 ` [PATCH 2/5 v2] input: mouse: Rename GPIO mouse variables Linus Walleij
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Linus Walleij @ 2017-09-25 16:34 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Hans-Christian Noren Egtvedt, Linus Walleij
This is not used much: git grep gpio_mouse_platform_data shows
that absolutely nothing in the kernel defines this platform
data.
It could be argued that the driver should be deleted. But that
is a bit harsh I think since it seems generally useful. So
this patch starts a series which repurposes it to be used with
hardware nodes from device tree or ACPI.
This first patch simply localize the platform data header and
allocates a dummy platform data.
Yes: this patch leaves the driver in a pretty useless state,
but since nothing is instantiating this driver, it doesn't
make it more useless than it already is. Later patches makes
use of the driver.
Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Collect Hand-Christian's ACK
---
drivers/input/mouse/gpio_mouse.c | 59 +++++++++++++++++++++++++++++++++-----
include/linux/gpio_mouse.h | 61 ----------------------------------------
2 files changed, 52 insertions(+), 68 deletions(-)
delete mode 100644 include/linux/gpio_mouse.h
diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c
index ced07391304b..dcaba1e4fffb 100644
--- a/drivers/input/mouse/gpio_mouse.c
+++ b/drivers/input/mouse/gpio_mouse.c
@@ -12,8 +12,54 @@
#include <linux/platform_device.h>
#include <linux/input-polldev.h>
#include <linux/gpio.h>
-#include <linux/gpio_mouse.h>
+#define GPIO_MOUSE_POLARITY_ACT_HIGH 0x00
+#define GPIO_MOUSE_POLARITY_ACT_LOW 0x01
+
+#define GPIO_MOUSE_PIN_UP 0
+#define GPIO_MOUSE_PIN_DOWN 1
+#define GPIO_MOUSE_PIN_LEFT 2
+#define GPIO_MOUSE_PIN_RIGHT 3
+#define GPIO_MOUSE_PIN_BLEFT 4
+#define GPIO_MOUSE_PIN_BMIDDLE 5
+#define GPIO_MOUSE_PIN_BRIGHT 6
+#define GPIO_MOUSE_PIN_MAX 7
+
+/**
+ * struct gpio_mouse_platform_data
+ * @scan_ms: integer in ms specifying the scan periode.
+ * @polarity: Pin polarity, active high or low.
+ * @up: GPIO line for up value.
+ * @down: GPIO line for down value.
+ * @left: GPIO line for left value.
+ * @right: GPIO line for right value.
+ * @bleft: GPIO line for left button.
+ * @bmiddle: GPIO line for middle button.
+ * @bright: GPIO line for right button.
+ * @pins: GPIO line numbers used for the mouse.
+ *
+ * This struct must be added to the platform_device in the board code.
+ * It is used by the gpio_mouse driver to setup GPIO lines and to
+ * calculate mouse movement.
+ */
+struct gpio_mouse_platform_data {
+ int scan_ms;
+ int polarity;
+
+ union {
+ struct {
+ int up;
+ int down;
+ int left;
+ int right;
+
+ int bleft;
+ int bmiddle;
+ int bright;
+ };
+ int pins[GPIO_MOUSE_PIN_MAX];
+ };
+};
/*
* Timer function which is run every scan_ms ms when the device is opened.
@@ -47,17 +93,16 @@ static void gpio_mouse_scan(struct input_polled_dev *dev)
static int gpio_mouse_probe(struct platform_device *pdev)
{
- struct gpio_mouse_platform_data *pdata = dev_get_platdata(&pdev->dev);
+ struct device *dev = &pdev->dev;
+ struct gpio_mouse_platform_data *pdata;
struct input_polled_dev *input_poll;
struct input_dev *input;
int pin, i;
int error;
- if (!pdata) {
- dev_err(&pdev->dev, "no platform data\n");
- error = -ENXIO;
- goto out;
- }
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return -ENOMEM;
if (pdata->scan_ms < 0) {
dev_err(&pdev->dev, "invalid scan time\n");
diff --git a/include/linux/gpio_mouse.h b/include/linux/gpio_mouse.h
deleted file mode 100644
index 44ed7aa14d85..000000000000
--- a/include/linux/gpio_mouse.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Driver for simulating a mouse on GPIO lines.
- *
- * Copyright (C) 2007 Atmel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _GPIO_MOUSE_H
-#define _GPIO_MOUSE_H
-
-#define GPIO_MOUSE_POLARITY_ACT_HIGH 0x00
-#define GPIO_MOUSE_POLARITY_ACT_LOW 0x01
-
-#define GPIO_MOUSE_PIN_UP 0
-#define GPIO_MOUSE_PIN_DOWN 1
-#define GPIO_MOUSE_PIN_LEFT 2
-#define GPIO_MOUSE_PIN_RIGHT 3
-#define GPIO_MOUSE_PIN_BLEFT 4
-#define GPIO_MOUSE_PIN_BMIDDLE 5
-#define GPIO_MOUSE_PIN_BRIGHT 6
-#define GPIO_MOUSE_PIN_MAX 7
-
-/**
- * struct gpio_mouse_platform_data
- * @scan_ms: integer in ms specifying the scan periode.
- * @polarity: Pin polarity, active high or low.
- * @up: GPIO line for up value.
- * @down: GPIO line for down value.
- * @left: GPIO line for left value.
- * @right: GPIO line for right value.
- * @bleft: GPIO line for left button.
- * @bmiddle: GPIO line for middle button.
- * @bright: GPIO line for right button.
- *
- * This struct must be added to the platform_device in the board code.
- * It is used by the gpio_mouse driver to setup GPIO lines and to
- * calculate mouse movement.
- */
-struct gpio_mouse_platform_data {
- int scan_ms;
- int polarity;
-
- union {
- struct {
- int up;
- int down;
- int left;
- int right;
-
- int bleft;
- int bmiddle;
- int bright;
- };
- int pins[GPIO_MOUSE_PIN_MAX];
- };
-};
-
-#endif /* _GPIO_MOUSE_H */
--
2.13.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/5 v2] input: mouse: Rename GPIO mouse variables
2017-09-25 16:34 [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse Linus Walleij
@ 2017-09-25 16:34 ` Linus Walleij
[not found] ` <20170925163430.22397-1-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2017-09-25 16:34 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Hans-Christian Noren Egtvedt, Linus Walleij
Use more apropriate names for the "platform data" which is
now just a simple state container for the GPIO mouse.
Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Collect Hand-Christian's ACK.
---
drivers/input/mouse/gpio_mouse.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c
index dcaba1e4fffb..d1914bb3531f 100644
--- a/drivers/input/mouse/gpio_mouse.c
+++ b/drivers/input/mouse/gpio_mouse.c
@@ -26,7 +26,7 @@
#define GPIO_MOUSE_PIN_MAX 7
/**
- * struct gpio_mouse_platform_data
+ * struct gpio_mouse
* @scan_ms: integer in ms specifying the scan periode.
* @polarity: Pin polarity, active high or low.
* @up: GPIO line for up value.
@@ -42,7 +42,7 @@
* It is used by the gpio_mouse driver to setup GPIO lines and to
* calculate mouse movement.
*/
-struct gpio_mouse_platform_data {
+struct gpio_mouse {
int scan_ms;
int polarity;
@@ -67,7 +67,7 @@ struct gpio_mouse_platform_data {
*/
static void gpio_mouse_scan(struct input_polled_dev *dev)
{
- struct gpio_mouse_platform_data *gpio = dev->private;
+ struct gpio_mouse *gpio = dev->private;
struct input_dev *input = dev->input;
int x, y;
@@ -94,24 +94,24 @@ static void gpio_mouse_scan(struct input_polled_dev *dev)
static int gpio_mouse_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
- struct gpio_mouse_platform_data *pdata;
+ struct gpio_mouse *gmouse;
struct input_polled_dev *input_poll;
struct input_dev *input;
int pin, i;
int error;
- pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
- if (!pdata)
+ gmouse = devm_kzalloc(dev, sizeof(*gmouse), GFP_KERNEL);
+ if (!gmouse)
return -ENOMEM;
- if (pdata->scan_ms < 0) {
+ if (gmouse->scan_ms < 0) {
dev_err(&pdev->dev, "invalid scan time\n");
error = -EINVAL;
goto out;
}
for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) {
- pin = pdata->pins[i];
+ pin = gmouse->pins[i];
if (pin < 0) {
@@ -148,9 +148,9 @@ static int gpio_mouse_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, input_poll);
/* set input-polldev handlers */
- input_poll->private = pdata;
+ input_poll->private = gmouse;
input_poll->poll = gpio_mouse_scan;
- input_poll->poll_interval = pdata->scan_ms;
+ input_poll->poll_interval = gmouse->scan_ms;
input = input_poll->input;
input->name = pdev->name;
@@ -159,11 +159,11 @@ static int gpio_mouse_probe(struct platform_device *pdev)
input_set_capability(input, EV_REL, REL_X);
input_set_capability(input, EV_REL, REL_Y);
- if (pdata->bleft >= 0)
+ if (gmouse->bleft >= 0)
input_set_capability(input, EV_KEY, BTN_LEFT);
- if (pdata->bmiddle >= 0)
+ if (gmouse->bmiddle >= 0)
input_set_capability(input, EV_KEY, BTN_MIDDLE);
- if (pdata->bright >= 0)
+ if (gmouse->bright >= 0)
input_set_capability(input, EV_KEY, BTN_RIGHT);
error = input_register_polled_device(input_poll);
@@ -173,10 +173,10 @@ static int gpio_mouse_probe(struct platform_device *pdev)
}
dev_dbg(&pdev->dev, "%d ms scan time, buttons: %s%s%s\n",
- pdata->scan_ms,
- pdata->bleft < 0 ? "" : "left ",
- pdata->bmiddle < 0 ? "" : "middle ",
- pdata->bright < 0 ? "" : "right");
+ gmouse->scan_ms,
+ gmouse->bleft < 0 ? "" : "left ",
+ gmouse->bmiddle < 0 ? "" : "middle ",
+ gmouse->bright < 0 ? "" : "right");
return 0;
@@ -185,7 +185,7 @@ static int gpio_mouse_probe(struct platform_device *pdev)
out_free_gpios:
while (--i >= 0) {
- pin = pdata->pins[i];
+ pin = gmouse->pins[i];
if (pin)
gpio_free(pin);
}
@@ -196,14 +196,14 @@ static int gpio_mouse_probe(struct platform_device *pdev)
static int gpio_mouse_remove(struct platform_device *pdev)
{
struct input_polled_dev *input = platform_get_drvdata(pdev);
- struct gpio_mouse_platform_data *pdata = input->private;
+ struct gpio_mouse *gmouse = input->private;
int pin, i;
input_unregister_polled_device(input);
input_free_polled_device(input);
for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) {
- pin = pdata->pins[i];
+ pin = gmouse->pins[i];
if (pin >= 0)
gpio_free(pin);
}
--
2.13.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/5 v2] input: mouse: Add DT bindings for GPIO mice
[not found] ` <20170925163430.22397-1-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
@ 2017-09-25 16:34 ` Linus Walleij
2017-09-26 16:54 ` Dmitry Torokhov
2017-10-05 20:23 ` Rob Herring
0 siblings, 2 replies; 9+ messages in thread
From: Linus Walleij @ 2017-09-25 16:34 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA
Cc: Hans-Christian Noren Egtvedt, Linus Walleij,
devicetree-u79uwXL29TY76Z2rM5mHXA
This adds DT bindings for simple mice attached to GPIO lines.
As the properties are very general and pertains to all mice I
can think of, we use very generic names for the 4-7 GPIO lines,
"up", "down" etc.
Acked-by: Hans-Christian Noren Egtvedt <egtvedt-BrfabpQBY5qlHtIdYg32fQ@public.gmane.org>
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Signed-off-by: Linus Walleij <linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
ChangeLog v1->v2:
- Collect Hand-Christian's ACK
- Uses 5-7 lines rather than 4-7 lines
- Add suffix "-ms" to the scan interval property
- Fix compatible string in the example
---
.../devicetree/bindings/input/gpio-mouse.txt | 32 ++++++++++++++++++++++
1 file changed, 32 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/gpio-mouse.txt
diff --git a/Documentation/devicetree/bindings/input/gpio-mouse.txt b/Documentation/devicetree/bindings/input/gpio-mouse.txt
new file mode 100644
index 000000000000..519510a11af9
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/gpio-mouse.txt
@@ -0,0 +1,32 @@
+Device-Tree bindings for GPIO attached mice
+
+This simply uses standard GPIO handles to define a simple mouse connected
+to 5-7 GPIO lines.
+
+Required properties:
+ - compatible: must be "gpio-mouse"
+ - scan-interval-ms: The scanning interval in milliseconds
+ - up-gpios: GPIO line phandle to the line indicating "up"
+ - down-gpios: GPIO line phandle to the line indicating "down"
+ - left-gpios: GPIO line phandle to the line indicating "left"
+ - right-gpios: GPIO line phandle to the line indicating "right"
+
+Optional properties:
+ - button-left-gpios: GPIO line handle to the left mouse button
+ - button-middle-gpios: GPIO line handle to the middle mouse button
+ - button-right-gpios: GPIO line handle to the right mouse button
+Example:
+
+#include <dt-bindings/gpio/gpio.h>
+
+gpio-mouse {
+ compatible = "gpio-mouse";
+ scan-interval-ms = <50>;
+ up-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
+ down-gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
+ left-gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+ right-gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
+ button-left-gpios = <&gpio0 4 GPIO_ACTIVE_LOW>;
+ button-middle-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
+ button-right-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
+};
--
2.13.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/5 v2] input: mouse: Convert GPIO mouse to use descriptors
2017-09-25 16:34 [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse Linus Walleij
2017-09-25 16:34 ` [PATCH 2/5 v2] input: mouse: Rename GPIO mouse variables Linus Walleij
[not found] ` <20170925163430.22397-1-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
@ 2017-09-25 16:34 ` Linus Walleij
2017-09-25 16:34 ` [PATCH 5/5 v2] input: mouse: Add device tree probing to GPIO mouse Linus Walleij
2017-10-16 8:17 ` [PATCH 1/5 v2] input: mouse: Kill off platform data for " Linus Walleij
4 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2017-09-25 16:34 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Hans-Christian Noren Egtvedt, Linus Walleij
This converts the GPIO mouse to use descriptors and
fwnode properties. The polarity settings go out the window
since GPIO descriptor already know about polarity so this
should be configured in device tree or ACPI or similar.
Set scanning interval by default to 50ms if not found as
a property on the device.
Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Collect Hans-Christian's ACK
- Use devm_gpiod_get_optional() on the buttons.
- Check button optional descriptors with IS_ERR() and
handle errors properly.
- If a button gpiod is !NULL it is valid
- Since we are using devm_* to allocate the input device,
the .remove() function is not needed at all, so removed
it.
---
drivers/input/mouse/gpio_mouse.c | 193 ++++++++++++++-------------------------
1 file changed, 69 insertions(+), 124 deletions(-)
diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c
index d1914bb3531f..4f3c9ca7b821 100644
--- a/drivers/input/mouse/gpio_mouse.c
+++ b/drivers/input/mouse/gpio_mouse.c
@@ -2,6 +2,7 @@
* Driver for simulating a mouse on GPIO lines.
*
* Copyright (C) 2007 Atmel Corporation
+ * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -11,24 +12,12 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/input-polldev.h>
-#include <linux/gpio.h>
-
-#define GPIO_MOUSE_POLARITY_ACT_HIGH 0x00
-#define GPIO_MOUSE_POLARITY_ACT_LOW 0x01
-
-#define GPIO_MOUSE_PIN_UP 0
-#define GPIO_MOUSE_PIN_DOWN 1
-#define GPIO_MOUSE_PIN_LEFT 2
-#define GPIO_MOUSE_PIN_RIGHT 3
-#define GPIO_MOUSE_PIN_BLEFT 4
-#define GPIO_MOUSE_PIN_BMIDDLE 5
-#define GPIO_MOUSE_PIN_BRIGHT 6
-#define GPIO_MOUSE_PIN_MAX 7
+#include <linux/gpio/consumer.h>
+#include <linux/property.h>
/**
* struct gpio_mouse
- * @scan_ms: integer in ms specifying the scan periode.
- * @polarity: Pin polarity, active high or low.
+ * @scan_ms: the scan interval in milliseconds.
* @up: GPIO line for up value.
* @down: GPIO line for down value.
* @left: GPIO line for left value.
@@ -36,29 +25,20 @@
* @bleft: GPIO line for left button.
* @bmiddle: GPIO line for middle button.
* @bright: GPIO line for right button.
- * @pins: GPIO line numbers used for the mouse.
*
* This struct must be added to the platform_device in the board code.
* It is used by the gpio_mouse driver to setup GPIO lines and to
* calculate mouse movement.
*/
struct gpio_mouse {
- int scan_ms;
- int polarity;
-
- union {
- struct {
- int up;
- int down;
- int left;
- int right;
-
- int bleft;
- int bmiddle;
- int bright;
- };
- int pins[GPIO_MOUSE_PIN_MAX];
- };
+ u32 scan_ms;
+ struct gpio_desc *up;
+ struct gpio_desc *down;
+ struct gpio_desc *left;
+ struct gpio_desc *right;
+ struct gpio_desc *bleft;
+ struct gpio_desc *bmiddle;
+ struct gpio_desc *bright;
};
/*
@@ -71,20 +51,18 @@ static void gpio_mouse_scan(struct input_polled_dev *dev)
struct input_dev *input = dev->input;
int x, y;
- if (gpio->bleft >= 0)
+ if (gpio->bleft)
input_report_key(input, BTN_LEFT,
- gpio_get_value(gpio->bleft) ^ gpio->polarity);
- if (gpio->bmiddle >= 0)
+ gpiod_get_value(gpio->bleft));
+ if (gpio->bmiddle)
input_report_key(input, BTN_MIDDLE,
- gpio_get_value(gpio->bmiddle) ^ gpio->polarity);
- if (gpio->bright >= 0)
+ gpiod_get_value(gpio->bmiddle));
+ if (gpio->bright)
input_report_key(input, BTN_RIGHT,
- gpio_get_value(gpio->bright) ^ gpio->polarity);
+ gpiod_get_value(gpio->bright));
- x = (gpio_get_value(gpio->right) ^ gpio->polarity)
- - (gpio_get_value(gpio->left) ^ gpio->polarity);
- y = (gpio_get_value(gpio->down) ^ gpio->polarity)
- - (gpio_get_value(gpio->up) ^ gpio->polarity);
+ x = gpiod_get_value(gpio->right) - gpiod_get_value(gpio->left);
+ y = gpiod_get_value(gpio->down) - gpiod_get_value(gpio->up);
input_report_rel(input, REL_X, x);
input_report_rel(input, REL_Y, y);
@@ -97,52 +75,51 @@ static int gpio_mouse_probe(struct platform_device *pdev)
struct gpio_mouse *gmouse;
struct input_polled_dev *input_poll;
struct input_dev *input;
- int pin, i;
- int error;
+ int ret;
gmouse = devm_kzalloc(dev, sizeof(*gmouse), GFP_KERNEL);
if (!gmouse)
return -ENOMEM;
- if (gmouse->scan_ms < 0) {
- dev_err(&pdev->dev, "invalid scan time\n");
- error = -EINVAL;
- goto out;
+ /* Assign some default scanning time */
+ ret = device_property_read_u32(dev, "scan-interval-ms",
+ &gmouse->scan_ms);
+ if (ret || (gmouse->scan_ms == 0)) {
+ dev_err(dev, "invalid scan time, set to 50 ms\n");
+ gmouse->scan_ms = 50;
}
- for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) {
- pin = gmouse->pins[i];
-
- if (pin < 0) {
-
- if (i <= GPIO_MOUSE_PIN_RIGHT) {
- /* Mouse direction is required. */
- dev_err(&pdev->dev,
- "missing GPIO for directions\n");
- error = -EINVAL;
- goto out_free_gpios;
- }
-
- if (i == GPIO_MOUSE_PIN_BLEFT)
- dev_dbg(&pdev->dev, "no left button defined\n");
-
- } else {
- error = gpio_request(pin, "gpio_mouse");
- if (error) {
- dev_err(&pdev->dev, "fail %d pin (%d idx)\n",
- pin, i);
- goto out_free_gpios;
- }
-
- gpio_direction_input(pin);
- }
- }
-
- input_poll = input_allocate_polled_device();
+ /*
+ * These are compulsory GPIOs so bail out if any of them are
+ * not found.
+ */
+ gmouse->up = devm_gpiod_get(dev, "up", GPIOD_IN);
+ if (IS_ERR(gmouse->up))
+ return PTR_ERR(gmouse->up);
+ gmouse->down = devm_gpiod_get(dev, "down", GPIOD_IN);
+ if (IS_ERR(gmouse->down))
+ return PTR_ERR(gmouse->down);
+ gmouse->left = devm_gpiod_get(dev, "left", GPIOD_IN);
+ if (IS_ERR(gmouse->left))
+ return PTR_ERR(gmouse->left);
+ gmouse->right = devm_gpiod_get(dev, "right", GPIOD_IN);
+ if (IS_ERR(gmouse->right))
+ return PTR_ERR(gmouse->right);
+
+ gmouse->bleft = devm_gpiod_get_optional(dev, "button-left", GPIOD_IN);
+ if (IS_ERR(gmouse->bleft))
+ return PTR_ERR(gmouse->bleft);
+ gmouse->bmiddle = devm_gpiod_get_optional(dev, "button-middle", GPIOD_IN);
+ if (IS_ERR(gmouse->bmiddle))
+ return PTR_ERR(gmouse->bmiddle);
+ gmouse->bright = devm_gpiod_get_optional(dev, "button-right", GPIOD_IN);
+ if (IS_ERR(gmouse->bright))
+ return PTR_ERR(gmouse->bright);
+
+ input_poll = devm_input_allocate_polled_device(dev);
if (!input_poll) {
- dev_err(&pdev->dev, "not enough memory for input device\n");
- error = -ENOMEM;
- goto out_free_gpios;
+ dev_err(dev, "not enough memory for input device\n");
+ return -ENOMEM;
}
platform_set_drvdata(pdev, input_poll);
@@ -159,61 +136,30 @@ static int gpio_mouse_probe(struct platform_device *pdev)
input_set_capability(input, EV_REL, REL_X);
input_set_capability(input, EV_REL, REL_Y);
- if (gmouse->bleft >= 0)
+ if (gmouse->bleft)
input_set_capability(input, EV_KEY, BTN_LEFT);
- if (gmouse->bmiddle >= 0)
+ if (gmouse->bmiddle)
input_set_capability(input, EV_KEY, BTN_MIDDLE);
- if (gmouse->bright >= 0)
+ if (gmouse->bright)
input_set_capability(input, EV_KEY, BTN_RIGHT);
- error = input_register_polled_device(input_poll);
- if (error) {
- dev_err(&pdev->dev, "could not register input device\n");
- goto out_free_polldev;
- }
-
- dev_dbg(&pdev->dev, "%d ms scan time, buttons: %s%s%s\n",
- gmouse->scan_ms,
- gmouse->bleft < 0 ? "" : "left ",
- gmouse->bmiddle < 0 ? "" : "middle ",
- gmouse->bright < 0 ? "" : "right");
-
- return 0;
-
- out_free_polldev:
- input_free_polled_device(input_poll);
-
- out_free_gpios:
- while (--i >= 0) {
- pin = gmouse->pins[i];
- if (pin)
- gpio_free(pin);
+ ret = input_register_polled_device(input_poll);
+ if (ret) {
+ dev_err(dev, "could not register input device\n");
+ return ret;
}
- out:
- return error;
-}
-static int gpio_mouse_remove(struct platform_device *pdev)
-{
- struct input_polled_dev *input = platform_get_drvdata(pdev);
- struct gpio_mouse *gmouse = input->private;
- int pin, i;
-
- input_unregister_polled_device(input);
- input_free_polled_device(input);
-
- for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) {
- pin = gmouse->pins[i];
- if (pin >= 0)
- gpio_free(pin);
- }
+ dev_dbg(dev, "%d ms scan time, buttons: %s%s%s\n",
+ gmouse->scan_ms,
+ gmouse->bleft ? "" : "left ",
+ gmouse->bmiddle ? "" : "middle ",
+ gmouse->bright ? "" : "right");
return 0;
}
static struct platform_driver gpio_mouse_device_driver = {
.probe = gpio_mouse_probe,
- .remove = gpio_mouse_remove,
.driver = {
.name = "gpio_mouse",
}
@@ -224,4 +170,3 @@ MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");
MODULE_DESCRIPTION("GPIO mouse driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:gpio_mouse"); /* work with hotplug and coldplug */
-
--
2.13.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/5 v2] input: mouse: Add device tree probing to GPIO mouse
2017-09-25 16:34 [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse Linus Walleij
` (2 preceding siblings ...)
2017-09-25 16:34 ` [PATCH 4/5 v2] input: mouse: Convert GPIO mouse to use descriptors Linus Walleij
@ 2017-09-25 16:34 ` Linus Walleij
2017-10-16 8:17 ` [PATCH 1/5 v2] input: mouse: Kill off platform data for " Linus Walleij
4 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2017-09-25 16:34 UTC (permalink / raw)
To: Dmitry Torokhov, linux-input; +Cc: Hans-Christian Noren Egtvedt, Linus Walleij
This makes the GPIO mouse probe nicely from the device tree
if found in a tree. As the driver uses device properties it
can easily be amended to also probe from ACPI devices.
Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Collect Hans-Christian's ACK
- Rebase on the other changes.
---
drivers/input/mouse/gpio_mouse.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c
index 4f3c9ca7b821..deefe0df56b4 100644
--- a/drivers/input/mouse/gpio_mouse.c
+++ b/drivers/input/mouse/gpio_mouse.c
@@ -14,6 +14,7 @@
#include <linux/input-polldev.h>
#include <linux/gpio/consumer.h>
#include <linux/property.h>
+#include <linux/of.h>
/**
* struct gpio_mouse
@@ -158,10 +159,17 @@ static int gpio_mouse_probe(struct platform_device *pdev)
return 0;
}
+static const struct of_device_id gpio_mouse_of_match[] = {
+ { .compatible = "gpio-mouse", },
+ { },
+};
+MODULE_DEVICE_TABLE(of, gpio_mouse_of_match);
+
static struct platform_driver gpio_mouse_device_driver = {
.probe = gpio_mouse_probe,
.driver = {
.name = "gpio_mouse",
+ .of_match_table = gpio_mouse_of_match,
}
};
module_platform_driver(gpio_mouse_device_driver);
--
2.13.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 3/5 v2] input: mouse: Add DT bindings for GPIO mice
2017-09-25 16:34 ` [PATCH 3/5 v2] input: mouse: Add DT bindings for GPIO mice Linus Walleij
@ 2017-09-26 16:54 ` Dmitry Torokhov
2017-10-05 20:23 ` Rob Herring
1 sibling, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2017-09-26 16:54 UTC (permalink / raw)
To: Linus Walleij, Rob Herring
Cc: linux-input, Hans-Christian Noren Egtvedt, devicetree
On Mon, Sep 25, 2017 at 06:34:28PM +0200, Linus Walleij wrote:
> This adds DT bindings for simple mice attached to GPIO lines.
> As the properties are very general and pertains to all mice I
> can think of, we use very generic names for the 4-7 GPIO lines,
> "up", "down" etc.
>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
> Cc: devicetree@vger.kernel.org
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Adding Rob. I am good with the patches unless there is objection to the
binding...
> ---
> ChangeLog v1->v2:
> - Collect Hand-Christian's ACK
> - Uses 5-7 lines rather than 4-7 lines
> - Add suffix "-ms" to the scan interval property
> - Fix compatible string in the example
> ---
> .../devicetree/bindings/input/gpio-mouse.txt | 32 ++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/input/gpio-mouse.txt
>
> diff --git a/Documentation/devicetree/bindings/input/gpio-mouse.txt b/Documentation/devicetree/bindings/input/gpio-mouse.txt
> new file mode 100644
> index 000000000000..519510a11af9
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/gpio-mouse.txt
> @@ -0,0 +1,32 @@
> +Device-Tree bindings for GPIO attached mice
> +
> +This simply uses standard GPIO handles to define a simple mouse connected
> +to 5-7 GPIO lines.
> +
> +Required properties:
> + - compatible: must be "gpio-mouse"
> + - scan-interval-ms: The scanning interval in milliseconds
> + - up-gpios: GPIO line phandle to the line indicating "up"
> + - down-gpios: GPIO line phandle to the line indicating "down"
> + - left-gpios: GPIO line phandle to the line indicating "left"
> + - right-gpios: GPIO line phandle to the line indicating "right"
> +
> +Optional properties:
> + - button-left-gpios: GPIO line handle to the left mouse button
> + - button-middle-gpios: GPIO line handle to the middle mouse button
> + - button-right-gpios: GPIO line handle to the right mouse button
> +Example:
> +
> +#include <dt-bindings/gpio/gpio.h>
> +
> +gpio-mouse {
> + compatible = "gpio-mouse";
> + scan-interval-ms = <50>;
> + up-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
> + down-gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
> + left-gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
> + right-gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
> + button-left-gpios = <&gpio0 4 GPIO_ACTIVE_LOW>;
> + button-middle-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
> + button-right-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
> +};
> --
> 2.13.5
>
--
Dmitry
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/5 v2] input: mouse: Add DT bindings for GPIO mice
2017-09-25 16:34 ` [PATCH 3/5 v2] input: mouse: Add DT bindings for GPIO mice Linus Walleij
2017-09-26 16:54 ` Dmitry Torokhov
@ 2017-10-05 20:23 ` Rob Herring
1 sibling, 0 replies; 9+ messages in thread
From: Rob Herring @ 2017-10-05 20:23 UTC (permalink / raw)
To: Linus Walleij
Cc: Dmitry Torokhov, linux-input, Hans-Christian Noren Egtvedt,
devicetree
On Mon, Sep 25, 2017 at 06:34:28PM +0200, Linus Walleij wrote:
> This adds DT bindings for simple mice attached to GPIO lines.
> As the properties are very general and pertains to all mice I
> can think of, we use very generic names for the 4-7 GPIO lines,
> "up", "down" etc.
>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
> Cc: devicetree@vger.kernel.org
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v1->v2:
> - Collect Hand-Christian's ACK
> - Uses 5-7 lines rather than 4-7 lines
> - Add suffix "-ms" to the scan interval property
> - Fix compatible string in the example
> ---
> .../devicetree/bindings/input/gpio-mouse.txt | 32 ++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/input/gpio-mouse.txt
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse
2017-09-25 16:34 [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse Linus Walleij
` (3 preceding siblings ...)
2017-09-25 16:34 ` [PATCH 5/5 v2] input: mouse: Add device tree probing to GPIO mouse Linus Walleij
@ 2017-10-16 8:17 ` Linus Walleij
2017-10-19 23:29 ` Dmitry Torokhov
4 siblings, 1 reply; 9+ messages in thread
From: Linus Walleij @ 2017-10-16 8:17 UTC (permalink / raw)
To: Dmitry Torokhov, Linux Input; +Cc: Hans-Christian Noren Egtvedt, Linus Walleij
On Mon, Sep 25, 2017 at 6:34 PM, Linus Walleij <linus.walleij@linaro.org> wrote:
> This is not used much: git grep gpio_mouse_platform_data shows
> that absolutely nothing in the kernel defines this platform
> data.
>
> It could be argued that the driver should be deleted. But that
> is a bit harsh I think since it seems generally useful. So
> this patch starts a series which repurposes it to be used with
> hardware nodes from device tree or ACPI.
>
> This first patch simply localize the platform data header and
> allocates a dummy platform data.
>
> Yes: this patch leaves the driver in a pretty useless state,
> but since nothing is instantiating this driver, it doesn't
> make it more useless than it already is. Later patches makes
> use of the driver.
>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v1->v2:
> - Collect Hand-Christian's ACK
Dmitry: with Rob's ACK arrvied on the DT bindings, can this series
be applied?
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse
2017-10-16 8:17 ` [PATCH 1/5 v2] input: mouse: Kill off platform data for " Linus Walleij
@ 2017-10-19 23:29 ` Dmitry Torokhov
0 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2017-10-19 23:29 UTC (permalink / raw)
To: Linus Walleij; +Cc: Linux Input, Hans-Christian Noren Egtvedt
On Mon, Oct 16, 2017 at 10:17:53AM +0200, Linus Walleij wrote:
> On Mon, Sep 25, 2017 at 6:34 PM, Linus Walleij <linus.walleij@linaro.org> wrote:
>
> > This is not used much: git grep gpio_mouse_platform_data shows
> > that absolutely nothing in the kernel defines this platform
> > data.
> >
> > It could be argued that the driver should be deleted. But that
> > is a bit harsh I think since it seems generally useful. So
> > this patch starts a series which repurposes it to be used with
> > hardware nodes from device tree or ACPI.
> >
> > This first patch simply localize the platform data header and
> > allocates a dummy platform data.
> >
> > Yes: this patch leaves the driver in a pretty useless state,
> > but since nothing is instantiating this driver, it doesn't
> > make it more useless than it already is. Later patches makes
> > use of the driver.
> >
> > Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> > ---
> > ChangeLog v1->v2:
> > - Collect Hand-Christian's ACK
>
> Dmitry: with Rob's ACK arrvied on the DT bindings, can this series
> be applied?
Queued for 4.15, thank you.
--
Dmitry
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-10-19 23:29 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-25 16:34 [PATCH 1/5 v2] input: mouse: Kill off platform data for GPIO mouse Linus Walleij
2017-09-25 16:34 ` [PATCH 2/5 v2] input: mouse: Rename GPIO mouse variables Linus Walleij
[not found] ` <20170925163430.22397-1-linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2017-09-25 16:34 ` [PATCH 3/5 v2] input: mouse: Add DT bindings for GPIO mice Linus Walleij
2017-09-26 16:54 ` Dmitry Torokhov
2017-10-05 20:23 ` Rob Herring
2017-09-25 16:34 ` [PATCH 4/5 v2] input: mouse: Convert GPIO mouse to use descriptors Linus Walleij
2017-09-25 16:34 ` [PATCH 5/5 v2] input: mouse: Add device tree probing to GPIO mouse Linus Walleij
2017-10-16 8:17 ` [PATCH 1/5 v2] input: mouse: Kill off platform data for " Linus Walleij
2017-10-19 23:29 ` Dmitry Torokhov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).