RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-19 Thread li.xi...@freescale.com
> >>> +static inline u32 ftm_readl(void __iomem *addr)
> >>> +{
> >>> + if (big_endian)
> >>
> >> I am not a big fan of addressing global variables in the functions, so
> >> if you can pass the structure pointer around here and the other
> >> functions instead that would be nice.
> >>
> >> Otherwise the patch sounds ok. Thanks for taking care of encapsulating
> >> well the functions and commenting the code.
> >>
> >
> > Yes, I did think so.
> >
> > But some callbacks like :
> > + static u64 ftm_read_sched_clock(void)
> > + {
> > + return ftm_readl(clksrc_base + FTM_CNT);
> > + }
> >
> > Used by :
> > + sched_clock_register(ftm_read_sched_clock,);
> >
> > If they are encapsulated in a structure, and should the struct instance
> > be one global instance too ? I'm doubting whether will this make sense ?
> 
> Actually, I plan in a near future to consolidate the code and factor out
> some parts with a common structure across the different drivers. So even
> if you address the base@ with the global instance but pass around the
> structure as parameter, that will be ok because that will be less
> modifications in the future. It is not a strong requirement, just put in
> place some encapsulation to make the life easier for after.
> 

Yes, sounds good.

I'll follow your advice...


> >>> +static int __init ftm_calc_closest_round_cyc(unsigned long freq)
> >>> +{
> >>> + ps = 0;
> >>> +
> >>> + do {
> >>> + peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1 << ps++));
> >>> + } while (peroidic_cyc > 0x);
> >>> +
> >>> + if (ps > 7) {
> >>> + pr_err("ftm: the max prescaler is %lu > 7\n", ps);
> >>> + return -EINVAL;
> >>> + }
> >>> +
> >>
> >> Can you explain how this error can happen ?
> >>
> >
> > Yes, the hardware limitation of the 'ps' is 0~7, and the counter register
> > Is only using the lower 16 bits.
> > If the 'freq' value is too big here, then the periodic_cyc may exceed 
> > 0x.
> >
> > Or should I add some comment here ?
> 
> Yes, a comment will be welcome.
> 

Okay, Please see the next version.

Thanks very much,

BRs
Xiubo


> Thanks
>-- Daniel
> 
> --
>    Linaro.org │ Open source software for ARM SoCs
> 
> Follow Linaro:   Facebook |
>  Twitter |
>  Blog



Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-19 Thread Daniel Lezcano

On 05/19/2014 04:26 AM, li.xi...@freescale.com wrote:

+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;
+static unsigned long ps;
+bool big_endian;
+


Usually this is encaspulated in a structure.

struct ftm_clock_device {
void __iomem *clksrc_base;
...
};



+static inline u32 ftm_readl(void __iomem *addr)
+{
+   if (big_endian)


I am not a big fan of addressing global variables in the functions, so
if you can pass the structure pointer around here and the other
functions instead that would be nice.

Otherwise the patch sounds ok. Thanks for taking care of encapsulating
well the functions and commenting the code.



Yes, I did think so.

But some callbacks like :
+ static u64 ftm_read_sched_clock(void)
+ {
+ return ftm_readl(clksrc_base + FTM_CNT);
+ }

Used by :
+ sched_clock_register(ftm_read_sched_clock,);

If they are encapsulated in a structure, and should the struct instance
be one global instance too ? I'm doubting whether will this make sense ?


Actually, I plan in a near future to consolidate the code and factor out 
some parts with a common structure across the different drivers. So even 
if you address the base@ with the global instance but pass around the 
structure as parameter, that will be ok because that will be less 
modifications in the future. It is not a strong requirement, just put in 
place some encapsulation to make the life easier for after.



+static int __init ftm_calc_closest_round_cyc(unsigned long freq)
+{
+   ps = 0;
+
+   do {
+   peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1 << ps++));
+   } while (peroidic_cyc > 0x);
+
+   if (ps > 7) {
+   pr_err("ftm: the max prescaler is %lu > 7\n", ps);
+   return -EINVAL;
+   }
+


Can you explain how this error can happen ?



Yes, the hardware limitation of the 'ps' is 0~7, and the counter register
Is only using the lower 16 bits.
If the 'freq' value is too big here, then the periodic_cyc may exceed 0x.

Or should I add some comment here ?


Yes, a comment will be welcome.

Thanks
  -- Daniel

--
  Linaro.org │ Open source software for ARM SoCs

Follow Linaro:   Facebook |
 Twitter |
 Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-19 Thread Daniel Lezcano

On 05/19/2014 04:26 AM, li.xi...@freescale.com wrote:

+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;
+static unsigned long ps;
+bool big_endian;
+


Usually this is encaspulated in a structure.

struct ftm_clock_device {
void __iomem *clksrc_base;
...
};



+static inline u32 ftm_readl(void __iomem *addr)
+{
+   if (big_endian)


I am not a big fan of addressing global variables in the functions, so
if you can pass the structure pointer around here and the other
functions instead that would be nice.

Otherwise the patch sounds ok. Thanks for taking care of encapsulating
well the functions and commenting the code.



Yes, I did think so.

But some callbacks like :
+ static u64 ftm_read_sched_clock(void)
+ {
+ return ftm_readl(clksrc_base + FTM_CNT);
+ }

Used by :
+ sched_clock_register(ftm_read_sched_clock,);

If they are encapsulated in a structure, and should the struct instance
be one global instance too ? I'm doubting whether will this make sense ?


Actually, I plan in a near future to consolidate the code and factor out 
some parts with a common structure across the different drivers. So even 
if you address the base@ with the global instance but pass around the 
structure as parameter, that will be ok because that will be less 
modifications in the future. It is not a strong requirement, just put in 
place some encapsulation to make the life easier for after.



+static int __init ftm_calc_closest_round_cyc(unsigned long freq)
+{
+   ps = 0;
+
+   do {
+   peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1  ps++));
+   } while (peroidic_cyc  0x);
+
+   if (ps  7) {
+   pr_err(ftm: the max prescaler is %lu  7\n, ps);
+   return -EINVAL;
+   }
+


Can you explain how this error can happen ?



Yes, the hardware limitation of the 'ps' is 0~7, and the counter register
Is only using the lower 16 bits.
If the 'freq' value is too big here, then the periodic_cyc may exceed 0x.

Or should I add some comment here ?


Yes, a comment will be welcome.

Thanks
  -- Daniel

--
 http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
http://twitter.com/#!/linaroorg Twitter |
http://www.linaro.org/linaro-blog/ Blog

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-19 Thread li.xi...@freescale.com
  +static inline u32 ftm_readl(void __iomem *addr)
  +{
  + if (big_endian)
 
  I am not a big fan of addressing global variables in the functions, so
  if you can pass the structure pointer around here and the other
  functions instead that would be nice.
 
  Otherwise the patch sounds ok. Thanks for taking care of encapsulating
  well the functions and commenting the code.
 
 
  Yes, I did think so.
 
  But some callbacks like :
  + static u64 ftm_read_sched_clock(void)
  + {
  + return ftm_readl(clksrc_base + FTM_CNT);
  + }
 
  Used by :
  + sched_clock_register(ftm_read_sched_clock,);
 
  If they are encapsulated in a structure, and should the struct instance
  be one global instance too ? I'm doubting whether will this make sense ?
 
 Actually, I plan in a near future to consolidate the code and factor out
 some parts with a common structure across the different drivers. So even
 if you address the base@ with the global instance but pass around the
 structure as parameter, that will be ok because that will be less
 modifications in the future. It is not a strong requirement, just put in
 place some encapsulation to make the life easier for after.
 

Yes, sounds good.

I'll follow your advice...


  +static int __init ftm_calc_closest_round_cyc(unsigned long freq)
  +{
  + ps = 0;
  +
  + do {
  + peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1  ps++));
  + } while (peroidic_cyc  0x);
  +
  + if (ps  7) {
  + pr_err(ftm: the max prescaler is %lu  7\n, ps);
  + return -EINVAL;
  + }
  +
 
  Can you explain how this error can happen ?
 
 
  Yes, the hardware limitation of the 'ps' is 0~7, and the counter register
  Is only using the lower 16 bits.
  If the 'freq' value is too big here, then the periodic_cyc may exceed 
  0x.
 
  Or should I add some comment here ?
 
 Yes, a comment will be welcome.
 

Okay, Please see the next version.

Thanks very much,

BRs
Xiubo


 Thanks
-- Daniel
 
 --
   http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs
 
 Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
 http://twitter.com/#!/linaroorg Twitter |
 http://www.linaro.org/linaro-blog/ Blog



RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-18 Thread li.xi...@freescale.com
> > +#define FTM_CNTIN  0x4C
> > +
> > +static void __iomem *clksrc_base;
> > +static void __iomem *clkevt_base;
> > +static unsigned long peroidic_cyc;
> > +static unsigned long ps;
> > +bool big_endian;
> > +
> 
> Usually this is encaspulated in a structure.
> 
> struct ftm_clock_device {
>   void __iomem *clksrc_base;
>   ...
> };
>
> 
> > +static inline u32 ftm_readl(void __iomem *addr)
> > +{
> > +   if (big_endian)
> 
> I am not a big fan of addressing global variables in the functions, so
> if you can pass the structure pointer around here and the other
> functions instead that would be nice.
> 
> Otherwise the patch sounds ok. Thanks for taking care of encapsulating
> well the functions and commenting the code.
> 

Yes, I did think so.

But some callbacks like :
+ static u64 ftm_read_sched_clock(void)
+ {
+ return ftm_readl(clksrc_base + FTM_CNT);
+ }

Used by :
+ sched_clock_register(ftm_read_sched_clock,);

If they are encapsulated in a structure, and should the struct instance
be one global instance too ? I'm doubting whether will this make sense ?


> > +static int __init ftm_calc_closest_round_cyc(unsigned long freq)
> > +{
> > +   ps = 0;
> > +
> > +   do {
> > +   peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1 << ps++));
> > +   } while (peroidic_cyc > 0x);
> > +
> > +   if (ps > 7) {
> > +   pr_err("ftm: the max prescaler is %lu > 7\n", ps);
> > +   return -EINVAL;
> > +   }
> > +
> 
> Can you explain how this error can happen ?
> 

Yes, the hardware limitation of the 'ps' is 0~7, and the counter register
Is only using the lower 16 bits.
If the 'freq' value is too big here, then the periodic_cyc may exceed 0x.

Or should I add some comment here ?


Thanks very much,
BRs
Xiubo


N�r��yb�X��ǧv�^�)޺{.n�+{zX����ܨ}���Ơz�:+v���zZ+��+zf���h���~i���z��w���?�&�)ߢf��^jǫy�m��@A�a���
0��h���i

RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-18 Thread li.xi...@freescale.com
> Subject: Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM)
> timer support
> 
> On 04/28/14 19:18, Xiubo Li wrote:
> > +bool big_endian;
> > +
> 
> static?
> 

I will fix this.

Thanks,

BRs
Xiubo


> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-18 Thread li.xi...@freescale.com
> > +static void __iomem *clksrc_base;
> > +static void __iomem *clkevt_base;
> > +static unsigned long peroidic_cyc;
> 
> peroidic_cyc ? Did you mean periodic_cyc ? :)
> 

Yes, I'll fix it.

Thanks,

BRs
Xiubo


> 
> 
> --
>    Linaro.org │ Open source software for ARM SoCs
> 
> Follow Linaro:   Facebook |
>  Twitter |
>  Blog



RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-18 Thread li.xi...@freescale.com
  +static void __iomem *clksrc_base;
  +static void __iomem *clkevt_base;
  +static unsigned long peroidic_cyc;
 
 peroidic_cyc ? Did you mean periodic_cyc ? :)
 

Yes, I'll fix it.

Thanks,

BRs
Xiubo


 
 
 --
   http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs
 
 Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
 http://twitter.com/#!/linaroorg Twitter |
 http://www.linaro.org/linaro-blog/ Blog



RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-18 Thread li.xi...@freescale.com
 Subject: Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM)
 timer support
 
 On 04/28/14 19:18, Xiubo Li wrote:
  +bool big_endian;
  +
 
 static?
 

I will fix this.

Thanks,

BRs
Xiubo


 --
 Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
 hosted by The Linux Foundation

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-18 Thread li.xi...@freescale.com
  +#define FTM_CNTIN  0x4C
  +
  +static void __iomem *clksrc_base;
  +static void __iomem *clkevt_base;
  +static unsigned long peroidic_cyc;
  +static unsigned long ps;
  +bool big_endian;
  +
 
 Usually this is encaspulated in a structure.
 
 struct ftm_clock_device {
   void __iomem *clksrc_base;
   ...
 };

 
  +static inline u32 ftm_readl(void __iomem *addr)
  +{
  +   if (big_endian)
 
 I am not a big fan of addressing global variables in the functions, so
 if you can pass the structure pointer around here and the other
 functions instead that would be nice.
 
 Otherwise the patch sounds ok. Thanks for taking care of encapsulating
 well the functions and commenting the code.
 

Yes, I did think so.

But some callbacks like :
+ static u64 ftm_read_sched_clock(void)
+ {
+ return ftm_readl(clksrc_base + FTM_CNT);
+ }

Used by :
+ sched_clock_register(ftm_read_sched_clock,);

If they are encapsulated in a structure, and should the struct instance
be one global instance too ? I'm doubting whether will this make sense ?


  +static int __init ftm_calc_closest_round_cyc(unsigned long freq)
  +{
  +   ps = 0;
  +
  +   do {
  +   peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1  ps++));
  +   } while (peroidic_cyc  0x);
  +
  +   if (ps  7) {
  +   pr_err(ftm: the max prescaler is %lu  7\n, ps);
  +   return -EINVAL;
  +   }
  +
 
 Can you explain how this error can happen ?
 

Yes, the hardware limitation of the 'ps' is 0~7, and the counter register
Is only using the lower 16 bits.
If the 'freq' value is too big here, then the periodic_cyc may exceed 0x.

Or should I add some comment here ?


Thanks very much,
BRs
Xiubo


N�r��yb�X��ǧv�^�)޺{.n�+{zX����ܨ}���Ơz�j:+v���zZ+��+zf���h���~i���z��w���?��)ߢf��^jǫy�m��@A�a���
0��h���i

Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-16 Thread Daniel Lezcano

On 04/29/2014 04:18 AM, Xiubo Li wrote:

The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li 
Cc: Shawn Guo 
Cc: Jingchang Lu 
---
  drivers/clocksource/Kconfig |   5 +
  drivers/clocksource/Makefile|   1 +
  drivers/clocksource/fsl_ftm_timer.c | 344 
  3 files changed, 350 insertions(+)
  create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cd6950f..28321c5 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
  for all devicetree enabled platforms. This driver will be
  needed only on systems that do not have the Exynos MCT available.

+config FSL_FTM_TIMER
+   bool
+   help
+ Support for Freescale FlexTimer Module (FTM) timer.
+
  config VF_PIT_TIMER
bool
help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index c7ca50a..ce0a967 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)   += cadence_ttc_timer.o
  obj-$(CONFIG_CLKSRC_EFM32)+= time-efm32.o
  obj-$(CONFIG_CLKSRC_EXYNOS_MCT)   += exynos_mct.o
  obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)  += samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)+= fsl_ftm_timer.o
  obj-$(CONFIG_VF_PIT_TIMER)+= vf_pit_timer.o

  obj-$(CONFIG_ARM_ARCH_TIMER)  += arm_arch_timer.o
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 000..7f6246a
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,344 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define FTM_SC 0x00
+#define FTM_SC_CLK_SHIFT   3
+#define FTM_SC_CLK_MASK(0x3 << FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)  ((c) << FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK 0x7
+#define FTM_SC_TOIEBIT(6)
+#define FTM_SC_TOF BIT(7)
+
+#define FTM_CNT0x04
+#define FTM_MOD0x08
+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;
+static unsigned long ps;
+bool big_endian;
+


Usually this is encaspulated in a structure.

struct ftm_clock_device {
void __iomem *clksrc_base;
...
};



+static inline u32 ftm_readl(void __iomem *addr)
+{
+   if (big_endian)


I am not a big fan of addressing global variables in the functions, so 
if you can pass the structure pointer around here and the other 
functions instead that would be nice.


Otherwise the patch sounds ok. Thanks for taking care of encapsulating 
well the functions and commenting the code.



+   return ioread32be(addr);
+   else
+   return ioread32(addr);
+}
+


[ ... ]


+
+static int __init ftm_calc_closest_round_cyc(unsigned long freq)
+{
+   ps = 0;
+
+   do {
+   peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1 << ps++));
+   } while (peroidic_cyc > 0x);
+
+   if (ps > 7) {
+   pr_err("ftm: the max prescaler is %lu > 7\n", ps);
+   return -EINVAL;
+   }
+


Can you explain how this error can happen ?


+   return 0;
+}
+


[ ... ]


--
  Linaro.org │ Open source software for ARM SoCs

Follow Linaro:   Facebook |
 Twitter |
 Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-16 Thread Stephen Boyd
On 04/28/14 19:18, Xiubo Li wrote:
> +bool big_endian;
> +

static?

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-16 Thread Daniel Lezcano

On 04/29/2014 04:18 AM, Xiubo Li wrote:

The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li 
Cc: Shawn Guo 
Cc: Jingchang Lu 
---
  drivers/clocksource/Kconfig |   5 +
  drivers/clocksource/Makefile|   1 +
  drivers/clocksource/fsl_ftm_timer.c | 344 
  3 files changed, 350 insertions(+)
  create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cd6950f..28321c5 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
  for all devicetree enabled platforms. This driver will be
  needed only on systems that do not have the Exynos MCT available.

+config FSL_FTM_TIMER
+   bool
+   help
+ Support for Freescale FlexTimer Module (FTM) timer.
+
  config VF_PIT_TIMER
bool
help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index c7ca50a..ce0a967 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)   += cadence_ttc_timer.o
  obj-$(CONFIG_CLKSRC_EFM32)+= time-efm32.o
  obj-$(CONFIG_CLKSRC_EXYNOS_MCT)   += exynos_mct.o
  obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)  += samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)+= fsl_ftm_timer.o
  obj-$(CONFIG_VF_PIT_TIMER)+= vf_pit_timer.o

  obj-$(CONFIG_ARM_ARCH_TIMER)  += arm_arch_timer.o
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 000..7f6246a
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,344 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define FTM_SC 0x00
+#define FTM_SC_CLK_SHIFT   3
+#define FTM_SC_CLK_MASK(0x3 << FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)  ((c) << FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK 0x7
+#define FTM_SC_TOIEBIT(6)
+#define FTM_SC_TOF BIT(7)
+
+#define FTM_CNT0x04
+#define FTM_MOD0x08
+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;


peroidic_cyc ? Did you mean periodic_cyc ? :)



--
  Linaro.org │ Open source software for ARM SoCs

Follow Linaro:   Facebook |
 Twitter |
 Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-16 Thread Daniel Lezcano

On 04/29/2014 04:18 AM, Xiubo Li wrote:

The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li li.xi...@freescale.com
Cc: Shawn Guo shawn@linaro.org
Cc: Jingchang Lu b35...@freescale.com
---
  drivers/clocksource/Kconfig |   5 +
  drivers/clocksource/Makefile|   1 +
  drivers/clocksource/fsl_ftm_timer.c | 344 
  3 files changed, 350 insertions(+)
  create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cd6950f..28321c5 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
  for all devicetree enabled platforms. This driver will be
  needed only on systems that do not have the Exynos MCT available.

+config FSL_FTM_TIMER
+   bool
+   help
+ Support for Freescale FlexTimer Module (FTM) timer.
+
  config VF_PIT_TIMER
bool
help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index c7ca50a..ce0a967 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)   += cadence_ttc_timer.o
  obj-$(CONFIG_CLKSRC_EFM32)+= time-efm32.o
  obj-$(CONFIG_CLKSRC_EXYNOS_MCT)   += exynos_mct.o
  obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)  += samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)+= fsl_ftm_timer.o
  obj-$(CONFIG_VF_PIT_TIMER)+= vf_pit_timer.o

  obj-$(CONFIG_ARM_ARCH_TIMER)  += arm_arch_timer.o
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 000..7f6246a
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,344 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include linux/clk.h
+#include linux/clockchips.h
+#include linux/clocksource.h
+#include linux/err.h
+#include linux/interrupt.h
+#include linux/io.h
+#include linux/of_address.h
+#include linux/of_irq.h
+#include linux/sched_clock.h
+
+#define FTM_SC 0x00
+#define FTM_SC_CLK_SHIFT   3
+#define FTM_SC_CLK_MASK(0x3  FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)  ((c)  FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK 0x7
+#define FTM_SC_TOIEBIT(6)
+#define FTM_SC_TOF BIT(7)
+
+#define FTM_CNT0x04
+#define FTM_MOD0x08
+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;


peroidic_cyc ? Did you mean periodic_cyc ? :)



--
 http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
http://twitter.com/#!/linaroorg Twitter |
http://www.linaro.org/linaro-blog/ Blog

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-16 Thread Stephen Boyd
On 04/28/14 19:18, Xiubo Li wrote:
 +bool big_endian;
 +

static?

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-05-16 Thread Daniel Lezcano

On 04/29/2014 04:18 AM, Xiubo Li wrote:

The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li li.xi...@freescale.com
Cc: Shawn Guo shawn@linaro.org
Cc: Jingchang Lu b35...@freescale.com
---
  drivers/clocksource/Kconfig |   5 +
  drivers/clocksource/Makefile|   1 +
  drivers/clocksource/fsl_ftm_timer.c | 344 
  3 files changed, 350 insertions(+)
  create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cd6950f..28321c5 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
  for all devicetree enabled platforms. This driver will be
  needed only on systems that do not have the Exynos MCT available.

+config FSL_FTM_TIMER
+   bool
+   help
+ Support for Freescale FlexTimer Module (FTM) timer.
+
  config VF_PIT_TIMER
bool
help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index c7ca50a..ce0a967 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)   += cadence_ttc_timer.o
  obj-$(CONFIG_CLKSRC_EFM32)+= time-efm32.o
  obj-$(CONFIG_CLKSRC_EXYNOS_MCT)   += exynos_mct.o
  obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)  += samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)+= fsl_ftm_timer.o
  obj-$(CONFIG_VF_PIT_TIMER)+= vf_pit_timer.o

  obj-$(CONFIG_ARM_ARCH_TIMER)  += arm_arch_timer.o
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 000..7f6246a
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,344 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include linux/clk.h
+#include linux/clockchips.h
+#include linux/clocksource.h
+#include linux/err.h
+#include linux/interrupt.h
+#include linux/io.h
+#include linux/of_address.h
+#include linux/of_irq.h
+#include linux/sched_clock.h
+
+#define FTM_SC 0x00
+#define FTM_SC_CLK_SHIFT   3
+#define FTM_SC_CLK_MASK(0x3  FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)  ((c)  FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK 0x7
+#define FTM_SC_TOIEBIT(6)
+#define FTM_SC_TOF BIT(7)
+
+#define FTM_CNT0x04
+#define FTM_MOD0x08
+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;
+static unsigned long ps;
+bool big_endian;
+


Usually this is encaspulated in a structure.

struct ftm_clock_device {
void __iomem *clksrc_base;
...
};



+static inline u32 ftm_readl(void __iomem *addr)
+{
+   if (big_endian)


I am not a big fan of addressing global variables in the functions, so 
if you can pass the structure pointer around here and the other 
functions instead that would be nice.


Otherwise the patch sounds ok. Thanks for taking care of encapsulating 
well the functions and commenting the code.



+   return ioread32be(addr);
+   else
+   return ioread32(addr);
+}
+


[ ... ]


+
+static int __init ftm_calc_closest_round_cyc(unsigned long freq)
+{
+   ps = 0;
+
+   do {
+   peroidic_cyc = DIV_ROUND_CLOSEST(freq, HZ * (1  ps++));
+   } while (peroidic_cyc  0x);
+
+   if (ps  7) {
+   pr_err(ftm: the max prescaler is %lu  7\n, ps);
+   return -EINVAL;
+   }
+


Can you explain how this error can happen ?


+   return 0;
+}
+


[ ... ]


--
 http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
http://twitter.com/#!/linaroorg Twitter |
http://www.linaro.org/linaro-blog/ Blog

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-04-28 Thread Xiubo Li
The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li 
Cc: Shawn Guo 
Cc: Jingchang Lu 
---
 drivers/clocksource/Kconfig |   5 +
 drivers/clocksource/Makefile|   1 +
 drivers/clocksource/fsl_ftm_timer.c | 344 
 3 files changed, 350 insertions(+)
 create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cd6950f..28321c5 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
  for all devicetree enabled platforms. This driver will be
  needed only on systems that do not have the Exynos MCT available.
 
+config FSL_FTM_TIMER
+   bool
+   help
+ Support for Freescale FlexTimer Module (FTM) timer.
+
 config VF_PIT_TIMER
bool
help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index c7ca50a..ce0a967 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)   += cadence_ttc_timer.o
 obj-$(CONFIG_CLKSRC_EFM32) += time-efm32.o
 obj-$(CONFIG_CLKSRC_EXYNOS_MCT)+= exynos_mct.o
 obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)   += samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)+= fsl_ftm_timer.o
 obj-$(CONFIG_VF_PIT_TIMER) += vf_pit_timer.o
 
 obj-$(CONFIG_ARM_ARCH_TIMER)   += arm_arch_timer.o
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 000..7f6246a
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,344 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define FTM_SC 0x00
+#define FTM_SC_CLK_SHIFT   3
+#define FTM_SC_CLK_MASK(0x3 << FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)  ((c) << FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK 0x7
+#define FTM_SC_TOIEBIT(6)
+#define FTM_SC_TOF BIT(7)
+
+#define FTM_CNT0x04
+#define FTM_MOD0x08
+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;
+static unsigned long ps;
+bool big_endian;
+
+static inline u32 ftm_readl(void __iomem *addr)
+{
+   if (big_endian)
+   return ioread32be(addr);
+   else
+   return ioread32(addr);
+}
+
+static inline void ftm_writel(u32 val, void __iomem *addr)
+{
+   if (big_endian)
+   iowrite32be(val, addr);
+   else
+   iowrite32(val, addr);
+}
+
+static inline void ftm_counter_enable(void __iomem *base)
+{
+   u32 val;
+
+   /* select and enable counter clock source */
+   val = ftm_readl(base + FTM_SC);
+   val &= ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK);
+   val |= ps | FTM_SC_CLK(1);
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_counter_disable(void __iomem *base)
+{
+   u32 val;
+
+   /* disable counter clock source */
+   val = ftm_readl(base + FTM_SC);
+   val &= ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK);
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_acknowledge(void __iomem *base)
+{
+   u32 val;
+
+   val = ftm_readl(base + FTM_SC);
+   val &= ~FTM_SC_TOF;
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_enable(void __iomem *base)
+{
+   u32 val;
+
+   val = ftm_readl(base + FTM_SC);
+   val |= FTM_SC_TOIE;
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_disable(void __iomem *base)
+{
+   u32 val;
+
+   val = ftm_readl(base + FTM_SC);
+   val &= ~FTM_SC_TOIE;
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_reset_counter(void __iomem *base)
+{
+   /*
+* The CNT register contains the FTM counter value.
+* Reset clears the CNT register. Writing any value to COUNT
+* updates the counter with its initial value, CNTIN.
+*/
+   ftm_writel(0x00, base + 

[PATCHv3 3/3] clocksource: Add Freescale FlexTimer Module (FTM) timer support

2014-04-28 Thread Xiubo Li
The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li li.xi...@freescale.com
Cc: Shawn Guo shawn@linaro.org
Cc: Jingchang Lu b35...@freescale.com
---
 drivers/clocksource/Kconfig |   5 +
 drivers/clocksource/Makefile|   1 +
 drivers/clocksource/fsl_ftm_timer.c | 344 
 3 files changed, 350 insertions(+)
 create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cd6950f..28321c5 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
  for all devicetree enabled platforms. This driver will be
  needed only on systems that do not have the Exynos MCT available.
 
+config FSL_FTM_TIMER
+   bool
+   help
+ Support for Freescale FlexTimer Module (FTM) timer.
+
 config VF_PIT_TIMER
bool
help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index c7ca50a..ce0a967 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)   += cadence_ttc_timer.o
 obj-$(CONFIG_CLKSRC_EFM32) += time-efm32.o
 obj-$(CONFIG_CLKSRC_EXYNOS_MCT)+= exynos_mct.o
 obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)   += samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)+= fsl_ftm_timer.o
 obj-$(CONFIG_VF_PIT_TIMER) += vf_pit_timer.o
 
 obj-$(CONFIG_ARM_ARCH_TIMER)   += arm_arch_timer.o
diff --git a/drivers/clocksource/fsl_ftm_timer.c 
b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 000..7f6246a
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,344 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include linux/clk.h
+#include linux/clockchips.h
+#include linux/clocksource.h
+#include linux/err.h
+#include linux/interrupt.h
+#include linux/io.h
+#include linux/of_address.h
+#include linux/of_irq.h
+#include linux/sched_clock.h
+
+#define FTM_SC 0x00
+#define FTM_SC_CLK_SHIFT   3
+#define FTM_SC_CLK_MASK(0x3  FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)  ((c)  FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK 0x7
+#define FTM_SC_TOIEBIT(6)
+#define FTM_SC_TOF BIT(7)
+
+#define FTM_CNT0x04
+#define FTM_MOD0x08
+#define FTM_CNTIN  0x4C
+
+static void __iomem *clksrc_base;
+static void __iomem *clkevt_base;
+static unsigned long peroidic_cyc;
+static unsigned long ps;
+bool big_endian;
+
+static inline u32 ftm_readl(void __iomem *addr)
+{
+   if (big_endian)
+   return ioread32be(addr);
+   else
+   return ioread32(addr);
+}
+
+static inline void ftm_writel(u32 val, void __iomem *addr)
+{
+   if (big_endian)
+   iowrite32be(val, addr);
+   else
+   iowrite32(val, addr);
+}
+
+static inline void ftm_counter_enable(void __iomem *base)
+{
+   u32 val;
+
+   /* select and enable counter clock source */
+   val = ftm_readl(base + FTM_SC);
+   val = ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK);
+   val |= ps | FTM_SC_CLK(1);
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_counter_disable(void __iomem *base)
+{
+   u32 val;
+
+   /* disable counter clock source */
+   val = ftm_readl(base + FTM_SC);
+   val = ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK);
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_acknowledge(void __iomem *base)
+{
+   u32 val;
+
+   val = ftm_readl(base + FTM_SC);
+   val = ~FTM_SC_TOF;
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_enable(void __iomem *base)
+{
+   u32 val;
+
+   val = ftm_readl(base + FTM_SC);
+   val |= FTM_SC_TOIE;
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_disable(void __iomem *base)
+{
+   u32 val;
+
+   val = ftm_readl(base + FTM_SC);
+   val = ~FTM_SC_TOIE;
+   ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_reset_counter(void __iomem *base)
+{
+   /*
+* The CNT register contains the FTM