summaryrefslogtreecommitdiff
path: root/sys/src/9/imx8/gpc.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-06-12 21:16:47 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-06-12 21:16:47 +0000
commitd35e41424ca244b2fbcce9e1cac9651cbd062741 (patch)
tree2d9ff0272366467b40378b53497e23fc074226ef /sys/src/9/imx8/gpc.c
parent771a93f3b7e8f18ac81c9c54152605214f82ff10 (diff)
imx8: make gpc functionality available with a powerup() function
Diffstat (limited to 'sys/src/9/imx8/gpc.c')
-rw-r--r--sys/src/9/imx8/gpc.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/sys/src/9/imx8/gpc.c b/sys/src/9/imx8/gpc.c
new file mode 100644
index 000000000..5b3ef8794
--- /dev/null
+++ b/sys/src/9/imx8/gpc.c
@@ -0,0 +1,63 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+
+/* power gating controller registers */
+enum {
+ GPC_PGC_CPU_0_1_MAPPING = 0xEC/4,
+ GPC_PGC_PU_PGC_SW_PUP_REQ = 0xF8/4,
+ GPC_PGC_PU_PGC_SW_PDN_REQ = 0x104/4,
+};
+
+static u32int *gpc = (u32int*)(VIRTIO + 0x3A0000);
+
+typedef struct Tab Tab;
+struct Tab {
+ char *dom;
+ uint mask;
+};
+
+static Tab pu_tab[] = {
+ "mipi", 1<<0,
+ "pcie", 1<<1,
+ "usb_otg1", 1<<2,
+ "usb_otg2", 1<<3,
+ "ddr1", 1<<5,
+ "ddr2", 1<<6,
+ "gpu", 1<<7,
+ "vpu", 1<<8,
+ "hdmi", 1<<9,
+ "disp", 1<<10,
+ "mipi_csi1", 1<<11,
+ "mipi_csi2", 1<<12,
+ "pcie2", 1<<13,
+
+ nil,
+};
+
+void
+powerup(char *dom)
+{
+ Tab *t;
+
+ if(dom == nil)
+ return;
+
+ for(t = pu_tab; t->dom != nil; t++)
+ if(cistrcmp(dom, t->dom) == 0)
+ goto Found;
+
+ panic("powerup: domain %s not defined", dom);
+
+Found:
+ gpc[GPC_PGC_CPU_0_1_MAPPING] = 0x0000FFFF;
+
+ gpc[GPC_PGC_PU_PGC_SW_PUP_REQ] |= t->mask;
+ while(gpc[GPC_PGC_PU_PGC_SW_PUP_REQ] & t->mask)
+ ;
+
+ gpc[GPC_PGC_CPU_0_1_MAPPING] = 0;
+}