-static void rb91x_change_gpo(u32 clear, u32 set)
-{
- void __iomem *base = ath79_gpio_base;
- static unsigned on = 0xE002800;
- static unsigned off = 0x0000C008;
- static unsigned oe = 0;
- static DEFINE_SPINLOCK(lock);
- unsigned long flags;
-
- spin_lock_irqsave(&lock, flags);
-
- on = (on | set) & ~clear;
- off = (off | clear) & ~set;
-
- if (!oe)
- oe = __raw_readl(base + AR71XX_GPIO_REG_OE);
-
- if (on & RB91X_LATCH_ENABLE) {
- u32 t;
-
- t = oe & __raw_readl(base + AR71XX_GPIO_REG_OE);
- t &= ~(on | off);
- __raw_writel(t, base + AR71XX_GPIO_REG_OE);
- __raw_writel(off, base + AR71XX_GPIO_REG_CLEAR);
- __raw_writel(on, base + AR71XX_GPIO_REG_SET);
- } else if (clear & RB91X_LATCH_ENABLE) {
- oe = __raw_readl(base + AR71XX_GPIO_REG_OE);
- __raw_writel(RB91X_LATCH_ENABLE,
- base + AR71XX_GPIO_REG_CLEAR);
- /* flush write */
- __raw_readl(base + AR71XX_GPIO_REG_CLEAR);
- }
-
- spin_unlock_irqrestore(&lock, flags);
-}
-
-static inline void rb91x_latch_enable(void)
-{
- rb91x_change_gpo(RB91X_LATCH_ENABLE, 0);
-}
-
-static inline void rb91x_latch_disable(void)
-{
- rb91x_change_gpo(0, RB91X_LATCH_ENABLE);
-}
-
-static void rb91x_nand_write(const u8 *buf, unsigned len)