Subject: [PATCH 04/26] ARM: OMAP: dmtimer: Add function to check if timer is running

From: [email-masked] (Joel Fernandes)
Date: Wed, 7 May 2014 17:00:22 -0500

On 05/07/2014 10:25 AM, Tony Lindgren wrote:
> * Joel Fernandes <[email-masked]> [140424 14:44]:
>> Inorder to move non-DM timer specific code that modifies the "idlect"
>> mask on OMAP1, from dmtimer code, to OMAP1 specific timer initialization code,
>> we introduce a new function that can possibly be reused for other purposes in
>> the future. The function just checks if a timer is running based on the timer ID
>> which should be same as pdev->id. This allows us to cleanly separate the timer vs
>> non-timer bits and keep the timer bits in the dmtimer code.
>>
>> Signed-off-by: Joel Fernandes <[email-masked]>
>> ---
>>  arch/arm/plat-omap/dmtimer.c              |   29 +++++++++++++++++++++++++++++
>>  arch/arm/plat-omap/include/plat/dmtimer.h |    2 ++
>>  2 files changed, 31 insertions(+)
>>
>> diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
>> index 4debb3d..86b2641 100644
>> --- a/arch/arm/plat-omap/dmtimer.c
>> +++ b/arch/arm/plat-omap/dmtimer.c
>> @@ -187,6 +187,35 @@ int omap_dm_timer_reserve_systimer(int id)
>>  	return 0;
>>  }
>>  
>> +/*
>> + * Check if a timer is running based on timer_id, used for OMAP1 currently.
>> + */
>> +int omap_dm_timer_is_running(int timer_id)
>> +{
>> +	int i = 1, ret = 0;
>> +	struct omap_dm_timer *timer = NULL;
>> +	unsigned long flags;
>> +
>> +	spin_lock_irqsave(&dm_timer_lock, flags);
>> +	list_for_each_entry(timer, &omap_timer_list, node) {
>> +		if (i == timer_id) {
>> +			u32 l;
>> +			l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
>> +			if (l & OMAP_TIMER_CTRL_ST) {
>> +				ret = 1;
>> +				goto done;
>> +			} else {
>> +				goto done;
>> +			}
>> +		}
>> +		i++;
>> +	}
>> +done:
>> +	spin_unlock_irqrestore(&dm_timer_lock, flags);
>> +	return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(omap_dm_timer_is_running);
> 
> Let's not add new exported custom functions, let's instead try to get
> rid of them. What needs to use this one?

This piece of code was entangled with OMAP1 specific logic.

The OMAP1 specific logic is moved into a new function in the OMAP1 timer
layer called: omap_dm_timer_modify_idlect_mask

What's left is code that needs to iterate over all the timers by
checking the OMAP_TIMER_CTRL_ST bit in the control register. This is
left back into the dmtimer code but needs to be exported since we
ultimately will move dmtimer into clock source.

If you notice, I removed export of omap_dm_timer_modify_idlect_mask
since it is moved to omap1 layer and is local there, so it should be OK
to export this symbol instead. We are not adding more exports, and its
still an improvement over the old code as the OMAP1 specific logic is
decoupled from the generic dmtimer code.

thanks,

-Joel