Hello.

Cyril Chemparathy wrote:

This patch adds support for the tnetv107x gpio controller.

Key differences between davinci and tnetv107x controllers:
 - register map - davinci's controller is organized into banks of 32 gpios,
   tnetv107x has a single space with arrays of registers for in, out,
   direction, etc.
 - davinci's controller has separate set/clear registers for output, tnetv107x
   has a single direct mapped register.

This patch does not yet add gpio irq support on this controller.

Signed-off-by: Cyril Chemparathy <[email protected]>
[...]
diff --git a/arch/arm/mach-davinci/include/mach/gpio.h 
b/arch/arm/mach-davinci/include/mach/gpio.h
index 504cc18..7475138 100644
--- a/arch/arm/mach-davinci/include/mach/gpio.h
+++ b/arch/arm/mach-davinci/include/mach/gpio.h
[...]
@@ -97,14 +98,30 @@ static inline void gpio_set_value(unsigned gpio, int value)
 {
        if (__builtin_constant_p(value) && gpio < davinci_soc_info.gpio_num) {
                struct davinci_gpio_controller *ctlr;
-               u32                             mask;
+               u32                             mask, data;
+               unsigned long                   flags;
ctlr = __gpio_to_controller(gpio);
                mask = __gpio_mask(gpio);
-               if (value)
-                       __raw_writel(mask, ctlr->set_data);
-               else
-                       __raw_writel(mask, ctlr->clr_data);
+
+               if (ctlr->set_data != ctlr->clr_data) {
+                       /* traditional set/clear registers */
+                       if (value)
+                               __raw_writel(mask, ctlr->set_data);
+                       else
+                               __raw_writel(mask, ctlr->clr_data);
+               } else {
+                       /* tnetv107x style single out register */
+                       spin_lock_irqsave(&ctlr->lock, flags);
+                       data = __raw_readl(ctlr->set_data);
+                       if (value)
+                               data |= mask;
+                       else
+                               data &= ~mask;
+                       __raw_writel(data, ctlr->set_data);
+                       spin_unlock_irqrestore(&ctlr->lock, flags);
+               }

 Sigh, now this has become too bulky for an inline function...

WBR, Sergei


_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to