From: Johan Hovold <johan@kernel.org>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: linux-gpio@vger.kernel.org, Johan Hovold <johan@kernel.org>,
Alexandre Courbot <acourbot@nvidia.com>,
Arnd Bergmann <arnd@arndb.de>,
Michael Welling <mwelling@ieee.org>,
Markus Pargmann <mpa@pengutronix.de>,
Mark Brown <broonie@kernel.org>,
Amit Kucheria <amit.kucheria@linaro.org>
Subject: Re: [PATCH 1/6] gpio: make the gpiochip a real device
Date: Mon, 2 Nov 2015 11:31:16 +0100 [thread overview]
Message-ID: <20151102103116.GE8676@localhost> (raw)
In-Reply-To: <1445502750-22672-2-git-send-email-linus.walleij@linaro.org>
On Thu, Oct 22, 2015 at 10:32:25AM +0200, Linus Walleij wrote:
> GPIO chips have been around for years, but were never real devices,
> instead they were piggy-backing on a parent device (such as a
> platform_device or amba_device) but this was always optional.
> GPIO chips could also exist without any device at all, with its
> struct device *dev pointer being set to null.
>
> When sysfs was in use, a mock device would be created, with the
> optional parent assigned, or just floating orphaned with NULL
> as parent.
>
> For a proper userspace ABI we need gpiochips to *always have a
> populated struct device, so add this in the gpio_chip struct.
> The name "dev" is unfortunately already take so we use "device"
> to name it.
>
> If sysfs is active, it will use this device as parent, and the
> former parent device "dev" will be set as parent of the new
> "device" struct member.
>
> From this point on, gpiochips are devices.
>
> Cc: Johan Hovold <johan@kernel.org>
> Cc: Michael Welling <mwelling@ieee.org>
> Cc: Markus Pargmann <mpa@pengutronix.de>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> drivers/gpio/gpiolib-sysfs.c | 2 +-
> drivers/gpio/gpiolib.c | 44 +++++++++++++++++++++++++++++++++++++++-----
> include/linux/gpio/driver.h | 9 +++++++--
> 3 files changed, 47 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
> index b57ed8e55ab5..7e5bc5736e47 100644
> --- a/drivers/gpio/gpiolib-sysfs.c
> +++ b/drivers/gpio/gpiolib-sysfs.c
> @@ -605,7 +605,7 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
> if (chip->names && chip->names[offset])
> ioname = chip->names[offset];
>
> - dev = device_create_with_groups(&gpio_class, chip->dev,
> + dev = device_create_with_groups(&gpio_class, &chip->device,
> MKDEV(0, 0), data, gpio_groups,
> ioname ? ioname : "gpio%u",
> desc_to_gpio(desc));
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index 6798355c61c6..0ab4f75b7f8e 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -16,6 +16,7 @@
> #include <linux/gpio/driver.h>
> #include <linux/gpio/machine.h>
> #include <linux/pinctrl/consumer.h>
> +#include <linux/idr.h>
>
> #include "gpiolib.h"
>
> @@ -42,6 +43,9 @@
> #define extra_checks 0
> #endif
>
> +/* Device and char device-related information */
> +static DEFINE_IDA(gpio_ida);
> +
> /* gpio_lock prevents conflicts during gpio_desc[] table updates.
> * While any GPIO is requested, its gpio_chip is not removable;
> * each GPIO's "requested" flag serves as a lock and refcount.
> @@ -52,7 +56,6 @@ static DEFINE_MUTEX(gpio_lookup_lock);
> static LIST_HEAD(gpio_lookup_list);
> LIST_HEAD(gpio_chips);
>
> -
> static void gpiochip_free_hogs(struct gpio_chip *chip);
> static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip);
>
> @@ -300,7 +303,7 @@ int gpiochip_add(struct gpio_chip *chip)
> {
> unsigned long flags;
> int status = 0;
> - unsigned id;
> + unsigned i;
> int base = chip->base;
> struct gpio_desc *descs;
>
> @@ -308,6 +311,28 @@ int gpiochip_add(struct gpio_chip *chip)
> if (!descs)
> return -ENOMEM;
>
> + /*
> + * The "dev" member of gpiochip is the parent, and the actual
> + * device is named "device" for historical reasons.
> + *
> + * We memset the struct to zero to avoid reentrance issues.
> + */
> + memset(&chip->device, 0, sizeof(chip->device));
This is an indication of a larger problem.
First of all, you must never register the same device structure twice.
And the larger problem is: With the current interface where a struct
gpio_chip is passed and registered, how would you prevent the device
from going away while in use?
You grab a reference to the chip->device when opening the node (in a
later patch), but it is not used to manage the life time of struct
gpio_chip.
> + if (chip->dev) {
> + chip->device.parent = chip->dev;
> + chip->device.of_node = chip->dev->of_node;
> + } else {
> +#ifdef CONFIG_OF_GPIO
> + /* If the gpiochip has an assigned OF node this takes precedence */
> + if (chip->of_node)
> + chip->device.of_node = chip->of_node;
> +#endif
> + }
> + chip->id = ida_simple_get(&gpio_ida, 0, 0, GFP_KERNEL);
Missing error handling.
> + dev_set_name(&chip->device, "gpiochip%d", chip->id);
> + device_initialize(&chip->device);
> + dev_set_drvdata(&chip->device, chip);
> +
> spin_lock_irqsave(&gpio_lock, flags);
>
> if (base < 0) {
Johan
next prev parent reply other threads:[~2015-11-02 10:31 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-22 8:32 [PATCH 0/6] GPIO character device skeleton Linus Walleij
2015-10-22 8:32 ` [PATCH 1/6] gpio: make the gpiochip a real device Linus Walleij
2015-10-24 18:09 ` Markus Pargmann
2015-10-25 7:06 ` Alexandre Courbot
2015-10-26 2:12 ` Mark Brown
2015-11-03 21:20 ` Linus Walleij
2015-11-02 10:31 ` Johan Hovold [this message]
2015-11-02 12:25 ` Mark Brown
2015-11-02 12:43 ` Johan Hovold
2015-11-02 12:47 ` Mark Brown
2015-11-02 12:53 ` Johan Hovold
2015-11-02 13:06 ` Mark Brown
2015-11-02 13:14 ` Johan Hovold
2015-11-02 13:17 ` Mark Brown
2015-11-02 13:25 ` Johan Hovold
2015-11-03 21:24 ` Linus Walleij
2015-11-04 10:48 ` Linus Walleij
2015-11-05 9:44 ` Johan Hovold
2015-11-05 10:29 ` Mark Brown
2015-11-16 14:27 ` Linus Walleij
2015-12-03 14:04 ` Linus Walleij
2015-12-03 14:06 ` Linus Walleij
2015-12-03 21:26 ` Michael Welling
2015-12-04 22:31 ` Michael Welling
2015-12-11 17:58 ` Linus Walleij
2015-12-08 9:29 ` Johan Hovold
2015-12-11 18:06 ` Linus Walleij
2015-10-22 8:32 ` [PATCH 2/6] gpio: refer to gpio device in prints and debugfs Linus Walleij
2015-10-22 8:32 ` [PATCH 3/6] gpio: add a userspace chardev ABI for GPIOs Linus Walleij
2015-10-22 20:35 ` Michael Welling
2015-10-24 0:30 ` Greg Kroah-Hartman
2016-01-28 11:13 ` Linus Walleij
2015-10-26 1:34 ` Mark Brown
2016-01-27 10:05 ` Bamvor Zhang Jian
2016-01-28 11:14 ` Linus Walleij
2016-01-29 10:24 ` Bamvor Zhang Jian
2016-02-10 10:04 ` Linus Walleij
2015-10-22 8:32 ` [PATCH 4/6] tools/gpio: create GPIO tools Linus Walleij
2015-10-25 8:23 ` Alexandre Courbot
2015-10-22 8:32 ` [PATCH 5/6] gpio: add a userspace character device ABI Linus Walleij
2015-10-24 18:46 ` Markus Pargmann
2015-10-22 8:32 ` [PATCH 6/6] gpio: ABI: mark the sysfs ABI as obsolete Linus Walleij
2015-10-22 18:57 ` [PATCH 0/6] GPIO character device skeleton Michael Welling
2015-10-24 17:53 ` Markus Pargmann
2015-10-30 14:40 ` Linus Walleij
2015-11-02 10:00 ` Johan Hovold
2015-10-24 18:42 ` Markus Pargmann
2015-10-30 1:55 ` Alexandre Courbot
2015-10-30 19:48 ` Linus Walleij
2015-11-02 10:13 ` Johan Hovold
2015-11-03 7:23 ` Markus Pargmann
2015-11-03 12:06 ` Johan Hovold
2015-11-03 17:18 ` Linus Walleij
2015-11-04 19:44 ` Michael Welling
2015-11-05 9:40 ` Johan Hovold
2015-11-05 14:11 ` Linus Walleij
2015-11-06 10:21 ` Johan Hovold
2015-11-16 13:33 ` Linus Walleij
2015-11-03 17:05 ` Linus Walleij
2015-10-30 14:43 ` Linus Walleij
2015-10-30 22:54 ` Arnd Bergmann
2015-11-01 9:37 ` Linus Walleij
2015-11-02 10:16 ` Johan Hovold
2015-10-26 2:18 ` Mark Brown
2015-10-30 1:55 ` Alexandre Courbot
2015-10-30 19:47 ` Linus Walleij
2015-11-01 2:41 ` Mark Brown
2015-11-03 7:39 ` Markus Pargmann
2015-11-03 8:50 ` Mark Brown
2015-11-03 10:21 ` Amit Kucheria
2015-11-03 17:06 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151102103116.GE8676@localhost \
--to=johan@kernel.org \
--cc=acourbot@nvidia.com \
--cc=amit.kucheria@linaro.org \
--cc=arnd@arndb.de \
--cc=broonie@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=mpa@pengutronix.de \
--cc=mwelling@ieee.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.