64 lines
1 KiB
C
64 lines
1 KiB
C
#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;
|
|
}
|