From: Jun Nie <jun.nie@linaro.org>
To: linus.walleij@linaro.org, linux-gpio@vger.kernel.org
Cc: shawn.guo@linaro.org, wan.zhijun@zte.com.cn,
jason.liu@linaro.org, Jun Nie <jun.nie@linaro.org>
Subject: [PATCH] pinctrl: single: support GPIO for bits pinctrl
Date: Fri, 12 Jun 2015 16:19:45 +0800 [thread overview]
Message-ID: <1434097185-16464-1-git-send-email-jun.nie@linaro.org> (raw)
Support GPIO for one register control multiple pins case
with calculating register offset first, then bit offset.
Signed-off-by: Jun Nie <jun.nie@linaro.org>
---
drivers/pinctrl/pinctrl-single.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index 13b45f2..bd69d9a 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -494,7 +494,7 @@ static int pcs_request_gpio(struct pinctrl_dev *pctldev,
struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
struct pcs_gpiofunc_range *frange = NULL;
struct list_head *pos, *tmp;
- int mux_bytes = 0;
+ int offset, mux_bytes = 0;
unsigned data;
/* If function mask is null, return directly. */
@@ -507,9 +507,23 @@ static int pcs_request_gpio(struct pinctrl_dev *pctldev,
|| pin < frange->offset)
continue;
mux_bytes = pcs->width / BITS_PER_BYTE;
- data = pcs->read(pcs->base + pin * mux_bytes) & ~pcs->fmask;
- data |= frange->gpiofunc;
- pcs->write(data, pcs->base + pin * mux_bytes);
+ if (pcs->bits_per_mux) {
+ int pin_pos, byte_num, num_pins_in_register;
+
+ num_pins_in_register = pcs->width / pcs->bits_per_pin;
+ byte_num = (pcs->bits_per_pin * pin) / BITS_PER_BYTE;
+ offset = (byte_num / mux_bytes) * mux_bytes;
+ pin_pos = pin % num_pins_in_register;
+ pin_pos *= pcs->bits_per_pin;
+ data = pcs->read(pcs->base + offset) &
+ ~(pcs->fmask << pin_pos);
+ data |= frange->gpiofunc << pin_pos;
+ } else {
+ offset = pin * mux_bytes;
+ data = pcs->read(pcs->base + offset) & ~pcs->fmask;
+ data |= frange->gpiofunc;
+ }
+ pcs->write(data, pcs->base + offset);
break;
}
return 0;
--
1.9.1
next reply other threads:[~2015-06-12 8:20 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-12 8:19 Jun Nie [this message]
2015-06-16 9:17 ` [PATCH] pinctrl: single: support GPIO for bits pinctrl Linus Walleij
2015-06-16 11:28 ` Tony Lindgren
-- strict thread matches above, loose matches on Subject: below --
2015-06-17 1:56 Jun Nie
2015-06-17 7:17 ` Tony Lindgren
2015-06-19 14:55 ` Haojian Zhuang
2015-06-23 9:54 ` Jun Nie
2015-06-23 10:14 ` Tony Lindgren
2015-06-23 10:18 ` Jun Nie
2015-07-06 8:40 ` Jun Nie
2015-07-06 9:03 ` Tony Lindgren
2015-07-06 9:19 ` Jun Nie
2015-07-06 10:40 ` Tony Lindgren
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=1434097185-16464-1-git-send-email-jun.nie@linaro.org \
--to=jun.nie@linaro.org \
--cc=jason.liu@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=shawn.guo@linaro.org \
--cc=wan.zhijun@zte.com.cn \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).