From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932358AbZHCQzv (ORCPT ); Mon, 3 Aug 2009 12:55:51 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932193AbZHCQzu (ORCPT ); Mon, 3 Aug 2009 12:55:50 -0400 Received: from aeryn.fluff.org.uk ([87.194.8.8]:37288 "EHLO kira.home.fluff.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754799AbZHCQzt (ORCPT ); Mon, 3 Aug 2009 12:55:49 -0400 Subject: gpiolib: add export/unexport by gpio name Message-Id: <20090803165544.286572916@fluff.org> User-Agent: quilt/0.46-1 From: ben@fluff.org To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org Cc: David Brownell Content-Disposition: inline; filename=gpio-export-by-name.patch Date: Mon, 03 Aug 2009 17:55:44 +0100 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add the facility to export/unexport a gpio by the name assigned to it as well as the number. Signed-off-by: Ben Dooks Cc: David Brownell --- drivers/gpio/gpiolib.c | 59 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) Index: b/drivers/gpio/gpiolib.c =================================================================== --- a/drivers/gpio/gpiolib.c 2009-08-03 17:53:04.000000000 +0100 +++ b/drivers/gpio/gpiolib.c 2009-08-03 17:53:33.000000000 +0100 @@ -364,6 +364,53 @@ static const struct attribute_group gpio .attrs = (struct attribute **) gpiochip_attrs, }; +static int search_names(char **names, const char *match, int ngpio) +{ + int ptr; + + if (names) { + for (ptr = 0; ptr < ngpio; ptr++) { + if (!names[ptr]) + continue; + + if (strcmp(names[ptr], match) == 0) + return ptr; + } + } + + return -ENOENT; +} + +static long gpio_from_string(const char *buf) +{ + struct gpio_chip *chip; + struct gpio_desc *desc; + long status; + long gpio; + int ptr, off; + + status = strict_strtol(buf, 0, &gpio); + if (status < 0) { + for (ptr = 0; ptr < ARCH_NR_GPIOS && status < 0;) { + desc = gpio_desc + ptr; + chip = desc->chip; + + if (!chip) { + ptr++; + continue; + } + + off = search_names(chip->names, buf, chip->ngpio); + if (off >= 0) + status = ptr + off; + + ptr += chip->ngpio; + } + } + + return status; +} + /* * /sys/class/gpio/export ... write-only * integer N ... number of GPIO to export (full access) @@ -375,9 +422,11 @@ static ssize_t export_store(struct class long gpio; int status; - status = strict_strtol(buf, 0, &gpio); - if (status < 0) + gpio = gpio_from_string(buf); + if (gpio < 0) { + status = gpio; goto done; + } /* No extra locking here; FLAG_SYSFS just signifies that the * request and export were done by on behalf of userspace, so @@ -405,9 +454,11 @@ static ssize_t unexport_store(struct cla long gpio; int status; - status = strict_strtol(buf, 0, &gpio); - if (status < 0) + gpio = gpio_from_string(buf); + if (gpio < 0) { + status = gpio; goto done; + } status = -EINVAL; --