mirror of https://github.com/OpenIPC/firmware.git
72 lines
1.8 KiB
Diff
72 lines
1.8 KiB
Diff
diff -drupN a/tools/pm-sleep/gpio.c b/tools/pm-sleep/gpio.c
|
|
--- a/tools/pm-sleep/gpio.c 1970-01-01 03:00:00.000000000 +0300
|
|
+++ b/tools/pm-sleep/gpio.c 2022-06-09 05:02:37.000000000 +0300
|
|
@@ -0,0 +1,67 @@
|
|
+#include "common.h"
|
|
+#include "gpio.h"
|
|
+void set_gpio_func(int gpio, int type) {
|
|
+ int i;
|
|
+ int port = gpio >> 5;
|
|
+ int pin = gpio & 0x1f;
|
|
+ int addr = GPIO_BASE + PXINT + port * 0x100;
|
|
+ int b;
|
|
+ for(i = 0;i < 4;i++){
|
|
+ b = REG32(addr + 0x10 * i);
|
|
+ b &= ~(1 << pin);
|
|
+ b |= (((type >> (3 - i)) & 1) << pin);
|
|
+ REG32(addr + 0x10 * i) = b;
|
|
+ }
|
|
+}
|
|
+
|
|
+int get_gpio_func(int gpio) {
|
|
+ int i;
|
|
+ int ret = 0;
|
|
+ int port = gpio >> 5;
|
|
+ int pin = gpio & 0x1f;
|
|
+ int addr = GPIO_BASE + PXINT + port * 0x100;
|
|
+ for(i = 0;i < 4;i++){
|
|
+ ret |= ((REG32(addr + 0x10 * i) >> pin) & 1) << (3 - i);
|
|
+ }
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+
|
|
+#if 0
|
|
+#define readl(addr) ({*(volatile unsigned int *)(addr);})
|
|
+
|
|
+#define writel(v,addr) do{*(volatile unsigned int *)(addr) = (v);}while(0)
|
|
+
|
|
+
|
|
+int gpio_get_value(unsigned int gpio)
|
|
+{
|
|
+ unsigned int port = gpio / 32;
|
|
+ unsigned int pin = gpio % 32;
|
|
+ unsigned int base = GPIO_BASE + 0x100 * port;
|
|
+ return !!(readl(base + PXPIN) & (1 << pin));
|
|
+}
|
|
+void gpio_direction_output(unsigned int gpio, int value)
|
|
+{
|
|
+ unsigned int port = gpio / 32;
|
|
+ unsigned int pin = gpio % 32;
|
|
+ unsigned int base = GPIO_BASE + 0x100 * port;
|
|
+ writel(1 << pin, base + PXINTC);
|
|
+ writel(1 << pin, base + PXMSKS);
|
|
+ writel(1 << pin, base + PXPAT1C);
|
|
+ if (value)
|
|
+ writel(1 << pin, base + PXPAT0S);
|
|
+ else
|
|
+ writel(1 << pin, base + PXPAT0C);
|
|
+
|
|
+}
|
|
+void gpio_direction_input(unsigned int gpio)
|
|
+{
|
|
+ unsigned int port = gpio / 32;
|
|
+ unsigned int pin = gpio % 32;
|
|
+ unsigned int base = GPIO_BASE + 0x100 * port;
|
|
+
|
|
+ writel(1 << pin, base + PXINTC);
|
|
+ writel(1 << pin, base + PXMSKS);
|
|
+ writel(1 << pin, base + PXPAT1S);
|
|
+}
|
|
+#endif
|