diff mbox

input: keyboard: Add devicetree support for lm8333

Message ID 1477595854-9059-1-git-send-email-gordan.markus@gmail.com
State Changes Requested, archived
Headers show

Commit Message

Gordan Markus Oct. 27, 2016, 7:17 p.m. UTC
This adds LM8333 devicetree parsing for the keypad part.
Optional properties to specify the keypad driver active
time and debounce time.

Signed-off-by: Gordan Markuš <gordan.markus@gmail.com>
---
 .../devicetree/bindings/input/ti,lm8333.txt        | 45 ++++++++++++++++++
 drivers/input/keyboard/lm8333.c                    | 54 ++++++++++++++++++++++
 2 files changed, 99 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/input/ti,lm8333.txt

Comments

Rob Herring Oct. 31, 2016, 5:32 a.m. UTC | #1
On Thu, Oct 27, 2016 at 09:17:34PM +0200, Gordan Markus wrote:
> This adds LM8333 devicetree parsing for the keypad part.
> Optional properties to specify the keypad driver active
> time and debounce time.
> 
> Signed-off-by: Gordan Markuš <gordan.markus@gmail.com>
> ---
>  .../devicetree/bindings/input/ti,lm8333.txt        | 45 ++++++++++++++++++

It is preferred that bindings be a separate patch.

>  drivers/input/keyboard/lm8333.c                    | 54 ++++++++++++++++++++++
>  2 files changed, 99 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/input/ti,lm8333.txt
> 
> diff --git a/Documentation/devicetree/bindings/input/ti,lm8333.txt b/Documentation/devicetree/bindings/input/ti,lm8333.txt
> new file mode 100644
> index 0000000..4100d48
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/ti,lm8333.txt
> @@ -0,0 +1,45 @@
> +LM8333 Keypad
> +
> +Required properties:
> +- compatible: Compatible property value should be "ti,lm8333".
> +
> +- reg: Physical base address of the peripheral and length of memory mapped
> +  region.
> +
> +- interrupts: The interrupt number for the peripheral.
> +
> +- linux,keymap: The keymap to use
> +	(see Documentation/devicetree/bindings/input/matrix-keymap.txt)
> +
> +Optional properties:
> +- ti,active-time: Specify the time during which the keypad is scanned after
> +	the last key is released, before entering Halt mode.
> +	The active time must be longer than the debounce time.
> +	Default 500 ms.

Add a unit suffix.

> +
> +- ti,debounce-time: Specify the keypad debounce time.
> +	This can be used for reliable scanning of keyboards with noisy contacts.
> +	Default 10 ms.

Don't we have a common property for this?

> +
> +Example:
> +input {
> +	compatible = "ti,lm8333";
> +	reg = <0x51>;
> +	interrupts = <5>;
> +
> +	ti,active-time = <750>;
> +	ti,debounce-time = <20>;
> +
> +	linux,keymap = <
> +			0x0001001e
> +			0x00020030
> +			0x0003002e
> +			0x00040020
> +			0x00050012
> +			0x00060021
> +			0x00070022
> +			0x00080023
> +			0x01010017
> +			0x01020024
> +			0x01030025>;
> +};
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Gordan Markus Oct. 31, 2016, 8:37 p.m. UTC | #2
On Mon, 2016-10-31 at 00:32 -0500, Rob Herring wrote:
> On Thu, Oct 27, 2016 at 09:17:34PM +0200, Gordan Markus wrote:
> > This adds LM8333 devicetree parsing for the keypad part.
> > Optional properties to specify the keypad driver active
> > time and debounce time.
> > 
> > Signed-off-by: Gordan Markuš <gordan.markus@gmail.com>
> > ---
> >  .../devicetree/bindings/input/ti,lm8333.txt        | 45 ++++++++++++++++++
> 
> It is preferred that bindings be a separate patch.

Thanks Rob. 
Just to be clear, should I create a new thread with two patches?

> 
> >  drivers/input/keyboard/lm8333.c                    | 54 ++++++++++++++++++++++
> >  2 files changed, 99 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/input/ti,lm8333.txt
> > 
> > diff --git a/Documentation/devicetree/bindings/input/ti,lm8333.txt b/Documentation/devicetree/bindings/input/ti,lm8333.txt
> > new file mode 100644
> > index 0000000..4100d48
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/input/ti,lm8333.txt
> > @@ -0,0 +1,45 @@
> > +LM8333 Keypad
> > +
> > +Required properties:
> > +- compatible: Compatible property value should be "ti,lm8333".
> > +
> > +- reg: Physical base address of the peripheral and length of memory mapped
> > +  region.
> > +
> > +- interrupts: The interrupt number for the peripheral.
> > +
> > +- linux,keymap: The keymap to use
> > +	(see Documentation/devicetree/bindings/input/matrix-keymap.txt)
> > +
> > +Optional properties:
> > +- ti,active-time: Specify the time during which the keypad is scanned after
> > +	the last key is released, before entering Halt mode.
> > +	The active time must be longer than the debounce time.
> > +	Default 500 ms.
> 
> Add a unit suffix.

The property will be renamed to "ti,active-time-ms". 

> 
> > +
> > +- ti,debounce-time: Specify the keypad debounce time.
> > +	This can be used for reliable scanning of keyboards with noisy contacts.
> > +	Default 10 ms.
> 
> Don't we have a common property for this?

There isn't a common property, as far as I can tell.
Different devices have different debounce time properties.

Furthermore, the property should have a unit sufix as well, i.e.
it should be renamed to "ti,debounce-time-ms", right? 

Gordan



--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rob Herring Oct. 31, 2016, 9:33 p.m. UTC | #3
On Mon, Oct 31, 2016 at 3:37 PM, Gordan Markuš <gordan.markus@gmail.com> wrote:
>
> On Mon, 2016-10-31 at 00:32 -0500, Rob Herring wrote:
>> On Thu, Oct 27, 2016 at 09:17:34PM +0200, Gordan Markus wrote:
>> > This adds LM8333 devicetree parsing for the keypad part.
>> > Optional properties to specify the keypad driver active
>> > time and debounce time.
>> >
>> > Signed-off-by: Gordan Markuš <gordan.markus@gmail.com>
>> > ---
>> >  .../devicetree/bindings/input/ti,lm8333.txt        | 45 ++++++++++++++++++
>>
>> It is preferred that bindings be a separate patch.
>
> Thanks Rob.
> Just to be clear, should I create a new thread with two patches?

Considering changes are needed, yes.

>> >  drivers/input/keyboard/lm8333.c                    | 54 ++++++++++++++++++++++
>> >  2 files changed, 99 insertions(+)
>> >  create mode 100644 Documentation/devicetree/bindings/input/ti,lm8333.txt
>> >
>> > diff --git a/Documentation/devicetree/bindings/input/ti,lm8333.txt b/Documentation/devicetree/bindings/input/ti,lm8333.txt
>> > new file mode 100644
>> > index 0000000..4100d48
>> > --- /dev/null
>> > +++ b/Documentation/devicetree/bindings/input/ti,lm8333.txt
>> > @@ -0,0 +1,45 @@
>> > +LM8333 Keypad
>> > +
>> > +Required properties:
>> > +- compatible: Compatible property value should be "ti,lm8333".
>> > +
>> > +- reg: Physical base address of the peripheral and length of memory mapped
>> > +  region.
>> > +
>> > +- interrupts: The interrupt number for the peripheral.
>> > +
>> > +- linux,keymap: The keymap to use
>> > +   (see Documentation/devicetree/bindings/input/matrix-keymap.txt)
>> > +
>> > +Optional properties:
>> > +- ti,active-time: Specify the time during which the keypad is scanned after
>> > +   the last key is released, before entering Halt mode.
>> > +   The active time must be longer than the debounce time.
>> > +   Default 500 ms.
>>
>> Add a unit suffix.
>
> The property will be renamed to "ti,active-time-ms".
>
>>
>> > +
>> > +- ti,debounce-time: Specify the keypad debounce time.
>> > +   This can be used for reliable scanning of keyboards with noisy contacts.
>> > +   Default 10 ms.
>>
>> Don't we have a common property for this?
>
> There isn't a common property, as far as I can tell.
> Different devices have different debounce time properties.

Looks like we have 2 at least: debounce-interval and
debounce-delay-ms. I'd go with the latter as it has units.

And there's lots of other variations. Don't add yet another one.

$ git grep debounce Documentation/devicetree/bindings/input/
Documentation/devicetree/bindings/input/ads7846.txt:
ti,debounce-max                 Max number of additional readings per
Documentation/devicetree/bindings/input/ads7846.txt:
ti,debounce-tol                 Tolerance used for filtering (u16).
Documentation/devicetree/bindings/input/ads7846.txt:
ti,debounce-rep                 Additional consecutive good readings
Documentation/devicetree/bindings/input/ads7846.txt:
ti,pendown-gpio-debounce        Platform specific debounce time for
the
Documentation/devicetree/bindings/input/brcm,bcm-keypad.txt:-
col-debounce-filter-period: The debounce period for the Column filter.
Documentation/devicetree/bindings/input/brcm,bcm-keypad.txt:-
status-debounce-filter-period: The debounce period for the Status
filter.
Documentation/devicetree/bindings/input/brcm,bcm-keypad.txt:
 col-debounce-filter-period = <5>;
Documentation/devicetree/bindings/input/gpio-keys-polled.txt:   -
debounce-interval: Debouncing interval time in milliseconds.
Documentation/devicetree/bindings/input/gpio-keys.txt:  -
debounce-interval: Debouncing interval time in milliseconds.
Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt:-
debounce-delay-ms:     debounce interval in milliseconds
Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt:
 debounce-delay-ms = <5>;
Documentation/devicetree/bindings/input/lpc32xx-key.txt:-
nxp,debounce-delay-ms: Debounce delay in ms
Documentation/devicetree/bindings/input/lpc32xx-key.txt:
 nxp,debounce-delay-ms = <3>;
Documentation/devicetree/bindings/input/nvidia,tegra20-kbc.txt:-
nvidia,debounce-delay-ms: delay in milliseconds per row scan for
debouncing
Documentation/devicetree/bindings/input/nvidia,tegra20-kbc.txt:
nvidia,debounce-delay-ms = <640>;
Documentation/devicetree/bindings/input/pxa27x-keypad.txt:-
marvell,debounce-interval : How long time the key will be
Documentation/devicetree/bindings/input/pxa27x-keypad.txt:  is
debounce interval for direct key and bit[15:0] is debounce
Documentation/devicetree/bindings/input/pxa27x-keypad.txt:
 marvell,debounce-interval = <0x001e001e>;
Documentation/devicetree/bindings/input/qcom,pm8941-pwrkey.txt:- debounce:
Documentation/devicetree/bindings/input/qcom,pm8941-pwrkey.txt:
 debounce = <15625>;
Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt:- debounce:
Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt:
 debounce = <15>;
Documentation/devicetree/bindings/input/qcom,pm8xxx-pwrkey.txt:- debounce:
Documentation/devicetree/bindings/input/qcom,pm8xxx-pwrkey.txt:
 debounce = <15625>;
Documentation/devicetree/bindings/input/st-keyscan.txt:-
st,debounce_us: Debouncing interval time in microseconds
Documentation/devicetree/bindings/input/st-keyscan.txt: st,debounce_us = <5000>;
Documentation/devicetree/bindings/input/stmpe-keypad.txt: -
debounce-interval        : Debouncing interval time in milliseconds
Documentation/devicetree/bindings/input/stmpe-keypad.txt:
 debounce-interval = <64>;
Documentation/devicetree/bindings/input/ti,palmas-pwrbutton.txt:-
ti,palmas-pwron-debounce-milli-seconds: Duration in milliseconds
Documentation/devicetree/bindings/input/ti,palmas-pwrbutton.txt:
         ti,palmas-pwron-debounce-milli-seconds = <15>;
Documentation/devicetree/bindings/input/touchscreen/brcm,iproc-touchscreen.txt:-
debounce_timeout: Each step is 512 us.  Valid 0-255
Documentation/devicetree/bindings/input/touchscreen/brcm,iproc-touchscreen.txt:
        debounce_timeout = <40>;
Documentation/devicetree/bindings/input/touchscreen/fsl-mx25-tcq.txt:
- fsl,pen-debounce-ns: Pen debounce time in nanoseconds.

Rob
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/input/ti,lm8333.txt b/Documentation/devicetree/bindings/input/ti,lm8333.txt
new file mode 100644
index 0000000..4100d48
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/ti,lm8333.txt
@@ -0,0 +1,45 @@ 
+LM8333 Keypad
+
+Required properties:
+- compatible: Compatible property value should be "ti,lm8333".
+
+- reg: Physical base address of the peripheral and length of memory mapped
+  region.
+
+- interrupts: The interrupt number for the peripheral.
+
+- linux,keymap: The keymap to use
+	(see Documentation/devicetree/bindings/input/matrix-keymap.txt)
+
+Optional properties:
+- ti,active-time: Specify the time during which the keypad is scanned after
+	the last key is released, before entering Halt mode.
+	The active time must be longer than the debounce time.
+	Default 500 ms.
+
+- ti,debounce-time: Specify the keypad debounce time.
+	This can be used for reliable scanning of keyboards with noisy contacts.
+	Default 10 ms.
+
+Example:
+input {
+	compatible = "ti,lm8333";
+	reg = <0x51>;
+	interrupts = <5>;
+
+	ti,active-time = <750>;
+	ti,debounce-time = <20>;
+
+	linux,keymap = <
+			0x0001001e
+			0x00020030
+			0x0003002e
+			0x00040020
+			0x00050012
+			0x00060021
+			0x00070022
+			0x00080023
+			0x01010017
+			0x01020024
+			0x01030025>;
+};
diff --git a/drivers/input/keyboard/lm8333.c b/drivers/input/keyboard/lm8333.c
index c717e8f..adb7d64 100644
--- a/drivers/input/keyboard/lm8333.c
+++ b/drivers/input/keyboard/lm8333.c
@@ -128,6 +128,51 @@  static irqreturn_t lm8333_irq_thread(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
+static struct lm8333_platform_data *lm8333_parse_dt(struct i2c_client *client)
+{
+	struct device_node *np = client->dev.of_node;
+	struct lm8333_platform_data *pdata;
+	struct matrix_keymap_data *matrix_data;
+	u32 *keymap;
+	u32 prop;
+	int len;
+
+	pdata = devm_kzalloc(&client->dev, sizeof(pdata),
+				GFP_KERNEL);
+	if (!pdata)
+		return ERR_PTR(-ENOMEM);
+
+	if (!of_property_read_u32(np, "ti,active-time", &prop))
+		pdata->active_time = prop;
+
+	if (!of_property_read_u32(np, "ti,debounce-time", &prop))
+		pdata->debounce_time = prop;
+	else
+		pdata->debounce_time = 10;
+
+	if (!of_get_property(np, "linux,keymap", &prop))
+		len = prop / sizeof(u32);
+	else {
+		dev_err(&client->dev, "no keymap data defined\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	keymap = devm_kzalloc(&client->dev, sizeof(len) * len, GFP_KERNEL);
+	matrix_data = devm_kzalloc(&client->dev, sizeof(matrix_data),
+					GFP_KERNEL);
+	if (!matrix_data || !keymap)
+		return ERR_PTR(-ENOMEM);
+
+	if (!of_property_read_u32_array(np, "linux,keymap", keymap, len)) {
+		matrix_data->keymap_size = len;
+		matrix_data->keymap = keymap;
+
+		pdata->matrix_data = matrix_data;
+	}
+
+	return pdata;
+}
+
 static int lm8333_probe(struct i2c_client *client,
 				  const struct i2c_device_id *id)
 {
@@ -137,6 +182,15 @@  static int lm8333_probe(struct i2c_client *client,
 	struct input_dev *input;
 	int err, active_time;
 
+	if (!pdata && client->dev.of_node) {
+		pdata = lm8333_parse_dt(client);
+		if (IS_ERR(pdata)) {
+			dev_err(&client->dev,
+				"could not parse configuration\n");
+			return IS_ERR(pdata);
+		}
+	}
+
 	if (!pdata)
 		return -EINVAL;