diff mbox

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

Message ID 1398375849-6017-5-git-send-email-joelf@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Joel Fernandes April 24, 2014, 9:43 p.m. UTC
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 <joelf@ti.com>
---
 arch/arm/plat-omap/dmtimer.c              |   29 +++++++++++++++++++++++++++++
 arch/arm/plat-omap/include/plat/dmtimer.h |    2 ++
 2 files changed, 31 insertions(+)

Comments

Tony Lindgren May 7, 2014, 3:25 p.m. UTC | #1
* Joel Fernandes <joelf@ti.com> [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 <joelf@ti.com>
> ---
>  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?

Regards,


Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Joel Fernandes May 7, 2014, 10 p.m. UTC | #2
On 05/07/2014 10:25 AM, Tony Lindgren wrote:
> * Joel Fernandes <joelf@ti.com> [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 <joelf@ti.com>
>> ---
>>  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

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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);
+
 static struct omap_dm_timer *_omap_dm_timer_request(int req_type, void *data)
 {
 	struct omap_dm_timer *timer = NULL, *t;
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h
index 2861b15..41df0a6 100644
--- a/arch/arm/plat-omap/include/plat/dmtimer.h
+++ b/arch/arm/plat-omap/include/plat/dmtimer.h
@@ -135,6 +135,8 @@  void omap_dm_timer_disable(struct omap_dm_timer *timer);
 
 int omap_dm_timer_get_irq(struct omap_dm_timer *timer);
 
+int omap_dm_timer_is_running(int timer_id);
+
 u32 omap_dm_timer_modify_idlect_mask(u32 inputmask);
 struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer);