All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Hilman <khilman@ti.com>
To: Tarun Kanti DebBarma <tarun.kanti@ti.com>
Cc: linux-omap@vger.kernel.org, tony@atomide.com,
	linux-arm-kernel@lists.infradead.org, Charulatha V <charu@ti.com>
Subject: Re: [PATCH v6 17/25] gpio/omap: use pm-runtime framework
Date: Tue, 06 Sep 2011 16:49:51 -0700	[thread overview]
Message-ID: <87ehztxmcg.fsf@ti.com> (raw)
In-Reply-To: <1314798161-19523-18-git-send-email-tarun.kanti@ti.com> (Tarun Kanti DebBarma's message of "Wed, 31 Aug 2011 19:12:33 +0530")

Tarun Kanti DebBarma <tarun.kanti@ti.com> writes:

> Call runtime pm APIs pm_runtime_get_sync() and pm_runtime_put_sync()
> for enabling/disabling clocks appropriately. Remove syscore_ops and
> instead use dev_pm_ops now.
>
> Signed-off-by: Charulatha V <charu@ti.com>
> Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com>
> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
>  drivers/gpio/gpio-omap.c |   89 ++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 67 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 6e7399c..f36931a 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -79,6 +79,8 @@ struct gpio_bank {
>  	struct omap_gpio_reg_offs *regs;
>  };
>  
> +static void omap_gpio_mod_init(struct gpio_bank *bank);
> +
>  #define GPIO_INDEX(bank, gpio) (gpio % bank->width)
>  #define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
>  #define GPIO_MOD_CTRL_BIT	BIT(0)
> @@ -476,6 +478,19 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
>  
>  	spin_lock_irqsave(&bank->lock, flags);
>  
> +	/*
> +	 * If this is the first gpio_request for the bank,
> +	 * enable the bank module.
> +	 */
> +	if (!bank->mod_usage)
> +		if (IS_ERR_VALUE(pm_runtime_get_sync(bank->dev) < 0)) {

All of the IS_ERR_VALUE() usage is wrong here.  You're checking if the
result of IS_ERR_VALUE() is < 0 which will never happen.

> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_get_sync failed\n",
> +					__func__, bank->id);
> +			spin_unlock_irqrestore(&bank->lock, flags);

Rather than take the lock and have to unlock it here, just move the
get_sync before the spinlock.  There's no reason to hold the spinlock
across the get_sync.

In fact, holding the spinlock across a get sync means that the
->runtime_resume callback does not have proper locking around register
access, which is also probably wrong.

The locking in this driver is only around device register accesses, and
should be kept minimal and to very small critical sections.

> +			return -EINVAL;
> +		}
> +
>  	/* Set trigger to none. You need to enable the desired trigger with
>  	 * request_irq() or set_irq_type().
>  	 */
> @@ -530,6 +545,19 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
>  	}
>  
>  	_reset_gpio(bank, bank->chip.base + offset);
> +
> +	/*
> +	 * If this is the last gpio to be freed in the bank,
> +	 * disable the bank module.
> +	 */
> +	if (!bank->mod_usage) {
> +		if (IS_ERR_VALUE(pm_runtime_put_sync(bank->dev) < 0)) {
> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_put_sync failed\n",
> +					__func__, bank->id);
> +		}
> +	}
> +

same here, this should be after unlocking the spinlock, and register
accesses inside the ->runtime_resume() callback need their own
protection.

>  	spin_unlock_irqrestore(&bank->lock, flags);
>  }
>  
> @@ -556,6 +584,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
>  
>  	bank = irq_get_handler_data(irq);
>  	isr_reg = bank->base + bank->regs->irqstatus;
> +	pm_runtime_get_sync(bank->dev);
>  
>  	if (WARN_ON(!isr_reg))
>  		goto exit;
> @@ -617,6 +646,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
>  exit:
>  	if (!unmasked)
>  		chained_irq_exit(chip, desc);
> +	pm_runtime_put_sync_suspend(bank->dev);

Why use _put_sync_suspend()? 

Why does this need to be synchronous?  I think it should use the
asynchronous pm_runtime_put(). 

>  }
>  
>  static void gpio_irq_shutdown(struct irq_data *d)
> @@ -1018,7 +1048,13 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
>  	}
>  
>  	pm_runtime_enable(bank->dev);
> -	pm_runtime_get_sync(bank->dev);
> +	pm_runtime_irq_safe(bank->dev);
> +	if (IS_ERR_VALUE(pm_runtime_get_sync(bank->dev) < 0)) {
> +		dev_err(bank->dev, "%s: GPIO bank %d pm_runtime_get_sync "
> +				"failed\n", __func__, bank->id);
> +		iounmap(bank->base);
> +		return -EINVAL;
> +	}
>  
>  	if (bank->is_mpuio)
>  		mpuio_init(bank);
> @@ -1027,6 +1063,13 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
>  	omap_gpio_chip_init(bank);
>  	omap_gpio_show_rev(bank);
>  
> +	if (IS_ERR_VALUE(pm_runtime_put_sync(bank->dev) < 0)) {
> +		dev_err(bank->dev, "%s: GPIO bank %d pm_runtime_put_sync "
> +				"failed\n", __func__, bank->id);
> +		iounmap(bank->base);
> +		return -EINVAL;
> +	}
> +
>  	list_add_tail(&bank->node, &omap_gpio_list);
>  
>  	return ret;
> @@ -1037,7 +1080,7 @@ err_exit:
>  	return ret;
>  }
>  
> -static int omap_gpio_suspend(void)
> +static int omap_gpio_suspend(struct device *dev)
>  {
>  	struct gpio_bank *bank;
>  
> @@ -1055,12 +1098,13 @@ static int omap_gpio_suspend(void)
>  		bank->saved_wakeup = __raw_readl(wake_status);
>  		MOD_REG_BIT(bank->regs->wkup_en, bank->suspend_wakeup, 1);
>  		spin_unlock_irqrestore(&bank->lock, flags);
> +		pm_runtime_put_sync(dev);
>  	}
>  
>  	return 0;
>  }
>  
> -static void omap_gpio_resume(void)
> +static int omap_gpio_resume(struct device *dev)
>  {
>  	struct gpio_bank *bank;
>  
> @@ -1069,18 +1113,16 @@ static void omap_gpio_resume(void)
>  		unsigned long flags;
>  
>  		if (!bank->regs->wkup_en)
> -			return;
> +			return 0;
>  
> +		pm_runtime_get_sync(dev);
>  		spin_lock_irqsave(&bank->lock, flags);
>  		MOD_REG_BIT(bank->regs->wkup_en, bank->saved_wakeup, 1);
>  		spin_unlock_irqrestore(&bank->lock, flags);
>  	}
> -}
>  
> -static struct syscore_ops omap_gpio_syscore_ops = {
> -	.suspend	= omap_gpio_suspend,
> -	.resume		= omap_gpio_resume,
> -};
> +	return 0;
> +}
>  
>  #ifdef CONFIG_ARCH_OMAP2PLUS
>  
> @@ -1104,6 +1146,11 @@ void omap2_gpio_prepare_for_idle(int off_mode)
>  		if (!off_mode)
>  			continue;
>  
> +		if (IS_ERR_VALUE(pm_runtime_put_sync_suspend(bank->dev) < 0))

_put_sync()

> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_put_sync_suspend failed\n",
> +					__func__, bank->id);
> +
>  		/* If going to OFF, remove triggering for all
>  		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
>  		 * generated.  See OMAP2420 Errata item 1.101. */
> @@ -1144,6 +1191,11 @@ void omap2_gpio_resume_after_idle(void)
>  		if (!bank->loses_context)
>  			continue;
>  
> +		if (IS_ERR_VALUE(pm_runtime_get_sync(bank->dev) < 0))
> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_get_sync failed\n",
> +					__func__, bank->id);
> +
>  		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
>  			clk_enable(bank->dbck);
>  
> @@ -1258,10 +1310,16 @@ static void omap_gpio_restore_context(struct gpio_bank *bank)
>  }
>  #endif
>  
> +static const struct dev_pm_ops gpio_pm_ops = {
> +	.suspend		= omap_gpio_suspend,
> +	.resume			= omap_gpio_resume,
> +};

Please use SET_SYSTEM_SLEEP_PM_OPS().  See <linux/pm.h>

>  static struct platform_driver omap_gpio_driver = {
>  	.probe		= omap_gpio_probe,
>  	.driver		= {
>  		.name	= "omap_gpio",
> +		.pm	= &gpio_pm_ops,
>  	},
>  };
>  
> @@ -1275,16 +1333,3 @@ static int __init omap_gpio_drv_reg(void)
>  	return platform_driver_register(&omap_gpio_driver);
>  }
>  postcore_initcall(omap_gpio_drv_reg);
> -
> -static int __init omap_gpio_sysinit(void)
> -{
> -
> -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
> -	if (cpu_is_omap16xx() || cpu_class_is_omap2())
> -		register_syscore_ops(&omap_gpio_syscore_ops);
> -#endif
> -
> -	return 0;
> -}
> -
> -arch_initcall(omap_gpio_sysinit);

Kevin

WARNING: multiple messages have this Message-ID (diff)
From: khilman@ti.com (Kevin Hilman)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 17/25] gpio/omap: use pm-runtime framework
Date: Tue, 06 Sep 2011 16:49:51 -0700	[thread overview]
Message-ID: <87ehztxmcg.fsf@ti.com> (raw)
In-Reply-To: <1314798161-19523-18-git-send-email-tarun.kanti@ti.com> (Tarun Kanti DebBarma's message of "Wed, 31 Aug 2011 19:12:33 +0530")

Tarun Kanti DebBarma <tarun.kanti@ti.com> writes:

> Call runtime pm APIs pm_runtime_get_sync() and pm_runtime_put_sync()
> for enabling/disabling clocks appropriately. Remove syscore_ops and
> instead use dev_pm_ops now.
>
> Signed-off-by: Charulatha V <charu@ti.com>
> Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com>
> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
>  drivers/gpio/gpio-omap.c |   89 ++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 67 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index 6e7399c..f36931a 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -79,6 +79,8 @@ struct gpio_bank {
>  	struct omap_gpio_reg_offs *regs;
>  };
>  
> +static void omap_gpio_mod_init(struct gpio_bank *bank);
> +
>  #define GPIO_INDEX(bank, gpio) (gpio % bank->width)
>  #define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
>  #define GPIO_MOD_CTRL_BIT	BIT(0)
> @@ -476,6 +478,19 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
>  
>  	spin_lock_irqsave(&bank->lock, flags);
>  
> +	/*
> +	 * If this is the first gpio_request for the bank,
> +	 * enable the bank module.
> +	 */
> +	if (!bank->mod_usage)
> +		if (IS_ERR_VALUE(pm_runtime_get_sync(bank->dev) < 0)) {

All of the IS_ERR_VALUE() usage is wrong here.  You're checking if the
result of IS_ERR_VALUE() is < 0 which will never happen.

> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_get_sync failed\n",
> +					__func__, bank->id);
> +			spin_unlock_irqrestore(&bank->lock, flags);

Rather than take the lock and have to unlock it here, just move the
get_sync before the spinlock.  There's no reason to hold the spinlock
across the get_sync.

In fact, holding the spinlock across a get sync means that the
->runtime_resume callback does not have proper locking around register
access, which is also probably wrong.

The locking in this driver is only around device register accesses, and
should be kept minimal and to very small critical sections.

> +			return -EINVAL;
> +		}
> +
>  	/* Set trigger to none. You need to enable the desired trigger with
>  	 * request_irq() or set_irq_type().
>  	 */
> @@ -530,6 +545,19 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
>  	}
>  
>  	_reset_gpio(bank, bank->chip.base + offset);
> +
> +	/*
> +	 * If this is the last gpio to be freed in the bank,
> +	 * disable the bank module.
> +	 */
> +	if (!bank->mod_usage) {
> +		if (IS_ERR_VALUE(pm_runtime_put_sync(bank->dev) < 0)) {
> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_put_sync failed\n",
> +					__func__, bank->id);
> +		}
> +	}
> +

same here, this should be after unlocking the spinlock, and register
accesses inside the ->runtime_resume() callback need their own
protection.

>  	spin_unlock_irqrestore(&bank->lock, flags);
>  }
>  
> @@ -556,6 +584,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
>  
>  	bank = irq_get_handler_data(irq);
>  	isr_reg = bank->base + bank->regs->irqstatus;
> +	pm_runtime_get_sync(bank->dev);
>  
>  	if (WARN_ON(!isr_reg))
>  		goto exit;
> @@ -617,6 +646,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
>  exit:
>  	if (!unmasked)
>  		chained_irq_exit(chip, desc);
> +	pm_runtime_put_sync_suspend(bank->dev);

Why use _put_sync_suspend()? 

Why does this need to be synchronous?  I think it should use the
asynchronous pm_runtime_put(). 

>  }
>  
>  static void gpio_irq_shutdown(struct irq_data *d)
> @@ -1018,7 +1048,13 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
>  	}
>  
>  	pm_runtime_enable(bank->dev);
> -	pm_runtime_get_sync(bank->dev);
> +	pm_runtime_irq_safe(bank->dev);
> +	if (IS_ERR_VALUE(pm_runtime_get_sync(bank->dev) < 0)) {
> +		dev_err(bank->dev, "%s: GPIO bank %d pm_runtime_get_sync "
> +				"failed\n", __func__, bank->id);
> +		iounmap(bank->base);
> +		return -EINVAL;
> +	}
>  
>  	if (bank->is_mpuio)
>  		mpuio_init(bank);
> @@ -1027,6 +1063,13 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
>  	omap_gpio_chip_init(bank);
>  	omap_gpio_show_rev(bank);
>  
> +	if (IS_ERR_VALUE(pm_runtime_put_sync(bank->dev) < 0)) {
> +		dev_err(bank->dev, "%s: GPIO bank %d pm_runtime_put_sync "
> +				"failed\n", __func__, bank->id);
> +		iounmap(bank->base);
> +		return -EINVAL;
> +	}
> +
>  	list_add_tail(&bank->node, &omap_gpio_list);
>  
>  	return ret;
> @@ -1037,7 +1080,7 @@ err_exit:
>  	return ret;
>  }
>  
> -static int omap_gpio_suspend(void)
> +static int omap_gpio_suspend(struct device *dev)
>  {
>  	struct gpio_bank *bank;
>  
> @@ -1055,12 +1098,13 @@ static int omap_gpio_suspend(void)
>  		bank->saved_wakeup = __raw_readl(wake_status);
>  		MOD_REG_BIT(bank->regs->wkup_en, bank->suspend_wakeup, 1);
>  		spin_unlock_irqrestore(&bank->lock, flags);
> +		pm_runtime_put_sync(dev);
>  	}
>  
>  	return 0;
>  }
>  
> -static void omap_gpio_resume(void)
> +static int omap_gpio_resume(struct device *dev)
>  {
>  	struct gpio_bank *bank;
>  
> @@ -1069,18 +1113,16 @@ static void omap_gpio_resume(void)
>  		unsigned long flags;
>  
>  		if (!bank->regs->wkup_en)
> -			return;
> +			return 0;
>  
> +		pm_runtime_get_sync(dev);
>  		spin_lock_irqsave(&bank->lock, flags);
>  		MOD_REG_BIT(bank->regs->wkup_en, bank->saved_wakeup, 1);
>  		spin_unlock_irqrestore(&bank->lock, flags);
>  	}
> -}
>  
> -static struct syscore_ops omap_gpio_syscore_ops = {
> -	.suspend	= omap_gpio_suspend,
> -	.resume		= omap_gpio_resume,
> -};
> +	return 0;
> +}
>  
>  #ifdef CONFIG_ARCH_OMAP2PLUS
>  
> @@ -1104,6 +1146,11 @@ void omap2_gpio_prepare_for_idle(int off_mode)
>  		if (!off_mode)
>  			continue;
>  
> +		if (IS_ERR_VALUE(pm_runtime_put_sync_suspend(bank->dev) < 0))

_put_sync()

> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_put_sync_suspend failed\n",
> +					__func__, bank->id);
> +
>  		/* If going to OFF, remove triggering for all
>  		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
>  		 * generated.  See OMAP2420 Errata item 1.101. */
> @@ -1144,6 +1191,11 @@ void omap2_gpio_resume_after_idle(void)
>  		if (!bank->loses_context)
>  			continue;
>  
> +		if (IS_ERR_VALUE(pm_runtime_get_sync(bank->dev) < 0))
> +			dev_err(bank->dev, "%s: GPIO bank %d "
> +					"pm_runtime_get_sync failed\n",
> +					__func__, bank->id);
> +
>  		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
>  			clk_enable(bank->dbck);
>  
> @@ -1258,10 +1310,16 @@ static void omap_gpio_restore_context(struct gpio_bank *bank)
>  }
>  #endif
>  
> +static const struct dev_pm_ops gpio_pm_ops = {
> +	.suspend		= omap_gpio_suspend,
> +	.resume			= omap_gpio_resume,
> +};

Please use SET_SYSTEM_SLEEP_PM_OPS().  See <linux/pm.h>

>  static struct platform_driver omap_gpio_driver = {
>  	.probe		= omap_gpio_probe,
>  	.driver		= {
>  		.name	= "omap_gpio",
> +		.pm	= &gpio_pm_ops,
>  	},
>  };
>  
> @@ -1275,16 +1333,3 @@ static int __init omap_gpio_drv_reg(void)
>  	return platform_driver_register(&omap_gpio_driver);
>  }
>  postcore_initcall(omap_gpio_drv_reg);
> -
> -static int __init omap_gpio_sysinit(void)
> -{
> -
> -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
> -	if (cpu_is_omap16xx() || cpu_class_is_omap2())
> -		register_syscore_ops(&omap_gpio_syscore_ops);
> -#endif
> -
> -	return 0;
> -}
> -
> -arch_initcall(omap_gpio_sysinit);

Kevin

  reply	other threads:[~2011-09-06 23:49 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-31 13:42 [PATCH v6 00/25] gpio/omap: driver cleanup and fixes Tarun Kanti DebBarma
2011-08-31 13:42 ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 01/25] gpio/omap: remove dependency on gpio_bank_count Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 02/25] gpio/omap: use flag to identify wakeup domain Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 03/25] gpio/omap: make gpio_context part of gpio_bank structure Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 04/25] gpio/omap: fix pwrdm_post_transition call sequence Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 05/25] gpio/omap: handle save/restore context in GPIO driver Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 06/25] gpio/omap: make non-wakeup GPIO part of pdata Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 07/25] gpio/omap: avoid cpu checks during module ena/disable Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 08/25] gpio/omap: further cleanup using wkup_en register Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 09/25] gpio/omap: use level/edge detect reg offsets Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 10/25] gpio/omap: remove hardcoded offsets in context save/restore Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 11/25] gpio/omap: cleanup set_gpio_triggering function Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 12/25] gpio/omap: cleanup omap_gpio_mod_init function Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 13/25] gpio/omap: use pinctrl offset instead of macro Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 14/25] gpio/omap: remove unnecessary bit-masking for read access Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 15/25] gpio/omap: remove bank->method & METHOD_* macros Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 16/25] gpio/omap: fix bankwidth for OMAP7xx MPUIO Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 17/25] gpio/omap: use pm-runtime framework Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-06 23:49   ` Kevin Hilman [this message]
2011-09-06 23:49     ` Kevin Hilman
2011-09-07  5:04     ` DebBarma, Tarun Kanti
2011-09-07  5:04       ` DebBarma, Tarun Kanti
2011-09-07 12:32       ` Kevin Hilman
2011-09-07 12:32         ` Kevin Hilman
2011-09-07 12:53         ` DebBarma, Tarun Kanti
2011-09-07 12:53           ` DebBarma, Tarun Kanti
2011-09-09 12:32     ` DebBarma, Tarun Kanti
2011-09-09 12:32       ` DebBarma, Tarun Kanti
2011-09-09 12:54       ` DebBarma, Tarun Kanti
2011-09-09 12:54         ` DebBarma, Tarun Kanti
2011-09-09 18:04       ` Kevin Hilman
2011-09-09 18:04         ` Kevin Hilman
2011-09-09 18:55         ` DebBarma, Tarun Kanti
2011-09-09 18:55           ` DebBarma, Tarun Kanti
2011-09-09 21:00           ` Kevin Hilman
2011-09-09 21:00             ` Kevin Hilman
2011-08-31 13:42 ` [PATCH v6 18/25] gpio/omap: optimize suspend and resume functions Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-08-31 13:42 ` [PATCH v6 19/25] gpio/omap: cleanup prepare_for_idle and resume_after_idle Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-06 23:53   ` Kevin Hilman
2011-09-06 23:53     ` Kevin Hilman
2011-09-07  5:17     ` DebBarma, Tarun Kanti
2011-09-07  5:17       ` DebBarma, Tarun Kanti
2011-08-31 13:42 ` [PATCH v6 20/25] gpio/omap: skip operations in runtime callbacks Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-06 23:54   ` Kevin Hilman
2011-09-06 23:54     ` Kevin Hilman
2011-09-07  5:33     ` DebBarma, Tarun Kanti
2011-09-07  5:33       ` DebBarma, Tarun Kanti
2011-08-31 13:42 ` [PATCH v6 21/25] gpio/omap: remove omap_gpio_save_context overhead Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-06 23:57   ` Kevin Hilman
2011-09-06 23:57     ` Kevin Hilman
2011-08-31 13:42 ` [PATCH v6 22/25] gpio/omap: save and restore debounce registers Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-07  0:03   ` Kevin Hilman
2011-09-07  0:03     ` Kevin Hilman
2011-09-07  6:16     ` DebBarma, Tarun Kanti
2011-09-07  6:16       ` DebBarma, Tarun Kanti
2011-08-31 13:42 ` [PATCH v6 23/25] gpio/omap: enable irq at the end of all configuration in restore Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-07  0:08   ` Kevin Hilman
2011-09-07  0:08     ` Kevin Hilman
2011-08-31 13:42 ` [PATCH v6 24/25] gpio/omap: restore OE only after setting the output level Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-07  0:06   ` Kevin Hilman
2011-09-07  0:06     ` Kevin Hilman
2011-09-07  6:18     ` DebBarma, Tarun Kanti
2011-09-07  6:18       ` DebBarma, Tarun Kanti
2011-08-31 13:42 ` [PATCH v6 25/25] gpio/omap: handle set_dataout reg capable IP on restore Tarun Kanti DebBarma
2011-08-31 13:42   ` Tarun Kanti DebBarma
2011-09-07  0:07   ` Kevin Hilman
2011-09-07  0:07     ` Kevin Hilman
2011-09-07  7:35     ` DebBarma, Tarun Kanti
2011-09-07  7:35       ` DebBarma, Tarun Kanti
2011-09-06 22:59 ` [PATCH v6 00/25] gpio/omap: driver cleanup and fixes Kevin Hilman
2011-09-06 22:59   ` Kevin Hilman
2011-09-07  5:24   ` DebBarma, Tarun Kanti
2011-09-07  5:24     ` DebBarma, Tarun Kanti
2011-09-10  0:54     ` DebBarma, Tarun Kanti
2011-09-10  0:54       ` DebBarma, Tarun Kanti
2011-09-11  8:37       ` Russell King - ARM Linux
2011-09-11  8:37         ` Russell King - ARM Linux
2011-09-12 16:39       ` Kevin Hilman
2011-09-12 16:39         ` Kevin Hilman
2011-09-06 23:25 ` Kevin Hilman
2011-09-06 23:25   ` Kevin Hilman
2011-09-07  5:31   ` DebBarma, Tarun Kanti
2011-09-07  5:31     ` DebBarma, Tarun Kanti
2011-09-12 11:44   ` DebBarma, Tarun Kanti
2011-09-12 11:44     ` DebBarma, Tarun Kanti

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=87ehztxmcg.fsf@ti.com \
    --to=khilman@ti.com \
    --cc=charu@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=tarun.kanti@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 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.