Re: [PATCH] OMAP3EVM: Update pad configuration for wakeup enabled pads

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Wed, 28-Apr-10 11:53 PM +0530, Kevin Hilman wrote:
> Ranjith Lohithakshan <ranjithl@xxxxxx> writes:
> 
>> Kevin,
>>
>> On Tue, 27-Apr-10 8:46 PM +0530, Kevin Hilman wrote:
>>> Ranjith Lohithakshan <ranjithl@xxxxxx> writes:
>>>
>>>> OMAP3530 TRM section 7.4.4.4.2 requires OFFOUTENABLE to be set (active low)
>>>> if wakeup capabilities are enabled on a pad. During OFF mode testing
>>>> on OMAP3530 EVM, it was observed that the device was not residing in
>>>> the OFF state. The device enters into the OFF state and immediately exits
>>>> from that state as if an IO wakeup event has occured. The issue was traced
>>>> down to the pad configuration of wkaeup enabled pad's.
>>> Nice.
>>>
>>>> Also, the pad configuration is included only if the respective drivers are
>>>> enabled in the defconfig.
>>> Hmm, do you really want this?  If you don't have the driver enabled,
>>> you have to rely on the bootloader settings of these pads which may
>>> also be wrong and trigger an IO wakeup as well.
>> The thought process was that, for example, if keypad is not enabled
>> in a system configuration you probably don't want to see a wakeup
>> occurring if someone presses a key stroke. I understand the concern
>> that you have raised regarding bootloader mis-configurations. My
>> impression was that the bootloaders typically set the mux modes and
>> pull up's/downs and dont really program or enable the wakeup
>> capability.  But we cannot depend on that thumb rule.
> 
> Unfortunately, Bootloaders don't "typically" do anything.  They are
> routinely hacked/patched and cannot be trusted at all.
> 
>> What is your recommendation?
> 
> First, I suggest you fix the OFFOUTENABLE bug in a single patch
> without introducing the #ifdefs.  Then, address the enable/disable of
> the wakeups in a separate patch.

I will do that.

> Next, ideally wakeups should not be configured a this level of board
> code.  There are APIs for that: enable_irq_wake()/disable_irq_wake()
> 
> For GPIOs (like the touchscreen), you really need to enable wakeups
> using existing APIs, either in the driver or in board init code and be
> sure there is an interrupt handler.  Please see the 'Known Problems'
> section of the OMAP PM wiki[2] where it talks about GPIO wakeups.
> Below[2] is an test patch I've used.

I have pushed a patch on ads7846 to linux-input some time ago adding
wakeup support.

fdba2bb : Input: ads7846 - add wakeup support

There is now a wakeup flag added to the ads7846 platform data which can
enabled at the board level. Once this is set , the driver will do an
enable_irq_wake. The patch is now accepted and in mainline. I will
remove the wakeup mux configuration from the board file and instead will
just set the wakeup flag in the ads7846 platform data.

The keypad uses a pin in the non-gpio mode. Is enable_irq_wake supported
for non-gpio mode?

> For MPU IRQs, the IRQ wake APIs don't quite work as expected.  You
> can look at board-3430sdp.c to see how wakeups are enabled there.  
> If you want to make that conditional on the T2 driver being installed,
> it could be part of the T2 init process.
> 

Thanks for the pointers.

> 
> [1] http://elinux.org/OMAP_Power_Management#Known_Problems
> 
> [2]
> commit a12a1b43c75795fa106d1222730591354209c037
> Author: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx>
> Date:   Wed Sep 9 11:58:20 2009 -0700
> 
>     OMAP3: PM: Enable touchscreen GPIO wakeups on SDP and omap3evm
>     
>     For the GPIO wakeup to work, the GPIO IRQ must be configured as a
>     wakeup IRQ.
>     
>     In addition, a corresponding interrupt handler must be used and enabled
>     so that after coming out of idle/suspend the interrupt will be cleared.
>     Otherwise, a pending GPIO IRQ will prevent future idle request. (c.f.
>     GPIO 'Interrupt and Wakeup' section of the TRM, specifically the
>     subsection 'Involved Configuration Registers'.)
>     
>     Signed-off-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx>
> 
> diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
> index c1742d0..96f921e 100644
> --- a/arch/arm/mach-omap2/board-3430sdp.c
> +++ b/arch/arm/mach-omap2/board-3430sdp.c
> @@ -24,6 +24,8 @@
>  #include <linux/regulator/machine.h>
>  #include <linux/io.h>
>  #include <linux/gpio.h>
> +#include <linux/interrupt.h>
> +#include <linux/irq.h>
>  
>  #include <mach/hardware.h>
>  #include <asm/mach-types.h>
> @@ -140,6 +142,11 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
>  
>  static int ts_gpio;	/* Needed for ads7846_get_pendown_state */
>  
> +static irqreturn_t dummy_interrupt_handler (int irq, void *dev_id)
> +{
> +	return IRQ_HANDLED;
> +}
> +
>  /**
>   * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
>   *
> @@ -147,6 +154,8 @@ static int ts_gpio;	/* Needed for ads7846_get_pendown_state */
>   */
>  static void ads7846_dev_init(void)
>  {
> +	int ret;
> +
>  	if (gpio_request(ts_gpio, "ADS7846 pendown") < 0) {
>  		printk(KERN_ERR "can't get ads746 pen down GPIO\n");
>  		return;
> @@ -156,6 +165,12 @@ static void ads7846_dev_init(void)
>  
>  	omap_set_gpio_debounce(ts_gpio, 1);
>  	omap_set_gpio_debounce_time(ts_gpio, 0xa);
> +
> +	ret = request_irq(gpio_to_irq(ts_gpio),
> +			  (irq_handler_t)dummy_interrupt_handler,
> +			  IRQF_TRIGGER_FALLING,
> +			  "ads7846-dummy", NULL);
> +	enable_irq_wake(gpio_to_irq(ts_gpio));
>  }
>  
>  static int ads7846_get_pendown_state(void)
> diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
> index 9ac1eb2..1647440 100644
> --- a/arch/arm/mach-omap2/board-omap3evm.c
> +++ b/arch/arm/mach-omap2/board-omap3evm.c
> @@ -574,8 +574,15 @@ static int __init omap3_evm_i2c_init(void)
>  	return 0;
>  }
>  
> +static irqreturn_t dummy_interrupt_handler (int irq, void *dev_id)
> +{
> +	return IRQ_HANDLED;
> +}
> +
>  static void ads7846_dev_init(void)
>  {
> +	int ret;
> +
>  	if (gpio_request(OMAP3_EVM_TS_GPIO, "ADS7846 pendown") < 0)
>  		printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
>  
> @@ -583,6 +590,12 @@ static void ads7846_dev_init(void)
>  
>  	omap_set_gpio_debounce(OMAP3_EVM_TS_GPIO, 1);
>  	omap_set_gpio_debounce_time(OMAP3_EVM_TS_GPIO, 0xa);
> +
> +	ret = request_irq(gpio_to_irq(OMAP3_EVM_TS_GPIO),
> +			  (irq_handler_t)dummy_interrupt_handler,
> +			  IRQF_TRIGGER_FALLING,
> +			  "ads7846-dummy", NULL);
> +	enable_irq_wake(gpio_to_irq(OMAP3_EVM_TS_GPIO));
>  }
>  
>  static int ads7846_get_pendown_state(void)
> 
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux