devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 4/5 v2] input: tc3589x-keypad: support probing from device tree
@ 2013-11-12 14:13 Linus Walleij
  2013-11-12 15:30 ` Sebastian Reichel
  0 siblings, 1 reply; 16+ messages in thread
From: Linus Walleij @ 2013-11-12 14:13 UTC (permalink / raw)
  To: devicetree, Samuel Ortiz, Lee Jones
  Cc: linux-kernel, linux-arm-kernel, Mark Rutland, Linus Walleij

Implement device tree probing for the tc3589x keypad driver.
This is modeled on the STMPE keypad driver and tested on the
Ux500 TVK1281618 UIB.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Fix rows/columns binding to read two u32's insead of two
  u8 /bits/ as noted by Mark Rutland.
---
 drivers/input/keyboard/tc3589x-keypad.c | 63 +++++++++++++++++++++++++++++++--
 1 file changed, 61 insertions(+), 2 deletions(-)

diff --git a/drivers/input/keyboard/tc3589x-keypad.c b/drivers/input/keyboard/tc3589x-keypad.c
index 208de7cbb7fa..7b6637d8cfbc 100644
--- a/drivers/input/keyboard/tc3589x-keypad.c
+++ b/drivers/input/keyboard/tc3589x-keypad.c
@@ -297,6 +297,62 @@ static void tc3589x_keypad_close(struct input_dev *input)
 	tc3589x_keypad_disable(keypad);
 }
 
+#ifdef CONFIG_OF
+static const struct tc3589x_keypad_platform_data *
+tc3589x_keypad_of_probe(struct device *dev)
+{
+	struct device_node *np = dev->of_node;
+	struct tc3589x_keypad_platform_data *plat;
+	u32 debounce_ms;
+	int proplen;
+
+	if (!np)
+		return ERR_PTR(-ENODEV);
+
+	plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL);
+	if (!plat)
+		return ERR_PTR(-ENOMEM);
+
+	of_property_read_u32(np, "keypad,num-columns", &plat->kcol);
+	of_property_read_u32(np, "keypad,num-rows", &plat->krow);
+	if (!plat->krow || !plat->kcol ||
+	     plat->krow > TC_KPD_ROWS || plat->kcol > TC_KPD_COLUMNS) {
+		dev_err(dev,
+			"keypad columns/rows not properly specified (%ux%u)\n",
+			plat->kcol, plat->krow);
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (!of_get_property(np, "linux,keymap", &proplen)) {
+		dev_err(dev, "property linux,keymap not found\n");
+		return ERR_PTR(-ENOENT);
+	}
+
+	plat->no_autorepeat = of_property_read_bool(np, "linux,no-autorepeat");
+	plat->enable_wakeup = of_property_read_bool(np, "linux,wakeup");
+
+	/* The custom delay format is ms/16 */
+	of_property_read_u32(np, "debounce-delay-ms", &debounce_ms);
+	if (debounce_ms)
+		plat->debounce_period = debounce_ms * 16;
+	else
+		plat->debounce_period = TC_KPD_DEBOUNCE_PERIOD;
+
+	plat->settle_time = TC_KPD_SETTLE_TIME;
+	/* FIXME: should be property of the IRQ resource? */
+	plat->irqtype = IRQF_TRIGGER_FALLING;
+
+	return plat;
+}
+#else
+static inline const struct tc3589x_keypad_platform_data *
+tc3589x_keypad_of_probe(struct device *dev)
+{
+	return ERR_PTR(-ENODEV);
+}
+#endif
+
+
 static int tc3589x_keypad_probe(struct platform_device *pdev)
 {
 	struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
@@ -307,8 +363,11 @@ static int tc3589x_keypad_probe(struct platform_device *pdev)
 
 	plat = tc3589x->pdata->keypad;
 	if (!plat) {
-		dev_err(&pdev->dev, "invalid keypad platform data\n");
-		return -EINVAL;
+		plat = tc3589x_keypad_of_probe(&pdev->dev);
+		if (IS_ERR(plat)) {
+			dev_err(&pdev->dev, "invalid keypad platform data\n");
+			return PTR_ERR(plat);
+		}
 	}
 
 	irq = platform_get_irq(pdev, 0);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2013-12-02 13:03 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-12 14:13 [PATCH 4/5 v2] input: tc3589x-keypad: support probing from device tree Linus Walleij
2013-11-12 15:30 ` Sebastian Reichel
2013-11-12 17:06   ` Linus Walleij
     [not found]     ` <CACRpkdb_bryGJo7CKGP5tj3RFGv=Gh+Q5m9ucVKqJ068tjPC2g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-11-12 20:05       ` Sebastian Reichel
     [not found]         ` <20131112200514.GA15413-SfvFxonMDyemK9LvCR3Hrw@public.gmane.org>
2013-11-12 20:11           ` Linus Walleij
     [not found]             ` <CACRpkdaAaLjm_b+OLj3tobxBN8YGUcTPnXJ=qtBqd02=FTxhjQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-11-12 20:40               ` Sebastian Reichel
2013-11-13 14:24                 ` Mark Rutland
     [not found]                   ` <20131113142406.GH21713-NuALmloUBlrZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2013-11-13 23:29                     ` Sebastian Reichel
     [not found]                       ` <20131113232923.GB13669-SfvFxonMDyemK9LvCR3Hrw@public.gmane.org>
2013-11-14 11:12                         ` Mark Rutland
2013-11-17 18:28                     ` Pavel Machek
     [not found]                       ` <20131117182852.GC30012-5NIqAleC692hcjWhqY66xCZi+YwRKgec@public.gmane.org>
2013-12-02 11:37                         ` Mark Rutland
     [not found]                           ` <20131202113720.GF12952-NuALmloUBlrZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2013-12-02 11:54                             ` Pavel Machek
2013-12-02 12:08                               ` Mark Rutland
     [not found]                                 ` <20131202120845.GI12952-NuALmloUBlrZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2013-12-02 13:03                                   ` Pavel Machek
     [not found]                 ` <20131112204013.GA17674-SfvFxonMDyemK9LvCR3Hrw@public.gmane.org>
2013-11-17 18:28                   ` Pavel Machek
     [not found]                     ` <20131117182845.GB30012-5NIqAleC692hcjWhqY66xCZi+YwRKgec@public.gmane.org>
2013-11-17 19:03                       ` Sebastian Reichel

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).