[PATCH v3] OMAP2+: PM/serial: fix console semaphore acquire during suspend
Kevin Hilman
khilman at deeprootsystems.com
Thu Dec 9 10:56:40 EST 2010
Vitaly Wool <vitalywool at gmail.com> writes:
> On Wed, Dec 8, 2010 at 11:40 PM, Kevin Hilman
> <khilman at deeprootsystems.com> wrote:
>> @@ -120,8 +133,9 @@ static void omap2_enter_full_retention(void)
>> goto no_sleep;
>>
>> /* Block console output in case it is on one of the OMAP UARTs */
>> - if (try_acquire_console_sem())
>> - goto no_sleep;
>> + if (!is_suspending())
>> + if (try_acquire_console_sem())
>> + goto no_sleep;
>
> Combine into one if?
personal preference I guess. I prefer it nested.
>
> <snip>
>
>> omap_uart_prepare_idle(0);
>> omap_uart_prepare_idle(1);
>> @@ -136,7 +150,8 @@ static void omap2_enter_full_retention(void)
>> omap_uart_resume_idle(1);
>> omap_uart_resume_idle(0);
>>
>> - release_console_sem();
>> + if (!is_suspending())
>> + release_console_sem();
>>
>> no_sleep:
>> if (omap2_pm_debug) {
>> @@ -284,6 +299,12 @@ out:
>> local_irq_enable();
>> }
>>
>> +static int omap2_pm_begin(suspend_state_t state)
>> +{
>> + suspend_state = state;
>> + return 0;
>> +}
>
> Do you really need a return code here?
yes, this function prototype is defined by the driver model, not by me.
>> static int omap2_pm_prepare(void)
>> {
>> /* We cannot sleep in idle until we have resumed */
>> @@ -333,10 +354,18 @@ static void omap2_pm_finish(void)
>> enable_hlt();
>> }
>>
>> +static void omap2_pm_end(void)
>> +{
>> + suspend_state = PM_SUSPEND_ON;
>> + return;
>> +}
>
> Redundant return.
but harmless
>> +
>> static struct platform_suspend_ops omap_pm_ops = {
>> + .begin = omap2_pm_begin,
>> .prepare = omap2_pm_prepare,
>> .enter = omap2_pm_enter,
>> .finish = omap2_pm_finish,
>> + .end = omap2_pm_end,
>> .valid = suspend_valid_only_mem,
>> };
>>
>> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
>> index 0ec8a04..648b8c5 100644
>> --- a/arch/arm/mach-omap2/pm34xx.c
>> +++ b/arch/arm/mach-omap2/pm34xx.c
>> @@ -50,6 +50,19 @@
>> #include "sdrc.h"
>> #include "control.h"
>>
>> +#ifdef CONFIG_SUSPEND
>> +static suspend_state_t suspend_state = PM_SUSPEND_ON;
>> +static inline bool is_suspending(void)
>> +{
>> + return (suspend_state != PM_SUSPEND_ON);
>> +}
>> +#else
>> +static inline bool is_suspending(void)
>> +{
>> + return false;
>> +}
>> +#endif
>> +
>> /* Scratchpad offsets */
>> #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4
>> #define OMAP343X_TABLE_VALUE_OFFSET 0xc0
>> @@ -387,10 +400,11 @@ void omap_sram_idle(void)
>> }
>>
>> /* Block console output in case it is on one of the OMAP UARTs */
>> - if (per_next_state < PWRDM_POWER_ON ||
>> - core_next_state < PWRDM_POWER_ON)
>> - if (try_acquire_console_sem())
>> - goto console_still_active;
>> + if (!is_suspending())
>> + if (per_next_state < PWRDM_POWER_ON ||
>> + core_next_state < PWRDM_POWER_ON)
>> + if (try_acquire_console_sem())
>> + goto console_still_active;
>
> Oh well, 3 nested ifs...
again, personal preference.
Kevin
More information about the linux-arm-kernel
mailing list