From patchwork Wed Feb 20 17:24:38 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 2168541 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 71A4FDF230 for ; Wed, 20 Feb 2013 17:26:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933973Ab3BTRZ5 (ORCPT ); Wed, 20 Feb 2013 12:25:57 -0500 Received: from mail-gg0-f202.google.com ([209.85.161.202]:34577 "EHLO mail-gg0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933938Ab3BTRZy (ORCPT ); Wed, 20 Feb 2013 12:25:54 -0500 Received: by mail-gg0-f202.google.com with SMTP id l4so529934ggi.1 for ; Wed, 20 Feb 2013 09:25:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=Sm1DtjpwrnSe1z0I1FRrF0EQrnYKt+aC5hufFkiu+i8=; b=jWkQWUghamrAFyR11jLvaJJvNblCMSsmZuSh/Jc4lywd2nuTHNYrucJdu80YSYYXAq kTY6Igsh0rcIuPEIzC8SF88AcCiY+Ps8rII4v9T7AGsGVQB7wEKWwaScimmCEmtIDICF HKHZkKAt6ge4dCOYX+LZ8eIbCofYnRaJL5vD57gJKcCDxssbXn8+u0yvl+21cGsMFhri m8VNJ43m7mlmvY2C3/HIxiF8lq8zTATkgVJMuQNNg++vVTiAL5p4jkCWidf8+tdmbDXG Orz1b0KnLFKeDouG7WEAOaBA5x47otWo9ZND0QNJJLv4z5QyfM6nrSbJhA9XiSk6gp2v qcVQ== X-Received: by 10.236.154.2 with SMTP id g2mr10638700yhk.13.1361381154222; Wed, 20 Feb 2013 09:25:54 -0800 (PST) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id h26si899536yhf.3.2013.02.20.09.25.54 (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Wed, 20 Feb 2013 09:25:54 -0800 (PST) Received: from kaka.mtv.corp.google.com (kaka.mtv.corp.google.com [172.22.73.79]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id 044185A40F3; Wed, 20 Feb 2013 09:25:54 -0800 (PST) Received: by kaka.mtv.corp.google.com (Postfix, from userid 121222) id AB94816086B; Wed, 20 Feb 2013 09:25:53 -0800 (PST) From: Simon Glass To: LKML Cc: Samuel Ortiz , Simon Glass , Dmitry Torokhov , Bill Pemberton , Mark Brown , Javier Martinez Canillas , Sourav Poddar , Felipe Balbi , Alban Bedel , linux-input@vger.kernel.org Subject: [PATCH v5 5/6] Input: matrix-keymap: Add function to read the new DT binding Date: Wed, 20 Feb 2013 09:24:38 -0800 Message-Id: <1361381079-26747-6-git-send-email-sjg@chromium.org> X-Mailer: git-send-email 1.8.1.3 In-Reply-To: <1361381079-26747-1-git-send-email-sjg@chromium.org> References: <1361381079-26747-1-git-send-email-sjg@chromium.org> X-Gm-Message-State: ALoCoQkii4krtk/H6Y1XpIt/vLs8eWV/3ooILIqWLnDCSndG8ZSHpX+IAVHi+v2rLIAUP233CmY6lJxaspTlNfCGWbl4xqODw3KN32HJw5Prv9jzxQ/OH9AOqXK9FuKjtn/0V/QUT6EwlaTIKj7f2hnoOcGqChitdYeAy0PXMHLNcpnQ8Ya/+nxLLUzDEBp9Drsb+2dFxSyHJkQEwMrN/oakEzgRnqdaiQ== Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org We now have a binding which adds two parameters to the matrix keypad DT node. This is separate from the GPIO-driven matrix keypad binding, and unfortunately incompatible, since that uses row-gpios/col-gpios for the row and column counts. So the easiest option here is to provide a function for non-GPIO drivers to use to decode the binding. Note: We could in fact create an entirely separate structure to hold these two fields, but it does not seem worth it, yet. If we have more parameters then we can add this, and then refactor each driver to hold such a structure. Signed-off-by: Simon Glass Tested-by: Sourav Poddar (v2) Acked-by: Dmitry Torokhov --- Changes in v5: None Changes in v4: None Changes in v3: - Add stub for matrix_keypad_parse_of_params() when no CONFIG_OF - Put back full DT range checking in tca8418 driver Changes in v2: - Add new patch to decode matrix-keypad DT binding drivers/input/keyboard/lpc32xx-keys.c | 11 ++++++----- drivers/input/keyboard/omap4-keypad.c | 16 +++++----------- drivers/input/keyboard/tca8418_keypad.c | 7 +++++-- drivers/input/matrix-keymap.c | 19 +++++++++++++++++++ include/linux/input/matrix_keypad.h | 19 +++++++++++++++++++ 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/drivers/input/keyboard/lpc32xx-keys.c b/drivers/input/keyboard/lpc32xx-keys.c index 1b8add6..4218143 100644 --- a/drivers/input/keyboard/lpc32xx-keys.c +++ b/drivers/input/keyboard/lpc32xx-keys.c @@ -144,12 +144,13 @@ static int lpc32xx_parse_dt(struct device *dev, { struct device_node *np = dev->of_node; u32 rows = 0, columns = 0; + int err; - of_property_read_u32(np, "keypad,num-rows", &rows); - of_property_read_u32(np, "keypad,num-columns", &columns); - if (!rows || rows != columns) { - dev_err(dev, - "rows and columns must be specified and be equal!\n"); + err = matrix_keypad_parse_of_params(dev, &rows, &columns); + if (err) + return err; + if (rows != columns) { + dev_err(dev, "rows and columns must be equal!\n"); return -EINVAL; } diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c index e25b022..1b28909 100644 --- a/drivers/input/keyboard/omap4-keypad.c +++ b/drivers/input/keyboard/omap4-keypad.c @@ -215,18 +215,12 @@ static int omap4_keypad_parse_dt(struct device *dev, struct omap4_keypad *keypad_data) { struct device_node *np = dev->of_node; + int err; - if (!np) { - dev_err(dev, "missing DT data"); - return -EINVAL; - } - - of_property_read_u32(np, "keypad,num-rows", &keypad_data->rows); - of_property_read_u32(np, "keypad,num-columns", &keypad_data->cols); - if (!keypad_data->rows || !keypad_data->cols) { - dev_err(dev, "number of keypad rows/columns not specified\n"); - return -EINVAL; - } + err = matrix_keypad_parse_of_params(dev, &keypad_data->rows, + &keypad_data->cols); + if (err) + return err; if (of_get_property(np, "linux,input-no-autorepeat", NULL)) keypad_data->no_autorepeat = true; diff --git a/drivers/input/keyboard/tca8418_keypad.c b/drivers/input/keyboard/tca8418_keypad.c index a34cc67..55c1530 100644 --- a/drivers/input/keyboard/tca8418_keypad.c +++ b/drivers/input/keyboard/tca8418_keypad.c @@ -288,8 +288,11 @@ static int tca8418_keypad_probe(struct i2c_client *client, irq_is_gpio = pdata->irq_is_gpio; } else { struct device_node *np = dev->of_node; - of_property_read_u32(np, "keypad,num-rows", &rows); - of_property_read_u32(np, "keypad,num-columns", &cols); + int err; + + err = matrix_keypad_parse_of_params(dev, &rows, &cols); + if (err) + return err; rep = of_property_read_bool(np, "keypad,autorepeat"); } diff --git a/drivers/input/matrix-keymap.c b/drivers/input/matrix-keymap.c index 3ae496e..619b382 100644 --- a/drivers/input/matrix-keymap.c +++ b/drivers/input/matrix-keymap.c @@ -50,6 +50,25 @@ static bool matrix_keypad_map_key(struct input_dev *input_dev, } #ifdef CONFIG_OF +int matrix_keypad_parse_of_params(struct device *dev, + unsigned int *rows, unsigned int *cols) +{ + struct device_node *np = dev->of_node; + + if (!np) { + dev_err(dev, "missing DT data"); + return -EINVAL; + } + of_property_read_u32(np, "keypad,num-rows", rows); + of_property_read_u32(np, "keypad,num-columns", cols); + if (!*rows || !*cols) { + dev_err(dev, "number of keypad rows/columns not specified\n"); + return -EINVAL; + } + + return 0; +} + static int matrix_keypad_parse_of_keymap(const char *propname, unsigned int rows, unsigned int cols, struct input_dev *input_dev) diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h index 5f3aa6b..27e06ac 100644 --- a/include/linux/input/matrix_keypad.h +++ b/include/linux/input/matrix_keypad.h @@ -81,4 +81,23 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, unsigned short *keymap, struct input_dev *input_dev); +#ifdef CONFIG_OF +/** + * matrix_keypad_parse_of_params() - Read parameters from matrix-keypad node + * + * @dev: Device containing of_node + * @rows: Returns number of matrix rows + * @cols: Returns number of matrix columns + * @return 0 if OK, <0 on error + */ +int matrix_keypad_parse_of_params(struct device *dev, + unsigned int *rows, unsigned int *cols); +#else +static inline int matrix_keypad_parse_of_params(struct device *dev, + unsigned int *rows, unsigned int *cols) +{ + return -ENOSYS; +} +#endif /* CONFIG_OF */ + #endif /* _MATRIX_KEYPAD_H */