uboot/arch/avr32/cpu/portmux-pio.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2006, 2008 Atmel Corporation
   3 *
   4 * SPDX-License-Identifier:     GPL-2.0+
   5 */
   6#include <common.h>
   7
   8#include <asm/io.h>
   9#include <asm/arch/hardware.h>
  10#include <asm/arch/gpio.h>
  11
  12void portmux_select_peripheral(void *port, unsigned long pin_mask,
  13                enum portmux_function func, unsigned long flags)
  14{
  15        if (flags & PORTMUX_PULL_UP)
  16                pio_writel(port, PUER, pin_mask);
  17        else
  18                pio_writel(port, PUDR, pin_mask);
  19
  20        switch (func) {
  21        case PORTMUX_FUNC_A:
  22                pio_writel(port, ASR, pin_mask);
  23                break;
  24        case PORTMUX_FUNC_B:
  25                pio_writel(port, BSR, pin_mask);
  26                break;
  27        }
  28
  29        pio_writel(port, PDR, pin_mask);
  30}
  31
  32void portmux_select_gpio(void *port, unsigned long pin_mask,
  33                unsigned long flags)
  34{
  35        if (flags & PORTMUX_PULL_UP)
  36                pio_writel(port, PUER, pin_mask);
  37        else
  38                pio_writel(port, PUDR, pin_mask);
  39
  40        if (flags & PORTMUX_OPEN_DRAIN)
  41                pio_writel(port, MDER, pin_mask);
  42        else
  43                pio_writel(port, MDDR, pin_mask);
  44
  45        if (flags & PORTMUX_DIR_OUTPUT) {
  46                if (flags & PORTMUX_INIT_HIGH)
  47                        pio_writel(port, SODR, pin_mask);
  48                else
  49                        pio_writel(port, CODR, pin_mask);
  50                pio_writel(port, OER, pin_mask);
  51        } else {
  52                pio_writel(port, ODR, pin_mask);
  53        }
  54
  55        pio_writel(port, PER, pin_mask);
  56}
  57
  58void pio_set_output_value(unsigned int pin, int value)
  59{
  60        void *port = pio_pin_to_port(pin);
  61
  62        if (!port)
  63                panic("Invalid GPIO pin %u\n", pin);
  64
  65        __pio_set_output_value(port, pin & 0x1f, value);
  66}
  67
  68int pio_get_input_value(unsigned int pin)
  69{
  70        void *port = pio_pin_to_port(pin);
  71
  72        if (!port)
  73                panic("Invalid GPIO pin %u\n", pin);
  74
  75        return __pio_get_input_value(port, pin & 0x1f);
  76}
  77