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];
}