]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - arch/avr32/cpu/portmux-gpio.c
2 * Copyright (C) 2008 Atmel Corporation
4 * SPDX-License-Identifier: GPL-2.0+
9 #include <asm/arch/hardware.h>
10 #include <asm/arch/gpio.h>
12 void portmux_select_peripheral(void *port
, unsigned long pin_mask
,
13 enum portmux_function func
, unsigned long flags
)
15 /* Both pull-up and pull-down set means buskeeper */
16 if (flags
& PORTMUX_PULL_DOWN
)
17 gpio_writel(port
, PDERS
, pin_mask
);
19 gpio_writel(port
, PDERC
, pin_mask
);
20 if (flags
& PORTMUX_PULL_UP
)
21 gpio_writel(port
, PUERS
, pin_mask
);
23 gpio_writel(port
, PUERC
, pin_mask
);
25 /* Select drive strength */
26 if (flags
& PORTMUX_DRIVE_LOW
)
27 gpio_writel(port
, ODCR0S
, pin_mask
);
29 gpio_writel(port
, ODCR0C
, pin_mask
);
30 if (flags
& PORTMUX_DRIVE_HIGH
)
31 gpio_writel(port
, ODCR1S
, pin_mask
);
33 gpio_writel(port
, ODCR1C
, pin_mask
);
36 if (func
& PORTMUX_FUNC_B
)
37 gpio_writel(port
, PMR0S
, pin_mask
);
39 gpio_writel(port
, PMR0C
, pin_mask
);
40 if (func
& PORTMUX_FUNC_C
)
41 gpio_writel(port
, PMR1S
, pin_mask
);
43 gpio_writel(port
, PMR1C
, pin_mask
);
45 /* Disable GPIO (i.e. enable peripheral) */
46 gpio_writel(port
, GPERC
, pin_mask
);
49 void portmux_select_gpio(void *port
, unsigned long pin_mask
,
52 /* Both pull-up and pull-down set means buskeeper */
53 if (flags
& PORTMUX_PULL_DOWN
)
54 gpio_writel(port
, PDERS
, pin_mask
);
56 gpio_writel(port
, PDERC
, pin_mask
);
57 if (flags
& PORTMUX_PULL_UP
)
58 gpio_writel(port
, PUERS
, pin_mask
);
60 gpio_writel(port
, PUERC
, pin_mask
);
62 /* Enable open-drain mode if requested */
63 if (flags
& PORTMUX_OPEN_DRAIN
)
64 gpio_writel(port
, ODMERS
, pin_mask
);
66 gpio_writel(port
, ODMERC
, pin_mask
);
68 /* Select drive strength */
69 if (flags
& PORTMUX_DRIVE_LOW
)
70 gpio_writel(port
, ODCR0S
, pin_mask
);
72 gpio_writel(port
, ODCR0C
, pin_mask
);
73 if (flags
& PORTMUX_DRIVE_HIGH
)
74 gpio_writel(port
, ODCR1S
, pin_mask
);
76 gpio_writel(port
, ODCR1C
, pin_mask
);
78 /* Select direction and initial pin state */
79 if (flags
& PORTMUX_DIR_OUTPUT
) {
80 if (flags
& PORTMUX_INIT_HIGH
)
81 gpio_writel(port
, OVRS
, pin_mask
);
83 gpio_writel(port
, OVRC
, pin_mask
);
84 gpio_writel(port
, ODERS
, pin_mask
);
86 gpio_writel(port
, ODERC
, pin_mask
);
90 gpio_writel(port
, GPERS
, pin_mask
);