Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-24 Thread Laurent Pinchart
Hi Kumar,

On Friday 18 July 2008, Kumar Gala wrote:
 On Jul 18, 2008, at 10:30 AM, Jochen Friedrich wrote:
  On Jun 18, 2008, at 12:08 PM, Laurent Pinchart wrote:
 
  +#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
  +
  +struct cpm2_ioports {
  + u32 dir, par, sor, odr, dat;
  + u32 res[3];
  +};
  +
 
  is this really common for both CPM2 and 8xx?  if so why the name?
 
  It is common to CPM2 and Port E of CPM1.
 
 but ports a-d are different on cpm1?  I guess I'd like to see both  
 patches to understand the commonality and differences.

As Jorgen mentionned, both patches are still in patchwork:

http://patchwork.ozlabs.org/linuxppc/patch?id=19045
http://patchwork.ozlabs.org/linuxppc/patch?id=19386

Would it be possible for you to review them in time for 2.6.27 ?

-- 
Laurent Pinchart
CSE Semaphore Belgium

Chaussee de Bruxelles, 732A
B-1410 Waterloo
Belgium

T +32 (2) 387 42 59
F +32 (2) 387 42 75


signature.asc
Description: This is a digitally signed message part.
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-24 Thread Kumar Gala


On Jul 24, 2008, at 9:46 AM, Laurent Pinchart wrote:


Hi Kumar,

On Friday 18 July 2008, Kumar Gala wrote:

On Jul 18, 2008, at 10:30 AM, Jochen Friedrich wrote:

On Jun 18, 2008, at 12:08 PM, Laurent Pinchart wrote:


+#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
+
+struct cpm2_ioports {
+   u32 dir, par, sor, odr, dat;
+   u32 res[3];
+};
+


is this really common for both CPM2 and 8xx?  if so why the name?


It is common to CPM2 and Port E of CPM1.


but ports a-d are different on cpm1?  I guess I'd like to see both
patches to understand the commonality and differences.


As Jorgen mentionned, both patches are still in patchwork:

http://patchwork.ozlabs.org/linuxppc/patch?id=19045
http://patchwork.ozlabs.org/linuxppc/patch?id=19386

Would it be possible for you to review them in time for 2.6.27 ?


Yes.  Can you resend the first patch and add some details in the  
commit message about the fact we can also use this code for 8xx/CPM1  
port E.


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


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Laurent Pinchart
On Friday 27 June 2008, Jochen Friedrich wrote:
 Hi Laurent,
 
  Is there any pending issue or can this be applied to powerpc-next ?
 
 Looks OK to me.
 
  Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
  Cc: Jochen Friedrich [EMAIL PROTECTED]
 Acked-by: Jochen Friedrich [EMAIL PROTECTED]

Any news on this patch ? Kumar, could you apply it to your tree for 2.6.27 ?

Best regards,

-- 
Laurent Pinchart
CSE Semaphore Belgium

Chaussee de Bruxelles, 732A
B-1410 Waterloo
Belgium

T +32 (2) 387 42 59
F +32 (2) 387 42 75


signature.asc
Description: This is a digitally signed message part.
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Kumar Gala


On Jul 18, 2008, at 9:38 AM, Laurent Pinchart wrote:


On Friday 27 June 2008, Jochen Friedrich wrote:

Hi Laurent,


Is there any pending issue or can this be applied to powerpc-next ?


Looks OK to me.


Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
Cc: Jochen Friedrich [EMAIL PROTECTED]

Acked-by: Jochen Friedrich [EMAIL PROTECTED]


Any news on this patch ? Kumar, could you apply it to your tree for  
2.6.27 ?


Can you repost it.  I not sure what patch 2/2 was and if I've already  
dealt with it.


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


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Laurent Pinchart
On Friday 18 July 2008, Kumar Gala wrote:
 
 On Jul 18, 2008, at 9:38 AM, Laurent Pinchart wrote:
 
  On Friday 27 June 2008, Jochen Friedrich wrote:
  Hi Laurent,
 
  Is there any pending issue or can this be applied to powerpc-next ?
 
  Looks OK to me.
 
  Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
  Cc: Jochen Friedrich [EMAIL PROTECTED]
  Acked-by: Jochen Friedrich [EMAIL PROTECTED]
 
  Any news on this patch ? Kumar, could you apply it to your tree for  
  2.6.27 ?
 
 Can you repost it.  I not sure what patch 2/2 was and if I've already  
 dealt with it.

2/2 was [PATCH2/2] [POWERPC] CPM1: implement GPIO LIB API on CPM1 Freescale 
SoC. posted by Jochen Friedrich. You haven't dealt with it yet as far as I 
know, but it would be up to Jochen to resubmit.

The PATCHv3 1/2 patch can be considered as-is, as it doesn't depend on 2/2. 
Should I resubmit a PATCHv4 that just changes the subject line ?

-- 
Laurent Pinchart
CSE Semaphore Belgium

Chaussee de Bruxelles, 732A
B-1410 Waterloo
Belgium

T +32 (2) 387 42 59
F +32 (2) 387 42 75


signature.asc
Description: This is a digitally signed message part.
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Kumar Gala


On Jul 18, 2008, at 10:07 AM, Laurent Pinchart wrote:


On Friday 18 July 2008, Kumar Gala wrote:


On Jul 18, 2008, at 9:38 AM, Laurent Pinchart wrote:


On Friday 27 June 2008, Jochen Friedrich wrote:

Hi Laurent,

Is there any pending issue or can this be applied to powerpc- 
next ?


Looks OK to me.


Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
Cc: Jochen Friedrich [EMAIL PROTECTED]

Acked-by: Jochen Friedrich [EMAIL PROTECTED]


Any news on this patch ? Kumar, could you apply it to your tree for
2.6.27 ?


Can you repost it.  I not sure what patch 2/2 was and if I've already
dealt with it.


2/2 was [PATCH2/2] [POWERPC] CPM1: implement GPIO LIB API on CPM1  
Freescale SoC. posted by Jochen Friedrich. You haven't dealt with  
it yet as far as I know, but it would be up to Jochen to resubmit.


Since it sounds like CPM1 and CPM2 gpio are different I'd like a new  
patch.  I'll send comments on v3.


The PATCHv3 1/2 patch can be considered as-is, as it doesn't  
depend on 2/2. Should I resubmit a PATCHv4 that just changes the  
subject line ?


You can generate a v4 w/my desired changes.

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


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Kumar Gala


On Jun 18, 2008, at 12:08 PM, Laurent Pinchart wrote:


+#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
+
+struct cpm2_ioports {
+   u32 dir, par, sor, odr, dat;
+   u32 res[3];
+};
+


is this really common for both CPM2 and 8xx?  if so why the name?

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


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Jochen Friedrich
Hi Kumar,

 On Jun 18, 2008, at 12:08 PM, Laurent Pinchart wrote:
 
 +#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
 +
 +struct cpm2_ioports {
 +u32 dir, par, sor, odr, dat;
 +u32 res[3];
 +};
 +
 
 is this really common for both CPM2 and 8xx?  if so why the name?

It is common to CPM2 and Port E of CPM1.

Thanks,
Jochen
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Kumar Gala


On Jul 18, 2008, at 10:30 AM, Jochen Friedrich wrote:


Hi Kumar,


On Jun 18, 2008, at 12:08 PM, Laurent Pinchart wrote:


+#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
+
+struct cpm2_ioports {
+   u32 dir, par, sor, odr, dat;
+   u32 res[3];
+};
+


is this really common for both CPM2 and 8xx?  if so why the name?


It is common to CPM2 and Port E of CPM1.


but ports a-d are different on cpm1?  I guess I'd like to see both  
patches to understand the commonality and differences.


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


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-07-18 Thread Jochen Friedrich
Hi Kumar,

 but ports a-d are different on cpm1?  I guess I'd like to see both  
 patches to understand the commonality and differences.

Yes. Both patches are still in patchwork:

http://patchwork.ozlabs.org/linuxppc/patch?id=19045
http://patchwork.ozlabs.org/linuxppc/patch?id=19386

Thanks,
Jochen
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-06-27 Thread Jochen Friedrich
Hi Laurent,

 Is there any pending issue or can this be applied to powerpc-next ?

Looks OK to me.

 Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
 Cc: Jochen Friedrich [EMAIL PROTECTED]
Acked-by: Jochen Friedrich [EMAIL PROTECTED]

Thanks,
Jochen
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


Re: [PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-06-26 Thread Laurent Pinchart
On Wednesday 18 June 2008 19:08, Laurent Pinchart wrote:
 Based on earlier work by Jochen Friedrich.
 
 This patch implement GPIO LIB support for the CPM2 GPIOs.

Is there any pending issue or can this be applied to powerpc-next ?

 Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
 Cc: Jochen Friedrich [EMAIL PROTECTED]
 ---
  arch/powerpc/platforms/Kconfig   |2 +
  arch/powerpc/sysdev/cpm2.c   |   11 
  arch/powerpc/sysdev/cpm_common.c |  123 
 ++
  include/asm-powerpc/cpm.h|3 +
  4 files changed, 139 insertions(+), 0 deletions(-)
 
 diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
 index 87454c5..7e67e26 100644
 --- a/arch/powerpc/platforms/Kconfig
 +++ b/arch/powerpc/platforms/Kconfig
 @@ -280,6 +280,8 @@ config CPM2
   depends on MPC85xx || 8260
   select CPM
   select PPC_LIB_RHEAP
 + select GENERIC_GPIO
 + select HAVE_GPIO_LIB
   help
 The CPM2 (Communications Processor Module) is a coprocessor on
 embedded CPUs made by Freescale.  Selecting this option means that
 diff --git a/arch/powerpc/sysdev/cpm2.c b/arch/powerpc/sysdev/cpm2.c
 index 5a6c5df..9311778 100644
 --- a/arch/powerpc/sysdev/cpm2.c
 +++ b/arch/powerpc/sysdev/cpm2.c
 @@ -377,3 +377,14 @@ void cpm2_set_pin(int port, int pin, int flags)
   else
   clrbits32(iop[port].odr, pin);
  }
 +
 +static int cpm_init_par_io(void)
 +{
 + struct device_node *np;
 +
 + for_each_compatible_node(np, NULL, fsl,cpm2-pario-bank)
 + cpm2_gpiochip_add32(np);
 + return 0;
 +}
 +arch_initcall(cpm_init_par_io);
 +
 diff --git a/arch/powerpc/sysdev/cpm_common.c 
 b/arch/powerpc/sysdev/cpm_common.c
 index cb7df2d..b957a48 100644
 --- a/arch/powerpc/sysdev/cpm_common.c
 +++ b/arch/powerpc/sysdev/cpm_common.c
 @@ -19,6 +19,8 @@
  
  #include linux/init.h
  #include linux/of_device.h
 +#include linux/spinlock.h
 +#include linux/of.h
  
  #include asm/udbg.h
  #include asm/io.h
 @@ -28,6 +30,10 @@
  
  #include mm/mmu_decl.h
  
 +#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
 +#include linux/of_gpio.h
 +#endif
 +
  #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
  static u32 __iomem *cpm_udbg_txdesc =
   (u32 __iomem __force *)CONFIG_PPC_EARLY_DEBUG_CPM_ADDR;
 @@ -198,3 +204,120 @@ dma_addr_t cpm_muram_dma(void __iomem *addr)
   return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
  }
  EXPORT_SYMBOL(cpm_muram_dma);
 +
 +#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
 +
 +struct cpm2_ioports {
 + u32 dir, par, sor, odr, dat;
 + u32 res[3];
 +};
 +
 +struct cpm2_gpio32_chip {
 + struct of_mm_gpio_chip mm_gc;
 + spinlock_t lock;
 +
 + /* shadowed data register to clear/set bits safely */
 + u32 cpdata;
 +};
 +
 +static inline struct cpm2_gpio32_chip *
 +to_cpm2_gpio32_chip(struct of_mm_gpio_chip *mm_gc)
 +{
 + return container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc);
 +}
 +
 +static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
 +{
 + struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc);
 + struct cpm2_ioports __iomem *iop = mm_gc-regs;
 +
 + cpm2_gc-cpdata = in_be32(iop-dat);
 +}
 +
 +static int cpm2_gpio32_get(struct gpio_chip *gc, unsigned int gpio)
 +{
 + struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 + struct cpm2_ioports __iomem *iop = mm_gc-regs;
 + u32 pin_mask;
 +
 + pin_mask = 1  (31 - gpio);
 +
 + return !!(in_be32(iop-dat)  pin_mask);
 +}
 +
 +static void cpm2_gpio32_set(struct gpio_chip *gc, unsigned int gpio, int 
 value)
 +{
 + struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 + struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc);
 + struct cpm2_ioports __iomem *iop = mm_gc-regs;
 + unsigned long flags;
 + u32 pin_mask = 1  (31 - gpio);
 +
 + spin_lock_irqsave(cpm2_gc-lock, flags);
 +
 + if (value)
 + cpm2_gc-cpdata |= pin_mask;
 + else
 + cpm2_gc-cpdata = ~pin_mask;
 +
 + out_be32(iop-dat, cpm2_gc-cpdata);
 +
 + spin_unlock_irqrestore(cpm2_gc-lock, flags);
 +}
 +
 +static int cpm2_gpio32_dir_out(struct gpio_chip *gc, unsigned int gpio, int 
 val)
 +{
 + struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 + struct cpm2_ioports __iomem *iop = mm_gc-regs;
 + u32 pin_mask;
 +
 + pin_mask = 1  (31 - gpio);
 +
 + setbits32(iop-dir, pin_mask);
 +
 + cpm2_gpio32_set(gc, gpio, val);
 +
 + return 0;
 +}
 +
 +static int cpm2_gpio32_dir_in(struct gpio_chip *gc, unsigned int gpio)
 +{
 + struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 + struct cpm2_ioports __iomem *iop = mm_gc-regs;
 + u32 pin_mask;
 +
 + pin_mask = 1  (31 - gpio);
 +
 + clrbits32(iop-dir, pin_mask);
 +
 + return 0;
 +}
 +
 +int cpm2_gpiochip_add32(struct device_node *np)
 +{
 + struct cpm2_gpio32_chip *cpm2_gc;
 + struct of_mm_gpio_chip *mm_gc;
 + struct of_gpio_chip *of_gc;

[PATCHv3 1/2] [POWERPC] CPM2: Implement GPIO LIB API on CPM2 Freescale SoC.

2008-06-18 Thread Laurent Pinchart
Based on earlier work by Jochen Friedrich.

This patch implement GPIO LIB support for the CPM2 GPIOs.

Signed-off-by: Laurent Pinchart [EMAIL PROTECTED]
Cc: Jochen Friedrich [EMAIL PROTECTED]
---
 arch/powerpc/platforms/Kconfig   |2 +
 arch/powerpc/sysdev/cpm2.c   |   11 
 arch/powerpc/sysdev/cpm_common.c |  123 ++
 include/asm-powerpc/cpm.h|3 +
 4 files changed, 139 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index 87454c5..7e67e26 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -280,6 +280,8 @@ config CPM2
depends on MPC85xx || 8260
select CPM
select PPC_LIB_RHEAP
+   select GENERIC_GPIO
+   select HAVE_GPIO_LIB
help
  The CPM2 (Communications Processor Module) is a coprocessor on
  embedded CPUs made by Freescale.  Selecting this option means that
diff --git a/arch/powerpc/sysdev/cpm2.c b/arch/powerpc/sysdev/cpm2.c
index 5a6c5df..9311778 100644
--- a/arch/powerpc/sysdev/cpm2.c
+++ b/arch/powerpc/sysdev/cpm2.c
@@ -377,3 +377,14 @@ void cpm2_set_pin(int port, int pin, int flags)
else
clrbits32(iop[port].odr, pin);
 }
+
+static int cpm_init_par_io(void)
+{
+   struct device_node *np;
+
+   for_each_compatible_node(np, NULL, fsl,cpm2-pario-bank)
+   cpm2_gpiochip_add32(np);
+   return 0;
+}
+arch_initcall(cpm_init_par_io);
+
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c
index cb7df2d..b957a48 100644
--- a/arch/powerpc/sysdev/cpm_common.c
+++ b/arch/powerpc/sysdev/cpm_common.c
@@ -19,6 +19,8 @@
 
 #include linux/init.h
 #include linux/of_device.h
+#include linux/spinlock.h
+#include linux/of.h
 
 #include asm/udbg.h
 #include asm/io.h
@@ -28,6 +30,10 @@
 
 #include mm/mmu_decl.h
 
+#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
+#include linux/of_gpio.h
+#endif
+
 #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
 static u32 __iomem *cpm_udbg_txdesc =
(u32 __iomem __force *)CONFIG_PPC_EARLY_DEBUG_CPM_ADDR;
@@ -198,3 +204,120 @@ dma_addr_t cpm_muram_dma(void __iomem *addr)
return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
 }
 EXPORT_SYMBOL(cpm_muram_dma);
+
+#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
+
+struct cpm2_ioports {
+   u32 dir, par, sor, odr, dat;
+   u32 res[3];
+};
+
+struct cpm2_gpio32_chip {
+   struct of_mm_gpio_chip mm_gc;
+   spinlock_t lock;
+
+   /* shadowed data register to clear/set bits safely */
+   u32 cpdata;
+};
+
+static inline struct cpm2_gpio32_chip *
+to_cpm2_gpio32_chip(struct of_mm_gpio_chip *mm_gc)
+{
+   return container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc);
+}
+
+static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
+{
+   struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc);
+   struct cpm2_ioports __iomem *iop = mm_gc-regs;
+
+   cpm2_gc-cpdata = in_be32(iop-dat);
+}
+
+static int cpm2_gpio32_get(struct gpio_chip *gc, unsigned int gpio)
+{
+   struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
+   struct cpm2_ioports __iomem *iop = mm_gc-regs;
+   u32 pin_mask;
+
+   pin_mask = 1  (31 - gpio);
+
+   return !!(in_be32(iop-dat)  pin_mask);
+}
+
+static void cpm2_gpio32_set(struct gpio_chip *gc, unsigned int gpio, int value)
+{
+   struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
+   struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc);
+   struct cpm2_ioports __iomem *iop = mm_gc-regs;
+   unsigned long flags;
+   u32 pin_mask = 1  (31 - gpio);
+
+   spin_lock_irqsave(cpm2_gc-lock, flags);
+
+   if (value)
+   cpm2_gc-cpdata |= pin_mask;
+   else
+   cpm2_gc-cpdata = ~pin_mask;
+
+   out_be32(iop-dat, cpm2_gc-cpdata);
+
+   spin_unlock_irqrestore(cpm2_gc-lock, flags);
+}
+
+static int cpm2_gpio32_dir_out(struct gpio_chip *gc, unsigned int gpio, int 
val)
+{
+   struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
+   struct cpm2_ioports __iomem *iop = mm_gc-regs;
+   u32 pin_mask;
+
+   pin_mask = 1  (31 - gpio);
+
+   setbits32(iop-dir, pin_mask);
+
+   cpm2_gpio32_set(gc, gpio, val);
+
+   return 0;
+}
+
+static int cpm2_gpio32_dir_in(struct gpio_chip *gc, unsigned int gpio)
+{
+   struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
+   struct cpm2_ioports __iomem *iop = mm_gc-regs;
+   u32 pin_mask;
+
+   pin_mask = 1  (31 - gpio);
+
+   clrbits32(iop-dir, pin_mask);
+
+   return 0;
+}
+
+int cpm2_gpiochip_add32(struct device_node *np)
+{
+   struct cpm2_gpio32_chip *cpm2_gc;
+   struct of_mm_gpio_chip *mm_gc;
+   struct of_gpio_chip *of_gc;
+   struct gpio_chip *gc;
+
+   cpm2_gc = kzalloc(sizeof(*cpm2_gc), GFP_KERNEL);
+   if (!cpm2_gc)
+   return -ENOMEM;
+
+