revert between 56095 -> 55830 in arch
[AROS.git] / arch / arm-native / soc / broadcom / 2708 / gpio / gpio_init.c
blob91a933bca00e9b858661760cd89e5df363a9e930
1 /*
2 Copyright � 2015, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
8 #include <aros/debug.h>
9 #include <aros/macros.h>
10 #include <aros/symbolsets.h>
11 #include <aros/libcall.h>
12 #include <proto/kernel.h>
13 #include <proto/exec.h>
14 #include <proto/gpio.h>
16 #include "gpio_private.h"
18 APTR KernelBase __attribute__((used)) = NULL;
20 static int gpio_init(struct GPIOBase *GPIOBase)
22 int retval = FALSE;
24 D(bug("[GPIO] %s()\n", __PRETTY_FUNCTION__));
26 KernelBase = OpenResource("kernel.resource");
28 if ((GPIOBase->gpio_periiobase = KrnGetSystemAttr(KATTR_PeripheralBase)) != 0)
30 InitSemaphore(&GPIOBase->gpio_Sem);
32 D(bug("[GPIO] %s: Initialised Semaphore @ 0x%p\n", __PRETTY_FUNCTION__, &GPIOBase->gpio_Sem));
34 retval = TRUE;
36 return retval;
39 AROS_LH2(void, GPIOSet,
40 AROS_LHA( unsigned int, pin, D0),
41 AROS_LHA( unsigned int, val, D1),
42 struct GPIOBase *, GPIOBase, 1, Gpio)
44 AROS_LIBFUNC_INIT
46 volatile unsigned int reg;
47 unsigned int bit;
49 D(bug("[GPIO] %s(#%d,%d)\n", __PRETTY_FUNCTION__, pin, val));
51 if (GPIOBase->gpio_periiobase && (pin <= 53))
53 reg = val? GPSET0: GPCLR0;
54 reg += (pin >> 5) << 2; /* (pin / 32) << 2 */
56 bit = 1 << (pin & 0x1F);
58 ObtainSemaphore(&GPIOBase->gpio_Sem);
60 *(volatile unsigned int *)reg = AROS_LONG2LE(bit);
62 ReleaseSemaphore(&GPIOBase->gpio_Sem);
65 AROS_LIBFUNC_EXIT
68 AROS_LH2(void, GPIOSetFunc,
69 AROS_LHA( unsigned int, pin, D0),
70 AROS_LHA( unsigned int, func, D1),
71 struct GPIOBase *, GPIOBase, 2, Gpio)
73 AROS_LIBFUNC_INIT
75 volatile unsigned int reg;
77 D(bug("[GPIO] %s(#%d,%d)\n", __PRETTY_FUNCTION__, pin, func));
79 if (GPIOBase->gpio_periiobase && (pin <= 53))
81 reg = GPFSEL0;
82 while (pin >= 10) {
83 pin -= 10;
84 reg += 4;
87 pin += (pin << 1);
88 func <<= pin;
90 ObtainSemaphore(&GPIOBase->gpio_Sem);
92 *(volatile unsigned int *)reg = AROS_LONG2LE(func);
94 ReleaseSemaphore(&GPIOBase->gpio_Sem);
97 AROS_LIBFUNC_EXIT
100 ADD2INITLIB(gpio_init, 0)