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
