diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-06-12 21:16:47 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-06-12 21:16:47 +0000 |
commit | d35e41424ca244b2fbcce9e1cac9651cbd062741 (patch) | |
tree | 2d9ff0272366467b40378b53497e23fc074226ef /sys/src/9/imx8/gpc.c | |
parent | 771a93f3b7e8f18ac81c9c54152605214f82ff10 (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.c | 63 |
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; +} |