From: swarren@wwwdotorg.org (Stephen Warren)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 8/8] reset: Add driver for gpio-controlled reset pins
Date: Tue, 19 Feb 2013 14:57:21 -0700 [thread overview]
Message-ID: <5123F541.4020407@wwwdotorg.org> (raw)
In-Reply-To: <1361273732-23357-9-git-send-email-p.zabel@pengutronix.de>
On 02/19/2013 04:35 AM, Philipp Zabel wrote:
> This driver implements a reset controller device that toggles gpios
> connected to reset pins of peripheral ICs. The delay between assertion
> and de-assertion of the reset signal can be configured.
> diff --git a/Documentation/devicetree/bindings/reset/gpio-reset.txt b/Documentation/devicetree/bindings/reset/gpio-reset.txt
> +Required properties:
> +- reset-delays: List of delays in ms. The corresponding gpio reset line is
> + asserted for this duration to reset.
mS are quite long. Would it make sense for this property to be uS instead?
> diff --git a/drivers/reset/gpio-reset.c b/drivers/reset/gpio-reset.c
> +static int gpio_reset_probe(struct platform_device *pdev)
> + if (of_find_property(np, "reset-delays", NULL)) {
> + delays = devm_kzalloc(&pdev->dev, sizeof(u32) *
> + drvdata->nr_gpios, GFP_KERNEL);
> + if (delays == NULL)
> + return -ENOMEM;
It'd be nice if there were something like of_property_read_u32_index()
so you could read each value one-by-one in the loop later on, rather
than dynamically allocating this temporarily.
> + ret = of_property_read_u32_array(np, "reset-delays", delays,
> + drvdata->nr_gpios);
> + if (ret < 0)
> + return ret;
> + }
> +
> + for (i = 0; i < drvdata->nr_gpios; i++) {
> + drvdata->gpios[i].gpio = of_get_named_gpio_flags(np,
> + "reset-gpios", i, &flags);
> + if (drvdata->gpios[i].gpio < 0) {
> + dev_err(&pdev->dev, "invalid gpio for reset %d\n", i);
It's not an error if the value is -EPROBE_DEFERRED; you might want to
explicitly check for that case and not print anything?
> + return drvdata->gpios[i].gpio;
> + }
> +
> + /*
> + * The flags are also used to remember whether a given GPIO
> + * reset is active-low.
> + */
> + if (flags & OF_GPIO_ACTIVE_LOW)
> + drvdata->gpios[i].flags = GPIOF_OUT_INIT_HIGH;
> + else
> + drvdata->gpios[i].flags = GPIOF_OUT_INIT_LOW;
That raises the question: What is the initial reset state expected to
be? Some devices might want to stay in reset until their driver
explicitly removes the reset signal.
We could handle that by adding another (optional) property indicating
the initial reset state of each GPIO; default to initially not-in-reset
unless that property exists and specifies initially-in-reset.
> + ret = devm_gpio_request_one(&pdev->dev, drvdata->gpios[i].gpio,
> + drvdata->gpios[i].flags, NULL);
> + if (ret < 0) {
> + dev_err(&pdev->dev, "failed to request gpio %d for reset %d\n",
> + drvdata->gpios[i].gpio, i);
> + return ret;
> + }
Perhaps first loop to look up all the GPIOs and initialize data
structures, then loop to request the GPIOs? That'd prevent lots of HW
programming and de-programming for the GPIOs near the start of the list,
in the case where some later GPIO causes -EPROBE_DEFERRED, and so this
probe() function keeps getting executed over and over.
> + if (delays != NULL)
> + drvdata->gpios[i].delay_ms = delays[i];
> + else
> + drvdata->gpios[i].delay_ms = -1; /* .reset returns -ENOSYS */
(here is where of_property_read_u32_index() might be handy)
> +static struct platform_driver gpio_reset_driver = {
> + .probe = gpio_reset_probe,
> + .remove = gpio_reset_remove,
> + .driver = {
> + .name = "gpio-reset",
> + .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(gpio_reset_dt_ids),
> + },
> +};
> +
> +module_platform_driver(gpio_reset_driver);
You might want to add a few things like MODULE_AUTHOR,
MODULE_DESCRIPTION, MODULE_LICENSE,
MODULE_DEVICE_TABLE(of, gpio_reset_dt_ids), perhaps MODULE_ALIAS for the
platform device too.
WARNING: multiple messages have this Message-ID (diff)
From: Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
To: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
Cc: Marek Vasut <marex-ynQEQJNshbs@public.gmane.org>,
Fabio Estevam
<fabio.estevam-KZfg59tc24xl57MIdRCFDg@public.gmane.org>,
Mike Turquette
<mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
Sascha Hauer <s.hauer-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>,
kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH v3 8/8] reset: Add driver for gpio-controlled reset pins
Date: Tue, 19 Feb 2013 14:57:21 -0700 [thread overview]
Message-ID: <5123F541.4020407@wwwdotorg.org> (raw)
In-Reply-To: <1361273732-23357-9-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
On 02/19/2013 04:35 AM, Philipp Zabel wrote:
> This driver implements a reset controller device that toggles gpios
> connected to reset pins of peripheral ICs. The delay between assertion
> and de-assertion of the reset signal can be configured.
> diff --git a/Documentation/devicetree/bindings/reset/gpio-reset.txt b/Documentation/devicetree/bindings/reset/gpio-reset.txt
> +Required properties:
> +- reset-delays: List of delays in ms. The corresponding gpio reset line is
> + asserted for this duration to reset.
mS are quite long. Would it make sense for this property to be uS instead?
> diff --git a/drivers/reset/gpio-reset.c b/drivers/reset/gpio-reset.c
> +static int gpio_reset_probe(struct platform_device *pdev)
> + if (of_find_property(np, "reset-delays", NULL)) {
> + delays = devm_kzalloc(&pdev->dev, sizeof(u32) *
> + drvdata->nr_gpios, GFP_KERNEL);
> + if (delays == NULL)
> + return -ENOMEM;
It'd be nice if there were something like of_property_read_u32_index()
so you could read each value one-by-one in the loop later on, rather
than dynamically allocating this temporarily.
> + ret = of_property_read_u32_array(np, "reset-delays", delays,
> + drvdata->nr_gpios);
> + if (ret < 0)
> + return ret;
> + }
> +
> + for (i = 0; i < drvdata->nr_gpios; i++) {
> + drvdata->gpios[i].gpio = of_get_named_gpio_flags(np,
> + "reset-gpios", i, &flags);
> + if (drvdata->gpios[i].gpio < 0) {
> + dev_err(&pdev->dev, "invalid gpio for reset %d\n", i);
It's not an error if the value is -EPROBE_DEFERRED; you might want to
explicitly check for that case and not print anything?
> + return drvdata->gpios[i].gpio;
> + }
> +
> + /*
> + * The flags are also used to remember whether a given GPIO
> + * reset is active-low.
> + */
> + if (flags & OF_GPIO_ACTIVE_LOW)
> + drvdata->gpios[i].flags = GPIOF_OUT_INIT_HIGH;
> + else
> + drvdata->gpios[i].flags = GPIOF_OUT_INIT_LOW;
That raises the question: What is the initial reset state expected to
be? Some devices might want to stay in reset until their driver
explicitly removes the reset signal.
We could handle that by adding another (optional) property indicating
the initial reset state of each GPIO; default to initially not-in-reset
unless that property exists and specifies initially-in-reset.
> + ret = devm_gpio_request_one(&pdev->dev, drvdata->gpios[i].gpio,
> + drvdata->gpios[i].flags, NULL);
> + if (ret < 0) {
> + dev_err(&pdev->dev, "failed to request gpio %d for reset %d\n",
> + drvdata->gpios[i].gpio, i);
> + return ret;
> + }
Perhaps first loop to look up all the GPIOs and initialize data
structures, then loop to request the GPIOs? That'd prevent lots of HW
programming and de-programming for the GPIOs near the start of the list,
in the case where some later GPIO causes -EPROBE_DEFERRED, and so this
probe() function keeps getting executed over and over.
> + if (delays != NULL)
> + drvdata->gpios[i].delay_ms = delays[i];
> + else
> + drvdata->gpios[i].delay_ms = -1; /* .reset returns -ENOSYS */
(here is where of_property_read_u32_index() might be handy)
> +static struct platform_driver gpio_reset_driver = {
> + .probe = gpio_reset_probe,
> + .remove = gpio_reset_remove,
> + .driver = {
> + .name = "gpio-reset",
> + .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(gpio_reset_dt_ids),
> + },
> +};
> +
> +module_platform_driver(gpio_reset_driver);
You might want to add a few things like MODULE_AUTHOR,
MODULE_DESCRIPTION, MODULE_LICENSE,
MODULE_DEVICE_TABLE(of, gpio_reset_dt_ids), perhaps MODULE_ALIAS for the
platform device too.
next prev parent reply other threads:[~2013-02-19 21:57 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-19 11:35 [PATCH v3 0/8] Reset controller API to reset IP modules on i.MX5 and i.MX6 Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 11:35 ` [PATCH v3 1/8] dt: describe base reset signal binding Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 11:35 ` [PATCH v3 2/8] reset: Add reset controller API Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 21:39 ` Stephen Warren
2013-02-19 21:39 ` Stephen Warren
2013-02-20 11:04 ` Philipp Zabel
2013-02-20 11:04 ` Philipp Zabel
2013-02-20 17:10 ` Stephen Warren
2013-02-20 17:10 ` Stephen Warren
2013-02-20 2:20 ` Shawn Guo
2013-02-20 2:20 ` Shawn Guo
2013-02-19 11:35 ` [PATCH v3 3/8] ARM i.MX6q: Add GPU, VPU, IPU, and OpenVG resets to System Reset Controller (SRC) Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 21:41 ` Stephen Warren
2013-02-19 21:41 ` Stephen Warren
2013-02-19 11:35 ` [PATCH v3 4/8] ARM i.MX6q: Link system reset controller (SRC) to IPU in DT Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 11:35 ` [PATCH v3 5/8] staging: drm/imx: Use SRC to reset IPU Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 11:35 ` [PATCH v3 6/8] ARM i.MX5: Add System Reset Controller (SRC) support for i.MX51 and i.MX53 Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 11:35 ` [PATCH v3 7/8] ARM i.MX5: Add system reset controller (SRC) to i.MX51 and i.MX53 device tree Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 11:35 ` [PATCH v3 8/8] reset: Add driver for gpio-controlled reset pins Philipp Zabel
2013-02-19 11:35 ` Philipp Zabel
2013-02-19 21:57 ` Stephen Warren [this message]
2013-02-19 21:57 ` Stephen Warren
2013-02-20 11:22 ` Philipp Zabel
2013-02-20 11:22 ` Philipp Zabel
2013-02-20 17:14 ` Stephen Warren
2013-02-20 17:14 ` Stephen Warren
2013-02-19 21:23 ` [PATCH v3 0/8] Reset controller API to reset IP modules on i.MX5 and i.MX6 Stephen Warren
2013-02-19 21:23 ` Stephen Warren
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=5123F541.4020407@wwwdotorg.org \
--to=swarren@wwwdotorg.org \
--cc=linux-arm-kernel@lists.infradead.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.