void gpio_direction_input(unsigned id) { struct stmp3xxx_pinmux_bank *b; int num = STMP3XXX_PINID_TO_PINNUM(id); BUG_ON(id > STMP3xxx_GPIO_TOTAL); b = stmp_pinmux_banks(STMP3XXX_PINID_TO_BANK(id)); spin_lock(&b->lock); __raw_writel(1 << num, b->hw_gpio_doe + HW_STMP3xxx_CLR); spin_unlock(&b->lock); }
void gpio_set_value(unsigned id, int value) { struct stmp3xxx_pinmux_bank *b; int num = STMP3XXX_PINID_TO_PINNUM(id); BUG_ON(id > STMP3xxx_GPIO_TOTAL); b = stmp_pinmux_banks(STMP3XXX_PINID_TO_BANK(id)); spin_lock(&b->lock); __raw_writel(1 << num, value ? b->hw_gpio_set : b->hw_gpio_clr); spin_unlock(&b->lock); }
int gpio_get_value(unsigned id) { struct stmp3xxx_pinmux_bank *b; int v; int num = STMP3XXX_PINID_TO_PINNUM(id); BUG_ON(id > STMP3xxx_GPIO_TOTAL); b = stmp_pinmux_banks(STMP3XXX_PINID_TO_BANK(id)); spin_lock(&b->lock); v = (__raw_readl(b->hw_gpio_read) & (1 << num)) >> num; spin_unlock(&b->lock); return v; }
static inline struct stmp3xxx_pinmux_bank * stmp3xxx_pinmux_bank(unsigned id, unsigned *bank, unsigned *pin) { unsigned b, p; b = STMP3XXX_PINID_TO_BANK(id); p = STMP3XXX_PINID_TO_PINNUM(id); BUG_ON(b >= NR_BANKS); if (bank) *bank = b; if (pin) *pin = p; return &pinmux_banks[b]; }