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);