From: lee.jones@linaro.org (Lee Jones)
To: linux-arm-kernel@lists.infradead.org
Subject: [RESEND v2 07/10] gpio: stmpe: rework registers access
Date: Wed, 10 Aug 2016 09:29:54 +0100 [thread overview]
Message-ID: <20160810082954.GM1581@dell> (raw)
In-Reply-To: <1470814755-19447-8-git-send-email-patrice.chotard@st.com>
On Wed, 10 Aug 2016, patrice.chotard at st.com wrote:
> From: Patrice Chotard <patrice.chotard@st.com>
>
> This update allows to use registers map as following :
> regs[reg_index + offset] instead of
> regs[reg_index] + offset
>
> This makes code clearer and will facilitate the addition of STMPE1600
> on which LSB and MSB registers are respectively located at addr and addr + 1.
> Despite for all others STMPE variant, LSB and MSB registers are respectively
> located in reverse order at addr + 1 and addr.
>
> For variant which have 3 registers's bank, we use LSB,CSB and MSB indexes
> which contains respectively LSB (or LOW), CSB (or MID) and MSB (or HIGH)
> register addresses (STMPE1801/STMPE24xx).
> For variant which have 2 registers's bank, we use LSB and CSB indexes only.
> In this case the CSB index contains the MSB regs address (STMPE 1601).
>
> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> drivers/gpio/gpio-stmpe.c | 48 ++++++++++++++++++++++++++---------------------
> 1 file changed, 27 insertions(+), 21 deletions(-)
Applied, thanks.
> diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
> index 2789bdc..6d6d76a 100644
> --- a/drivers/gpio/gpio-stmpe.c
> +++ b/drivers/gpio/gpio-stmpe.c
> @@ -21,6 +21,8 @@
> */
> enum { REG_RE, REG_FE, REG_IE };
>
> +enum { LSB, CSB, MSB };
> +
> #define CACHE_NR_REGS 3
> /* No variant has more than 24 GPIOs */
> #define CACHE_NR_BANKS (24 / 8)
> @@ -40,7 +42,7 @@ static int stmpe_gpio_get(struct gpio_chip *chip, unsigned offset)
> {
> struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
> struct stmpe *stmpe = stmpe_gpio->stmpe;
> - u8 reg = stmpe->regs[STMPE_IDX_GPMR_LSB] - (offset / 8);
> + u8 reg = stmpe->regs[STMPE_IDX_GPMR_LSB + (offset / 8)];
> u8 mask = 1 << (offset % 8);
> int ret;
>
> @@ -56,7 +58,7 @@ static void stmpe_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
> struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
> struct stmpe *stmpe = stmpe_gpio->stmpe;
> int which = val ? STMPE_IDX_GPSR_LSB : STMPE_IDX_GPCR_LSB;
> - u8 reg = stmpe->regs[which] - (offset / 8);
> + u8 reg = stmpe->regs[which + (offset / 8)];
> u8 mask = 1 << (offset % 8);
>
> /*
> @@ -74,7 +76,7 @@ static int stmpe_gpio_direction_output(struct gpio_chip *chip,
> {
> struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
> struct stmpe *stmpe = stmpe_gpio->stmpe;
> - u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
> + u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB + (offset / 8)];
> u8 mask = 1 << (offset % 8);
>
> stmpe_gpio_set(chip, offset, val);
> @@ -87,7 +89,7 @@ static int stmpe_gpio_direction_input(struct gpio_chip *chip,
> {
> struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
> struct stmpe *stmpe = stmpe_gpio->stmpe;
> - u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
> + u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB + (offset / 8)];
> u8 mask = 1 << (offset % 8);
>
> return stmpe_set_bits(stmpe, reg, mask, 0);
> @@ -157,10 +159,16 @@ static void stmpe_gpio_irq_sync_unlock(struct irq_data *d)
> struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(gc);
> struct stmpe *stmpe = stmpe_gpio->stmpe;
> int num_banks = DIV_ROUND_UP(stmpe->num_gpios, 8);
> - static const u8 regmap[] = {
> - [REG_RE] = STMPE_IDX_GPRER_LSB,
> - [REG_FE] = STMPE_IDX_GPFER_LSB,
> - [REG_IE] = STMPE_IDX_IEGPIOR_LSB,
> + static const u8 regmap[CACHE_NR_REGS][CACHE_NR_BANKS] = {
> + [REG_RE][LSB] = STMPE_IDX_GPRER_LSB,
> + [REG_RE][CSB] = STMPE_IDX_GPRER_CSB,
> + [REG_RE][MSB] = STMPE_IDX_GPRER_MSB,
> + [REG_FE][LSB] = STMPE_IDX_GPFER_LSB,
> + [REG_FE][CSB] = STMPE_IDX_GPFER_CSB,
> + [REG_FE][MSB] = STMPE_IDX_GPFER_MSB,
> + [REG_IE][LSB] = STMPE_IDX_IEGPIOR_LSB,
> + [REG_IE][CSB] = STMPE_IDX_IEGPIOR_CSB,
> + [REG_IE][MSB] = STMPE_IDX_IEGPIOR_MSB,
> };
> int i, j;
>
> @@ -178,7 +186,7 @@ static void stmpe_gpio_irq_sync_unlock(struct irq_data *d)
> continue;
>
> stmpe_gpio->oldregs[i][j] = new;
> - stmpe_reg_write(stmpe, stmpe->regs[regmap[i]] - j, new);
> + stmpe_reg_write(stmpe, stmpe->regs[regmap[i][j]], new);
> }
> }
>
> @@ -214,9 +222,9 @@ static void stmpe_dbg_show_one(struct seq_file *s,
> struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(gc);
> struct stmpe *stmpe = stmpe_gpio->stmpe;
> const char *label = gpiochip_is_requested(gc, offset);
> - int num_banks = DIV_ROUND_UP(stmpe->num_gpios, 8);
> bool val = !!stmpe_gpio_get(gc, offset);
> - u8 dir_reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
> + u8 bank = offset / 8;
> + u8 dir_reg = stmpe->regs[STMPE_IDX_GPDR_LSB + bank];
> u8 mask = 1 << (offset % 8);
> int ret;
> u8 dir;
> @@ -257,18 +265,16 @@ static void stmpe_dbg_show_one(struct seq_file *s,
> case STMPE1601:
> case STMPE2401:
> case STMPE2403:
> - edge_det_reg = stmpe->regs[STMPE_IDX_GPEDR_MSB] +
> - num_banks - 1 - (offset / 8);
> + edge_det_reg = stmpe->regs[STMPE_IDX_GPEDR_LSB + bank];
> ret = stmpe_reg_read(stmpe, edge_det_reg);
> if (ret < 0)
> return;
> edge_det = !!(ret & mask);
>
> case STMPE1801:
> - rise_reg = stmpe->regs[STMPE_IDX_GPRER_LSB] -
> - (offset / 8);
> - fall_reg = stmpe->regs[STMPE_IDX_GPFER_LSB] -
> - (offset / 8);
> + rise_reg = stmpe->regs[STMPE_IDX_GPRER_LSB + bank];
> + fall_reg = stmpe->regs[STMPE_IDX_GPFER_LSB + bank];
> +
> ret = stmpe_reg_read(stmpe, rise_reg);
> if (ret < 0)
> return;
> @@ -279,8 +285,7 @@ static void stmpe_dbg_show_one(struct seq_file *s,
> fall = !!(ret & mask);
>
> case STMPE801:
> - irqen_reg = stmpe->regs[STMPE_IDX_IEGPIOR_LSB] -
> - (offset / 8);
> + irqen_reg = stmpe->regs[STMPE_IDX_IEGPIOR_LSB + bank];
> break;
>
> default:
> @@ -362,8 +367,9 @@ static irqreturn_t stmpe_gpio_irq(int irq, void *dev)
> */
> if (stmpe->partnum != STMPE801 || stmpe->partnum != STMPE1801) {
> stmpe_reg_write(stmpe, statmsbreg + i, status[i]);
> - stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_GPEDR_MSB]
> - + i, status[i]);
> + stmpe_reg_write(stmpe,
> + stmpe->regs[STMPE_IDX_GPEDR_LSB + i],
> + status[i]);
> }
> }
>
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
next prev parent reply other threads:[~2016-08-10 8:29 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-10 7:39 [RESEND v2 00/10] STMPE fixes/rework and add STMPE1600 support patrice.chotard at st.com
2016-08-10 7:39 ` [RESEND v2 01/10] mfd: stmpe: Add STMPE_IDX_SYS_CTRL/2 enum patrice.chotard at st.com
2016-08-10 8:28 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 02/10] mfd: stmpe: Add reset support for all STMPE variant patrice.chotard at st.com
2016-08-10 8:28 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 03/10] gpio: stmpe: fix edge and rising/falling edge detection patrice.chotard at st.com
2016-08-10 8:29 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 04/10] gpio: stmpe: write int status register only when needed patrice.chotard at st.com
2016-08-10 8:29 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 05/10] mfd: stmpe: use generic bit mask name patrice.chotard at st.com
2016-08-10 8:29 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 06/10] mfd: stmpe: rework registers access patrice.chotard at st.com
2016-08-10 8:29 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 07/10] gpio: " patrice.chotard at st.com
2016-08-10 8:29 ` Lee Jones [this message]
2016-08-10 7:39 ` [RESEND v2 08/10] Documentation: dt: add stmpe1600 compatible string to stmpe mfd patrice.chotard at st.com
2016-08-10 8:30 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 09/10] mfd: Add STMPE1600 support patrice.chotard at st.com
2016-08-10 8:30 ` Lee Jones
2016-08-10 7:39 ` [RESEND v2 10/10] gpio: stmpe: " patrice.chotard at st.com
2016-08-10 8:30 ` Lee Jones
2016-08-10 8:42 ` [GIT PULL] Immutable branch between MFD and GPIO due for v4.9 Lee Jones
2016-08-11 12:07 ` 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=20160810082954.GM1581@dell \
--to=lee.jones@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox