From: Igor Grinberg <grinberg@compulab.co.il>
To: Linus Walleij <linus.walleij@stericsson.com>
Cc: linux-kernel@vger.kernel.org, Stephen Warren <swarren@nvidia.com>,
Grant Likely <grant.likely@secretlab.ca>,
Barry Song <21cnbao@gmail.com>,
Shawn Guo <shawn.guo@freescale.com>,
Thomas Abraham <thomas.abraham@linaro.org>,
Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH] pinctrl: indicate GPIO direction on single GPIO request
Date: Mon, 14 Nov 2011 13:08:00 +0200 [thread overview]
Message-ID: <4EC0F690.8060308@compulab.co.il> (raw)
In-Reply-To: <1321261837-31320-1-git-send-email-linus.walleij@stericsson.com>
Hi Linus,
On 11/14/11 11:10, Linus Walleij wrote:
> From: Linus Walleij <linus.walleij@linaro.org>
>
> When requesting a single GPIO pin to be muxed in, some controllers
> will need to poke a different value into the control register
> depending on whether the pin will be used for GPIO output or GPIO
> input. So pass this info along for the gpio_request_enable()
> function, we assume this is not needed for the gpio_free_disable()
> function for the time being.
>
> Suggested-by: Thomas Abraham <thomas.abraham@linaro.org>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> drivers/pinctrl/pinmux.c | 16 +++++++++++-----
> include/linux/pinctrl/pinmux.h | 14 ++++++++++----
> 2 files changed, 21 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
> index d27b77d..ef2f812 100644
> --- a/drivers/pinctrl/pinmux.c
> +++ b/drivers/pinctrl/pinmux.c
> @@ -100,10 +100,13 @@ struct pinmux_hog {
> * means that you want to mux in the pin for use as GPIO number NN
> * @gpio_range: the range matching the GPIO pin if this is a request for a
> * single GPIO pin
> + * @gpio_direction: if the pin is muxed for GPIO, this provides the direction
> + * of the GPIO @true means output, @false means input
can this be gpio_direction_out (throughout the patch)?
so the true/false values will make more sense?
> */
> static int pin_request(struct pinctrl_dev *pctldev,
> int pin, const char *function,
> - struct pinctrl_gpio_range *gpio_range)
> + struct pinctrl_gpio_range *gpio_range,
> + bool gpio_direction)
> {
> struct pin_desc *desc;
> const struct pinmux_ops *ops = pctldev->desc->pmxops;
> @@ -148,7 +151,8 @@ static int pin_request(struct pinctrl_dev *pctldev,
> */
> if (gpio_range && ops->gpio_request_enable)
> /* This requests and enables a single GPIO pin */
> - status = ops->gpio_request_enable(pctldev, gpio_range, pin);
> + status = ops->gpio_request_enable(pctldev, gpio_range, pin,
> + gpio_direction);
> else if (ops->request)
> status = ops->request(pctldev, pin);
> else
> @@ -218,8 +222,10 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
> /**
> * pinmux_request_gpio() - request a single pin to be muxed in as GPIO
> * @gpio: the GPIO pin number from the GPIO subsystem number space
> + * @direction: the direction of the GPIO, @true means output, @false
> + * means input
> */
> -int pinmux_request_gpio(unsigned gpio)
> +int pinmux_request_gpio(unsigned gpio, bool direction)
> {
> char gpiostr[16];
> const char *function;
> @@ -242,7 +248,7 @@ int pinmux_request_gpio(unsigned gpio)
> if (!function)
> return -EINVAL;
>
> - ret = pin_request(pctldev, pin, function, range);
> + ret = pin_request(pctldev, pin, function, range, direction);
> if (ret < 0)
> kfree(function);
>
> @@ -360,7 +366,7 @@ static int acquire_pins(struct pinctrl_dev *pctldev,
>
> /* Try to allocate all pins in this group, one by one */
> for (i = 0; i < num_pins; i++) {
> - ret = pin_request(pctldev, pins[i], func, NULL);
> + ret = pin_request(pctldev, pins[i], func, NULL, false);
> if (ret) {
> dev_err(&pctldev->dev,
> "could not get pin %d for function %s "
> diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h
> index bb7a979..7d3841f 100644
> --- a/include/linux/pinctrl/pinmux.h
> +++ b/include/linux/pinctrl/pinmux.h
> @@ -54,7 +54,12 @@ struct pinctrl_dev;
> * Implement this only if you can mux every pin individually as GPIO. The
> * affected GPIO range is passed along with an offset(pin number) into that
> * specific GPIO range - function selectors and pin groups are orthogonal
> - * to this, the core will however make sure the pins do not collide
> + * to this, the core will however make sure the pins do not collide. Since
> + * controllers may be needing different configurations depending on
> + * whether the GPIO is configured as input or output, a direction
> + * indicator is passed along
> + * @gpio_disable_free: free up GPIO muxing on a certain pin, the reverse of
> + * @gpio_request_enable
> */
> struct pinmux_ops {
> int (*request) (struct pinctrl_dev *pctldev, unsigned offset);
> @@ -72,14 +77,15 @@ struct pinmux_ops {
> unsigned group_selector);
> int (*gpio_request_enable) (struct pinctrl_dev *pctldev,
> struct pinctrl_gpio_range *range,
> - unsigned offset);
> + unsigned offset,
> + bool direction);
> void (*gpio_disable_free) (struct pinctrl_dev *pctldev,
> struct pinctrl_gpio_range *range,
> unsigned offset);
> };
>
> /* External interface to pinmux */
> -extern int pinmux_request_gpio(unsigned gpio);
> +extern int pinmux_request_gpio(unsigned gpio, bool direction);
> extern void pinmux_free_gpio(unsigned gpio);
> extern struct pinmux * __must_check pinmux_get(struct device *dev, const char *name);
> extern void pinmux_put(struct pinmux *pmx);
> @@ -88,7 +94,7 @@ extern void pinmux_disable(struct pinmux *pmx);
>
> #else /* !CONFIG_PINMUX */
>
> -static inline int pinmux_request_gpio(unsigned gpio)
> +static inline int pinmux_request_gpio(unsigned gpio, bool direction)
> {
> return 0;
> }
--
Regards,
Igor.
next prev parent reply other threads:[~2011-11-14 11:08 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-14 9:10 [PATCH] pinctrl: indicate GPIO direction on single GPIO request Linus Walleij
2011-11-14 11:08 ` Igor Grinberg [this message]
2011-11-14 17:18 ` Stephen Warren
2011-11-14 18:00 ` Thomas Abraham
2011-11-15 19:04 ` Stephen Warren
2011-11-17 10:04 ` Linus Walleij
2011-11-17 17:15 ` Stephen Warren
2011-11-21 10:47 ` Linus Walleij
2011-11-21 19:00 ` Stephen Warren
2011-11-21 21:44 ` Linus Walleij
2011-11-21 21:54 ` Stephen Warren
2011-11-23 12:50 ` Linus Walleij
2011-11-15 7:15 ` Igor Grinberg
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=4EC0F690.8060308@compulab.co.il \
--to=grinberg@compulab.co.il \
--cc=21cnbao@gmail.com \
--cc=grant.likely@secretlab.ca \
--cc=linus.walleij@linaro.org \
--cc=linus.walleij@stericsson.com \
--cc=linux-kernel@vger.kernel.org \
--cc=shawn.guo@freescale.com \
--cc=swarren@nvidia.com \
--cc=thomas.abraham@linaro.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.