devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Gerlach <d-gerlach@ti.com>
To: balbi@ti.com
Cc: Lokesh Vutla <lokeshvutla@ti.com>,
	linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	bcousson@baylibre.com, tony@atomide.com,
	devicetree@vger.kernel.org, nsekhar@ti.com, rnayak@ti.com,
	nm@ti.com, mark.rutland@arm.com
Subject: Re: [PATCH] ARM: dts: am437x-gp-evm: Do not reset gpio5
Date: Mon, 24 Mar 2014 10:29:58 -0500	[thread overview]
Message-ID: <53304F76.8090703@ti.com> (raw)
In-Reply-To: <20140321055242.GA1959@saruman.home>

On 03/21/2014 12:52 AM, Felipe Balbi wrote:
> On Fri, Mar 21, 2014 at 10:50:13AM +0530, Lokesh Vutla wrote:
>> From: Dave Gerlach <d-gerlach@ti.com>
>>
>> Do not reset GPIO5 at boot-up because GPIO5_7 is used
>> on AM437x GP-EVM to control VTT regulators on DDR3.
>> Without this some GP-EVM boards will fail to boot because
>> of DDR3 corruption.
>>
>> Reported-by: Nishanth Menon <nm@ti.com>
>> Tested-by: Nishanth Menon <nm@ti.com>
>> Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
>> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
>
> every now and again we see a patch like this because yet another board
> is using a GPIO to toggle DDR regulators.
>
> Instead of constantly patching things like this, how about we try
> something like below (build-tested only):

Why should we change all of them? Is it correct to leave every single 
GPIO at the mercy of the bootloader in every situation? The reason we 
see these patches only every now and again is because it's a special 
case that should be handled only for that situation. I also don't think 
it makes sense to make gpio's a unique case that never gets reset while 
every other IP does by default.

Regards,
Dave

>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index 1f33f5d..f5962ff 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -2610,6 +2610,10 @@ static int __init _setup_reset(struct omap_hwmod *oh)
>   	if (oh->flags & HWMOD_EXT_OPT_MAIN_CLK)
>   		return -EPERM;
>
> +	/* NEVER reset GPIO blocks */
> +	if (strncmp(oh->name, "gpio", 4) == 0)
> +		return 0;
> +
>   	if (oh->rst_lines_cnt == 0) {
>   		r = _enable(oh);
>   		if (r) {
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 4243190..ce8b53a 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -1130,6 +1130,29 @@ static void omap_gpio_chip_init(struct gpio_bank *bank)
>
>   static const struct of_device_id omap_gpio_match[];
>
> +static void omap_gpio_init_context(struct gpio_bank *p)
> +{
> +	struct omap_gpio_reg_offs *regs = p->regs;
> +	void __iomem *base = p->base;
> +
> +	p->context.ctrl		= readl_relaxed(base + regs->ctrl);
> +	p->context.oe		= readl_relaxed(base + regs->direction);
> +	p->context.wake_en	= readl_relaxed(base + regs->wkup_en);
> +	p->context.leveldetect0	= readl_relaxed(base + regs->leveldetect0);
> +	p->context.leveldetect1	= readl_relaxed(base + regs->leveldetect1);
> +	p->context.risingdetect	= readl_relaxed(base + regs->risingdetect);
> +	p->context.fallingdetect = readl_relaxed(base + regs->fallingdetect);
> +	p->context.irqenable1	= readl_relaxed(base + regs->irqenable);
> +	p->context.irqenable2	= readl_relaxed(base + regs->irqenable2);
> +
> +	if (regs->set_dataout && p->regs->clr_dataout)
> +		p->context.dataout = readl_relaxed(base + regs->set_dataout);
> +	else
> +		p->context.dataout = readl_relaxed(base + regs->dataout);
> +
> +	p->context_valid = true;
> +}
> +
>   static int omap_gpio_probe(struct platform_device *pdev)
>   {
>   	struct device *dev = &pdev->dev;
> @@ -1246,6 +1269,7 @@ static int omap_gpio_probe(struct platform_device *pdev)
>   	omap_gpio_mod_init(bank);
>   	omap_gpio_chip_init(bank);
>   	omap_gpio_show_rev(bank);
> +	omap_gpio_init_context(bank);
>
>   	pm_runtime_put(bank->dev);
>
> @@ -1325,8 +1349,6 @@ update_gpio_context_count:
>   	return 0;
>   }
>
> -static void omap_gpio_init_context(struct gpio_bank *p);
> -
>   static int omap_gpio_runtime_resume(struct device *dev)
>   {
>   	struct platform_device *pdev = to_platform_device(dev);
> @@ -1466,29 +1488,6 @@ void omap2_gpio_resume_after_idle(void)
>   }
>
>   #if defined(CONFIG_PM_RUNTIME)
> -static void omap_gpio_init_context(struct gpio_bank *p)
> -{
> -	struct omap_gpio_reg_offs *regs = p->regs;
> -	void __iomem *base = p->base;
> -
> -	p->context.ctrl		= readl_relaxed(base + regs->ctrl);
> -	p->context.oe		= readl_relaxed(base + regs->direction);
> -	p->context.wake_en	= readl_relaxed(base + regs->wkup_en);
> -	p->context.leveldetect0	= readl_relaxed(base + regs->leveldetect0);
> -	p->context.leveldetect1	= readl_relaxed(base + regs->leveldetect1);
> -	p->context.risingdetect	= readl_relaxed(base + regs->risingdetect);
> -	p->context.fallingdetect = readl_relaxed(base + regs->fallingdetect);
> -	p->context.irqenable1	= readl_relaxed(base + regs->irqenable);
> -	p->context.irqenable2	= readl_relaxed(base + regs->irqenable2);
> -
> -	if (regs->set_dataout && p->regs->clr_dataout)
> -		p->context.dataout = readl_relaxed(base + regs->set_dataout);
> -	else
> -		p->context.dataout = readl_relaxed(base + regs->dataout);
> -
> -	p->context_valid = true;
> -}
> -
>   static void omap_gpio_restore_context(struct gpio_bank *bank)
>   {
>   	writel_relaxed(bank->context.wake_en,
>
> Then, we can even remove ti,no-reset flag from all GPIO DT nodes.
>


  reply	other threads:[~2014-03-24 15:29 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-21  5:20 [PATCH] ARM: dts: am437x-gp-evm: Do not reset gpio5 Lokesh Vutla
     [not found] ` <1395379213-15451-1-git-send-email-lokeshvutla-l0cyMroinI0@public.gmane.org>
2014-03-21  5:52   ` Felipe Balbi
2014-03-24 15:29     ` Dave Gerlach [this message]
2014-03-24 18:50       ` Felipe Balbi
2014-03-24 19:01         ` Nishanth Menon
2014-03-24 19:22           ` Felipe Balbi
2014-03-25 15:02 ` Nishanth Menon
     [not found]   ` <53319A7D.1060904-l0cyMroinI0@public.gmane.org>
2014-04-17 16:34     ` Tony Lindgren
2014-04-25 16:46       ` 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=53304F76.8090703@ti.com \
    --to=d-gerlach@ti.com \
    --cc=balbi@ti.com \
    --cc=bcousson@baylibre.com \
    --cc=devicetree@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=lokeshvutla@ti.com \
    --cc=mark.rutland@arm.com \
    --cc=nm@ti.com \
    --cc=nsekhar@ti.com \
    --cc=rnayak@ti.com \
    --cc=tony@atomide.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).