From c36efa0f96040e1276c6195eced7f8cc0da1be08 Mon Sep 17 00:00:00 2001
From: Hauke Petersen <hauke.petersen@fu-berlin.de>
Date: Sat, 20 Feb 2016 13:17:11 +0100
Subject: [PATCH] cpu/atmega2560: adapted GPIO driver

---
 cpu/atmega2560/periph/gpio.c | 51 +++++++++++++-----------------------
 1 file changed, 18 insertions(+), 33 deletions(-)

diff --git a/cpu/atmega2560/periph/gpio.c b/cpu/atmega2560/periph/gpio.c
index 3cea0534ad..7ce2ec7661 100644
--- a/cpu/atmega2560/periph/gpio.c
+++ b/cpu/atmega2560/periph/gpio.c
@@ -86,53 +86,38 @@ static inline uint16_t _pin_addr(gpio_t pin)
     return (_port_addr(pin) - 0x02);
 }
 
-int gpio_init(gpio_t pin, gpio_dir_t dir, gpio_pp_t pullup)
+int gpio_init(gpio_t pin, gpio_mode_t mode)
 {
-    int res;
-
-    if (dir == GPIO_DIR_OUT) {
-        _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin));
-        res = bit_is_set(_SFR_MEM8(_ddr_addr(pin)), _pin_num(pin));
-    }
-    else {
-        _SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin));
-        res = bit_is_clear(_SFR_MEM8(_ddr_addr(pin)), _pin_num(pin));
-
-        if (res == 0) {
+    switch (mode) {
+        case GPIO_OUT:
+            _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin));
+            break;
+        case GPIO_IN:
+            _SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin));
+            _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin));
+            break;
+        case GPIO_IN_PU:
+            _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin));
+            break;
+        default:
             return -1;
-        }
-
-        switch (pullup) {
-            case GPIO_NOPULL:
-                _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin));
-                res = bit_is_clear(_SFR_MEM8(_port_addr(pin)), _pin_num(pin));
-                break;
-            case GPIO_PULLUP:
-                _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin));
-                res = bit_is_set(_SFR_MEM8(_port_addr(pin)), _pin_num(pin));
-                break;
-            case GPIO_PULLDOWN:
-                /* Not supported by atmega2560 */
-                return -1;
-        }
     }
 
-    return (res == 0) ? -1 : 0;
+    return 0;
 }
 
-int gpio_init_int(gpio_t pin, gpio_pp_t pullup, gpio_flank_t flank,
+int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
                   gpio_cb_t cb, void *arg)
 {
     uint8_t pin_num = _pin_num(pin);
 
     if ((_port_num(pin) == PORT_D && pin_num > 3)
-         || (_port_num(pin) == PORT_E && pin_num < 4)) {
+         || (_port_num(pin) == PORT_E && pin_num < 4)
+         || ((mode != GPIO_IN) && (mode != GPIO_IN_PU))) {
         return -1;
     }
 
-    if (gpio_init(pin, GPIO_DIR_IN, pullup) < 0) {
-        return -1;
-    }
+    gpio_init(pin, mode);
 
     /* clear global interrupt flag */
     cli();
-- 
GitLab