[PATCH v4] powerpc/rcpm: add RCPM driver

2015-06-23 Thread Yuantian.Tang
From: Tang Yuantian 

There is a RCPM (Run Control/Power Management) in Freescale QorIQ
series processors. The device performs tasks associated with device
run control and power management.

The driver implements some features: mask/unmask irq, enter/exit low
power states, freeze time base, etc.

Signed-off-by: Chenhui Zhao 
Signed-off-by: Tang Yuantian 
---
v4:
- refine bindings document
v3:
- added static and __init modifier to fsl_rcpm_init
v2:
- fix code style issues
- refine compatible string match part

 Documentation/devicetree/bindings/soc/fsl/rcpm.txt |  42 +++
 arch/powerpc/include/asm/fsl_guts.h| 105 +++
 arch/powerpc/include/asm/fsl_pm.h  |  48 +++
 arch/powerpc/platforms/85xx/Kconfig|   1 +
 arch/powerpc/sysdev/Kconfig|   5 +
 arch/powerpc/sysdev/Makefile   |   1 +
 arch/powerpc/sysdev/fsl_rcpm.c | 338 +
 7 files changed, 540 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/soc/fsl/rcpm.txt
 create mode 100644 arch/powerpc/include/asm/fsl_pm.h
 create mode 100644 arch/powerpc/sysdev/fsl_rcpm.c

diff --git a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt 
b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
new file mode 100644
index 000..1f58018
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
@@ -0,0 +1,42 @@
+* Run Control and Power Management
+
+The RCPM performs all device-level tasks associated with device run control
+and power management.
+
+Required properites:
+  - reg : Offset and length of the register set of RCPM block.
+  - compatible : Sould contain a chip-specific RCPM block compatible string
+   and (if applicable) may contain a chassis-version RCPM compatible 
string.
+   Chip-specific strings are of the form "fsl,-rcpm", such as:
+   * "fsl,p2041-rcpm"
+   * "fsl,p3041-rcpm"
+   * "fsl,p4080-rcpm"
+   * "fsl,p5020-rcpm"
+   * "fsl,p5040-rcpm"
+   * "fsl,t4240-rcpm"
+   * "fsl,b4420-rcpm"
+   * "fsl,b4860-rcpm"
+
+   Chassis-version RCPM strings include:
+   * "fsl,qoriq-rcpm-1.0": for chassis 1.0 rcpm
+   * "fsl,qoriq-rcpm-2.0": for chassis 2.0 rcpm
+
+All references to "1.0" and "2.0" refer to the QorIQ chassis version to
+which the chip complies.
+Chassis VersionExample Chips
+------
+1.0p4080, p5020, p5040, p2041, p3041
+2.0t4240, b4860, t1040, b4420
+
+Example:
+The RCPM node for T4240:
+   rcpm: global-utilities@e2000 {
+   compatible = "fsl,t4240-rcpm", "fsl,qoriq-rcpm-2.0";
+   reg = <0xe2000 0x1000>;
+   };
+
+The RCPM node for P4080:
+   rcpm: global-utilities@e2000 {
+   compatible = "fsl,qoriq-rcpm-1.0";
+   reg = <0xe2000 0x1000>;
+   };
diff --git a/arch/powerpc/include/asm/fsl_guts.h 
b/arch/powerpc/include/asm/fsl_guts.h
index 43b6bb1..a67413c 100644
--- a/arch/powerpc/include/asm/fsl_guts.h
+++ b/arch/powerpc/include/asm/fsl_guts.h
@@ -188,5 +188,110 @@ static inline void guts_set_pmuxcr_dma(struct ccsr_guts 
__iomem *guts,
 
 #endif
 
+struct ccsr_rcpm_v1 {
+   u8  res[4];
+   __be32  cdozsr; /* 0x0004 Core Doze Status Register */
+   u8  res0008[4];
+   __be32  cdozcr; /* 0x000c Core Doze Control Register */
+   u8  res0010[4];
+   __be32  cnapsr; /* 0x0014 Core Nap Status Register */
+   u8  res0018[4];
+   __be32  cnapcr; /* 0x001c Core Nap Control Register */
+   u8  res0020[4];
+   __be32  cdozpsr;/* 0x0024 Core Doze Previous Status Register */
+   u8  res0028[4];
+   __be32  cnappsr;/* 0x002c Core Nap Previous Status Register */
+   u8  res0030[4];
+   __be32  cwaitsr;/* 0x0034 Core Wait Status Register */
+   u8  res0038[4];
+   __be32  cwdtdsr;/* 0x003c Core Watchdog Detect Status Register */
+   __be32  powmgtcsr;  /* 0x0040 PM Control&Status Register */
+#define RCPM_POWMGTCSR_SLP 0x0002
+   u8  res0044[12];
+   __be32  ippdexpcr;  /* 0x0050 IP Powerdown Exception Control Register */
+   u8  res0054[16];
+   __be32  cpmimr; /* 0x0064 Core PM IRQ Mask Register */
+   u8  res0068[4];
+   __be32  cpmcimr;/* 0x006c Core PM Critical IRQ Mask Register */
+   u8  res0070[4];
+   __be32  cpmmcmr;/* 0x0074 Core PM Machine Check Mask Register */
+   u8  res0078[4];
+   __be32  cpmnmimr;   /* 0x007c Core PM NMI Mask Register */
+   u8  res0080[4];
+   __be32  ctbenr; /* 0x0084 Core Time Base Enable Register */
+   u8  res0088[4];
+   __be32  ctbckselr;  /* 0x008c Core Time Base Clock Select Register */
+   u8  res0090[4];
+   __be32  ctbhltc

[PATCH v3] powerpc/rcpm: add RCPM driver

2015-06-16 Thread Yuantian.Tang
From: Tang Yuantian 

There is a RCPM (Run Control/Power Management) in Freescale QorIQ
series processors. The device performs tasks associated with device
run control and power management.

The driver implements some features: mask/unmask irq, enter/exit low
power states, freeze time base, etc.

Signed-off-by: Chenhui Zhao 
Signed-off-by: Tang Yuantian 
---
v3:
- added static and __init modifier to fsl_rcpm_init
v2:
- fix code style issues
- refine compatible string match part

 Documentation/devicetree/bindings/soc/fsl/rcpm.txt |  22 ++
 arch/powerpc/include/asm/fsl_guts.h| 105 +++
 arch/powerpc/include/asm/fsl_pm.h  |  48 +++
 arch/powerpc/platforms/85xx/Kconfig|   1 +
 arch/powerpc/sysdev/Kconfig|   5 +
 arch/powerpc/sysdev/Makefile   |   1 +
 arch/powerpc/sysdev/fsl_rcpm.c | 338 +
 7 files changed, 520 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/soc/fsl/rcpm.txt
 create mode 100644 arch/powerpc/include/asm/fsl_pm.h
 create mode 100644 arch/powerpc/sysdev/fsl_rcpm.c

diff --git a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt 
b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
new file mode 100644
index 000..5318999
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
@@ -0,0 +1,22 @@
+* Run Control and Power Management
+
+The RCPM performs all device-level tasks associated with device run control
+and power management.
+
+Required properites:
+  - reg : Offset and length of the register set of RCPM block.
+  - compatible : Specifies the compatibility list for the RCPM. The type
+should be string, such as "fsl,qoriq-rcpm-1.0", "fsl,qoriq-rcpm-2.0".
+
+Example:
+The RCPM node for T4240:
+   rcpm: global-utilities@e2000 {
+   compatible = "fsl,t4240-rcpm", "fsl,qoriq-rcpm-2.0";
+   reg = <0xe2000 0x1000>;
+   };
+
+The RCPM node for P4080:
+   rcpm: global-utilities@e2000 {
+   compatible = "fsl,qoriq-rcpm-1.0";
+   reg = <0xe2000 0x1000>;
+   };
diff --git a/arch/powerpc/include/asm/fsl_guts.h 
b/arch/powerpc/include/asm/fsl_guts.h
index 43b6bb1..a67413c 100644
--- a/arch/powerpc/include/asm/fsl_guts.h
+++ b/arch/powerpc/include/asm/fsl_guts.h
@@ -188,5 +188,110 @@ static inline void guts_set_pmuxcr_dma(struct ccsr_guts 
__iomem *guts,
 
 #endif
 
+struct ccsr_rcpm_v1 {
+   u8  res[4];
+   __be32  cdozsr; /* 0x0004 Core Doze Status Register */
+   u8  res0008[4];
+   __be32  cdozcr; /* 0x000c Core Doze Control Register */
+   u8  res0010[4];
+   __be32  cnapsr; /* 0x0014 Core Nap Status Register */
+   u8  res0018[4];
+   __be32  cnapcr; /* 0x001c Core Nap Control Register */
+   u8  res0020[4];
+   __be32  cdozpsr;/* 0x0024 Core Doze Previous Status Register */
+   u8  res0028[4];
+   __be32  cnappsr;/* 0x002c Core Nap Previous Status Register */
+   u8  res0030[4];
+   __be32  cwaitsr;/* 0x0034 Core Wait Status Register */
+   u8  res0038[4];
+   __be32  cwdtdsr;/* 0x003c Core Watchdog Detect Status Register */
+   __be32  powmgtcsr;  /* 0x0040 PM Control&Status Register */
+#define RCPM_POWMGTCSR_SLP 0x0002
+   u8  res0044[12];
+   __be32  ippdexpcr;  /* 0x0050 IP Powerdown Exception Control Register */
+   u8  res0054[16];
+   __be32  cpmimr; /* 0x0064 Core PM IRQ Mask Register */
+   u8  res0068[4];
+   __be32  cpmcimr;/* 0x006c Core PM Critical IRQ Mask Register */
+   u8  res0070[4];
+   __be32  cpmmcmr;/* 0x0074 Core PM Machine Check Mask Register */
+   u8  res0078[4];
+   __be32  cpmnmimr;   /* 0x007c Core PM NMI Mask Register */
+   u8  res0080[4];
+   __be32  ctbenr; /* 0x0084 Core Time Base Enable Register */
+   u8  res0088[4];
+   __be32  ctbckselr;  /* 0x008c Core Time Base Clock Select Register */
+   u8  res0090[4];
+   __be32  ctbhltcr;   /* 0x0094 Core Time Base Halt Control Register */
+   u8  res0098[4];
+   __be32  cmcpmaskcr; /* 0x00a4 Core Machine Check Mask Register */
+};
+
+struct ccsr_rcpm_v2 {
+   u8  res_00[12];
+   __be32  tph10sr0;   /* Thread PH10 Status Register */
+   u8  res_10[12];
+   __be32  tph10setr0; /* Thread PH10 Set Control Register */
+   u8  res_20[12];
+   __be32  tph10clrr0; /* Thread PH10 Clear Control Register */
+   u8  res_30[12];
+   __be32  tph10psr0;  /* Thread PH10 Previous Status Register */
+   u8  res_40[12];
+   __be32  twaitsr0;   /* Thread Wait Status Register */
+   u8  res_50[96];
+   __be32  pcph15sr;   /* Physical Core PH15 Status Register */
+   __be32  pcph15setr; /* Physical Core PH15 Set Contr

[PATCH v2] powerpc/rcpm: add RCPM driver

2015-06-10 Thread Yuantian.Tang
From: Tang Yuantian 

There is a RCPM (Run Control/Power Management) in Freescale QorIQ
series processors. The device performs tasks associated with device
run control and power management.

The driver implements some features: mask/unmask irq, enter/exit low
power states, freeze time base, etc.

Signed-off-by: Chenhui Zhao 
Signed-off-by: Tang Yuantian 
---
v2:
- fix code style issues
- refine compatible string match part

 Documentation/devicetree/bindings/soc/fsl/rcpm.txt |  22 ++
 arch/powerpc/include/asm/fsl_guts.h| 105 +++
 arch/powerpc/include/asm/fsl_pm.h  |  48 +++
 arch/powerpc/platforms/85xx/Kconfig|   1 +
 arch/powerpc/sysdev/Kconfig|   5 +
 arch/powerpc/sysdev/Makefile   |   1 +
 arch/powerpc/sysdev/fsl_rcpm.c | 338 +
 7 files changed, 520 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/soc/fsl/rcpm.txt
 create mode 100644 arch/powerpc/include/asm/fsl_pm.h
 create mode 100644 arch/powerpc/sysdev/fsl_rcpm.c

diff --git a/Documentation/devicetree/bindings/soc/fsl/rcpm.txt 
b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
new file mode 100644
index 000..5318999
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/fsl/rcpm.txt
@@ -0,0 +1,22 @@
+* Run Control and Power Management
+
+The RCPM performs all device-level tasks associated with device run control
+and power management.
+
+Required properites:
+  - reg : Offset and length of the register set of RCPM block.
+  - compatible : Specifies the compatibility list for the RCPM. The type
+should be string, such as "fsl,qoriq-rcpm-1.0", "fsl,qoriq-rcpm-2.0".
+
+Example:
+The RCPM node for T4240:
+   rcpm: global-utilities@e2000 {
+   compatible = "fsl,t4240-rcpm", "fsl,qoriq-rcpm-2.0";
+   reg = <0xe2000 0x1000>;
+   };
+
+The RCPM node for P4080:
+   rcpm: global-utilities@e2000 {
+   compatible = "fsl,qoriq-rcpm-1.0";
+   reg = <0xe2000 0x1000>;
+   };
diff --git a/arch/powerpc/include/asm/fsl_guts.h 
b/arch/powerpc/include/asm/fsl_guts.h
index 43b6bb1..a67413c 100644
--- a/arch/powerpc/include/asm/fsl_guts.h
+++ b/arch/powerpc/include/asm/fsl_guts.h
@@ -188,5 +188,110 @@ static inline void guts_set_pmuxcr_dma(struct ccsr_guts 
__iomem *guts,
 
 #endif
 
+struct ccsr_rcpm_v1 {
+   u8  res[4];
+   __be32  cdozsr; /* 0x0004 Core Doze Status Register */
+   u8  res0008[4];
+   __be32  cdozcr; /* 0x000c Core Doze Control Register */
+   u8  res0010[4];
+   __be32  cnapsr; /* 0x0014 Core Nap Status Register */
+   u8  res0018[4];
+   __be32  cnapcr; /* 0x001c Core Nap Control Register */
+   u8  res0020[4];
+   __be32  cdozpsr;/* 0x0024 Core Doze Previous Status Register */
+   u8  res0028[4];
+   __be32  cnappsr;/* 0x002c Core Nap Previous Status Register */
+   u8  res0030[4];
+   __be32  cwaitsr;/* 0x0034 Core Wait Status Register */
+   u8  res0038[4];
+   __be32  cwdtdsr;/* 0x003c Core Watchdog Detect Status Register */
+   __be32  powmgtcsr;  /* 0x0040 PM Control&Status Register */
+#define RCPM_POWMGTCSR_SLP 0x0002
+   u8  res0044[12];
+   __be32  ippdexpcr;  /* 0x0050 IP Powerdown Exception Control Register */
+   u8  res0054[16];
+   __be32  cpmimr; /* 0x0064 Core PM IRQ Mask Register */
+   u8  res0068[4];
+   __be32  cpmcimr;/* 0x006c Core PM Critical IRQ Mask Register */
+   u8  res0070[4];
+   __be32  cpmmcmr;/* 0x0074 Core PM Machine Check Mask Register */
+   u8  res0078[4];
+   __be32  cpmnmimr;   /* 0x007c Core PM NMI Mask Register */
+   u8  res0080[4];
+   __be32  ctbenr; /* 0x0084 Core Time Base Enable Register */
+   u8  res0088[4];
+   __be32  ctbckselr;  /* 0x008c Core Time Base Clock Select Register */
+   u8  res0090[4];
+   __be32  ctbhltcr;   /* 0x0094 Core Time Base Halt Control Register */
+   u8  res0098[4];
+   __be32  cmcpmaskcr; /* 0x00a4 Core Machine Check Mask Register */
+};
+
+struct ccsr_rcpm_v2 {
+   u8  res_00[12];
+   __be32  tph10sr0;   /* Thread PH10 Status Register */
+   u8  res_10[12];
+   __be32  tph10setr0; /* Thread PH10 Set Control Register */
+   u8  res_20[12];
+   __be32  tph10clrr0; /* Thread PH10 Clear Control Register */
+   u8  res_30[12];
+   __be32  tph10psr0;  /* Thread PH10 Previous Status Register */
+   u8  res_40[12];
+   __be32  twaitsr0;   /* Thread Wait Status Register */
+   u8  res_50[96];
+   __be32  pcph15sr;   /* Physical Core PH15 Status Register */
+   __be32  pcph15setr; /* Physical Core PH15 Set Control Register */
+   __be32  pcph15clrr; /* Physical Core 

[PATCH v4] powerpc/cache: add cache flush operation for various e500

2015-06-09 Thread Yuantian.Tang
From: Tang Yuantian 

Various e500 core have different cache architecture, so they
need different cache flush operations. Therefore, add a callback
function cpu_flush_caches to the struct cpu_spec. The cache flush
operation for the specific kind of e500 is selected at init time.
The callback function will flush all caches inside the current cpu.

Signed-off-by: Chenhui Zhao 
Signed-off-by: Tang Yuantian 
---
v4:
- line up cpu_down_flush*
v3:
- change all flush_caches to cpu_down_flush
- replace whitespace with tab
v2:
- remove some function's prefix "__"
- remove redundent CONFIG_PPC_E500MC micro

 arch/powerpc/include/asm/cacheflush.h |   2 -
 arch/powerpc/include/asm/cputable.h   |  11 +++
 arch/powerpc/kernel/asm-offsets.c |   3 +
 arch/powerpc/kernel/cpu_setup_fsl_booke.S | 112 ++
 arch/powerpc/kernel/cputable.c|   4 ++
 arch/powerpc/kernel/head_fsl_booke.S  |  74 
 arch/powerpc/platforms/85xx/smp.c |   3 +-
 7 files changed, 132 insertions(+), 77 deletions(-)

diff --git a/arch/powerpc/include/asm/cacheflush.h 
b/arch/powerpc/include/asm/cacheflush.h
index 30b35ff..729fde4 100644
--- a/arch/powerpc/include/asm/cacheflush.h
+++ b/arch/powerpc/include/asm/cacheflush.h
@@ -30,8 +30,6 @@ extern void flush_dcache_page(struct page *page);
 #define flush_dcache_mmap_lock(mapping)do { } while (0)
 #define flush_dcache_mmap_unlock(mapping)  do { } while (0)
 
-extern void __flush_disable_L1(void);
-
 extern void flush_icache_range(unsigned long, unsigned long);
 extern void flush_icache_user_range(struct vm_area_struct *vma,
struct page *page, unsigned long addr,
diff --git a/arch/powerpc/include/asm/cputable.h 
b/arch/powerpc/include/asm/cputable.h
index 6367b83..069 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -43,6 +43,13 @@ extern int machine_check_e500(struct pt_regs *regs);
 extern int machine_check_e200(struct pt_regs *regs);
 extern int machine_check_47x(struct pt_regs *regs);
 
+#if defined(CONFIG_E500)
+extern void cpu_down_flush_e500v2(void);
+extern void cpu_down_flush_e500mc(void);
+extern void cpu_down_flush_e5500(void);
+extern void cpu_down_flush_e6500(void);
+#endif
+
 /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
 struct cpu_spec {
/* CPU is matched via (PVR & pvr_mask) == pvr_value */
@@ -59,6 +66,10 @@ struct cpu_spec {
unsigned inticache_bsize;
unsigned intdcache_bsize;
 
+#if defined(CONFIG_E500)
+   /* flush caches inside the current cpu */
+   void (*cpu_down_flush)(void);
+#endif
/* number of performance monitor counters */
unsigned intnum_pmcs;
enum powerpc_pmc_type pmc_type;
diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 0034b6b..52efca9 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -373,6 +373,9 @@ int main(void)
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
DEFINE(CPU_SPEC_RESTORE, offsetof(struct cpu_spec, cpu_restore));
+#if defined(CONFIG_E500)
+   DEFINE(CPU_DOWN_FLUSH, offsetof(struct cpu_spec, cpu_down_flush));
+#endif
 
DEFINE(pbe_address, offsetof(struct pbe, address));
DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address));
diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S 
b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
index dddba3e..462aed9 100644
--- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
+++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
@@ -13,11 +13,13 @@
  *
  */
 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include 
 
 _GLOBAL(__e500_icache_setup)
mfspr   r0, SPRN_L1CSR1
@@ -233,3 +235,113 @@ _GLOBAL(__setup_cpu_e5500)
mtlrr5
blr
 #endif
+
+/* flush L1 date cache, it can apply to e500v2, e500mc and e5500 */
+_GLOBAL(flush_dcache_L1)
+   mfmsr   r10
+   wrteei  0
+
+   mfspr   r3,SPRN_L1CFG0
+   rlwinm  r5,r3,9,3   /* Extract cache block size */
+   twlgti  r5,1/* Only 32 and 64 byte cache blocks
+* are currently defined.
+*/
+   li  r4,32
+   subfic  r6,r5,2 /* r6 = log2(1KiB / cache block size) -
+*  log2(number of ways)
+*/
+   slw r5,r4,r5/* r5 = cache block size */
+
+   rlwinm  r7,r3,0,0xff/* Extract number of KiB in the cache */
+   mulli   r7,r7,13/* An 8-way cache will require 13
+* loads per set.
+*/
+   slw r7,r7,r6
+
+   /* save off HID0 and set DCFA */
+   mfs

[PATCH v3] powerpc/cache: add cache flush operation for various e500

2015-06-08 Thread Yuantian.Tang
From: Tang Yuantian 

Various e500 core have different cache architecture, so they
need different cache flush operations. Therefore, add a callback
function cpu_flush_caches to the struct cpu_spec. The cache flush
operation for the specific kind of e500 is selected at init time.
The callback function will flush all caches inside the current cpu.

Signed-off-by: Chenhui Zhao 
Signed-off-by: Tang Yuantian 
---
v3:
- change all flush_caches to cpu_down_flush
- replace whitespace with tab
v2:
- remove some function's prefix "__"
- remove redundent CONFIG_PPC_E500MC micro

 arch/powerpc/include/asm/cacheflush.h |   2 -
 arch/powerpc/include/asm/cputable.h   |  11 +++
 arch/powerpc/kernel/asm-offsets.c |   3 +
 arch/powerpc/kernel/cpu_setup_fsl_booke.S | 112 ++
 arch/powerpc/kernel/cputable.c|   4 ++
 arch/powerpc/kernel/head_fsl_booke.S  |  74 
 arch/powerpc/platforms/85xx/smp.c |   3 +-
 7 files changed, 132 insertions(+), 77 deletions(-)

diff --git a/arch/powerpc/include/asm/cacheflush.h 
b/arch/powerpc/include/asm/cacheflush.h
index 30b35ff..729fde4 100644
--- a/arch/powerpc/include/asm/cacheflush.h
+++ b/arch/powerpc/include/asm/cacheflush.h
@@ -30,8 +30,6 @@ extern void flush_dcache_page(struct page *page);
 #define flush_dcache_mmap_lock(mapping)do { } while (0)
 #define flush_dcache_mmap_unlock(mapping)  do { } while (0)
 
-extern void __flush_disable_L1(void);
-
 extern void flush_icache_range(unsigned long, unsigned long);
 extern void flush_icache_user_range(struct vm_area_struct *vma,
struct page *page, unsigned long addr,
diff --git a/arch/powerpc/include/asm/cputable.h 
b/arch/powerpc/include/asm/cputable.h
index 6367b83..069 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -43,6 +43,13 @@ extern int machine_check_e500(struct pt_regs *regs);
 extern int machine_check_e200(struct pt_regs *regs);
 extern int machine_check_47x(struct pt_regs *regs);
 
+#if defined(CONFIG_E500)
+extern void cpu_down_flush_e500v2(void);
+extern void cpu_down_flush_e500mc(void);
+extern void cpu_down_flush_e5500(void);
+extern void cpu_down_flush_e6500(void);
+#endif
+
 /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
 struct cpu_spec {
/* CPU is matched via (PVR & pvr_mask) == pvr_value */
@@ -59,6 +66,10 @@ struct cpu_spec {
unsigned inticache_bsize;
unsigned intdcache_bsize;
 
+#if defined(CONFIG_E500)
+   /* flush caches inside the current cpu */
+   void (*cpu_down_flush)(void);
+#endif
/* number of performance monitor counters */
unsigned intnum_pmcs;
enum powerpc_pmc_type pmc_type;
diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 0034b6b..52efca9 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -373,6 +373,9 @@ int main(void)
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
DEFINE(CPU_SPEC_RESTORE, offsetof(struct cpu_spec, cpu_restore));
+#if defined(CONFIG_E500)
+   DEFINE(CPU_DOWN_FLUSH, offsetof(struct cpu_spec, cpu_down_flush));
+#endif
 
DEFINE(pbe_address, offsetof(struct pbe, address));
DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address));
diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S 
b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
index dddba3e..462aed9 100644
--- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
+++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
@@ -13,11 +13,13 @@
  *
  */
 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include 
 
 _GLOBAL(__e500_icache_setup)
mfspr   r0, SPRN_L1CSR1
@@ -233,3 +235,113 @@ _GLOBAL(__setup_cpu_e5500)
mtlrr5
blr
 #endif
+
+/* flush L1 date cache, it can apply to e500v2, e500mc and e5500 */
+_GLOBAL(flush_dcache_L1)
+   mfmsr   r10
+   wrteei  0
+
+   mfspr   r3,SPRN_L1CFG0
+   rlwinm  r5,r3,9,3   /* Extract cache block size */
+   twlgti  r5,1/* Only 32 and 64 byte cache blocks
+* are currently defined.
+*/
+   li  r4,32
+   subfic  r6,r5,2 /* r6 = log2(1KiB / cache block size) -
+*  log2(number of ways)
+*/
+   slw r5,r4,r5/* r5 = cache block size */
+
+   rlwinm  r7,r3,0,0xff/* Extract number of KiB in the cache */
+   mulli   r7,r7,13/* An 8-way cache will require 13
+* loads per set.
+*/
+   slw r7,r7,r6
+
+   /* save off HID0 and set DCFA */
+   mfspr   r8,SPRN_HID0
+   ori r9,r

[PATCH v2] powerpc/cache: add cache flush operation for various e500

2015-06-08 Thread Yuantian.Tang
From: Tang Yuantian 

Various e500 core have different cache architecture, so they
need different cache flush operations. Therefore, add a callback
function cpu_flush_caches to the struct cpu_spec. The cache flush
operation for the specific kind of e500 is selected at init time.
The callback function will flush all caches inside the current cpu.

Signed-off-by: Chenhui Zhao 
Signed-off-by: Tang Yuantian 
---
v2:
- remove some function's prefix "__"
- remove redundent CONFIG_PPC_E500MC micro

 arch/powerpc/include/asm/cacheflush.h |   2 -
 arch/powerpc/include/asm/cputable.h   |  11 +++
 arch/powerpc/kernel/asm-offsets.c |   3 +
 arch/powerpc/kernel/cpu_setup_fsl_booke.S | 114 +-
 arch/powerpc/kernel/cputable.c|   4 ++
 arch/powerpc/kernel/head_fsl_booke.S  |  74 ---
 arch/powerpc/platforms/85xx/smp.c |   3 +-
 7 files changed, 133 insertions(+), 78 deletions(-)

diff --git a/arch/powerpc/include/asm/cacheflush.h 
b/arch/powerpc/include/asm/cacheflush.h
index 30b35ff..729fde4 100644
--- a/arch/powerpc/include/asm/cacheflush.h
+++ b/arch/powerpc/include/asm/cacheflush.h
@@ -30,8 +30,6 @@ extern void flush_dcache_page(struct page *page);
 #define flush_dcache_mmap_lock(mapping)do { } while (0)
 #define flush_dcache_mmap_unlock(mapping)  do { } while (0)
 
-extern void __flush_disable_L1(void);
-
 extern void flush_icache_range(unsigned long, unsigned long);
 extern void flush_icache_user_range(struct vm_area_struct *vma,
struct page *page, unsigned long addr,
diff --git a/arch/powerpc/include/asm/cputable.h 
b/arch/powerpc/include/asm/cputable.h
index 6367b83..43fffef 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -43,6 +43,13 @@ extern int machine_check_e500(struct pt_regs *regs);
 extern int machine_check_e200(struct pt_regs *regs);
 extern int machine_check_47x(struct pt_regs *regs);
 
+#if defined(CONFIG_E500)
+extern void flush_caches_e500v2(void);
+extern void flush_caches_e500mc(void);
+extern void flush_caches_e5500(void);
+extern void flush_caches_e6500(void);
+#endif
+
 /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
 struct cpu_spec {
/* CPU is matched via (PVR & pvr_mask) == pvr_value */
@@ -59,6 +66,10 @@ struct cpu_spec {
unsigned inticache_bsize;
unsigned intdcache_bsize;
 
+#if defined(CONFIG_E500)
+   /* flush caches inside the current cpu */
+   void (*cpu_down_flush)(void);
+#endif
/* number of performance monitor counters */
unsigned intnum_pmcs;
enum powerpc_pmc_type pmc_type;
diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 0034b6b..52efca9 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -373,6 +373,9 @@ int main(void)
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
DEFINE(CPU_SPEC_RESTORE, offsetof(struct cpu_spec, cpu_restore));
+#if defined(CONFIG_E500)
+   DEFINE(CPU_DOWN_FLUSH, offsetof(struct cpu_spec, cpu_down_flush));
+#endif
 
DEFINE(pbe_address, offsetof(struct pbe, address));
DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address));
diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S 
b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
index dddba3e..4c857a6a 100644
--- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
+++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
@@ -1,7 +1,7 @@
 /*
  * This file contains low level CPU setup functions.
  * Kumar Gala 
- * Copyright 2009 Freescale Semiconductor, Inc.
+ * Copyright 2009, 2015 Freescale Semiconductor, Inc.
  *
  * Based on cpu_setup_6xx code by
  * Benjamin Herrenschmidt 
@@ -13,11 +13,13 @@
  *
  */
 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include 
 
 _GLOBAL(__e500_icache_setup)
mfspr   r0, SPRN_L1CSR1
@@ -233,3 +235,113 @@ _GLOBAL(__setup_cpu_e5500)
mtlrr5
blr
 #endif
+
+/* flush L1 date cache, it can apply to e500v2, e500mc and e5500 */
+_GLOBAL(flush_dcache_L1)
+   mfmsr   r10
+   wrteei  0
+
+   mfspr   r3,SPRN_L1CFG0
+   rlwinm  r5,r3,9,3   /* Extract cache block size */
+   twlgti  r5,1/* Only 32 and 64 byte cache blocks
+* are currently defined.
+*/
+   li  r4,32
+   subfic  r6,r5,2 /* r6 = log2(1KiB / cache block size) -
+*  log2(number of ways)
+*/
+   slw r5,r4,r5/* r5 = cache block size */
+
+   rlwinm  r7,r3,0,0xff/* Extract number of KiB in the cache */
+   mulli   r7,r7,13/* An 8-way cache will require 13
+* loads per

[PATCH] cpufreq: qoriq: optimize the CPU frequency switching time

2015-06-04 Thread Yuantian.Tang
From: Tang Yuantian 

Each time the CPU switches its frequency, the clock nodes in
DTS are walked through to find proper clock source. This is
very time-consuming, for example, it is up to 500+ us on T4240.
Besides, switching time varies from clock to clock.
To optimize this, each input clock of CPU is buffered, so that
it can be picked up instantly when needed.

Since for each CPU each input clock is stored in a pointer
which takes 4 or 8 bytes memory and normally there are several
input clocks per CPU, that will not take much memory as well.

Signed-off-by: Tang Yuantian 
---
 drivers/cpufreq/qoriq-cpufreq.c | 32 +---
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/drivers/cpufreq/qoriq-cpufreq.c b/drivers/cpufreq/qoriq-cpufreq.c
index 88b21ae..358f075 100644
--- a/drivers/cpufreq/qoriq-cpufreq.c
+++ b/drivers/cpufreq/qoriq-cpufreq.c
@@ -27,11 +27,11 @@
 
 /**
  * struct cpu_data
- * @parent: the parent node of cpu clock
+ * @pclk: the parent clock of cpu
  * @table: frequency table
  */
 struct cpu_data {
-   struct device_node *parent;
+   struct clk **pclk;
struct cpufreq_frequency_table *table;
 };
 
@@ -196,7 +196,7 @@ static void freq_table_sort(struct cpufreq_frequency_table 
*freq_table,
 
 static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
-   struct device_node *np;
+   struct device_node *np, *pnode;
int i, count, ret;
u32 freq, mask;
struct clk *clk;
@@ -219,17 +219,23 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy 
*policy)
goto err_nomem2;
}
 
-   data->parent = of_parse_phandle(np, "clocks", 0);
-   if (!data->parent) {
+   pnode = of_parse_phandle(np, "clocks", 0);
+   if (!pnode) {
pr_err("%s: could not get clock information\n", __func__);
goto err_nomem2;
}
 
-   count = of_property_count_strings(data->parent, "clock-names");
+   count = of_property_count_strings(pnode, "clock-names");
+   data->pclk = kcalloc(count, sizeof(struct clk *), GFP_KERNEL);
+   if (!data->pclk) {
+   pr_err("%s: no memory\n", __func__);
+   goto err_node;
+   }
+
table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
if (!table) {
pr_err("%s: no memory\n", __func__);
-   goto err_node;
+   goto err_pclk;
}
 
if (fmask)
@@ -238,7 +244,8 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy 
*policy)
mask = 0x0;
 
for (i = 0; i < count; i++) {
-   clk = of_clk_get(data->parent, i);
+   clk = of_clk_get(pnode, i);
+   data->pclk[i] = clk;
freq = clk_get_rate(clk);
/*
 * the clock is valid if its frequency is not masked
@@ -273,13 +280,16 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy 
*policy)
policy->cpuinfo.transition_latency = u64temp + 1;
 
of_node_put(np);
+   of_node_put(pnode);
 
return 0;
 
 err_nomem1:
kfree(table);
+err_pclk:
+   kfree(data->pclk);
 err_node:
-   of_node_put(data->parent);
+   of_node_put(pnode);
 err_nomem2:
policy->driver_data = NULL;
kfree(data);
@@ -293,7 +303,7 @@ static int __exit qoriq_cpufreq_cpu_exit(struct 
cpufreq_policy *policy)
 {
struct cpu_data *data = policy->driver_data;
 
-   of_node_put(data->parent);
+   kfree(data->pclk);
kfree(data->table);
kfree(data);
policy->driver_data = NULL;
@@ -307,7 +317,7 @@ static int qoriq_cpufreq_target(struct cpufreq_policy 
*policy,
struct clk *parent;
struct cpu_data *data = policy->driver_data;
 
-   parent = of_clk_get(data->parent, data->table[index].driver_data);
+   parent = data->pclk[data->table[index].driver_data];
return clk_set_parent(policy->clk, parent);
 }
 
-- 
2.1.0.27.g96db324

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH] powerpc/config: add SCSI configs for corenet64_smp_defconfig

2015-03-31 Thread Yuantian.Tang
From: Tang Yuantian 

Otherwise there wil be no SCSI device nodes.

Signed-off-by: Shaohui Xie 
Signed-off-by: Tang Yuantian 
---
 arch/powerpc/configs/corenet64_smp_defconfig | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/arch/powerpc/configs/corenet64_smp_defconfig 
b/arch/powerpc/configs/corenet64_smp_defconfig
index 04737aa..77a8151 100644
--- a/arch/powerpc/configs/corenet64_smp_defconfig
+++ b/arch/powerpc/configs/corenet64_smp_defconfig
@@ -75,6 +75,13 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=131072
 CONFIG_EEPROM_LEGACY=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SPI_ATTRS=y
 CONFIG_ATA=y
 CONFIG_SATA_FSL=y
 CONFIG_SATA_SIL24=y
-- 
2.1.0.27.g96db324

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH 1/2 v5] cpufreq: qoriq: Make the driver usable on all QorIQ platforms

2015-03-12 Thread Yuantian.Tang
From: Tang Yuantian 

Freescale introduced new ARM core-based SoCs which support dynamic
frequency switch feature. DFS on new SoCs are compatible with current
PowerPC CoreNet platforms. In order to support those new platforms,
this driver needs to be updated. The main changes include:

1. Changed the names of functions in driver.
2. Added two new functions get_cpu_physical_id() and get_bus_freq().
3. Used a new way to get the CPU mask which share clock wire.

Signed-off-by: Tang Yuantian 
Acked-by: Viresh Kumar 
---
v5:
- rebased to 4.0.-rc3
- put Kconfig and Makefile entry to the following rename patch
v4:
- resolve "unmet direct dependencies" warning
v3:
- put the menu entries into Kconfig
v2:
- split the name change into a separete patch
- use policy->driver_data instead of per_cpu variable

 drivers/cpufreq/ppc-corenet-cpufreq.c | 161 +-
 1 file changed, 99 insertions(+), 62 deletions(-)

diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
index 7cb4b76..9fd51c8 100644
--- a/drivers/cpufreq/ppc-corenet-cpufreq.c
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -1,7 +1,7 @@
 /*
  * Copyright 2013 Freescale Semiconductor, Inc.
  *
- * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ * CPU Frequency Scaling driver for Freescale QorIQ SoCs.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -20,12 +20,11 @@
 #include 
 #include 
 #include 
-#include 
 
 #include/* for get_hard_smp_processor_id() in UP configs */
 
 /**
- * struct cpu_data - per CPU data struct
+ * struct cpu_data
  * @parent: the parent node of cpu clock
  * @table: frequency table
  */
@@ -69,17 +68,78 @@ static const struct soc_data sdata[] = {
 static u32 min_cpufreq;
 static const u32 *fmask;
 
-static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+#if defined(CONFIG_ARM)
+static int get_cpu_physical_id(int cpu)
+{
+   return topology_core_id(cpu);
+}
+#else
+static int get_cpu_physical_id(int cpu)
+{
+   return get_hard_smp_processor_id(cpu);
+}
+#endif
+
+static u32 get_bus_freq(void)
+{
+   struct device_node *soc;
+   u32 sysfreq;
+
+   soc = of_find_node_by_type(NULL, "soc");
+   if (!soc)
+   return 0;
+
+   if (of_property_read_u32(soc, "bus-frequency", &sysfreq))
+   sysfreq = 0;
+
+   of_node_put(soc);
 
-/* cpumask in a cluster */
-static DEFINE_PER_CPU(cpumask_var_t, cpu_mask);
+   return sysfreq;
+}
 
-#ifndef CONFIG_SMP
-static inline const struct cpumask *cpu_core_mask(int cpu)
+static struct device_node *cpu_to_clk_node(int cpu)
 {
-   return cpumask_of(0);
+   struct device_node *np, *clk_np;
+
+   if (!cpu_present(cpu))
+   return NULL;
+
+   np = of_get_cpu_node(cpu, NULL);
+   if (!np)
+   return NULL;
+
+   clk_np = of_parse_phandle(np, "clocks", 0);
+   if (!clk_np)
+   return NULL;
+
+   of_node_put(np);
+
+   return clk_np;
+}
+
+/* traverse cpu nodes to get cpu mask of sharing clock wire */
+static void set_affected_cpus(struct cpufreq_policy *policy)
+{
+   struct device_node *np, *clk_np;
+   struct cpumask *dstp = policy->cpus;
+   int i;
+
+   np = cpu_to_clk_node(policy->cpu);
+   if (!np)
+   return;
+
+   for_each_present_cpu(i) {
+   clk_np = cpu_to_clk_node(i);
+   if (!clk_np)
+   continue;
+
+   if (clk_np == np)
+   cpumask_set_cpu(i, dstp);
+
+   of_node_put(clk_np);
+   }
+   of_node_put(np);
 }
-#endif
 
 /* reduce the duplicated frequencies in frequency table */
 static void freq_table_redup(struct cpufreq_frequency_table *freq_table,
@@ -107,6 +167,7 @@ static void freq_table_sort(struct cpufreq_frequency_table 
*freq_table,
int i, j, ind;
unsigned int freq, max_freq;
struct cpufreq_frequency_table table;
+
for (i = 0; i < count - 1; i++) {
max_freq = freq_table[i].frequency;
ind = i;
@@ -131,7 +192,7 @@ static void freq_table_sort(struct cpufreq_frequency_table 
*freq_table,
}
 }
 
-static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
+static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
struct device_node *np;
int i, count, ret;
@@ -147,10 +208,8 @@ static int corenet_cpufreq_cpu_init(struct cpufreq_policy 
*policy)
return -ENODEV;
 
data = kzalloc(sizeof(*data), GFP_KERNEL);
-   if (!data) {
-   pr_err("%s: no memory\n", __func__);
+   if (!data)
goto err_np;
-   }
 
policy->clk = of_clk_get(np, 0);
if (IS_ERR(policy->clk)) {
@@ -172,7 +231,7 @@ static int corenet_cpufreq_cpu_init(struct cpufreq_policy 
*po

[PATCH 2/2 v5] cpufreq: qoriq: rename the driver

2015-03-12 Thread Yuantian.Tang
From: Tang Yuantian 

This driver works on all QorIQ platforms which include
ARM-based cores and PPC-based cores.
Rename it in order to represent better.

Signed-off-by: Tang Yuantian 
Acked-by: Viresh Kumar 
---
v5:
- rebased to 4.0-rc3
- added Kconfig and Makefile entry
v3, v4
- none
v2:
- use -C -M options when format-patch

 drivers/cpufreq/Kconfig| 8 
 drivers/cpufreq/Kconfig.powerpc| 9 -
 drivers/cpufreq/Makefile   | 2 +-
 drivers/cpufreq/{ppc-corenet-cpufreq.c => qoriq-cpufreq.c} | 0
 4 files changed, 9 insertions(+), 10 deletions(-)
 rename drivers/cpufreq/{ppc-corenet-cpufreq.c => qoriq-cpufreq.c} (100%)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index a171fef..659879a 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -293,5 +293,13 @@ config SH_CPU_FREQ
  If unsure, say N.
 endif
 
+config QORIQ_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale QorIQ SoCs"
+   depends on OF && COMMON_CLK && (PPC_E500MC || ARM)
+   select CLK_QORIQ
+   help
+ This adds the CPUFreq driver support for Freescale QorIQ SoCs
+ which are capable of changing the CPU's frequency dynamically.
+
 endif
 endmenu
diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index 7ea2441..3a0595b 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -23,15 +23,6 @@ config CPU_FREQ_MAPLE
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
 
-config PPC_CORENET_CPUFREQ
-   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
-   depends on PPC_E500MC && OF && COMMON_CLK
-   select CLK_QORIQ
-   help
- This adds the CPUFreq driver support for Freescale e500mc,
- e5500 and e6500 series SoCs which are capable of changing
- the CPU's frequency dynamically.
-
 config CPU_FREQ_PMAC
bool "Support for Apple PowerBooks"
depends on ADB_PMU && PPC32
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 82a1821..26df0ad 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -85,7 +85,7 @@ obj-$(CONFIG_CPU_FREQ_CBE)+= ppc-cbe-cpufreq.o
 ppc-cbe-cpufreq-y  += ppc_cbe_cpufreq_pervasive.o 
ppc_cbe_cpufreq.o
 obj-$(CONFIG_CPU_FREQ_CBE_PMI) += ppc_cbe_cpufreq_pmi.o
 obj-$(CONFIG_CPU_FREQ_MAPLE)   += maple-cpufreq.o
-obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
+obj-$(CONFIG_QORIQ_CPUFREQ)+= qoriq-cpufreq.o
 obj-$(CONFIG_CPU_FREQ_PMAC)+= pmac32-cpufreq.o
 obj-$(CONFIG_CPU_FREQ_PMAC64)  += pmac64-cpufreq.o
 obj-$(CONFIG_PPC_PASEMI_CPUFREQ)   += pasemi-cpufreq.o
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/qoriq-cpufreq.c
similarity index 100%
rename from drivers/cpufreq/ppc-corenet-cpufreq.c
rename to drivers/cpufreq/qoriq-cpufreq.c
-- 
2.1.0.27.g96db324

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH 2/2 v4] cpufreq: qoriq: rename the driver

2015-03-02 Thread Yuantian.Tang
From: Tang Yuantian 

This driver works on all QorIQ platforms which include
ARM-based cores and PPC-based cores.
Rename it in order to represent better.

Signed-off-by: Tang Yuantian 
Acked-by: Viresh Kumar 
---
v3, v4
- none
v2:
- use -C -M options when format-patch

 drivers/cpufreq/{ppc-corenet-cpufreq.c => qoriq-cpufreq.c} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename drivers/cpufreq/{ppc-corenet-cpufreq.c => qoriq-cpufreq.c} (100%)

diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/qoriq-cpufreq.c
similarity index 100%
rename from drivers/cpufreq/ppc-corenet-cpufreq.c
rename to drivers/cpufreq/qoriq-cpufreq.c
-- 
2.1.0.27.g96db324

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH 1/2 v4] cpufreq: qoriq: Make the driver usable on all QorIQ platforms

2015-03-02 Thread Yuantian.Tang
From: Tang Yuantian 

Freescale introduced new ARM core-based SoCs which support dynamic
frequency switch feature. DFS on new SoCs are compatible with current
PowerPC CoreNet platforms. In order to support those new platforms,
this driver needs to be updated. The main changes include:

1. Changed the names of functions in driver.
2. Added two new functions get_cpu_physical_id() and get_bus_freq().
3. Used a new way to get the CPU mask which share clock wire.

Signed-off-by: Tang Yuantian 
Acked-by: Viresh Kumar 
---
v4:
- resolve "unmet direct dependencies" warning
v3:
- put the menu entries into Kconfig
v2:
- split the name change into a separete patch
- use policy->driver_data instead of per_cpu variable

 drivers/cpufreq/Kconfig   |   8 ++
 drivers/cpufreq/Kconfig.powerpc   |   9 --
 drivers/cpufreq/ppc-corenet-cpufreq.c | 160 +-
 3 files changed, 107 insertions(+), 70 deletions(-)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index a171fef..659879a 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -293,5 +293,13 @@ config SH_CPU_FREQ
  If unsure, say N.
 endif
 
+config QORIQ_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale QorIQ SoCs"
+   depends on OF && COMMON_CLK && (PPC_E500MC || ARM)
+   select CLK_QORIQ
+   help
+ This adds the CPUFreq driver support for Freescale QorIQ SoCs
+ which are capable of changing the CPU's frequency dynamically.
+
 endif
 endmenu
diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index 7ea2441..3a0595b 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -23,15 +23,6 @@ config CPU_FREQ_MAPLE
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
 
-config PPC_CORENET_CPUFREQ
-   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
-   depends on PPC_E500MC && OF && COMMON_CLK
-   select CLK_QORIQ
-   help
- This adds the CPUFreq driver support for Freescale e500mc,
- e5500 and e6500 series SoCs which are capable of changing
- the CPU's frequency dynamically.
-
 config CPU_FREQ_PMAC
bool "Support for Apple PowerBooks"
depends on ADB_PMU && PPC32
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
index bee5df7..949d992 100644
--- a/drivers/cpufreq/ppc-corenet-cpufreq.c
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -1,7 +1,7 @@
 /*
  * Copyright 2013 Freescale Semiconductor, Inc.
  *
- * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ * CPU Frequency Scaling driver for Freescale QorIQ SoCs.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -20,10 +20,9 @@
 #include 
 #include 
 #include 
-#include 
 
 /**
- * struct cpu_data - per CPU data struct
+ * struct cpu_data
  * @parent: the parent node of cpu clock
  * @table: frequency table
  */
@@ -67,17 +66,78 @@ static const struct soc_data sdata[] = {
 static u32 min_cpufreq;
 static const u32 *fmask;
 
-static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+#if defined(CONFIG_ARM)
+static int get_cpu_physical_id(int cpu)
+{
+   return topology_core_id(cpu);
+}
+#else
+static int get_cpu_physical_id(int cpu)
+{
+   return get_hard_smp_processor_id(cpu);
+}
+#endif
 
-/* cpumask in a cluster */
-static DEFINE_PER_CPU(cpumask_var_t, cpu_mask);
+static u32 get_bus_freq(void)
+{
+   struct device_node *soc;
+   u32 sysfreq;
+
+   soc = of_find_node_by_type(NULL, "soc");
+   if (!soc)
+   return 0;
+
+   if (of_property_read_u32(soc, "bus-frequency", &sysfreq))
+   sysfreq = 0;
+
+   of_node_put(soc);
+
+   return sysfreq;
+}
 
-#ifndef CONFIG_SMP
-static inline const struct cpumask *cpu_core_mask(int cpu)
+static struct device_node *cpu_to_clk_node(int cpu)
 {
-   return cpumask_of(0);
+   struct device_node *np, *clk_np;
+
+   if (!cpu_present(cpu))
+   return NULL;
+
+   np = of_get_cpu_node(cpu, NULL);
+   if (!np)
+   return NULL;
+
+   clk_np = of_parse_phandle(np, "clocks", 0);
+   if (!clk_np)
+   return NULL;
+
+   of_node_put(np);
+
+   return clk_np;
+}
+
+/* traverse cpu nodes to get cpu mask of sharing clock wire */
+static void set_affected_cpus(struct cpufreq_policy *policy)
+{
+   struct device_node *np, *clk_np;
+   struct cpumask *dstp = policy->cpus;
+   int i;
+
+   np = cpu_to_clk_node(policy->cpu);
+   if (!np)
+   return;
+
+   for_each_present_cpu(i) {
+   clk_np = cpu_to_clk_node(i);
+   if (!clk_np)
+   continue;
+
+   if (clk_np == np)
+ 

[PATCH 2/2] clk: ppc-corenet: rename driver to clk-qoriq

2015-01-14 Thread Yuantian.Tang
From: Tang Yuantian 

Freescale introduced new ARM-based socs which using the compatible
clock IP block with PowerPC-based socs'. So this driver can be used
on both platforms.
Updated relevant descriptions and renamed this driver to better
represent its meaning and keep the function of driver untouched.

Signed-off-by: Tang Yuantian 
---
 Documentation/devicetree/bindings/clock/qoriq-clock.txt |  5 +++--
 drivers/clk/Kconfig | 10 +-
 drivers/clk/Makefile|  2 +-
 drivers/clk/{clk-ppc-corenet.c => clk-qoriq.c}  |  6 +++---
 drivers/cpufreq/Kconfig.powerpc |  2 +-
 5 files changed, 13 insertions(+), 12 deletions(-)
 rename drivers/clk/{clk-ppc-corenet.c => clk-qoriq.c} (98%)

diff --git a/Documentation/devicetree/bindings/clock/qoriq-clock.txt 
b/Documentation/devicetree/bindings/clock/qoriq-clock.txt
index 266ff9d..df4a259 100644
--- a/Documentation/devicetree/bindings/clock/qoriq-clock.txt
+++ b/Documentation/devicetree/bindings/clock/qoriq-clock.txt
@@ -1,6 +1,6 @@
-* Clock Block on Freescale CoreNet Platforms
+* Clock Block on Freescale QorIQ Platforms
 
-Freescale CoreNet chips take primary clocking input from the external
+Freescale qoriq chips take primary clocking input from the external
 SYSCLK signal. The SYSCLK input (frequency) is multiplied using
 multiple phase locked loops (PLL) to create a variety of frequencies
 which can then be passed to a variety of internal logic, including
@@ -29,6 +29,7 @@ Required properties:
* "fsl,t4240-clockgen"
* "fsl,b4420-clockgen"
* "fsl,b4860-clockgen"
+   * "fsl,ls1021a-clockgen"
Chassis clock strings include:
* "fsl,qoriq-clockgen-1.0": for chassis 1.0 clocks
* "fsl,qoriq-clockgen-2.0": for chassis 2.0 clocks
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 3f44f29..a896fbc 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -101,12 +101,12 @@ config COMMON_CLK_AXI_CLKGEN
  Support for the Analog Devices axi-clkgen pcore clock generator for 
Xilinx
  FPGAs. It is commonly used in Analog Devices' reference designs.
 
-config CLK_PPC_CORENET
-   bool "Clock driver for PowerPC corenet platforms"
-   depends on PPC_E500MC && OF
+config CLK_QORIQ
+   bool "Clock driver for Freescale QorIQ platforms"
+   depends on (PPC_E500MC || ARM) && OF
---help---
- This adds the clock driver support for Freescale PowerPC corenet
- platforms using common clock framework.
+ This adds the clock driver support for Freescale QorIQ platforms
+ using common clock framework.
 
 config COMMON_CLK_XGENE
bool "Clock driver for APM XGene SoC"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index d5fba5b..4ff94cd 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -30,7 +30,7 @@ obj-$(CONFIG_ARCH_MOXART) += clk-moxart.o
 obj-$(CONFIG_ARCH_NOMADIK) += clk-nomadik.o
 obj-$(CONFIG_ARCH_NSPIRE)  += clk-nspire.o
 obj-$(CONFIG_COMMON_CLK_PALMAS)+= clk-palmas.o
-obj-$(CONFIG_CLK_PPC_CORENET)  += clk-ppc-corenet.o
+obj-$(CONFIG_CLK_QORIQ)+= clk-qoriq.o
 obj-$(CONFIG_COMMON_CLK_RK808) += clk-rk808.o
 obj-$(CONFIG_COMMON_CLK_S2MPS11)   += clk-s2mps11.o
 obj-$(CONFIG_COMMON_CLK_SI5351)+= clk-si5351.o
diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-qoriq.c
similarity index 98%
rename from drivers/clk/clk-ppc-corenet.c
rename to drivers/clk/clk-qoriq.c
index 5e9bb18..f9b7eb4 100644
--- a/drivers/clk/clk-ppc-corenet.c
+++ b/drivers/clk/clk-qoriq.c
@@ -5,7 +5,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * clock driver for Freescale PowerPC corenet SoCs.
+ * clock driver for Freescale QorIQ SoCs.
  */
 #include 
 #include 
@@ -166,7 +166,7 @@ static void __init core_pll_init(struct device_node *np)
 
base = of_iomap(np, 0);
if (!base) {
-   pr_err("clk-ppc: iomap error\n");
+   pr_err("clk-qoriq: iomap error\n");
return;
}
 
@@ -260,7 +260,7 @@ static void __init sysclk_init(struct device_node *node)
u32 rate;
 
if (!np) {
-   pr_err("ppc-clk: could not get parent node\n");
+   pr_err("qoriq-clk: could not get parent node\n");
return;
}
 
diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index 72564b7..7ea2441 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -26,7 +26,7 @@ config CPU_FREQ_MAPLE
 config PPC_CORENET_CPUFREQ
tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
depends on PPC_E500MC && OF && COMMON_CLK
-   select CLK_PPC_CORENET
+   select CLK_QORIQ
help
  This add

[PATCH 1/2] clock: redefine variable clocks_per_pll as a struct member

2015-01-14 Thread Yuantian.Tang
From: Tang Yuantian 

redefine variable clocks_per_pll as a struct member

If there are multiple PLL clock nodes, this variable will
get overwritten. Redefining it as a struct member can avoid that.

Signed-off-by: Tang Yuantian 
---
These patches are based on following three patches which are acked
by Scott wood :
1. http://patchwork.ozlabs.org/patch/417292/
Revert "clk: ppc-corenet: Fix Section mismatch warning"
2. http://patchwork.ozlabs.org/patch/417295/
powerpc: call of_clk_init() from time_init()
3. http://patchwork.ozlabs.org/patch/417297/
clk: ppc-corenet: fix section mismatch warning

 drivers/clk/clk-ppc-corenet.c | 22 +++---
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
index 57a2de4..5e9bb18 100644
--- a/drivers/clk/clk-ppc-corenet.c
+++ b/drivers/clk/clk-ppc-corenet.c
@@ -19,6 +19,7 @@
 struct cmux_clk {
struct clk_hw hw;
void __iomem *reg;
+   unsigned int clk_per_pll;
u32 flags;
 };
 
@@ -27,14 +28,12 @@ struct cmux_clk {
 #define CLKSEL_ADJUST  BIT(0)
 #define to_cmux_clk(p) container_of(p, struct cmux_clk, hw)
 
-static unsigned int clocks_per_pll;
-
 static int cmux_set_parent(struct clk_hw *hw, u8 idx)
 {
struct cmux_clk *clk = to_cmux_clk(hw);
u32 clksel;
 
-   clksel = ((idx / clocks_per_pll) << 2) + idx % clocks_per_pll;
+   clksel = ((idx / clk->clk_per_pll) << 2) + idx % clk->clk_per_pll;
if (clk->flags & CLKSEL_ADJUST)
clksel += 8;
clksel = (clksel & 0xf) << CLKSEL_SHIFT;
@@ -52,7 +51,7 @@ static u8 cmux_get_parent(struct clk_hw *hw)
clksel = (clksel >> CLKSEL_SHIFT) & 0xf;
if (clk->flags & CLKSEL_ADJUST)
clksel -= 8;
-   clksel = (clksel >> 2) * clocks_per_pll + clksel % 4;
+   clksel = (clksel >> 2) * clk->clk_per_pll + clksel % 4;
 
return clksel;
 }
@@ -72,6 +71,7 @@ static void __init core_mux_init(struct device_node *np)
u32 offset;
const char *clk_name;
const char **parent_names;
+   struct of_phandle_args clkspec;
 
rc = of_property_read_u32(np, "reg", &offset);
if (rc) {
@@ -105,6 +105,17 @@ static void __init core_mux_init(struct device_node *np)
goto err_clk;
}
 
+   rc = of_parse_phandle_with_args(np, "clocks", "#clock-cells", 0,
+   &clkspec);
+   if (rc) {
+   pr_err("%s: parse clock node error\n", __func__);
+   goto err_clk;
+   }
+
+   cmux_clk->clk_per_pll = of_property_count_strings(clkspec.np,
+   "clock-output-names");
+   of_node_put(clkspec.np);
+
node = of_find_compatible_node(NULL, NULL, "fsl,p4080-clockgen");
if (node && (offset >= 0x80))
cmux_clk->flags = CLKSEL_ADJUST;
@@ -181,9 +192,6 @@ static void __init core_pll_init(struct device_node *np)
goto err_map;
}
 
-   /* output clock number per PLL */
-   clocks_per_pll = count;
-
subclks = kzalloc(sizeof(struct clk *) * count, GFP_KERNEL);
if (!subclks) {
pr_err("%s: could not allocate subclks\n", __func__);
-- 
2.1.0.27.g96db324

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH v2] clk: qoriq: Update the clock bindings

2014-05-07 Thread Yuantian.Tang
From: Tang Yuantian 

Main changs include:
- Clarified the clock nodes' version number
- Fixed a issue in example

Singed-off-by: Tang Yuantian 
---
v2:
- rename this binding
- rewrite the description

 .../bindings/clock/{corenet-clock.txt => qoriq-clock.txt}  | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)
 rename Documentation/devicetree/bindings/clock/{corenet-clock.txt => 
qoriq-clock.txt} (95%)

diff --git a/Documentation/devicetree/bindings/clock/corenet-clock.txt 
b/Documentation/devicetree/bindings/clock/qoriq-clock.txt
similarity index 95%
rename from Documentation/devicetree/bindings/clock/corenet-clock.txt
rename to Documentation/devicetree/bindings/clock/qoriq-clock.txt
index 24711af..5666812 100644
--- a/Documentation/devicetree/bindings/clock/corenet-clock.txt
+++ b/Documentation/devicetree/bindings/clock/qoriq-clock.txt
@@ -7,6 +7,14 @@ which can then be passed to a variety of internal logic, 
including
 cores and peripheral IP blocks.
 Please refer to the Reference Manual for details.
 
+All references to "1.0" and "2.0" refer to the QorIQ chassis version to
+which the chip complies.
+
+Chassis VersionExample Chips
+----
+1.0p4080, p5020, p5040
+2.0t4240, b4860, t1040
+
 1. Clock Block Binding
 
 Required properties:
@@ -85,7 +93,7 @@ Example for clock block and clock provider:
#clock-cells = <0>;
compatible = "fsl,qoriq-sysclk-1.0";
clock-output-names = "sysclk";
-   }
+   };
 
pll0: pll0@800 {
#clock-cells = <1>;
-- 
1.8.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH 1/1] booke/watchdog: refine and clean up the codes

2014-05-07 Thread Yuantian.Tang
From: Tang Yuantian 

Basically, this patch does the following:
1. Move the codes of parsing boot parameters from setup-common.c
   to driver. In this way, code reader can know directly that
   there are boot parameters that can change the timeout.
2. Make boot parameter 'booke_wdt_period' effective.
   currently, when driver is loaded, default timeout is always
   being used in stead of booke_wdt_period.
3. Wrap up the watchdog timeout in device struct and clean up
   unnecessary codes.

Signed-off-by: Tang Yuantian 
Acked-by: Scott Wood 
---
resend to watchdog maintainer

 arch/powerpc/kernel/setup-common.c | 27 
 drivers/watchdog/booke_wdt.c   | 51 --
 2 files changed, 33 insertions(+), 45 deletions(-)

diff --git a/arch/powerpc/kernel/setup-common.c 
b/arch/powerpc/kernel/setup-common.c
index bc76cc6..5874aef 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -715,33 +715,6 @@ static int powerpc_debugfs_init(void)
 arch_initcall(powerpc_debugfs_init);
 #endif
 
-#ifdef CONFIG_BOOKE_WDT
-extern u32 booke_wdt_enabled;
-extern u32 booke_wdt_period;
-
-/* Checks wdt=x and wdt_period=xx command-line option */
-notrace int __init early_parse_wdt(char *p)
-{
-   if (p && strncmp(p, "0", 1) != 0)
-   booke_wdt_enabled = 1;
-
-   return 0;
-}
-early_param("wdt", early_parse_wdt);
-
-int __init early_parse_wdt_period(char *p)
-{
-   unsigned long ret;
-   if (p) {
-   if (!kstrtol(p, 0, &ret))
-   booke_wdt_period = ret;
-   }
-
-   return 0;
-}
-early_param("wdt_period", early_parse_wdt_period);
-#endif /* CONFIG_BOOKE_WDT */
-
 void ppc_printk_progress(char *s, unsigned short hex)
 {
pr_info("%s\n", s);
diff --git a/drivers/watchdog/booke_wdt.c b/drivers/watchdog/booke_wdt.c
index a8dbceb3..08a7853 100644
--- a/drivers/watchdog/booke_wdt.c
+++ b/drivers/watchdog/booke_wdt.c
@@ -41,6 +41,28 @@ u32 booke_wdt_period = CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT;
 #define WDTP_MASK  (TCR_WP_MASK)
 #endif
 
+/* Checks wdt=x and wdt_period=xx command-line option */
+notrace int __init early_parse_wdt(char *p)
+{
+   if (p && strncmp(p, "0", 1) != 0)
+   booke_wdt_enabled = 1;
+
+   return 0;
+}
+early_param("wdt", early_parse_wdt);
+
+int __init early_parse_wdt_period(char *p)
+{
+   unsigned long ret;
+   if (p) {
+   if (!kstrtol(p, 0, &ret))
+   booke_wdt_period = ret;
+   }
+
+   return 0;
+}
+early_param("wdt_period", early_parse_wdt_period);
+
 #ifdef CONFIG_PPC_FSL_BOOK3E
 
 /* For the specified period, determine the number of seconds
@@ -103,17 +125,18 @@ static unsigned int sec_to_period(unsigned int secs)
 static void __booke_wdt_set(void *data)
 {
u32 val;
+   struct watchdog_device *wdog = data;
 
val = mfspr(SPRN_TCR);
val &= ~WDTP_MASK;
-   val |= WDTP(booke_wdt_period);
+   val |= WDTP(sec_to_period(wdog->timeout));
 
mtspr(SPRN_TCR, val);
 }
 
-static void booke_wdt_set(void)
+static void booke_wdt_set(void *data)
 {
-   on_each_cpu(__booke_wdt_set, NULL, 0);
+   on_each_cpu(__booke_wdt_set, data, 0);
 }
 
 static void __booke_wdt_ping(void *data)
@@ -131,12 +154,13 @@ static int booke_wdt_ping(struct watchdog_device *wdog)
 static void __booke_wdt_enable(void *data)
 {
u32 val;
+   struct watchdog_device *wdog = data;
 
/* clear status before enabling watchdog */
__booke_wdt_ping(NULL);
val = mfspr(SPRN_TCR);
val &= ~WDTP_MASK;
-   val |= (TCR_WIE|TCR_WRC(WRC_CHIP)|WDTP(booke_wdt_period));
+   val |= (TCR_WIE|TCR_WRC(WRC_CHIP)|WDTP(sec_to_period(wdog->timeout)));
 
mtspr(SPRN_TCR, val);
 }
@@ -162,25 +186,17 @@ static void __booke_wdt_disable(void *data)
 
 }
 
-static void __booke_wdt_start(struct watchdog_device *wdog)
+static int booke_wdt_start(struct watchdog_device *wdog)
 {
-   on_each_cpu(__booke_wdt_enable, NULL, 0);
+   on_each_cpu(__booke_wdt_enable, wdog, 0);
pr_debug("watchdog enabled (timeout = %u sec)\n", wdog->timeout);
-}
 
-static int booke_wdt_start(struct watchdog_device *wdog)
-{
-   if (booke_wdt_enabled == 0) {
-   booke_wdt_enabled = 1;
-   __booke_wdt_start(wdog);
-   }
return 0;
 }
 
 static int booke_wdt_stop(struct watchdog_device *wdog)
 {
on_each_cpu(__booke_wdt_disable, NULL, 0);
-   booke_wdt_enabled = 0;
pr_debug("watchdog disabled\n");
 
return 0;
@@ -191,9 +207,8 @@ static int booke_wdt_set_timeout(struct watchdog_device 
*wdt_dev,
 {
if (timeout > MAX_WDT_TIMEOUT)
return -EINVAL;
-   booke_wdt_period = sec_to_period(timeout);
wdt_dev->timeout = timeout;
-   booke_wdt_set();
+   booke_wdt_set(wdt_dev);
 
return 0;
 }
@@ -231,10 +246,10 @@ static int __init booke_wdt_init(void)
pr_

[PATCH] powerpc/mpc85xx: Update clock nodes in device tree

2014-01-20 Thread Yuantian.Tang
From: Tang Yuantian 

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040, b4420, b4860, t4240

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
 arch/powerpc/boot/dts/fsl/b4420si-post.dtsi |  36 +
 arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/b4860si-post.dtsi |  36 +
 arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi  |   4 +
 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi |  60 +++
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi  |   4 +
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi |  61 +++
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi  |   4 +
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | 113 
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi  |   8 ++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |  43 +++
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi |  61 +++
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi  |   4 +
 arch/powerpc/boot/dts/fsl/t4240si-post.dtsi |  86 +
 arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi  |  12 +++
 16 files changed, 536 insertions(+)

diff --git a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
index 5a6615d..60566f99 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
@@ -86,6 +86,42 @@
 
clockgen: global-utilities@e1000 {
compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0";
+   ranges = <0x0 0xe1000 0x1000>;
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   sysclk: sysclk {
+   #clock-cells = <0>;
+   compatible = "fsl,qoriq-sysclk-2.0";
+   clock-output-names = "sysclk";
+   };
+
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800 0x4>;
+   compatible = "fsl,qoriq-core-pll-2.0";
+   clocks = <&sysclk>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820 0x4>;
+   compatible = "fsl,qoriq-core-pll-2.0";
+   clocks = <&sysclk>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0 0x4>;
+   compatible = "fsl,qoriq-core-mux-2.0";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+   <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0", "pll0-div2", "pll0-div4",
+   "pll1", "pll1-div2", "pll1-div4";
+   clock-output-names = "cmux0";
+   };
};
 
rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi 
b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
index c6e451a..2419731 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
@@ -64,11 +64,13 @@
cpu0: PowerPC,e6500@0 {
device_type = "cpu";
reg = <0 1>;
+   clocks = <&mux0>;
next-level-cache = <&L2>;
};
cpu1: PowerPC,e6500@2 {
device_type = "cpu";
reg = <2 3>;
+   clocks = <&mux0>;
next-level-cache = <&L2>;
};
};
diff --git a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
index 9813975..cbc354b 100644
--- a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
@@ -130,6 +130,42 @@
 
clockgen: global-utilities@e1000 {
compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0";
+   ranges = <0x0 0xe1000 0x1000>;
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   sysclk: sysclk {
+   #clock-cells = <0>;
+   compatible = "fsl,qoriq-sysclk-2.0";
+   clock-output-names = "sysclk";
+   };
+
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800 0x4>;
+   compatible = "fsl,qoriq-core-pll-2.0";
+   clocks = <&sysclk>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820 0x

[PATCH v7] clk: corenet: Adds the clock binding

2013-11-20 Thread Yuantian.Tang
From: Tang Yuantian 

Adds the clock bindings for Freescale PowerPC CoreNet platforms

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v7:
- refined some properties' definitions
v6:
- splited the previous patch into 2 parts, one is for binding(this one),
  the other is for DTS modification(will submit once this gets accepted)
- fixed typo
- refined #clock-cells and clock-output-names properties
- removed fixed-clock compatible string
v5:
- refine the binding document
- update the compatible string
v4:
- add binding document
- update compatible string
- update the reg property
v3:
- fix typo
v2:
- add t4240, b4420, b4860 support
- remove pll/4 clock from p2041, p3041 and p5020 board
 .../devicetree/bindings/clock/corenet-clock.txt| 128 +
 1 file changed, 128 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/corenet-clock.txt

diff --git a/Documentation/devicetree/bindings/clock/corenet-clock.txt 
b/Documentation/devicetree/bindings/clock/corenet-clock.txt
new file mode 100644
index 000..609ba2b
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/corenet-clock.txt
@@ -0,0 +1,128 @@
+* Clock Block on Freescale CoreNet Platforms
+
+Freescale CoreNet chips take primary clocking input from the external
+SYSCLK signal. The SYSCLK input (frequency) is multiplied using
+multiple phase locked loops (PLL) to create a variety of frequencies
+which can then be passed to a variety of internal logic, including
+cores and peripheral IP blocks.
+Please refer to the Reference Manual for details.
+
+1. Clock Block Binding
+
+Required properties:
+- compatible: Should contain a specific clock block compatible string
+   and a single chassis clock compatible string.
+   Clock block strings include, but not limited to, one of the:
+   * "fsl,p2041-clockgen"
+   * "fsl,p3041-clockgen"
+   * "fsl,p4080-clockgen"
+   * "fsl,p5020-clockgen"
+   * "fsl,p5040-clockgen"
+   * "fsl,t4240-clockgen"
+   * "fsl,b4420-clockgen"
+   * "fsl,b4860-clockgen"
+   Chassis clock strings include:
+   * "fsl,qoriq-clockgen-1.0": for chassis 1.0 clocks
+   * "fsl,qoriq-clockgen-2.0": for chassis 2.0 clocks
+- reg: Offset and length of the clock register set
+
+Recommended properties:
+- ranges: Allows valid translation between child's address space and
+   parent's. Must be present if the device has sub-nodes.
+- #address-cells: Specifies the number of cells used to represent
+   physical base addresses.  Must be present if the device has
+   sub-nodes and set to 1 if present
+- #size-cells: Specifies the number of cells used to represent
+   the size of an address. Must be present if the device has
+   sub-nodes and set to 1 if present
+
+2. Clock Provider/Consumer Binding
+
+Most of the bindings are from the common clock binding[1].
+ [1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible : Should include one of the following:
+   * "fsl,qoriq-core-pll-1.0" for core PLL clocks (v1.0)
+* "fsl,qoriq-core-pll-2.0" for core PLL clocks (v2.0)
+* "fsl,qoriq-core-mux-1.0" for core mux clocks (v1.0)
+* "fsl,qoriq-core-mux-2.0" for core mux clocks (v2.0)
+   * "fsl,qoriq-sysclk-1.0": for input system clock (v1.0)
+   * "fsl,qoriq-sysclk-2.0": for input system clock (v2.0)
+- #clock-cells: From common clock binding. The number of cells in a
+   clock-specifier. Should be <0> for "fsl,qoriq-sysclk-[1,2].0"
+   clocks, or <1> for "fsl,qoriq-core-pll-[1,2].0" clocks.
+   For "fsl,qoriq-core-pll-[1,2].0" clocks, the single
+   clock-specifier cell may take the following values:
+   * 0 - equal to the PLL frequency
+   * 1 - equal to the PLL frequency divided by 2
+   * 2 - equal to the PLL frequency divided by 4
+
+Recommended properties:
+- clocks: Should be the phandle of input parent clock
+- clock-names: From common clock binding, indicates the clock name
+- clock-output-names: From common clock binding, indicates the names of
+   output clocks
+- reg: Should be the offset and length of clock block base address.
+   The length should be 4.
+
+Example for clock block and clock provider:
+/ {
+   clockgen: global-utilities@e1000 {
+   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
+   ranges = <0x0 0xe1000 0x1000>;
+   reg = <0xe1000 0x1000>;
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   sysclk: sysclk {
+   #clock-cells = <0>;
+   compatible = "fsl,qoriq-sysclk-1.0";
+   clock-output-names = "sysclk";
+   }
+
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800 0x4>;
+ 

[PATCH v6] clk: corenet: Adds the clock binding

2013-11-11 Thread Yuantian.Tang
From: Tang Yuantian 

Adds the clock bindings for Freescale PowerPC CoreNet platforms

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v6:
- splited the previous patch into 2 parts, one is for binding(this one),
  the other is for DTS modification(will submit once this gets accepted)
- fixed typo
- refined #clock-cells and clock-output-names properties
- removed fixed-clock compatible string
v5:
- refine the binding document
- update the compatible string
v4:
- add binding document
- update compatible string
- update the reg property
v3:
- fix typo
v2:
- add t4240, b4420, b4860 support
- remove pll/4 clock from p2041, p3041 and p5020 board

 .../devicetree/bindings/clock/corenet-clock.txt| 123 +
 1 file changed, 123 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/corenet-clock.txt

diff --git a/Documentation/devicetree/bindings/clock/corenet-clock.txt 
b/Documentation/devicetree/bindings/clock/corenet-clock.txt
new file mode 100644
index 000..6a4e15d
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/corenet-clock.txt
@@ -0,0 +1,123 @@
+* Clock Block on Freescale CoreNet Platforms
+
+Freescale CoreNet chips take primary clocking input from the external
+SYSCLK signal. The SYSCLK input (frequency) is multiplied using
+multiple phase locked loops (PLL) to create a variety of frequencies
+which can then be passed to a variety of internal logic, including
+cores and peripheral IP blocks.
+Please refer to the Reference Manual for details.
+
+1. Clock Block Binding
+
+Required properties:
+- compatible: Should include one or more of the following:
+   * "fsl,-clockgen": for chip specific clock block, here chip
+   could be but not limited to one of the: p2041, p3041, p4080,
+   p5020, p5040, t4240, b4420, b4860
+   * "fsl,qoriq-clockgen-1.0": for chassis 1.0 clocks
+   * "fsl,qoriq-clockgen-2.0": for chassis 2.0 clocks
+   Notes that "fsl,qoriq-clockgen-1.0" and "fsl,qoriq-clockgen-2.0"
+   cannot be included simultaneously.
+- reg: Offset and length of the clock register set
+
+Recommended properties:
+- ranges: Allows valid translation between child's address space and
+   parent's. Must be present if the device has sub-nodes.
+- #address-cells: Specifies the number of cells used to represent
+   physical base addresses.  Must be present if the device has
+   sub-nodes and set to 1 if present
+- #size-cells: Specifies the number of cells used to represent
+   the size of an address. Must be present if the device has
+   sub-nodes and set to 1 if present
+
+2. Clock Provider/Consumer Binding
+
+Most of the bindings are from the common clock binding[1].
+ [1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible : Should include one of the following:
+   * "fsl,qoriq-core-pll-1.0" for core PLL clocks (v1.0)
+* "fsl,qoriq-core-pll-2.0" for core PLL clocks (v2.0)
+* "fsl,qoriq-core-mux-1.0" for core mux clocks (v1.0)
+* "fsl,qoriq-core-mux-2.0" for core mux clocks (v2.0)
+   * "fsl,qoriq-sysclk-1.0": for input system clock (v1.0)
+   * "fsl,qoriq-sysclk-2.0": for input system clock (v2.0)
+- #clock-cells: From common clock binding; indicates the number of
+   output clock. 0 is for "fsl,qoriq-sysclk-[1,2].0" and
+   "fsl,qoriq-core-mux-[1,2].0"; 1 for "fsl,qoriq-core-pll-[1,2].0".
+   If #clock-cells has a value of 1, its clock consumer should specify
+   the desired clock by having the clock ID in its "clocks" phandle
+   cell. The following is a full list IDs:
+   * 0 - equal to the PLL frequency
+   * 1 - equal to the PLL frequency divided by 2
+   * 2 - equal to the PLL frequency divided by 4
+
+Recommended properties:
+- clocks: Should be the phandle of input parent clock
+- clock-names: From common clock binding, indicates the clock name
+- clock-output-names: From common clock binding, indicates the names of
+   output clocks
+- reg: Should be the offset and length of clock block base address.
+   The length should be 4.
+
+Example for clock block and clock provider:
+/ {
+   clockgen: global-utilities@e1000 {
+   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
+   ranges = <0x0 0xe1000 0x1000>;
+   reg = <0xe1000 0x1000>;
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   sysclk: sysclk {
+   #clock-cells = <0>;
+   compatible = "fsl,qoriq-sysclk-1.0";
+   clock-output-names = "sysclk";
+   }
+
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800 0x4>;
+   compatible = "fsl,qoriq-core-pll-1.0";
+   clock

[PATCH v5] powerpc/mpc85xx: Update the clock nodes in device tree

2013-10-08 Thread Yuantian.Tang
From: Tang Yuantian 

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040, b4420, b4860, t4240

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v5:
- refine the binding document
- update the compatible string
v4:
- add binding document
- update compatible string
- update the reg property
v3:
- fix typo
v2:
- add t4240, b4420, b4860 support
- remove pll/4 clock from p2041, p3041 and p5020 board

 .../devicetree/bindings/clock/corenet-clock.txt| 111 
 arch/powerpc/boot/dts/fsl/b4420si-post.dtsi|  35 +++
 arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi |   2 +
 arch/powerpc/boot/dts/fsl/b4860si-post.dtsi|  35 +++
 arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi|  60 +++
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi|  60 +++
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi| 112 +
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi |   8 ++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi|  42 
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi|  60 +++
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/t4240si-post.dtsi|  85 
 arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi |  12 +++
 17 files changed, 640 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/corenet-clock.txt

diff --git a/Documentation/devicetree/bindings/clock/corenet-clock.txt 
b/Documentation/devicetree/bindings/clock/corenet-clock.txt
new file mode 100644
index 000..8efc62d
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/corenet-clock.txt
@@ -0,0 +1,111 @@
+* Clock Block on Freescale CoreNet Platforms
+
+Freescale CoreNet chips take primary clocking input from the external
+SYSCLK signal. The SYSCLK input (frequency) is multiplied using
+multiple phase locked loops (PLL) to create a variety of frequencies
+which can then be passed to a variety of internal logic, including
+cores and peripheral IP blocks.
+Please refer to the Reference Manual for details.
+
+1. Clock Block Binding
+
+Required properties:
+- compatible: Should include one or more of the following:
+   - "fsl,-clockgen": for chip specific clock block
+   - "fsl,qoriq-clockgen-[1,2].x": for chassis 1.x and 2.x clock
+- reg: Offset and length of the clock register set
+- clock-frequency: Indicates input clock frequency of clock block.
+   Will be set by u-boot
+
+Recommended properties:
+- #ddress-cells: Specifies the number of cells used to represent
+   physical base addresses.  Must be present if the device has
+   sub-nodes and set to 1 if present
+- #size-cells: Specifies the number of cells used to represent
+   the size of an address. Must be present if the device has
+   sub-nodes and set to 1 if present
+
+2. Clock Provider/Consumer Binding
+
+Most of the binding are from the common clock binding[1].
+ [1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible : Should include one or more of the following:
+   - "fsl,qoriq-core-pll-[1,2].x": Indicates a core PLL clock device
+   - "fsl,qoriq-core-mux-[1,2].x": Indicates a core multiplexer clock
+   device; divided from the core PLL clock
+   - "fixed-clock": From common clock binding; indicates output clock
+   of oscillator
+   - "fsl,qoriq-sysclk-[1,2].x": Indicates input system clock
+- #clock-cells: From common clock binding; indicates the number of
+   output clock. 0 is for one output clock; 1 for more than one clock
+
+Recommended properties:
+- clocks: Should be the phandle of input parent clock
+- clock-names: From common clock binding, indicates the clock name
+- clock-output-names: From common clock binding, indicates the names of
+   output clocks
+- reg: Should be the offset and length of clock block base address.
+   The length should be 4.
+
+Example for clock block and clock provider:
+/ {
+   clockgen: global-utilities@e1000 {
+   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
+   reg = <0xe1000 0x1000>;
+   clock-frequency = <0>;
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   sysclk: sysclk {
+   #clock-cells = <0>;
+   compatible = "fsl,qoriq-sysclk-1.0", "fixed-clock";
+   clock-output-names = "sysclk";
+   }
+
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800 0x4>;
+   compatible = 

[PATCH v4] powerpc/mpc85xx: Update the clock device tree nodes

2013-09-11 Thread Yuantian.Tang
From: Tang Yuantian 

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040, b4420, b4860, t4240

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v4:
- add binding document
- update compatible string
- update the reg property
v3:
- fix typo
v2:
- add t4240, b4420, b4860 support
- remove pll/4 clock from p2041, p3041 and p5020 board

 .../devicetree/bindings/clock/corenet-clock.txt|  80 +++
 arch/powerpc/boot/dts/fsl/b4420si-post.dtsi|  34 ++-
 arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi |   2 +
 arch/powerpc/boot/dts/fsl/b4860si-post.dtsi|  34 ++-
 arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi|  59 ++-
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi|  59 ++-
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi| 111 -
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi |   8 ++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi|  41 +++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi|  59 ++-
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi |   4 +
 arch/powerpc/boot/dts/fsl/t4240si-post.dtsi|  84 +++-
 arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi |  12 +++
 17 files changed, 593 insertions(+), 8 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/corenet-clock.txt

diff --git a/Documentation/devicetree/bindings/clock/corenet-clock.txt 
b/Documentation/devicetree/bindings/clock/corenet-clock.txt
new file mode 100644
index 000..51eab75
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/corenet-clock.txt
@@ -0,0 +1,80 @@
+Device Tree Clock bindings for Freescale PowerPC corenet platform
+
+This binding uses the common clock binding[1].
+
+[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible : shall be one or more of the following:
+   - "fsl,-clockgen": for chip specific clock block
+   - "fsl,qoriq-clockgen-[1,2].0": for chassis 1.0 and 2.0 clock
+   block respectively.
+   - "fsl,qoriq-chassis[1,2]-core-pll" - for a core PLL clock
+   - "fsl,qoriq-chassis[1,2]-core-mux" - for a core multiplexer clock.
+   Divided from the core PLL clock
+   - "fixed-clock" - from common clock binding; should be output clock
+   of oscillator
+- reg : shall be the control register offset from clock block base address.
+- clocks : shall be the input parent clock phandle for the clock.
+- #clock-cells : from common clock binding; shall be set to 0 or 1.
+- clock-names : from common clock binding
+- clock-output-names : from common clock binding
+
+Example for clock provider:
+
+/ {
+   clockgen: global-utilities@e1000 {
+   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0",
+  "fixed-clock";
+   reg = <0xe1000 0x1000>;
+   clock-frequency = <0>;
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800 0x4>;
+   compatible = "fsl,qoriq-chassis1-core-pll";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2";
+   };
+
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820 0x4>;
+   compatible = "fsl,qoriq-chassis1-core-pll";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2";
+   };
+
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0 0x4>;
+   compatible = "fsl,qoriq-chassis1-core-mux";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+   clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+   clock-output-names = "cmux0";
+   };
+
+   mux1: mux1@20 {
+   #clock-cells = <0>;
+   reg = <0x20 0x4>;
+   compatible = "fsl,qoriq-chassis1-core-mux";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+   clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+   clock-output-names = "cmux1";
+   };
+   };
+  }
+
+Example for clock consumer:
+
+/ {
+   cpu0: PowerPC,e5500@0 {
+   ...
+   

[PATCH v3] powerpc/mpc85xx: Update the clock device tree nodes

2013-06-05 Thread Yuantian.Tang
From: Tang Yuantian 

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040, b4420, b4860, t4240

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v3:
- fix typo
v2:
- add t4240, b4420, b4860 support
- remove pll/4 clock from p2041, p3041 and p5020 board

 arch/powerpc/boot/dts/fsl/b4420si-post.dtsi |  32 -
 arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/b4860si-post.dtsi |  32 -
 arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | 100 +++-
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi  |   8 +++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |  38 ++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/t4240si-post.dtsi |  77 -
 arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi  |  12 
 16 files changed, 473 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
index 5a6615d..b69d6e5 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
@@ -85,7 +85,37 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0";
+   compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0",
+  "fixed-clock";
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+<&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux0";
+   };
};
 
rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi 
b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
index 7b4426e..a11126b 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
@@ -62,11 +62,13 @@
cpu0: PowerPC,e6500@0 {
device_type = "cpu";
reg = <0 1>;
+   clocks = <&mux0>;
next-level-cache = <&L2>;
};
cpu1: PowerPC,e6500@2 {
device_type = "cpu";
reg = <2 3>;
+   clocks = <&mux0>;
next-level-cache = <&L2>;
};
};
diff --git a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
index e5cf6c8..507a22d 100644
--- a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
@@ -129,7 +129,37 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0";
+   compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0",
+  "fixed-clock";
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   

[PATCH v5] cpufreq: powerpc: Add cpufreq driver for Freescale e500mc SoCs

2013-06-05 Thread Yuantian.Tang
From: Tang Yuantian 

Add cpufreq driver for Freescale e500mc, e5500 and e6500 SoCs
which are capable of changing the CPU frequency dynamically

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v5:
- enhance the CPU hotplug case
- mask the disallowed CPU frequencies
- remove freqs.cpu = policy->cpu;
- refine the code style
v4:
- rebase on bleeding-edge branch of Rafael's linux-pm.git 
- #define pr_fmt() for better debug prints
- use newest cpufreq_notify_transition()
- support CPU hotplug
- remove table[i].index as it is not used
- remove cpus_per_cluster
v3:
- change sizeof(struct name).. to sizeof(*p)
- remove the struct cpufreq_data, use global variable instead
- resolve setting policy->cpus incorrectly
- add CPUFREQ_POSTCHANGE notifier when setting frequency error
v2:
- add depends on OF and COMMON_CLK in Kconfig
- use clk.h instead of clk-provider.h
- change per_cpu variable from struct to pointer

 drivers/cpufreq/Kconfig.powerpc   |  10 +
 drivers/cpufreq/Makefile  |   1 +
 drivers/cpufreq/ppc-corenet-cpufreq.c | 380 ++
 3 files changed, 391 insertions(+)
 create mode 100644 drivers/cpufreq/ppc-corenet-cpufreq.c

diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index 9c926ca..88f629e 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -23,3 +23,13 @@ config CPU_FREQ_MAPLE
help
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
+
+config PPC_CORENET_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
+   depends on PPC_E500MC && OF && COMMON_CLK
+   select CPU_FREQ_TABLE
+   select CLK_PPC_CORENET
+   help
+ This adds the CPUFreq driver support for Freescale e500mc,
+ e5500 and e6500 series SoCs which are capable of changing
+ the CPU's frequency dynamically.
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 315b923..c956094 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -79,6 +79,7 @@ obj-$(CONFIG_CPU_FREQ_CBE)+= ppc-cbe-cpufreq.o
 ppc-cbe-cpufreq-y  += ppc_cbe_cpufreq_pervasive.o 
ppc_cbe_cpufreq.o
 obj-$(CONFIG_CPU_FREQ_CBE_PMI) += ppc_cbe_cpufreq_pmi.o
 obj-$(CONFIG_CPU_FREQ_MAPLE)   += maple-cpufreq.o
+obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
 
 
##
 # Other platform drivers
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
new file mode 100644
index 000..3cae452
--- /dev/null
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#define pr_fmt(fmt)KBUILD_MODNAME ": " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/**
+ * struct cpu_data - per CPU data struct
+ * @clk: the clk of CPU
+ * @parent: the parent node of cpu clock
+ * @table: frequency table
+ */
+struct cpu_data {
+   struct clk *clk;
+   struct device_node *parent;
+   struct cpufreq_frequency_table *table;
+};
+
+/**
+ * struct soc_data - SoC specific data
+ * @freq_mask: mask the disallowed frequencies
+ * @flag: unique flags
+ */
+struct soc_data {
+   u32 freq_mask[4];
+   u32 flag;
+};
+
+#define FREQ_MASK  1
+/* see hardware specification for the allowed frqeuencies */
+static const struct soc_data sdata[] = {
+   { /* used by p2041 and p3041 */
+   .freq_mask = {0x8, 0x8, 0x2, 0x2},
+   .flag = FREQ_MASK,
+   },
+   { /* used by p5020 */
+   .freq_mask = {0x8, 0x2},
+   .flag = FREQ_MASK,
+   },
+   { /* used by p4080, p5040 */
+   .freq_mask = {0},
+   .flag = 0,
+   },
+};
+
+/*
+ * the minimum allowed core frequency, in Hz
+ * for chassis v1.0, >= platform frequency
+ * for chassis v2.0, >= platform frequency / 2
+ */
+static u32 min_cpufreq;
+static const u32 *fmask;
+
+/* serialize frequency changes  */
+static DEFINE_MUTEX(cpufreq_lock);
+static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+
+/* cpumask in a cluster */
+static DEFINE_PER_CPU(cpumask_var_t, cpu_mask);
+
+#ifndef CONFIG_SMP
+static inline const struct cpumask *cpu_core_mask(int cpu)
+{
+   return cpumask_of(0);
+}
+#endif
+
+static unsigned int corenet_cpufreq_get_speed(un

[PATCH v2] powerpc/mpc85xx: Update the clock device tree nodes

2013-05-31 Thread Yuantian.Tang
From: Tang Yuantian 

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040, b4420, b4860, t4240

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v2:
- add t4240, b4420, b4860 support
- remove pll/4 clock from p2041, p3041 and p5020 board

 arch/powerpc/boot/dts/fsl/b4420si-post.dtsi |  32 -
 arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/b4860si-post.dtsi |  32 -
 arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | 100 +++-
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi  |   8 +++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |  38 ++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/t4240si-post.dtsi |  77 -
 arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi  |  12 
 16 files changed, 473 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
index 5a6615d..b69d6e5 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
@@ -85,7 +85,37 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0";
+   compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0",
+  "fixed-clock";
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+<&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux0";
+   };
};
 
rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi 
b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
index 7b4426e..a11126b 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
@@ -62,11 +62,13 @@
cpu0: PowerPC,e6500@0 {
device_type = "cpu";
reg = <0 1>;
+   clocks = <&mux0>;
next-level-cache = <&L2>;
};
cpu1: PowerPC,e6500@2 {
device_type = "cpu";
reg = <2 3>;
+   clocks = <&mux0>;
next-level-cache = <&L2>;
};
};
diff --git a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
index e5cf6c8..507a22d 100644
--- a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
@@ -129,7 +129,37 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0";
+   compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0",
+  "fixed-clock";
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg

[PATCH] clk/mpc85xx: Update the compatible string

2013-05-22 Thread Yuantian.Tang
From: Tang Yuantian 

The compatible string of clock is changed from *-2 to *-2.0
on chassis 2. So updated it accordingly.

Signed-off-by: Tang Yuantian 
---
 drivers/clk/clk-ppc-corenet.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
index a2d483f..e958707 100644
--- a/drivers/clk/clk-ppc-corenet.c
+++ b/drivers/clk/clk-ppc-corenet.c
@@ -260,7 +260,7 @@ static int __init ppc_corenet_clk_probe(struct 
platform_device *pdev)
 
 static const struct of_device_id ppc_clk_ids[] __initconst = {
{ .compatible = "fsl,qoriq-clockgen-1.0", },
-   { .compatible = "fsl,qoriq-clockgen-2", },
+   { .compatible = "fsl,qoriq-clockgen-2.0", },
{}
 };
 
-- 
1.8.0


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v2] of/base: release the node correctly in of_parse_phandle_with_args()

2013-04-09 Thread Yuantian.Tang
From: Tang Yuantian 

Call of_node_put() only when the out_args is NULL on success,
or the node's reference count will not be correct because the caller
will call of_node_put() again.

Signed-off-by: Tang Yuantian 
---
v2:
- modified the title and description. the 1st patch title is:
  of: remove the unnecessary of_node_put for 
of_parse_phandle_with_args()
  the 1st patch is not good enough.

 drivers/of/base.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 321d3ef..ee94f64 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -1158,6 +1158,7 @@ static int __of_parse_phandle_with_args(const struct 
device_node *np,
if (!phandle)
goto err;
 
+   /* Found it! return success */
if (out_args) {
int i;
if (WARN_ON(count > MAX_PHANDLE_ARGS))
@@ -1166,11 +1167,10 @@ static int __of_parse_phandle_with_args(const struct 
device_node *np,
out_args->args_count = count;
for (i = 0; i < count; i++)
out_args->args[i] = 
be32_to_cpup(list++);
+   } else if (node) {
+   of_node_put(node);
}
 
-   /* Found it! return success */
-   if (node)
-   of_node_put(node);
return 0;
}
 
-- 
1.8.0


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH] powerpc/mpc85xx: Update the clock device tree nodes

2013-04-09 Thread Yuantian.Tang
From: Tang Yuantian 

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
* resend for review

 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi |  62 -
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi |  62 -
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | 100 +++-
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi  |   8 +++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |  42 +++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi  |   4 ++
 10 files changed, 337 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
index 69ac1ac..d83de62 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
@@ -305,9 +305,69 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0";
+   compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0",
+  "fixed-clock";
reg = <0xe1000 0x1000>;
clock-frequency = <0>;
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux0";
+   };
+   mux1: mux1@20 {
+   #clock-cells = <0>;
+   reg = <0x20>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux1";
+   };
+   mux2: mux2@40 {
+   #clock-cells = <0>;
+   reg = <0x40>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux2";
+   };
+   mux3: mux3@60 {
+   #clock-cells = <0>;
+   reg = <0x60>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux3";
+   };
};
 
rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi 
b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
index 7a2697d..22f3b14 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
@@ -81,6 +81,7 @@
cpu0: PowerPC,e500mc@0 {
device_type = "cpu";
reg = <0>;
+   clocks = <&mux0>;
next-level-cache = <&L2_0>;
L2_0: l2-cache {
next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
cpu1: PowerPC,e500mc@1 {
device_type = "cpu";
  

[PATCH v3] clk: add PowerPC corenet clock driver support

2013-04-09 Thread Yuantian.Tang
From: Tang Yuantian 

This adds the clock driver for Freescale PowerPC corenet
series SoCs using common clock infrastructure.

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v3:
- remove the module author and description
v2:
- add the document for device tree clock bindings

 arch/powerpc/platforms/Kconfig.cputype |   1 +
 drivers/clk/Kconfig|   7 +
 drivers/clk/Makefile   |   1 +
 drivers/clk/clk-ppc-corenet.c  | 280 +
 4 files changed, 289 insertions(+)
 create mode 100644 drivers/clk/clk-ppc-corenet.c

diff --git a/arch/powerpc/platforms/Kconfig.cputype 
b/arch/powerpc/platforms/Kconfig.cputype
index 18e3b76..cf065b8 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -158,6 +158,7 @@ config E500
 config PPC_E500MC
bool "e500mc Support"
select PPC_FPU
+   select COMMON_CLK
depends on E500
help
  This must be enabled for running on e500mc (and derivatives
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index a47e6ee..6e2fd9c 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -63,6 +63,13 @@ config CLK_TWL6040
  McPDM. McPDM module is using the external bit clock on the McPDM bus
  as functional clock.
 
+config CLK_PPC_CORENET
+   bool "Clock driver for PowerPC corenet platforms"
+   depends on PPC_E500MC && OF
+   ---help---
+ This adds the clock driver support for Freescale PowerPC corenet
+ platforms using common clock framework.
+
 endmenu
 
 source "drivers/clk/mvebu/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 300d477..6720319 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -34,3 +34,4 @@ obj-$(CONFIG_X86) += x86/
 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
 obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
 obj-$(CONFIG_CLK_TWL6040)  += clk-twl6040.o
+obj-$(CONFIG_CLK_PPC_CORENET)  += clk-ppc-corenet.o
diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
new file mode 100644
index 000..a2d483f
--- /dev/null
+++ b/drivers/clk/clk-ppc-corenet.c
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2013 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 version 2 as
+ * published by the Free Software Foundation.
+ *
+ * clock driver for Freescale PowerPC corenet SoCs.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct cmux_clk {
+   struct clk_hw hw;
+   void __iomem *reg;
+   u32 flags;
+};
+
+#define PLL_KILL   BIT(31)
+#defineCLKSEL_SHIFT27
+#define CLKSEL_ADJUST  BIT(0)
+#define to_cmux_clk(p) container_of(p, struct cmux_clk, hw)
+
+static void __iomem *base;
+static unsigned int clocks_per_pll;
+
+static int cmux_set_parent(struct clk_hw *hw, u8 idx)
+{
+   struct cmux_clk *clk = to_cmux_clk(hw);
+   u32 clksel;
+
+   clksel = ((idx / clocks_per_pll) << 2) + idx % clocks_per_pll;
+   if (clk->flags & CLKSEL_ADJUST)
+   clksel += 8;
+   clksel = (clksel & 0xf) << CLKSEL_SHIFT;
+   iowrite32be(clksel, clk->reg);
+
+   return 0;
+}
+
+static u8 cmux_get_parent(struct clk_hw *hw)
+{
+   struct cmux_clk *clk = to_cmux_clk(hw);
+   u32 clksel;
+
+   clksel = ioread32be(clk->reg);
+   clksel = (clksel >> CLKSEL_SHIFT) & 0xf;
+   if (clk->flags & CLKSEL_ADJUST)
+   clksel -= 8;
+   clksel = (clksel >> 2) * clocks_per_pll + clksel % 4;
+
+   return clksel;
+}
+
+const struct clk_ops cmux_ops = {
+   .get_parent = cmux_get_parent,
+   .set_parent = cmux_set_parent,
+};
+
+static void __init core_mux_init(struct device_node *np)
+{
+   struct clk *clk;
+   struct clk_init_data init;
+   struct cmux_clk *cmux_clk;
+   struct device_node *node;
+   int rc, count, i;
+   u32 offset;
+   const char *clk_name;
+   const char **parent_names;
+
+   rc = of_property_read_u32(np, "reg", &offset);
+   if (rc) {
+   pr_err("%s: could not get reg property\n", np->name);
+   return;
+   }
+
+   /* get the input clock source count */
+   count = of_property_count_strings(np, "clock-names");
+   if (count < 0) {
+   pr_err("%s: get clock count error\n", np->name);
+   return;
+   }
+   parent_names = kzalloc((sizeof(char *) * count), GFP_KERNEL);
+   if (!parent_names) {
+   pr_err("%s: could not allocate parent_names\n", __func__);
+   return;
+   }
+
+   for (i = 0; i < count; i++)
+   parent_names[i] = of_clk_get_parent_name(np, i);
+
+   cmux_clk = kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);
+   if (!cmux_clk) {
+

[PATCH v4] cpufreq: powerpc: Add cpufreq driver for Freescale e500mc SoCs

2013-04-09 Thread Yuantian.Tang
From: Tang Yuantian 

Add cpufreq driver for Freescale e500mc, e5500 and e6500 SoCs
which are capable of changing the CPU frequency dynamically

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v4:
- rebase on bleeding-edge branch of Rafael's linux-pm.git 
- #define pr_fmt() for better debug prints
- use newest cpufreq_notify_transition()
- support CPU hotplug
- remove table[i].index as it is not used
- remove cpus_per_cluster
v3:
- change sizeof(struct name).. to sizeof(*p)
- remove the struct cpufreq_data, use global variable instead
- resolve setting policy->cpus incorrectly
- add CPUFREQ_POSTCHANGE notifier when setting frequency error
v2:
- add depends on OF and COMMON_CLK in Kconfig
- use clk.h instead of clk-provider.h
- change per_cpu variable from struct to pointer

 drivers/cpufreq/Kconfig.powerpc   |  10 ++
 drivers/cpufreq/Makefile  |   1 +
 drivers/cpufreq/ppc-corenet-cpufreq.c | 254 ++
 3 files changed, 265 insertions(+)
 create mode 100644 drivers/cpufreq/ppc-corenet-cpufreq.c

diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index 9c926ca..88f629e 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -23,3 +23,13 @@ config CPU_FREQ_MAPLE
help
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
+
+config PPC_CORENET_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
+   depends on PPC_E500MC && OF && COMMON_CLK
+   select CPU_FREQ_TABLE
+   select CLK_PPC_CORENET
+   help
+ This adds the CPUFreq driver support for Freescale e500mc,
+ e5500 and e6500 series SoCs which are capable of changing
+ the CPU's frequency dynamically.
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 6ad0b91..5125034 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -84,6 +84,7 @@ obj-$(CONFIG_CPU_FREQ_CBE)+= ppc-cbe-cpufreq.o
 ppc-cbe-cpufreq-y  += ppc_cbe_cpufreq_pervasive.o 
ppc_cbe_cpufreq.o
 obj-$(CONFIG_CPU_FREQ_CBE_PMI) += ppc_cbe_cpufreq_pmi.o
 obj-$(CONFIG_CPU_FREQ_MAPLE)   += maple-cpufreq.o
+obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
 
 
##
 # Other platform drivers
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
new file mode 100644
index 000..e230282
--- /dev/null
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#define pr_fmt(fmt)KBUILD_MODNAME ": " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/**
+ * struct cpu_data - per CPU data struct
+ * @clk: the clk of CPU
+ * @parent: the parent node of cpu clock
+ * @table: frequency table
+ */
+struct cpu_data {
+   struct clk *clk;
+   struct device_node *parent;
+   struct cpufreq_frequency_table *table;
+};
+
+/* serialize frequency changes  */
+static DEFINE_MUTEX(cpufreq_lock);
+static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+
+static unsigned int corenet_cpufreq_get_speed(unsigned int cpu)
+{
+   struct cpu_data *data = per_cpu(cpu_data, cpu);
+
+   return clk_get_rate(data->clk) / 1000;
+}
+
+/* reduce the duplicated frequency in frequency table */
+static void freq_table_redup(struct cpufreq_frequency_table *freq_table,
+   int count)
+{
+   int i, j;
+
+   for (i = 1; i < count; i++) {
+   for (j = 0; j < i; j++) {
+   if (freq_table[j].frequency == CPUFREQ_ENTRY_INVALID ||
+   freq_table[j].frequency !=
+   freq_table[i].frequency)
+   continue;
+
+   freq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+   break;
+   }
+   }
+}
+
+static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+   struct device_node *np;
+   int i, count, ret;
+   struct clk *clk;
+   struct cpufreq_frequency_table *table;
+   struct cpu_data *data;
+   unsigned int cpu = policy->cpu;
+
+   np = of_get_cpu_node(cpu, NULL);
+   if (!np)
+   return -ENODEV;
+
+   data = kzalloc(sizeof(*data), GFP_KERNEL);
+   if (!data) {
+   pr_err("%s: no memory\n", __func__);
+  

[PATCH] of: remove the unnecessary of_node_put for of_parse_phandle_with_args()

2013-04-09 Thread Yuantian.Tang
From: Tang Yuantian 

As the function itself says it is caller's responsibility to call the
of_node_put().  So, remove it on success to keep the reference count
correct.

Signed-off-by: Tang Yuantian 
---
 drivers/of/base.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 321d3ef..e8b4c28 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -1168,9 +1168,6 @@ static int __of_parse_phandle_with_args(const struct 
device_node *np,
out_args->args[i] = 
be32_to_cpup(list++);
}
 
-   /* Found it! return success */
-   if (node)
-   of_node_put(node);
return 0;
}
 
-- 
1.8.0


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v3] cpufreq: Add cpufreq driver for Freescale e500mc SoCs

2013-03-28 Thread Yuantian.Tang
From: Tang Yuantian 

Add cpufreq driver for Freescale e500mc, e5500 and e6500 SoCs
which are capable of changing the frequency of CPU dynamically

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v3:
- change sizeof(struct name).. to sizeof(*p)
- remove the struct cpufreq_data, use global variable instead
- resolve setting policy->cpus incorrectly
- add CPUFREQ_POSTCHANGE notifier when setting frequency error
v2:
- add depends on OF and COMMON_CLK in Kconfig
- use clk.h instead of clk-provider.h
- change per_cpu variable from struct to pointer

 drivers/cpufreq/Kconfig.powerpc   |  10 ++
 drivers/cpufreq/Makefile  |   1 +
 drivers/cpufreq/ppc-corenet-cpufreq.c | 247 ++
 3 files changed, 258 insertions(+)
 create mode 100644 drivers/cpufreq/ppc-corenet-cpufreq.c

diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index e76992f..3a0d8d0 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -5,3 +5,13 @@ config CPU_FREQ_MAPLE
help
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
+
+config PPC_CORENET_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
+   depends on PPC_E500MC && OF && COMMON_CLK
+   select CPU_FREQ_TABLE
+   select CLK_PPC_CORENET
+   help
+ This adds the CPUFreq driver support for Freescale e500mc,
+ e5500 and e6500 series SoCs which are capable of changing
+ the CPU's frequency dynamically.
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 863fd18..2416559 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -61,3 +61,4 @@ obj-$(CONFIG_ARM_IMX6Q_CPUFREQ)   += 
imx6q-cpufreq.o
 
##
 # PowerPC platform drivers
 obj-$(CONFIG_CPU_FREQ_MAPLE)   += maple-cpufreq.o
+obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
new file mode 100644
index 000..08e820ee
--- /dev/null
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/**
+ * struct cpu_data - per CPU data struct
+ * @clk: the clk of CPU
+ * @parent: the parent node of cpu clock
+ * @table: frequency table
+ */
+struct cpu_data {
+   struct clk *clk;
+   struct device_node *parent;
+   struct cpufreq_frequency_table *table;
+};
+
+/* serialize frequency changes  */
+static DEFINE_MUTEX(cpufreq_lock);
+
+static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+static unsigned intcpus_per_cluster;
+
+static unsigned int corenet_cpufreq_get_speed(unsigned int cpu)
+{
+   struct cpu_data *data = per_cpu(cpu_data, cpu);
+
+   return clk_get_rate(data->clk) / 1000;
+}
+
+/* reduce the duplicated frequency in frequency table */
+static void freq_table_redup(struct cpufreq_frequency_table *freq_table,
+   int count)
+{
+   int i, j;
+
+   for (i = 1; i < count; i++) {
+   for (j = 0; j < i; j++) {
+   if (freq_table[j].frequency == CPUFREQ_ENTRY_INVALID ||
+   freq_table[j].frequency !=
+   freq_table[i].frequency)
+   continue;
+
+   freq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+   break;
+   }
+   }
+}
+
+static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+   struct device_node *np;
+   int i, count, ret;
+   struct clk *clk;
+   struct cpufreq_frequency_table *table;
+   struct cpu_data *data;
+   unsigned int cpu = policy->cpu;
+
+   np = of_get_cpu_node(cpu, NULL);
+   if (!np)
+   return -ENODEV;
+
+   data = kzalloc(sizeof(*data), GFP_KERNEL);
+   if (!data)
+   return -ENOMEM;
+
+   data->clk = of_clk_get(np, 0);
+   data->parent = of_parse_phandle(np, "clocks", 0);
+   if (!data->parent) {
+   pr_err("%s: could not get clock information\n", __func__);
+   goto err_nomem2;
+   }
+
+   count = of_property_count_strings(data->parent, "clock-names");
+   table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
+   if (!table) {
+   pr_err("

[PATCH 1/2 V2] clk: add PowerPC corenet clock driver support

2013-03-28 Thread Yuantian.Tang
From: Tang Yuantian 

This adds the clock driver for Freescale PowerPC corenet
series SoCs using common clock infrastructure.

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v2: add the document for device tree clock bindings

 .../bindings/clock/freescale-corenet-clock.txt |  67 +
 arch/powerpc/platforms/Kconfig.cputype |   1 +
 drivers/clk/Kconfig|   7 +
 drivers/clk/Makefile   |   1 +
 drivers/clk/clk-ppc-corenet.c  | 285 +
 5 files changed, 361 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/clock/freescale-corenet-clock.txt
 create mode 100644 drivers/clk/clk-ppc-corenet.c

diff --git 
a/Documentation/devicetree/bindings/clock/freescale-corenet-clock.txt 
b/Documentation/devicetree/bindings/clock/freescale-corenet-clock.txt
new file mode 100644
index 000..696c85f
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/freescale-corenet-clock.txt
@@ -0,0 +1,67 @@
+Device Tree Clock bindings for Freescale PowerPC corenet platform
+
+This binding uses the common clock binding[1].
+
+[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible : shall be one of the following:
+   "fsl,core-pll-clock" - for a core PLL clock
+   "fsl,core-mux-clock" - for a core multiplexer clock. Divided from the
+   core PLL clock
+   "fixed-clock" - from common clock binding; should be output clock
+   of oscillator
+- reg : shall be the control register offset from clock block base address.
+- clocks : shall be the input parent clock phandle for the clock.
+- #clock-cells : from common clock binding; shall be set to 0 or 1.
+- clock-names : from common clock binding
+- clock-output-names : from common clock binding
+
+Example SoC include file:
+
+/ {
+   clockgen: global-utilities@e1000 {
+   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0",
+  "fixed-clock";
+   reg = <0xe1000 0x1000>;
+   clock-frequency = <0>;
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+<&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux0";
+   };
+   mux1: mux1@20 {
+   #clock-cells = <0>;
+   reg = <0x20>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+<&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux1";
+   };
+   };
diff --git a/arch/powerpc/platforms/Kconfig.cputype 
b/arch/powerpc/platforms/Kconfig.cputype
index 18e3b76..cf065b8 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -158,6 +158,7 @@ config E500
 config PPC_E500MC
bool "e500mc Support"
select PPC_FPU
+   select COMMON_CLK
depends on E500
help
  This must be enabled for running on e500mc (and derivatives
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index a47e6ee..6e2fd9c 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -63,6 +63,13 @@ config CLK_TWL6040
  McPDM. McPDM module is using the external bit clock on the McPDM bus
  as functional clock.
 
+config CLK_PPC_CORENET
+   bool "Clock driver for PowerPC corenet platforms"
+   depends on PPC_E500MC && OF
+   ---help---
+ This adds the clock driver support for Freescale PowerPC corenet
+ platforms using common clock framework.
+
 endmenu
 
 source "driver

[PATCH 2/2 v2] cpufreq: Add cpufreq driver for Freescale e500mc SoCs

2013-03-28 Thread Yuantian.Tang
From: Tang Yuantian 

Add cpufreq driver for Freescale e500mc, e5500 and e6500 SoCs
which are capable of changing the frequency of CPU dynamically

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
v2:
- change the per_cpu variable to point type
- fixed other issues

 drivers/cpufreq/Kconfig.powerpc   |  10 ++
 drivers/cpufreq/Makefile  |   1 +
 drivers/cpufreq/ppc-corenet-cpufreq.c | 255 ++
 3 files changed, 266 insertions(+)
 create mode 100644 drivers/cpufreq/ppc-corenet-cpufreq.c

diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index e76992f..3a0d8d0 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -5,3 +5,13 @@ config CPU_FREQ_MAPLE
help
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
+
+config PPC_CORENET_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
+   depends on PPC_E500MC && OF && COMMON_CLK
+   select CPU_FREQ_TABLE
+   select CLK_PPC_CORENET
+   help
+ This adds the CPUFreq driver support for Freescale e500mc,
+ e5500 and e6500 series SoCs which are capable of changing
+ the CPU's frequency dynamically.
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 863fd18..2416559 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -61,3 +61,4 @@ obj-$(CONFIG_ARM_IMX6Q_CPUFREQ)   += 
imx6q-cpufreq.o
 
##
 # PowerPC platform drivers
 obj-$(CONFIG_CPU_FREQ_MAPLE)   += maple-cpufreq.o
+obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
new file mode 100644
index 000..a50ab5a
--- /dev/null
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/**
+ * struct cpufreq_data - cpufreq driver data
+ * @cpus_per_cluster: CPU numbers per cluster
+ * @cpufreq_lock: the mutex lock
+ */
+struct cpufreq_data {
+   int cpus_per_cluster;
+   struct mutex cpufreq_lock;
+};
+
+/**
+ * struct cpu_data - per CPU data struct
+ * @clk: the clk data of CPU
+ * @parent: the parent node of clock of cpu
+ * @table: frequency table point
+ */
+struct cpu_data {
+   struct clk *clk;
+   struct device_node *parent;
+   struct cpufreq_frequency_table *table;
+};
+
+static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+static struct cpufreq_data freq_data;
+
+static unsigned int corenet_cpufreq_get_speed(unsigned int cpu)
+{
+   struct cpu_data *data = per_cpu(cpu_data, cpu);
+
+   return clk_get_rate(data->clk) / 1000;
+}
+
+/* reduce the duplicated frequency in frequency table */
+static void freq_table_redup(struct cpufreq_frequency_table *freq_table,
+   int count)
+{
+   int i, j;
+
+   for (i = 1; i < count; i++) {
+   for (j = 0; j < i; j++) {
+   if (freq_table[j].frequency == CPUFREQ_ENTRY_INVALID ||
+   freq_table[j].frequency !=
+   freq_table[i].frequency)
+   continue;
+
+   freq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+   break;
+   }
+   }
+}
+
+static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+   unsigned int cpu = policy->cpu;
+   struct device_node *np;
+   int i, count;
+   struct clk *clk;
+   struct cpufreq_frequency_table *table;
+   struct cpu_data *data;
+
+   np = of_get_cpu_node(cpu, NULL);
+   if (!np)
+   return -ENODEV;
+
+   data = kzalloc(sizeof(struct cpu_data), GFP_KERNEL);
+   if (!data)
+   return -ENOMEM;
+
+   data->clk = of_clk_get(np, 0);
+   data->parent = of_parse_phandle(np, "clocks", 0);
+   if (!data->parent) {
+   pr_err("%s: could not get clock information\n", __func__);
+   goto err_nomem2;
+   }
+
+   count = of_property_count_strings(data->parent, "clock-names");
+
+   table = kcalloc(count + 1,
+   sizeof(struct cpufreq_frequency_table), GFP_KERNEL);
+   if (!table) {
+   pr_err("%s: no memory\n", __func__);
+   goto err_nomem2;
+   }
+
+   for (i = cpu; i <

[PATCH 3/3] cpufreq: Add cpufreq driver for Freescale e500mc SOCs

2013-03-25 Thread Yuantian.Tang
From: Tang Yuantian 

Add cpufreq driver for Freescale e500mc, e5500 and e6500 SOCs
which are capable of changing the frequency of CPU dynamically

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
 drivers/cpufreq/Kconfig.powerpc   |  10 ++
 drivers/cpufreq/Makefile  |   1 +
 drivers/cpufreq/ppc-corenet-cpufreq.c | 237 ++
 3 files changed, 248 insertions(+)
 create mode 100644 drivers/cpufreq/ppc-corenet-cpufreq.c

diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index e76992f..6339db4 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -5,3 +5,13 @@ config CPU_FREQ_MAPLE
help
  This adds support for frequency switching on Maple 970FX
  Evaluation Board and compatible boards (IBM JS2x blades).
+
+config PPC_CORENET_CPUFREQ
+   tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
+   depends on PPC_E500MC
+   select CPU_FREQ_TABLE
+   select CLK_PPC_CORENET
+   help
+ This adds the CPUFreq driver support for Freescale e500mc,
+ e5500 and e6500 series SoCs which are capable of changing
+ the CPU's frequency dynamically.
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 863fd18..2416559 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -61,3 +61,4 @@ obj-$(CONFIG_ARM_IMX6Q_CPUFREQ)   += 
imx6q-cpufreq.o
 
##
 # PowerPC platform drivers
 obj-$(CONFIG_CPU_FREQ_MAPLE)   += maple-cpufreq.o
+obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c 
b/drivers/cpufreq/ppc-corenet-cpufreq.c
new file mode 100644
index 000..ad359d4
--- /dev/null
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/**
+ * struct cpufreq_data - cpufreq driver data
+ * @cpus_per_cluster: CPU numbers per cluster
+ * @cpufreq_lock: the mutex lock
+ */
+struct cpufreq_data {
+   int cpus_per_cluster;
+   struct mutex cpufreq_lock;
+};
+
+/**
+ * struct cpu_data - per CPU data struct
+ * @np: the node of CPU
+ * @parent: the parent node of np
+ * @table: frequency table point
+ */
+struct cpu_data {
+   struct device_node  *np;
+   struct device_node  *parent;
+   struct cpufreq_frequency_table *table;
+};
+
+static DEFINE_PER_CPU(struct cpu_data, cpu_data);
+static struct cpufreq_data freq_data;
+
+static unsigned int corenet_cpufreq_get_speed(unsigned int cpu)
+{
+   struct clk *clk;
+   struct cpu_data *data = &per_cpu(cpu_data, cpu);
+
+   clk = of_clk_get(data->np, 0);
+
+   return clk_get_rate(clk) / 1000;
+}
+
+/* reduce the duplicated frequency in frequency table */
+static int freq_table_redup(struct cpufreq_frequency_table *freq_table,
+   int cur)
+{
+   int i;
+
+   for (i = 0; i < cur; i++) {
+   if (freq_table[i].frequency == CPUFREQ_ENTRY_INVALID ||
+   freq_table[i].frequency != freq_table[cur].frequency)
+   continue;
+
+   freq_table[cur].index = -1;
+   freq_table[cur].frequency = CPUFREQ_ENTRY_INVALID;
+   break;
+   }
+
+   return (i == cur) ? 0 : 1;
+}
+
+static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+   unsigned int cpu = policy->cpu;
+   int i, count;
+   struct clk *clk;
+   struct cpufreq_frequency_table *table;
+   struct cpu_data *data;
+
+   data = &per_cpu(cpu_data, cpu);
+   data->np = of_get_cpu_node(cpu, NULL);
+   if (!data->np)
+   return -ENODEV;
+
+   data->parent = of_parse_phandle(data->np, "clocks", 0);
+   if (!data->parent)
+   return -ENODEV;
+
+   count = of_property_count_strings(data->parent, "clock-names");
+
+   table = kcalloc(count + 1,
+   sizeof(struct cpufreq_frequency_table), GFP_KERNEL);
+   if (!table)
+   return -ENOMEM;
+
+   for (i = cpu; i < freq_data.cpus_per_cluster + cpu; i++)
+   cpumask_set_cpu(i, policy->cpus);
+
+   for (i = 0; i < count; i++) {
+   table[i].index = i;
+   clk = of_clk_get(data->parent, i);
+   table[i].frequency = clk_get_rate(clk) / 1000;
+   freq_table_redup(table, i);
+   }
+   table[i].index = -1;
+   table[i].frequency = CPUFREQ_TABLE

[PATCH 1/3] powerpc/mpc85xx: Update the clock device tree nodes

2013-03-25 Thread Yuantian.Tang
From: Tang Yuantian 

The following SOCs will be affected: p2041, p3041, p4080,
p5020, p5040

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi |  62 -
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi |  62 -
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | 100 +++-
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi  |   8 +++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |  42 +++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi |  54 ++-
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi  |   4 ++
 10 files changed, 337 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
index 69ac1ac..d83de62 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
@@ -305,9 +305,69 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0";
+   compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0",
+  "fixed-clock";
reg = <0xe1000 0x1000>;
clock-frequency = <0>;
+   clock-output-names = "sysclk";
+   #clock-cells = <0>;
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+   pll0: pll0@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+   };
+   pll1: pll1@820 {
+   #clock-cells = <1>;
+   reg = <0x820>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux0";
+   };
+   mux1: mux1@20 {
+   #clock-cells = <0>;
+   reg = <0x20>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux1";
+   };
+   mux2: mux2@40 {
+   #clock-cells = <0>;
+   reg = <0x40>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux2";
+   };
+   mux3: mux3@60 {
+   #clock-cells = <0>;
+   reg = <0x60>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+  <&pll1 0>, <&pll1 1>, <&pll1 2>;
+   clock-names = "pll0_0", "pll0_1", "pll0_2",
+   "pll1_0", "pll1_1", "pll1_2";
+   clock-output-names = "cmux3";
+   };
};
 
rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi 
b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
index 7a2697d..22f3b14 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
@@ -81,6 +81,7 @@
cpu0: PowerPC,e500mc@0 {
device_type = "cpu";
reg = <0>;
+   clocks = <&mux0>;
next-level-cache = <&L2_0>;
L2_0: l2-cache {
next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
cpu1: PowerPC,e500mc@1 {
device_type = "cpu";
reg

[PATCH 2/3] clk: add PowerPC corenet clock driver support

2013-03-25 Thread Yuantian.Tang
From: Tang Yuantian 

This adds the clock driver for Freescale PowerPC corenet
series SOC using common clock infrastructure.

Signed-off-by: Tang Yuantian 
Signed-off-by: Li Yang 
---
 arch/powerpc/platforms/Kconfig.cputype |   1 +
 drivers/clk/Kconfig|   7 +
 drivers/clk/Makefile   |   1 +
 drivers/clk/clk-ppc-corenet.c  | 285 +
 4 files changed, 294 insertions(+)
 create mode 100644 drivers/clk/clk-ppc-corenet.c

diff --git a/arch/powerpc/platforms/Kconfig.cputype 
b/arch/powerpc/platforms/Kconfig.cputype
index 18e3b76..cf065b8 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -158,6 +158,7 @@ config E500
 config PPC_E500MC
bool "e500mc Support"
select PPC_FPU
+   select COMMON_CLK
depends on E500
help
  This must be enabled for running on e500mc (and derivatives
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index a47e6ee..97ec76f 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -63,6 +63,13 @@ config CLK_TWL6040
  McPDM. McPDM module is using the external bit clock on the McPDM bus
  as functional clock.
 
+config CLK_PPC_CORENET
+   bool "Clock driver for PowerPC corenet platforms"
+   depends on PPC_E500MC
+   ---help---
+ This adds the clock driver support for Freescale PowerPC corenet
+ platforms using common clock framework.
+
 endmenu
 
 source "drivers/clk/mvebu/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 300d477..6720319 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -34,3 +34,4 @@ obj-$(CONFIG_X86) += x86/
 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
 obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
 obj-$(CONFIG_CLK_TWL6040)  += clk-twl6040.o
+obj-$(CONFIG_CLK_PPC_CORENET)  += clk-ppc-corenet.o
diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
new file mode 100644
index 000..6811e03
--- /dev/null
+++ b/drivers/clk/clk-ppc-corenet.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2013 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 version 2 as
+ * published by the Free Software Foundation.
+ *
+ * clock driver for Freescale PowerPC corenet SoCs.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct cmux_clk {
+   struct clk_hw   hw;
+   void __iomem*reg;
+   u32 flags;
+};
+
+#define PLL_KILL   BIT(31)
+#define CLKSEL_SHIFT   27
+#define CLKSEL_ADJUST  BIT(0)
+
+#define to_cmux_clk(p) container_of(p, struct cmux_clk, hw)
+
+static void __iomem *base;
+static unsigned int clocks_per_pll;
+
+static int cmux_set_parent(struct clk_hw *hw, u8 idx)
+{
+   struct cmux_clk *clk = to_cmux_clk(hw);
+   u32 clksel;
+
+   clksel = ((idx / clocks_per_pll) << 2) + idx % clocks_per_pll;
+   if (clk->flags & CLKSEL_ADJUST)
+   clksel += 8;
+   clksel = (clksel & 0xf) << CLKSEL_SHIFT;
+   iowrite32be(clksel, clk->reg);
+
+   return 0;
+}
+
+static u8 cmux_get_parent(struct clk_hw *hw)
+{
+   struct cmux_clk *clk = to_cmux_clk(hw);
+   u32 clksel;
+
+   clksel = ioread32be(clk->reg);
+   clksel = (clksel >> CLKSEL_SHIFT) & 0xf;
+   if (clk->flags & CLKSEL_ADJUST)
+   clksel -= 8;
+   clksel = (clksel >> 2) * clocks_per_pll + clksel % 4;
+
+   return clksel;
+}
+
+const struct clk_ops cmux_ops = {
+   .get_parent = cmux_get_parent,
+   .set_parent = cmux_set_parent,
+};
+
+static void __init core_mux_init(struct device_node *np)
+{
+   struct clk *clk;
+   struct clk_init_data init;
+   struct cmux_clk *cmux_clk;
+   struct device_node *node;
+   int rc, count, i;
+   u32 offset;
+   const char *clk_name;
+   const char **parent_names;
+
+   rc = of_property_read_u32(np, "reg", &offset);
+   if (rc) {
+   pr_err("%s: could not get reg property\n", np->name);
+   return;
+   }
+
+   /* get the input clock source count */
+   count = of_property_count_strings(np, "clock-names");
+   if (count < 0) {
+   pr_err("%s: get clock count error\n", np->name);
+   return;
+   }
+   parent_names = kzalloc((sizeof(char *) * count), GFP_KERNEL);
+   if (!parent_names) {
+   pr_err("%s: could not allocate parent_names\n", __func__);
+   return;
+   }
+
+   for (i = 0; i < count; i++)
+   parent_names[i] = of_clk_get_parent_name(np, i);
+
+   cmux_clk = kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);
+   if (!cmux_clk) {
+   pr_err("%s: could not allocate cmux_clk\n", __func__);
+   goto err_name;
+

[PATCH 2/2][RFC] clk: add PowerPC corenet clock support

2013-03-12 Thread Yuantian.Tang
From: Tang Yuantian 

This adds the clock driver support for Freescale E500MC, E5500,
E6500 series SoCs using common clock framework.

Signed-off-by: Tang Yuantian 
---
 arch/powerpc/platforms/Kconfig.cputype |1 +
 drivers/clk/Kconfig|7 +
 drivers/clk/Makefile   |1 +
 drivers/clk/clk-ppc-corenet.c  |  262 
 4 files changed, 271 insertions(+), 0 deletions(-)
 create mode 100644 drivers/clk/clk-ppc-corenet.c

diff --git a/arch/powerpc/platforms/Kconfig.cputype 
b/arch/powerpc/platforms/Kconfig.cputype
index 72afd28..dc3a56b 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -159,6 +159,7 @@ config E500
 config PPC_E500MC
bool "e500mc Support"
select PPC_FPU
+   select COMMON_CLK
depends on E500
help
  This must be enabled for running on e500mc (and derivatives
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index a47e6ee..ecb663d 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -63,6 +63,13 @@ config CLK_TWL6040
  McPDM. McPDM module is using the external bit clock on the McPDM bus
  as functional clock.
 
+config CLK_PPC_CORENET
+   bool "Clock driver for PowerPC corenet platforms"
+   depends on PPC_E500MC
+   ---help---
+  This adds the clock driver support for Freescale PowerPC corenet
+ platforms using common clock framework.
+
 endmenu
 
 source "drivers/clk/mvebu/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index ee90e87..9e7750c 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -22,6 +22,7 @@ obj-$(CONFIG_ARCH_U8500)  += ux500/
 obj-$(CONFIG_ARCH_VT8500)  += clk-vt8500.o
 obj-$(CONFIG_ARCH_SUNXI)   += clk-sunxi.o
 obj-$(CONFIG_ARCH_ZYNQ)+= clk-zynq.o
+obj-$(CONFIG_CLK_PPC_CORENET)  += clk-ppc-corenet.o
 
 # Chip specific
 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
new file mode 100644
index 000..a7bfb02
--- /dev/null
+++ b/drivers/clk/clk-ppc-corenet.c
@@ -0,0 +1,262 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct cmux_clk {
+   struct clk_hw   hw;
+   void __iomem*reg;
+};
+
+#define PLL_KILL   (1 << 31)
+#defineCLKSEL_SHIFT27
+
+#define to_cmux_clk(p) container_of(p, struct cmux_clk, hw)
+
+static const int idx_val[9] = {0, 1, 2, 4, 5, 6, 8, 9, 10};
+static const int val_idx[12] = {0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 8, 0};
+
+static void __iomem *base;
+
+static int cmux_set_parent(struct clk_hw *hw, u8 idx)
+{
+   struct cmux_clk *clk = to_cmux_clk(hw);
+   u32 clksel;
+
+   clksel = (idx_val[idx] & 0xf) << CLKSEL_SHIFT;
+   iowrite32be(clksel, clk->reg);
+
+   return 0;
+}
+
+static u8 cmux_get_parent(struct clk_hw *hw)
+{
+   struct cmux_clk *clk = to_cmux_clk(hw);
+   u32 val;
+
+   val = ioread32be(clk->reg);
+   val = (val >> CLKSEL_SHIFT) & 0xf;
+
+   return val_idx[val];
+}
+
+const struct clk_ops cmux_ops = {
+   .get_parent = cmux_get_parent,
+   .set_parent = cmux_set_parent,
+};
+
+static void __init core_mux_init(struct device_node *np)
+{
+   struct clk *clk;
+   struct clk_init_data init;
+   struct cmux_clk *cmux_clk;
+   int rc, count, i;
+   u32 offset;
+   const char *clk_name;
+   const char **parent_names;
+
+   rc = of_property_read_u32(np, "reg", &offset);
+   if (rc) {
+   pr_err("%s: could not get reg property\n", np->name);
+   return;
+   }
+
+   /* get the input clock source count */
+   count = of_property_count_strings(np, "clock-names");
+   if (count < 0) {
+   pr_err("%s: get clock count error\n", np->name);
+   return;
+   }
+   parent_names = kzalloc((sizeof(char *) * count), GFP_KERNEL);
+   if (!parent_names) {
+   pr_err("%s: could not allocate parent_names\n", __func__);
+   return;
+   }
+
+   for (i = 0; i < count; i++)
+   parent_names[i] = of_clk_get_parent_name(np, i);
+
+   cmux_clk = kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);
+   if (!cmux_clk) {
+   pr_err("%s: could not allocate cmux_clk\n", __func__);
+   goto err_name;
+   }
+   cmux_clk->reg = base + offset;
+
+   rc = of_property_read_string_index(np, "clock-output-names",
+   0, &clk_name);
+   if (rc) {
+   pr_err("%s: read clock names error\n", np->name);
+   goto err_clk;
+   }
+
+   init.name = clk_name;
+   init.ops = &cmux_ops;
+   init.flags = 0;
+   init.parent_names = parent_names;
+   init.num_parents = count;
+   cmux_clk->hw.init = &init;
+
+   clk = clk_register(NULL, &cm

[PATCH 1/2][RFC] PowerPC/85xx: Add clock nodes support

2013-03-12 Thread Yuantian.Tang
From: Tang Yuantian 

Signed-off-by: Tang Yuantian 
---
take p5020 for example.

 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |   44 ++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |2 +
 2 files changed, 45 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi 
b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
index 9ea77c3..2db0d3c 100644
--- a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
@@ -337,9 +337,51 @@
};
 
clockgen: global-utilities@e1000 {
-   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
+   compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0", 
"fixed-clock";
reg = <0xe1000 0x1000>;
clock-frequency = <0>;
+   clock-output-names = "sysclk";
+
+   #address-cells = <1>;
+   #size-cells = <0>;
+
+   pll1: pll1@800 {
+   #clock-cells = <1>;
+   reg = <0x800>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+   };
+
+   pll2: pll2@820 {
+   #clock-cells = <1>;
+   reg = <0x820>;
+   compatible = "fsl,core-pll-clock";
+   clocks = <&clockgen>;
+   clock-output-names = "pll2", "pll2-div2", "pll2-div4";
+   };
+
+   mux0: mux0@0 {
+   #clock-cells = <0>;
+   reg = <0x0>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll1 0>, <&pll1 1>, <&pll1 2>,
+<&pll2 0>, <&pll2 1>, <&pll2 2>;
+   clock-names = "pll1_0", "pll1_1", "pll1_2",
+   "pll2_0", "pll2_1", "pll2_2";
+   clock-output-names = "cmux0";
+   };
+
+   mux1: mux1@20 {
+   #clock-cells = <0>;
+   reg = <0x20>;
+   compatible = "fsl,core-mux-clock";
+   clocks = <&pll1 0>, <&pll1 1>, <&pll1 2>,
+<&pll2 0>, <&pll2 1>, <&pll2 2>;
+   clock-names = "pll1_0", "pll1_1", "pll1_2",
+   "pll2_0", "pll2_1", "pll2_2";
+   clock-output-names = "cmux1";
+   };
};
 
rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi 
b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
index 8df47fc..fe1a2e6 100644
--- a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
@@ -88,6 +88,7 @@
cpu0: PowerPC,e5500@0 {
device_type = "cpu";
reg = <0>;
+   clocks = <&mux0>;
next-level-cache = <&L2_0>;
L2_0: l2-cache {
next-level-cache = <&cpc>;
@@ -96,6 +97,7 @@
cpu1: PowerPC,e5500@1 {
device_type = "cpu";
reg = <1>;
+   clocks = <&mux1>;
next-level-cache = <&L2_1>;
L2_1: l2-cache {
next-level-cache = <&cpc>;
-- 
1.7.0.4


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH][V3] powerpc: remove the PPC_CLOCK dependency

2013-03-12 Thread Yuantian.Tang
From: Tang Yuantian 

Config FSL_SOC does not depend on PPC_CLOCK anymore since the following
commit got merged: 93abe8e (clk: add non CONFIG_HAVE_CLK routines)
Config CPM does not use PPC_CLOCK either currently. So remove them.

PPC_CLOCK also keeps Freescale PowerPC archtecture from supporting COMMON_CLK.

Signed-off-by: Tang Yuantian 
---
v3: modified the description
v2: correct the title

 arch/powerpc/Kconfig   |1 -
 arch/powerpc/platforms/Kconfig |1 -
 2 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 352f416..383485b 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -655,7 +655,6 @@ config SBUS
 config FSL_SOC
bool
select HAVE_CAN_FLEXCAN if NET && CAN
-   select PPC_CLOCK
 
 config FSL_PCI
bool
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index e7a896a..aba81cd 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -343,7 +343,6 @@ config FSL_ULI1575
 
 config CPM
bool
-   select PPC_CLOCK
 
 config OF_RTC
bool
-- 
1.7.0.4


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH][V2] powerpc: remove the PPC_CLOCK dependency

2013-03-06 Thread Yuantian.Tang
From: Tang Yuantian 

config FSL_SOC and CPM do not really depend on PPC_CLOCK. So remove it.
PPC_CLOCK also keeps powerpc archtecture from supporting COMMON_CLK.

Signed-off-by: Tang Yuantian 
---
v2: correct the title

 arch/powerpc/Kconfig   |1 -
 arch/powerpc/platforms/Kconfig |1 -
 2 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 352f416..383485b 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -655,7 +655,6 @@ config SBUS
 config FSL_SOC
bool
select HAVE_CAN_FLEXCAN if NET && CAN
-   select PPC_CLOCK
 
 config FSL_PCI
bool
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index e7a896a..aba81cd 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -343,7 +343,6 @@ config FSL_ULI1575
 
 config CPM
bool
-   select PPC_CLOCK
 
 config OF_RTC
bool
-- 
1.7.0.4


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH][RFC, upstream] powerpc: remove the PPC_CLOCK dependency

2013-03-06 Thread Yuantian.Tang
From: Tang Yuantian 

config FSL_SOC and CPM do not really depend on PPC_CLOCK. So remove it.
PPC_CLOCK also keeps powerpc archtecture from supporting COMMON_CLK.

Signed-off-by: Tang Yuantian 
---
 arch/powerpc/Kconfig   |1 -
 arch/powerpc/platforms/Kconfig |1 -
 2 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 352f416..383485b 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -655,7 +655,6 @@ config SBUS
 config FSL_SOC
bool
select HAVE_CAN_FLEXCAN if NET && CAN
-   select PPC_CLOCK
 
 config FSL_PCI
bool
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index e7a896a..aba81cd 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -343,7 +343,6 @@ config FSL_ULI1575
 
 config CPM
bool
-   select PPC_CLOCK
 
 config OF_RTC
bool
-- 
1.7.0.4


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH] powerpc/85xx: Add p2020rdb-pc dts support

2012-01-09 Thread Yuantian.Tang
From: Tang Yuantian 

Signed-off-by: Prabhakar Kushwaha 
Signed-off-by: Poonam Aggrwal 
Signed-off-by: Tang Yuantian 
---
 arch/powerpc/boot/dts/p2020rdb-pc.dts|   96 +
 arch/powerpc/boot/dts/p2020rdb-pc.dtsi   |  241 ++
 arch/powerpc/boot/dts/p2020rdb-pc_36b.dts|   96 +
 arch/powerpc/boot/dts/p2020rdb-pc_camp_core0.dts |   90 
 arch/powerpc/boot/dts/p2020rdb-pc_camp_core1.dts |  152 ++
 5 files changed, 675 insertions(+), 0 deletions(-)
 create mode 100644 arch/powerpc/boot/dts/p2020rdb-pc.dts
 create mode 100644 arch/powerpc/boot/dts/p2020rdb-pc.dtsi
 create mode 100644 arch/powerpc/boot/dts/p2020rdb-pc_36b.dts
 create mode 100644 arch/powerpc/boot/dts/p2020rdb-pc_camp_core0.dts
 create mode 100644 arch/powerpc/boot/dts/p2020rdb-pc_camp_core1.dts

diff --git a/arch/powerpc/boot/dts/p2020rdb-pc.dts 
b/arch/powerpc/boot/dts/p2020rdb-pc.dts
new file mode 100644
index 000..852e5b2
--- /dev/null
+++ b/arch/powerpc/boot/dts/p2020rdb-pc.dts
@@ -0,0 +1,96 @@
+/*
+ * P2020 RDB-PC 32Bit Physical Address Map Device Tree Source
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of Freescale Semiconductor nor the
+ *   names of its contributors may be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/include/ "fsl/p2020si-pre.dtsi"
+
+/ {
+   model = "fsl,P2020RDB";
+   compatible = "fsl,P2020RDB-PC";
+
+   memory {
+   device_type = "memory";
+   };
+
+   lbc: localbus@ffe05000 {
+   reg = <0 0xffe05000 0 0x1000>;
+
+   /* NOR and NAND Flashes */
+   ranges = <0x0 0x0 0x0 0xef00 0x0100
+ 0x1 0x0 0x0 0xff80 0x0004
+ 0x2 0x0 0x0 0xffb0 0x0002
+ 0x3 0x0 0x0 0xffa0 0x0002>;
+   };
+
+   soc: soc@ffe0 {
+   ranges = <0x0 0x0 0xffe0 0x10>;
+   };
+
+   pci0: pcie@ffe08000 {
+   reg = <0 0xffe08000 0 0x1000>;
+   status = "disabled";
+   };
+
+   pci1: pcie@ffe09000 {
+   reg = <0 0xffe09000 0 0x1000>;
+   ranges = <0x200 0x0 0xe000 0 0xa000 0x0 0x2000
+ 0x100 0x0 0x 0 0xffc1 0x0 0x1>;
+   pcie@0 {
+   ranges = <0x200 0x0 0xe000
+ 0x200 0x0 0xe000
+ 0x0 0x2000
+
+ 0x100 0x0 0x0
+ 0x100 0x0 0x0
+ 0x0 0x10>;
+   };
+   };
+
+   pci2: pcie@ffe0a000 {
+   reg = <0 0xffe0a000 0 0x1000>;
+   ranges = <0x200 0x0 0xe000 0 0x8000 0x0 0x2000
+ 0x100 0x0 0x 0 0xffc0 0x0 0x1>;
+   pcie@0 {
+   ranges = <0x200 0x0 0xe000
+ 0x200 0x0 0xe000
+ 0x0 0x2000
+
+ 0x100 0x0 0x0
+ 0x100 0x0 0x0
+ 0x0 0x10>;
+   };
+   };
+};
+
+/include/ "p2020rdb-p