|
@@ -83,6 +83,7 @@ struct gpio_bank {
|
|
|
|
|
|
#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
|
|
#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
|
|
#define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
|
|
#define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
|
|
|
|
+#define GPIO_MOD_CTRL_BIT BIT(0)
|
|
|
|
|
|
static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
|
|
static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
|
|
{
|
|
{
|
|
@@ -577,22 +578,18 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
|
|
__raw_writel(__raw_readl(reg) | (1 << offset), reg);
|
|
__raw_writel(__raw_readl(reg) | (1 << offset), reg);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
- if (!cpu_class_is_omap1()) {
|
|
|
|
- if (!bank->mod_usage) {
|
|
|
|
- void __iomem *reg = bank->base;
|
|
|
|
- u32 ctrl;
|
|
|
|
-
|
|
|
|
- if (cpu_is_omap24xx() || cpu_is_omap34xx())
|
|
|
|
- reg += OMAP24XX_GPIO_CTRL;
|
|
|
|
- else if (cpu_is_omap44xx())
|
|
|
|
- reg += OMAP4_GPIO_CTRL;
|
|
|
|
- ctrl = __raw_readl(reg);
|
|
|
|
- /* Module is enabled, clocks are not gated */
|
|
|
|
- ctrl &= 0xFFFFFFFE;
|
|
|
|
- __raw_writel(ctrl, reg);
|
|
|
|
- }
|
|
|
|
- bank->mod_usage |= 1 << offset;
|
|
|
|
|
|
+ if (bank->regs->ctrl && !bank->mod_usage) {
|
|
|
|
+ void __iomem *reg = bank->base + bank->regs->ctrl;
|
|
|
|
+ u32 ctrl;
|
|
|
|
+
|
|
|
|
+ ctrl = __raw_readl(reg);
|
|
|
|
+ /* Module is enabled, clocks are not gated */
|
|
|
|
+ ctrl &= ~GPIO_MOD_CTRL_BIT;
|
|
|
|
+ __raw_writel(ctrl, reg);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ bank->mod_usage |= 1 << offset;
|
|
|
|
+
|
|
spin_unlock_irqrestore(&bank->lock, flags);
|
|
spin_unlock_irqrestore(&bank->lock, flags);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -625,22 +622,18 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
|
|
__raw_writel(1 << offset, reg);
|
|
__raw_writel(1 << offset, reg);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
- if (!cpu_class_is_omap1()) {
|
|
|
|
- bank->mod_usage &= ~(1 << offset);
|
|
|
|
- if (!bank->mod_usage) {
|
|
|
|
- void __iomem *reg = bank->base;
|
|
|
|
- u32 ctrl;
|
|
|
|
-
|
|
|
|
- if (cpu_is_omap24xx() || cpu_is_omap34xx())
|
|
|
|
- reg += OMAP24XX_GPIO_CTRL;
|
|
|
|
- else if (cpu_is_omap44xx())
|
|
|
|
- reg += OMAP4_GPIO_CTRL;
|
|
|
|
- ctrl = __raw_readl(reg);
|
|
|
|
- /* Module is disabled, clocks are gated */
|
|
|
|
- ctrl |= 1;
|
|
|
|
- __raw_writel(ctrl, reg);
|
|
|
|
- }
|
|
|
|
|
|
+ bank->mod_usage &= ~(1 << offset);
|
|
|
|
+
|
|
|
|
+ if (bank->regs->ctrl && !bank->mod_usage) {
|
|
|
|
+ void __iomem *reg = bank->base + bank->regs->ctrl;
|
|
|
|
+ u32 ctrl;
|
|
|
|
+
|
|
|
|
+ ctrl = __raw_readl(reg);
|
|
|
|
+ /* Module is disabled, clocks are gated */
|
|
|
|
+ ctrl |= GPIO_MOD_CTRL_BIT;
|
|
|
|
+ __raw_writel(ctrl, reg);
|
|
}
|
|
}
|
|
|
|
+
|
|
_reset_gpio(bank, bank->chip.base + offset);
|
|
_reset_gpio(bank, bank->chip.base + offset);
|
|
spin_unlock_irqrestore(&bank->lock, flags);
|
|
spin_unlock_irqrestore(&bank->lock, flags);
|
|
}
|
|
}
|