Example #1
0
void gpio_select_periph_B(unsigned int pin, int use_pullup)
{
	void *base = gpio_pin_to_addr(pin);
	uint32_t mask = 1 << (pin & 0x1f);

	if (!base)
		panic("Invalid GPIO pin %u\n", pin);

	pio2_writel(base, BSR, mask);
	pio2_writel(base, PDR, mask);
	if (use_pullup)
		pio2_writel(base, PUER, mask);
	else
		pio2_writel(base, PUDR, mask);
}
Example #2
0
void gpio_free(enum device_id gpio_devid, unsigned int start,
	       unsigned int nr_pins)
{
	const struct device *gpio;
	struct pio_state *state;
	u32 mask;

	state = &pio_state[gpio_devid - DEVICE_PIOA];
	gpio = state->dev;
	mask = ((1 << nr_pins) - 1) << start;

	pio2_writel(gpio, ODR, mask);
	pio2_writel(gpio, PER, mask);

	state->alloc_mask &= ~mask;
	put_device(gpio);
}
Example #3
0
int gpio_set_func(enum device_id gpio_devid, unsigned int start,
		  unsigned int nr_pins, enum gpio_func func)
{
	const struct device *gpio;
	struct pio_state *state;
	u32 mask;

	state = &pio_state[gpio_devid - DEVICE_PIOA];

	gpio = get_device(gpio_devid);
	if (!gpio)
		return -EBUSY;

	state->dev = gpio;
	mask = ((1 << nr_pins) - 1) << start;

	if (mask & state->alloc_mask) {
		put_device(gpio);
		return -EBUSY;
	}
	state->alloc_mask |= mask;

	switch (func) {
	case GPIO_FUNC_GPIO:
		/* TODO */
		return -EINVAL;
	case GPIO_FUNC_A:
		pio2_writel(gpio, ASR, mask);
		pio2_writel(gpio, PDR, mask);
		pio2_writel(gpio, PUDR, mask);
		break;
	case GPIO_FUNC_B:
		pio2_writel(gpio, BSR, mask);
		pio2_writel(gpio, PDR, mask);
		pio2_writel(gpio, PUDR, mask);
		break;
	}

	return 0;
}