devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Chaotian Jing <chaotian.jing@mediatek.com>
Cc: Rob Herring <robh+dt@kernel.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Chris Ball <chris@printf.net>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Linus Walleij <linus.walleij@linaro.org>,
	Mark Rutland <mark.rutland@arm.com>,
	James Liao <jamesjj.liao@mediatek.com>,
	srv_heupstream@mediatek.com, Arnd Bergmann <arnd@arndb.de>,
	devicetree@vger.kernel.org,
	Hongzhou Yang <hongzhou.yang@mediatek.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	linux-mmc@vger.kernel.org, Will Deacon <will.deacon@arm.com>,
	linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org,
	Sascha Hauer <kernel@pengutronix.de>,
	"Joe.C" <yingjoe.chen@mediatek.com>,
	Eddie Huang <eddie.huang@mediatek.com>,
	bin.zhang@mediatek.com, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 1/7] pinctrl: mediatek: emulate GPIO interrupt on both-edges
Date: Tue, 10 Feb 2015 09:40:21 +0100	[thread overview]
Message-ID: <20150210084021.GM10842@pengutronix.de> (raw)
In-Reply-To: <1422339332-27498-2-git-send-email-chaotian.jing@mediatek.com>

Hello,

On Tue, Jan 27, 2015 at 02:15:26PM +0800, Chaotian Jing wrote:
> From: Yingjoe Chen <yingjoe.chen@mediatek.com>
> 
> MTK EINT does not support generating interrupt on both edges.
> Emulate this by changing edge polarity while enable irq,
> set types and interrupt handling. This follows an example of
> drivers/gpio/gpio-mxc.c.
> 
> Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
> Signed-off-by: Chaotian Jing <chaotian.jing@mediatek.com>
> ---
>  drivers/pinctrl/mediatek/pinctrl-mt8135.c     |  3 ++
>  drivers/pinctrl/mediatek/pinctrl-mt8173.c     |  3 ++
>  drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 76 +++++++++++++++++++++++++--
>  drivers/pinctrl/mediatek/pinctrl-mtk-common.h |  4 ++
>  4 files changed, 83 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8135.c b/drivers/pinctrl/mediatek/pinctrl-mt8135.c
> index b6ee2b2..1296d6d 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mt8135.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mt8135.c
> @@ -325,6 +325,9 @@ static const struct mtk_pinctrl_devdata mt8135_pinctrl_data = {
>  		.sens      = 0x140,
>  		.sens_set  = 0x180,
>  		.sens_clr  = 0x1c0,
> +		.soft      = 0x200,
> +		.soft_set  = 0x240,
> +		.soft_clr  = 0x280,
>  		.pol       = 0x300,
>  		.pol_set   = 0x340,
>  		.pol_clr   = 0x380,
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8173.c b/drivers/pinctrl/mediatek/pinctrl-mt8173.c
> index 444d88d..717000e 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mt8173.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mt8173.c
> @@ -278,6 +278,9 @@ static const struct mtk_pinctrl_devdata mt8173_pinctrl_data = {
>  		.sens      = 0x140,
>  		.sens_set  = 0x180,
>  		.sens_clr  = 0x1c0,
> +		.soft      = 0x200,
> +		.soft_set  = 0x240,
> +		.soft_clr  = 0x280,
>  		.pol       = 0x300,
>  		.pol_set   = 0x340,
>  		.pol_clr   = 0x380,
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> index 109a882..820ce9e 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> @@ -792,6 +792,32 @@ static unsigned int mtk_eint_get_mask(struct mtk_pinctrl *pctl,
>  	return !!(readl(reg) & bit);
>  }
>  
> +static int mtk_eint_flip_edge(struct mtk_pinctrl *pctl, int hwirq)
> +{
> +	int start_level, curr_level;
> +	unsigned int reg_offset;
> +	const struct mtk_eint_offsets *eint_offsets = &(pctl->devdata->eint_offsets);
> +	u32 mask = 1 << (hwirq & 0x1f);
> +	u32 port = (hwirq >> 5) & eint_offsets->port_mask;
> +	void __iomem *reg = pctl->eint_reg_base + (port << 2);
> +	const struct mtk_desc_pin *pin;
> +
> +	pin = mtk_find_pin_by_eint_num(pctl, hwirq);
> +	curr_level = mtk_gpio_get(pctl->chip, pin->pin.number);
> +	do {
> +		start_level = curr_level;
> +		if (start_level)
> +			reg_offset = eint_offsets->pol_clr;
> +		else
> +			reg_offset = eint_offsets->pol_set;
> +		writel(mask, reg + reg_offset);
> +
> +		curr_level = mtk_gpio_get(pctl->chip, pin->pin.number);
> +	} while (start_level != curr_level);
> +
> +	return start_level;
> +}
> +
>  static void mtk_eint_mask(struct irq_data *d)
>  {
>  	struct mtk_pinctrl *pctl = irq_data_get_irq_chip_data(d);
> @@ -814,6 +840,9 @@ static void mtk_eint_unmask(struct irq_data *d)
>  			eint_offsets->mask_clr);
>  
>  	writel(mask, reg);
> +
> +	if (pctl->eint_dual_edges[d->hwirq])
> +		mtk_eint_flip_edge(pctl, d->hwirq);
>  }
From looking at the code it seems to me that there is a bug. Consider
the following to happen:

	pin changes level, say high to low, triggers irq

	irq is masked by writel(mask, reg) in mtk_eint_mask

	mtk_eint_flip_edge gets curr_level = low

	pin goes up

	writel(mask, reg + eint_offsets->pol_set);

	oh, pin is high, so: writel(mask, reg + eint_offsets->pol_clr

So now you trigger the irq the next time when the pin goes down again.
But that means to missed to trigger on the "pin goes up" in the above
list, right?

Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

  parent reply	other threads:[~2015-02-10  8:40 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-27  6:15 [RFC PATCH 0/7] msdc: Add mediatek MMC driver Chaotian Jing
2015-01-27  6:15 ` [PATCH 1/7] pinctrl: mediatek: emulate GPIO interrupt on both-edges Chaotian Jing
2015-01-27 14:21   ` Linus Walleij
2015-01-28  9:24     ` Yingjoe Chen
2015-01-29  7:29     ` Hongzhou Yang
2015-02-10  8:24   ` Linus Walleij
2015-02-10  8:40   ` Uwe Kleine-König [this message]
     [not found]     ` <20150210084021.GM10842-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2015-02-10  9:22       ` Yingjoe Chen
2015-01-27  6:15 ` [PATCH 2/7] mmc: mediatek: Add Mediatek MMC driver Chaotian Jing
2015-01-27  6:15 ` [PATCH 3/7] ARM: mediatek: Add Mediatek MMC support in multi_v7_defconfig Chaotian Jing
2015-01-27  6:15 ` [PATCH 4/7] arm64: mediatek: Add Mediatek MMC support in defconfig Chaotian Jing
2015-01-27  6:15 ` [PATCH 5/7] mmc: dt-bindings: add Mediatek MMC bindings Chaotian Jing
2015-01-27  6:15 ` [PATCH 6/7] dts: mediatek: Add MT8135 mmc dts Chaotian Jing
2015-01-27  6:15 ` [PATCH 7/7] arm64: dts: mediatek: Add MT8173 MMC dts Chaotian Jing

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=20150210084021.GM10842@pengutronix.de \
    --to=u.kleine-koenig@pengutronix.de \
    --cc=arnd@arndb.de \
    --cc=bin.zhang@mediatek.com \
    --cc=catalin.marinas@arm.com \
    --cc=chaotian.jing@mediatek.com \
    --cc=chris@printf.net \
    --cc=devicetree@vger.kernel.org \
    --cc=eddie.huang@mediatek.com \
    --cc=hongzhou.yang@mediatek.com \
    --cc=jamesjj.liao@mediatek.com \
    --cc=kernel@pengutronix.de \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=matthias.bgg@gmail.com \
    --cc=robh+dt@kernel.org \
    --cc=srv_heupstream@mediatek.com \
    --cc=ulf.hansson@linaro.org \
    --cc=will.deacon@arm.com \
    --cc=yingjoe.chen@mediatek.com \
    /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).