Beispiel #1
0
static void sc_wait_for_interrupt(unsigned int pwrlevel, bool dpidle)
{
	u32 ckdiv1;

	/* for shutdown mode issue-2 */
	ckdiv1 = sc_read(TOP_CKDIV1);
	if (!((ckdiv1 >= 0x14 && ckdiv1 < 0x18) || ckdiv1 >= 0x1d))	/* !(1/5 || 1/6) */
		sc_write(TOP_CKDIV1, 0x0b);	/* (1/4) */
	sc_write_sync();

	if (pwrlevel == 0) {
		wfi_with_sync();
	} else {
		if (dpidle)	/* debug help */
			aee_rr_rec_shutdown_mode(1);
		else
			aee_rr_rec_shutdown_mode(2);

		if (!cpu_power_down(pwrlevel == 1 ? DORMANT_MODE : SHUTDOWN_MODE))
			wfi_with_sync();

		aee_rr_rec_shutdown_mode(0);

		cpu_check_dormant_abort();
	}

	/* for shutdown mode issue-2 */
	sc_write(TOP_CKDIV1, 0x00);	/* (1/1) */
	sc_write(TOP_CKDIV1, ckdiv1);
	sc_write_sync();
}
Beispiel #2
0
void sc_unrequest_mdbus_clk(sc_mdbus_user_t user)
{
	unsigned long flags;

	if (user < SC_MDBUS_USER_SLEEP || user > SC_MDBUS_USER_AUDIO)
		return;

	spin_lock_irqsave(&sc_lock, flags);
	sc_mdbus_user &= ~(1U << user);

	if (!(sc_mdbus_user & SC_MDBUS_USER_MASK)) {	/* no users */
		sc_write(SC_CLK_CON, sc_read(SC_CLK_CON) & ~SC_CLK_CON_CLKREQ2MD);
		sc_write_sync();
	}
	//sc_xinfo("user %d unrequests MD bus clock (0x%x)\n", user, sc_mdbus_user);
	spin_unlock_irqrestore(&sc_lock, flags);
}
Beispiel #3
0
static ssize_t dcload_read_buffer(uint32 hnd, int8 *buf, size_t cnt)
{
  const ssize_t frag = FRAG;
  int oldirq = 0;
  ssize_t ret = 0;
  
  while (cnt) {
    ssize_t err, n;

    n = cnt;
    if (n > frag) {
      n = frag;
    }
    cnt -= n;

    STOPIRQ;
/*    vid_border_color(0xff,0,0); */
    err = sc_read(hnd, buf, n);
/*    vid_border_color(0,0,0); */
    STARTIRQ;

    if (err < 0) {
/*      vid_border_color(0,0xff,0);*/
      if (!ret) {
	ret = -1;
      }
      break;
    } else if (!err) {
      break;
    } else {
      buf += err;
      ret += err;
/*       if (err != n) { */
/* 	vid_border_color(0,0,0xff); */
/* 	break; */
/*       } */
    }
/*     if (cnt && thd_enabled) { */
/*       thd_pass(); */
/*     } */
  }

  return ret;
}
Beispiel #4
0
Datei: nliter.c Projekt: rolk/ug
static INT NLSmootherInit (NP_BASE *theNP, INT argc , char **argv)
{
  NP_NL_SMOOTHER *np;
  INT i;

  np = (NP_NL_SMOOTHER *) theNP;

  if (sc_read(np->damp,NP_FMT(np),np->c,"damp",argc,argv))
    for (i=0; i<MAX_VEC_COMP; i++)
      np->damp[i] = 1.0;

  np->c = ReadArgvVecDesc(theNP->mg,"c",argc,argv);
  np->L = ReadArgvMatDesc(theNP->mg,"L",argc,argv);
    #ifdef ModelP
  if (ReadArgvOption("M",argc,argv))
    np->cons_mode = MAT_CONS;
  else if (ReadArgvOption("D",argc,argv))
    np->cons_mode = MAT_DIAG_CONS;
  else
    np->cons_mode = MAT_MASTER_CONS;
        #endif
  return (NPNLIterInit(&np->iter,argc,argv));
}
Beispiel #5
0
Datei: newton.c Projekt: rolk/ug
static INT NewtonInit (NP_BASE *base, INT argc, char **argv)
{
  NP_NEWTON *newton;                                            /* object pointer						*/
  INT i;

  newton = (NP_NEWTON *) base;

  /* read  data descs */
  newton->J = ReadArgvMatDesc(base->mg,"J",argc,argv);
  newton->d = ReadArgvVecDesc(base->mg,"d",argc,argv);
  newton->v = ReadArgvVecDesc(base->mg,"v",argc,argv);
  newton->s = ReadArgvVecDesc(base->mg,"s",argc,argv);
  newton->dold = ReadArgvVecDesc(base->mg,"dold",argc,argv);
  newton->dsave = ReadArgvVecDesc(base->mg,"dsave",argc,argv);

  /* read other numprocs */
  newton->trans = (NP_TRANSFER *) ReadArgvNumProc(base->mg,"T",TRANSFER_CLASS_NAME,
                                                  argc,argv);
  if (newton->trans == NULL) {
    PrintErrorMessage('E',"NewtonInit","cannot read transfer num proc");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  newton->solve = (NP_LINEAR_SOLVER *) ReadArgvNumProc(base->mg,"S",
                                                       LINEAR_SOLVER_CLASS_NAME,argc,argv);
  if (newton->solve == NULL) {
    PrintErrorMessage('E',"NewtonInit","cannot read solve num proc");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  /* set configuration parameters */
  if (ReadArgvDOUBLE("rhoreass",&(newton->rhoReass),argc,argv))
    newton->rhoReass = 0.8;
  if ((newton->rhoReass<0.0)||(newton->rhoReass>1.0)) {
    PrintErrorMessage('E',"NewtonInit","rhoreass must be in (0,1)");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  if (ReadArgvINT("lsteps",&(newton->maxLineSearch),argc,argv))
    newton->maxLineSearch=6;
  if ((newton->maxLineSearch<0)||(newton->maxLineSearch>=MAX_LINE_SEARCH)) {
    PrintErrorMessageF('E',"NewtonInit","maxLineSearch < %d",(int)MAX_LINE_SEARCH);
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  if (ReadArgvINT("linmode",&(newton->linearMode),argc,argv)) {
    newton->linearMode = 0;
  }
  if (ReadArgvINT("line",&(newton->lineSearch),argc,argv)) {
    newton->lineSearch = 0;
    newton->maxLineSearch=1;
  }
  if ((newton->lineSearch<0)||(newton->lineSearch>3)) {
    PrintErrorMessage('E',"NewtonInit","line = 0,1,2 or 3");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  if (ReadArgvINT("fi",&(newton->force_iteration),argc,argv)) {
    newton->force_iteration = 0;
  }
  if (ReadArgvINT("maxit",&(newton->maxit),argc,argv))
    newton->maxit = 50;
  if ((newton->maxit<0)||(newton->maxit>1000)) {
    PrintErrorMessage('E',"NewtonInit","maxit <= 1000");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  if (ReadArgvINT("linrate",&(newton->linearRate),argc,argv))
    newton->linearRate = 0;
  if ((newton->linearRate<0)||(newton->linearRate>2)) {
    PrintErrorMessage('E',"NewtonInit","linrate = 0,1 or 2");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  if (ReadArgvDOUBLE("lambda",&(newton->lambda),argc,argv))
    newton->lambda = 1.0;
  if ((newton->lambda<-2.0)||(newton->lambda>2.0)) {
    PrintErrorMessage('E',"NewtonInit","lambda must be in (-2,2)");
    REP_ERR_RETURN(NP_NOT_ACTIVE);
  }
  if (sc_read(newton->linMinRed,NP_FMT(newton),newton->s,"linminred",argc,argv))
    for (i=0; i<MAX_VEC_COMP; i++)
      newton->linMinRed[i] = 0.001;

  for (i=0; i<MAX_VEC_COMP; i++)
    if ((newton->linMinRed[i]<0.0)||(newton->linMinRed[i]>=1.0))
    {
      PrintErrorMessage('E',"NewtonInit","linminred must be in (0,1)");
      REP_ERR_RETURN(NP_NOT_ACTIVE);
    }

  if (sc_read(newton->scale,NP_FMT(newton),newton->s,"scale",argc,argv))
    for (i=0; i<MAX_VEC_COMP; i++)
      newton->scale[i] = 1.0;

  if (sc_read(newton->divFactor,NP_FMT(newton),newton->s,"divfac",argc,argv))
    for (i=0; i<MAX_VEC_COMP; i++)
      newton->divFactor[i] = 1e5;

  for (i=0; i<MAX_VEC_COMP; i++)
    if ((newton->divFactor[i]<=1.0))
    {
      PrintErrorMessage('E',"NewtonInit","divfac must be in )1,inf(");
      REP_ERR_RETURN(NP_NOT_ACTIVE);
    }
  /* set noLastDef option */
  newton->noLastDef = ReadArgvOption("noLastDef",argc,argv);

  /* set display option */
  newton->displayMode = ReadArgvDisplay(argc,argv);

  /* call general nls init */
  return (NPNLSolverInit(&(newton->nlsolver),argc,argv));
}
Beispiel #6
0
Datei: ewn.c Projekt: rolk/ug
static INT EWInit (NP_BASE *theNP, INT argc , char **argv)
{
  NP_EW_SOLVER *npew;
  NP_EWN *np;
  INT i,n;
  char *token,*names,buffer[128];

  npew = (NP_EW_SOLVER *) theNP;
  np = (NP_EWN *) theNP;

  np->reset = 1;
  np->LS = (NP_LINEAR_SOLVER *)ReadArgvNumProc(theNP->mg,"L",LINEAR_SOLVER_CLASS_NAME,argc,argv);
  if (np->LS == NULL) return(NP_NOT_ACTIVE);
  np->Transfer = (NP_TRANSFER *)ReadArgvNumProc(theNP->mg,"T",TRANSFER_CLASS_NAME,argc,argv);
  np->Project = (NP_PROJECT *)ReadArgvNumProc(theNP->mg,"P",PROJECT_CLASS_NAME,argc,argv);

  np->M = ReadArgvMatDesc(theNP->mg,"M",argc,argv);
  if (np->M==NULL) return(NP_NOT_ACTIVE);
  np->N = ReadArgvMatDesc(theNP->mg,"N",argc,argv);
  if (np->N==NULL || np->M==np->N) return(NP_NOT_ACTIVE);
  np->E = ReadArgvVecDesc(theNP->mg,"E",argc,argv);
  if (np->E==NULL) return(NP_NOT_ACTIVE);
  np->t = ReadArgvVecDesc(theNP->mg,"t",argc,argv);
  np->r = ReadArgvVecDesc(theNP->mg,"r",argc,argv);
  if (ReadArgvINT("m",&(np->maxiter),argc,argv))
    return(NP_NOT_ACTIVE);
  np->display = ReadArgvDisplay(argc,argv);
  np->baselevel = 0;

  n = 0;
  for (i=1; i<argc; i++)
    if (argv[i][0]=='e')
    {
      if (sscanf(argv[i],"e %s",buffer)!=1)
      {
        UserWrite("Missing symbol for eigenvector in init of ew\n");
        return(NP_NOT_ACTIVE);
      }
      names=argv[i];
      names++;
      while ((*names==' ')||(*names=='\t')) names++;
      token = strtok(names," ");
      npew->ev[n] = GetVecDataDescByName(npew->base.mg,token);
      if (npew->ev[n] == NULL) npew->ev[n] = CreateVecDescOfTemplate(npew->base.mg,token,NULL);
      if (npew->ev[n++] == NULL) return(NP_NOT_ACTIVE);
      token = strtok(NULL," ");
      if (token!=NULL)
        if (sscanf(token,"%d",&n) != 1)
        {
          n = 1;
          while (token!=NULL) {
            npew->ev[n] = GetVecDataDescByName(npew->base.mg,token);
            if (npew->ev[n] == NULL)
              npew->ev[n] = CreateVecDescOfTemplate(npew->base.mg,
                                                    token,NULL);
            if (npew->ev[n++] == NULL)
              return(NP_NOT_ACTIVE);
            token = strtok(NULL," ");
          }
        }
    }
  npew->nev = n;
  if (ReadArgvINT("c_n",&np->c_n,argc,argv)) np->c_n=npew->nev;
  if (np->c_n<1 || np->c_n>npew->nev) return(NP_NOT_ACTIVE);
  if (ReadArgvINT("c_d",&np->c_d,argc,argv)) np->c_d=6;
  if (np->c_d<1 || np->c_d>16) return(NP_NOT_ACTIVE);
  if (sc_read(npew->abslimit,NP_FMT(npew),npew->ev[0],"abslimit",argc,argv))
    for (i=0; i<MAX_VEC_COMP; i++)
      npew->abslimit[i] = ABS_LIMIT;
  if (sc_read(npew->reduction,NP_FMT(npew),npew->ev[0],"red",argc,argv))
    return(NP_ACTIVE);
  if (ReadArgvChar("type",buffer,argc,argv)) return(NP_ACTIVE);
  if (strcmp(buffer,"std")==0) np->type=MD_STD;
  else if (strcmp(buffer,"0")==0) np->type=MD_0;
  else if (strcmp(buffer,"id")==0) np->type=MD_ID;
  else np->type=MD_UNDEF;
  if (ReadArgvDOUBLE("scale",&np->scale,argc,argv)) np->scale=1.0;
  if (np->scale<=0.0) return(NP_ACTIVE);
  if (ReadArgvDOUBLE("smin",&np->shift_min,argc,argv)) np->shift_min=0.0;
  if (ReadArgvDOUBLE("smax",&np->shift_max,argc,argv)) np->shift_max=0.0;
  if (ReadArgvDOUBLE("imax",&np->imag_max,argc,argv)) np->imag_max=0.0;
  if (sc_read(np->weight,NP_FMT(npew),npew->ev[0],"weight",argc,argv))
    for (i=0; i<MAX_VEC_COMP; i++)
      np->weight[i]=1.0;
  if (ReadArgvChar("cmode",buffer,argc,argv)) np->conv_mode=0;
  else
  {
    if (strcmp(buffer,"val")==0) np->conv_mode=0;
    else if (strcmp(buffer,"vec")==0) np->conv_mode=1;
    else return(NP_ACTIVE);
  }
  if (ReadArgvChar("order",buffer,argc,argv)) np->order=ORDER_REAL_UP;
  else
  {
    if (strcmp(buffer,"real_up")==0) np->order=ORDER_REAL_UP;
    else if (strcmp(buffer,"real_down")==0) np->order=ORDER_REAL_DOWN;
    else if (strcmp(buffer,"abs_up")==0) np->order=ORDER_ABS_UP;
    else if (strcmp(buffer,"abs_down")==0) np->order=ORDER_ABS_DOWN;
    else return(NP_ACTIVE);
  }

  return(NP_EXECUTABLE);
}
Beispiel #7
0
void sc_mod_init(void)
{
	int r;
	unsigned long flags;

	cpu_dormant_init();

	spin_lock_irqsave(&sc_lock, flags);
#ifdef CONFIG_MTK_SC_DEBUG
	sc_pwake_en = 0;

	/* make AP control whole-chip sleep mode */
	sc_write(SC_MD_INTF_CON, 0x363f);
#else
	/* NOTE: reset MD_INTF_CON to 0 because it was modified in bootloader */
	sc_write(SC_MD_INTF_CON, 0);
#endif

	/* need to match with MD's RM_CLK_SETTLE setting */
	sc_write(SC_CLK_SETTLE, SC_CLK_SETTLE_TYPICAL);

	/* MTCMOS power-on sequence: CPUSYS(2) -> CPU(0) -> NEON(3) -> DBG(1) */
	sc_write(SC_PWR_CON8, (1 << 20) | (3 << 16) | (0 << 12) | (2 << 8));
	//sc_write(SC_PWR_CON9, 0x000f);
	sc_write(SC_PWR_CON9, 0);	/* for shutdown mode issue-1 */

	/* bit 17: DVFS_SEL[0] = 1 depends on AP_SRCLKEN (from 75E2) */
	/* bit 7: STANDBYWFI = STANDBYWFI_CPU & L2CC_IDLE & SCU_IDLE (from 75E2) */
	/* bit 4: enable SRCLKENAI pin */
	sc_write(SC_CLK_CON, (1U << 17) | (1U << 7) | (1U << 4));

	/* if bus clock source is from 3GPLL, make AP be able to control 3GPLL */
	if ((sc_read(TOP_CKMUXSEL) & 0x3) == 0x2)
		sc_write(SC_CLK_CON, sc_read(SC_CLK_CON) | SC_CLK_CON_3GPLLON);

	/* set peripheral control to handshake mode */
	sc_write(SC_PERI_CON, 0x0081);

	sc_write(SC_PAUSE, 0);

	/* mask all wakeup sources */
	sc_write(SC_WAKEUP_EVENT_MASK, 0xffffffff);

	/* for cleaning wakeup source status */
	sc_write(SC_DBG_WAKEUP, 0);

	sc_write(SC_TIMER_CON, SC_TIMER_CON_DBG | SC_TIMER_CON_EN);
	sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_CONWR |
	                       SC_TIMER_CMD_CNTWR | SC_TIMER_CMD_WR);
	while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

	sc_write(SC_ISR_MASK, 0x0007);
	sc_write(SC_ISR_STATUS, 0x0007);	/* write 1 clear */
	sc_write_sync();
	spin_unlock_irqrestore(&sc_lock, flags);

	r = request_irq(MT_SLEEP_IRQ_ID, sc_irq_handler, IRQF_TRIGGER_LOW,
	                SC_NAME, NULL);
	if (r) {
		sc_xerror("register SC IRQ failed (%d)\n", r);
		WARN_ON(1);
	}
}
Beispiel #8
0
/*
 * pwrlevel:
 *     0: CPU standby + AP sleep (SRCLKENA high) => legacy deep idle
 *     1: CPU dormant (L1/L2 sleep) + AP sleep (SRCLKENA high)
 *     2: CPU shutdown (L1/L2 power down) + AP sleep (SRCLKENA high)
 */
void sc_go_to_dpidle(unsigned int pwrlevel)
{
	u32 wakesrc, dvfscon, clksettle;
	unsigned long flags;
	struct mtk_irq_mask mask;

	wakesrc = WAKE_SRC_KP | WAKE_SRC_MSDC1 | WAKE_SRC_EINT | WAKE_SRC_RTC |
	          WAKE_SRC_CCIF_MD | WAKE_SRC_ACCDET | WAKE_SRC_GPT |
	          WAKE_SRC_AFE;

	spin_lock_irqsave(&sc_lock, flags);
	mt_irq_mask_all(&mask);

	mt_irq_unmask_for_sleep(MT_SLEEP_IRQ_ID);

	/* to workaround DVFS issue due to CKDIV1 failure */
	dvfscon = sc_read(SC_AP_DVFS_CON);
	//ckdiv1 = sc_read(TOP_CKDIV1);
	sc_write(SC_AP_DVFS_CON, dvfscon | 0x3);
	sc_write_sync();

	sc_set_apmcu_pwrctl(pwrlevel);

	/* keep SRCLKENA high (26M on) when in sleep mode */
	sc_write(SC_CLK_CON, sc_read(SC_CLK_CON) | SC_CLK_CON_SRCLKEN);

	/* set SYSCLK settle time to 1T 32K */
	clksettle = sc_read(SC_CLK_SETTLE);
	sc_write(SC_CLK_SETTLE, SC_CLK_SETTLE_26MON);

	sc_write(SC_PAUSE, 0xffffffff);

	/* unmask wakeup sources */
	sc_write(SC_WAKEUP_EVENT_MASK, ~wakesrc);

	/* unmask Pause Interrupt and Pause Abort */
	sc_write(SC_ISR_MASK, 0x0001);

	sc_write(SC_TIMER_CON, SC_TIMER_CON_EN);
	sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_CONWR |
	                       SC_TIMER_CMD_CNTWR | SC_TIMER_CMD_WR);
	while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

	if (sc_dpidle_can_enter()) {
		sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_PAUSE);
		while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

		sc_dpidle_before_wfi();

		sc_wait_for_interrupt(pwrlevel, true);

		sc_dpidle_after_wfi();
	}

	/* delay to make sure ISR_STATUS can be cleared later */
	udelay(100);

	/* for cleaning wakeup source status */
	sc_write(SC_DBG_WAKEUP, 0);

	sc_write(SC_TIMER_CON, SC_TIMER_CON_DBG | SC_TIMER_CON_EN);
	sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_CONWR |
	                       SC_TIMER_CMD_WR);
	while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

	sc_write(SC_ISR_MASK, 0x0007);
	sc_write(SC_ISR_STATUS, 0x0007);	/* write 1 clear */

	/* restore SC_CLK_SETTLE and SC_CLK_CON */
	sc_write(SC_CLK_SETTLE, clksettle);
	sc_write(SC_CLK_CON, sc_read(SC_CLK_CON) & ~SC_CLK_CON_SRCLKEN);
	sc_write_sync();

	/* to workaround DVFS issue due to CKDIV1 failure */
	//sc_write(TOP_CKDIV1, 0x00);
	//sc_write(TOP_CKDIV1, ckdiv1);
	sc_write(SC_AP_DVFS_CON, dvfscon);
	sc_write_sync();

	mt_irq_mask_restore(&mask);
	spin_unlock_irqrestore(&sc_lock, flags);
}
Beispiel #9
0
/*
 * pwrlevel:
 *     0: CPU standby + AP sleep => legacy sleep mode
 *     1: CPU dormant (L1/L2 sleep) + AP sleep
 *     2: CPU shutdown (L1/L2 power down) + AP sleep
 */
wake_reason_t sc_go_to_sleep(unsigned int pwrlevel)
{
	u32 wakesrc, dvfscon, sec = 0;
	int i, r;
	unsigned long flags;
	struct mtk_irq_mask mask;
	static wake_reason_t last_wr = WR_NONE;

	sc_info2("pwrlevel = %u\n", pwrlevel);

	if (sc_pwake_en)
		sec = sc_get_wake_period(!!(last_wr != WR_SLP_TMR));

	mtk_wdt_suspend();

	spin_lock_irqsave(&sc_lock, flags);
	wakesrc = sc_wake_src;
	for (i = 0; i < NUM_WAKE_SRC; i++) {
		if (wakesrc & (1U << i)) {
			r = sc_enable_wake_irq(sc_wake_irq[i]);
			if (r)
				wakesrc &= ~(1U << i);
		}
	}

	mt_irq_mask_all(&mask);

	mt_irq_unmask_for_sleep(MT_SLEEP_IRQ_ID);

	/* to workaround DVFS issue due to CKDIV1 failure */
	dvfscon = sc_read(SC_AP_DVFS_CON);
	//ckdiv1 = sc_read(TOP_CKDIV1);
	sc_write(SC_AP_DVFS_CON, dvfscon | 0x3);
	sc_write_sync();

	sc_set_apmcu_pwrctl(pwrlevel);

#ifdef CONFIG_MTK_SC_DEBUG
	/* bypass CSYSPWRUPREQ to avoid keeping SRCLKENA high */
	sc_write(SC_CLK_CON, sc_read(SC_CLK_CON) | SC_CLK_CON_BYPASSDBG);
	sc_write_sync();
#endif

	last_wr = sc_enter_pause_mode(pwrlevel, sec, wakesrc);

#ifdef CONFIG_MTK_SC_DEBUG
	/* restore SC_CLK_CON */
	sc_write(SC_CLK_CON, sc_read(SC_CLK_CON) & ~SC_CLK_CON_BYPASSDBG);
	sc_write_sync();
#endif

	/* to workaround DVFS issue due to CKDIV1 failure */
	//sc_write(TOP_CKDIV1, 0x00);
	//sc_write(TOP_CKDIV1, ckdiv1);
	sc_write(SC_AP_DVFS_CON, dvfscon);
	sc_write_sync();

	mt_irq_mask_restore(&mask);
	spin_unlock_irqrestore(&sc_lock, flags);

	mtk_wdt_resume();

	return last_wr;
}
Beispiel #10
0
static wake_reason_t sc_enter_pause_mode(unsigned int pwrlevel, u32 sec, u32 wakesrc)
{
	u32 pause, wakesta, isr;
	wake_reason_t wr;

	sc_info2("sec = %u, wakesrc = 0x%x\n", sec, wakesrc);

	if (sec > 0) {
		sc_write(SC_PAUSE, sec * 32768);

		/* unmask wakeup sources */
		sc_write(SC_WAKEUP_EVENT_MASK, ~wakesrc);

		/* unmask Pause Interrupt, Pause Abort and Timer Timeout */
		sc_write(SC_ISR_MASK, 0);

		sc_write(SC_TIMER_CON, SC_TIMER_CON_DOWN | SC_TIMER_CON_EN);
	} else {
		sc_write(SC_PAUSE, 0xffffffff);

		/* unmask wakeup sources */
		sc_write(SC_WAKEUP_EVENT_MASK, ~wakesrc);

		/* unmask Pause Interrupt and Pause Abort */
		sc_write(SC_ISR_MASK, 0x0001);

		sc_write(SC_TIMER_CON, SC_TIMER_CON_EN);
	}

	sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_CONWR |
	                       SC_TIMER_CMD_CNTWR | SC_TIMER_CMD_WR);
	while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

	sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_PAUSE);
	while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

	sc_wait_for_interrupt(pwrlevel, false);

	wakesta = sc_read(SC_WAKEUP_SRC);
	isr = sc_read(SC_ISR_STATUS);
	pause = sc_read(SC_FINAL_PAUSE);

	/* delay to make sure ISR_STATUS can be cleared later */
	udelay(100);

	/* for cleaning wakeup source status */
	sc_write(SC_DBG_WAKEUP, 0);

	sc_write(SC_TIMER_CON, SC_TIMER_CON_DBG | SC_TIMER_CON_EN);
	sc_write(SC_TIMER_CMD, SC_TIMER_CMD_KEY | SC_TIMER_CMD_CONWR |
	                       SC_TIMER_CMD_WR);
	while (!(sc_read(SC_TIMER_STA) & SC_TIMER_STA_CMDCPL));

	sc_write(SC_ISR_MASK, 0x0007);
	sc_write(SC_ISR_STATUS, 0x0007);	/* write 1 clear */
	sc_write_sync();

	if (isr == 0x0001) {	/* Timer Timeout */
		wr = WR_SLP_TMR;
		sc_info2("wake up by SLP_TMR (0x%x)(0x%x)(%u)\n", wakesta, isr, pause);
	} else {
		wr = WR_WAKE_SRC;
		sc_output_wake_reason(wakesrc, wakesta, isr, pause);
	}

	return wr;
}
Beispiel #11
0
static UWORD crysbind(WORD opcode, LONG pglobal, WORD control[], WORD int_in[], WORD int_out[], LONG addr_in[])
{
        LONG    maddr;
        LONG    tree;
        WORD    mouse, ret;
        WORD    unsupported = FALSE;

        maddr = 0;
        ret = TRUE;

        switch(opcode)
        {       
                                /* Application Manager                  */
          case APPL_INIT:
#if DBG_GEMSUPER
                aestrace("appl_init()");
#endif
                LWSET(pglobal, AES_VERSION);    /* version number       */
                LWSET(pglobal+2, 0x0001);       /* num of concurrent procs*/
/*              LLSET(pglobal, 0x00010200L);
*/
                LWSET(pglobal+4, rlr->p_pid);
                sh_deskf(0, pglobal+6);
                LWSET(pglobal+20, gl_nplanes);
                LLSET(pglobal+22, ADDR(&D));
                                                /* reset dispatcher     */
                                                /*  count to let the app*/
                                                /*  run a while.        */
                dspcnt = 0;
                ret = ap_init();
                break;
          case APPL_READ:
          case APPL_WRITE:
                ap_rdwr(opcode == APPL_READ ? MU_MESAG : MU_SDMSG, 
                        fpdnm(NULLPTR, AP_RWID), AP_LENGTH, AP_PBUFF);
                break;
          case APPL_FIND:
                ret = ap_find( AP_PNAME );
                break;
          case APPL_TPLAY:
                ap_tplay(AP_TBUFFER, AP_TLENGTH, AP_TSCALE);
                break;
          case APPL_TRECORD:
                ret = ap_trecd(AP_TBUFFER, AP_TLENGTH);
                break;
#if CONF_WITH_PCGEM
          case APPL_YIELD:
                dsptch();
                break;
#endif
          case APPL_EXIT:
#if DBG_GEMSUPER
                aestrace("appl_exit()");
#endif
                ap_exit();
                break;
                                /* Event Manager                        */
          case EVNT_KEYBD:
                  ret = ev_block(MU_KEYBD, 0x0L);
                break;
          case EVNT_BUTTON:
                ret = ev_button(B_CLICKS, B_MASK, B_STATE, &EV_MX);
                break;
          case EVNT_MOUSE:
                ret = ev_mouse((MOBLK *)&MO_FLAGS, &EV_MX);
                break;
          case EVNT_MESAG:
#if DBG_GEMSUPER
                aestrace("evnt_mesag()");
#endif
                ap_rdwr(MU_MESAG, rlr, 16, ME_PBUFF);
                break;
          case EVNT_TIMER:
                ev_timer( HW(T_HICOUNT) + LW(T_LOCOUNT) );
                break;
          case EVNT_MULTI:
#if DBG_GEMSUPER
                aestrace("evnt_multi()");
#endif
                if (MU_FLAGS & MU_TIMER)
                  maddr = HW(MT_HICOUNT) + LW(MT_LOCOUNT);
                tree = HW(MB_CLICKS) | LW((MB_MASK << 8) | MB_STATE);
                ret = ev_multi(MU_FLAGS, (MOBLK *)&MMO1_FLAGS, (MOBLK *)&MMO2_FLAGS, 
                        maddr, tree, MME_PBUFF, &EV_MX);
                break;
          case EVNT_DCLICK:
                ret = ev_dclick(EV_DCRATE, EV_DCSETIT);
                break;
                                /* Menu Manager                         */
          case MENU_BAR:
                if (gl_mnppd == rlr || gl_mnppd == NULL)
                  mn_bar(MM_ITREE, SHOW_IT, rlr->p_pid);
                else
                  menu_tree[rlr->p_pid] = (SHOW_IT) ? MM_ITREE : 0x0L;
                break;
          case MENU_ICHECK:
                do_chg(MM_ITREE, ITEM_NUM, CHECKED, CHECK_IT, FALSE, FALSE);
                break;
          case MENU_IENABLE:
                do_chg(MM_ITREE, (ITEM_NUM & 0x7fff), DISABLED, 
                        !ENABLE_IT, ((ITEM_NUM & 0x8000) != 0x0), FALSE);
                break;
          case MENU_TNORMAL:
                if (gl_mntree == menu_tree[rlr->p_pid])
                  do_chg(MM_ITREE, TITLE_NUM, SELECTED, !NORMAL_IT, 
                                TRUE, TRUE);
                break;
          case MENU_TEXT:
                tree = MM_ITREE;
                strcpy((char *)LLGET(OB_SPEC(ITEM_NUM)), 
                         (char *)MM_PTEXT);   
                break;
          case MENU_REGISTER:
                ret = mn_register(MM_PID, MM_PSTR);
                break;
          case MENU_UNREGISTER:
#if CONF_WITH_PCGEM
                /* distinguish between menu_unregister() and menu_popup() */
                if (IN_LEN == 1)
                  mn_unregister( MM_MID );
                else
#endif
                  unsupported = TRUE;
                break;
          case MENU_CLICK:
                /* distinguish between menu_click() and menu_attach() */
                /*
                 * although menu_click() is PC-GEM only, it's always
                 * enabled because the desktop uses it.
                 */
                if (IN_LEN == 2) {
                  if (MN_SETIT)
                    gl_mnclick = MN_CLICK;
                  ret = gl_mnclick;
                } else
                  unsupported = TRUE;
                break;
                                /* Object Manager                       */
          case OBJC_ADD:
                ob_add(OB_TREE, OB_PARENT, OB_CHILD);
                break;
          case OBJC_DELETE:
                ob_delete(OB_TREE, OB_DELOB);
                break;
          case OBJC_DRAW:
                gsx_sclip((GRECT *)&OB_XCLIP);
                ob_draw(OB_TREE, OB_DRAWOB, OB_DEPTH);
                break;
          case OBJC_FIND:
                ret = ob_find(OB_TREE, OB_STARTOB, OB_DEPTH, 
                                OB_MX, OB_MY);
                break;
          case OBJC_OFFSET:
                ob_offset(OB_TREE, OB_OBJ, &OB_XOFF, &OB_YOFF);
                break;
          case OBJC_ORDER:
                ob_order(OB_TREE, OB_OBJ, OB_NEWPOS);
                break;
          case OBJC_EDIT:
                gsx_sclip(&gl_rfull);
                OB_ODX = OB_IDX;
                ret = ob_edit(OB_TREE, OB_OBJ, OB_CHAR, &OB_ODX, OB_KIND);
                break;
          case OBJC_CHANGE:
                gsx_sclip((GRECT *)&OB_XCLIP);
                ob_change(OB_TREE, OB_DRAWOB, OB_NEWSTATE, OB_REDRAW);
                break;
                                /* Form Manager                         */
          case FORM_DO:
                ret = fm_do(FM_FORM, FM_START);
                break;
          case FORM_DIAL:
                ret = fm_dial(FM_TYPE, (GRECT *)&FM_X);
                break;
          case FORM_ALERT:
                ret = fm_alert(FM_DEFBUT, FM_ASTRING);
                break;
          case FORM_ERROR:
                ret = fm_error(FM_ERRNUM);
                break;
          case FORM_CENTER:
                ob_center(FM_FORM, (GRECT *)&FM_XC);
                break;
          case FORM_KEYBD:
                gsx_sclip(&gl_rfull);
                FM_OCHAR = FM_ICHAR;
                FM_ONXTOB = FM_INXTOB;
                ret = fm_keybd(FM_FORM, FM_OBJ, &FM_OCHAR, &FM_ONXTOB);
                break;
          case FORM_BUTTON:
                gsx_sclip(&gl_rfull);
                ret = fm_button(FM_FORM, FM_OBJ, FM_CLKS, &FM_ONXTOB);
                break;
                                /* Graphics Manager                     */
          case GRAF_RUBBOX:
                gr_rubbox(GR_I1, GR_I2, GR_I3, GR_I4, 
                          &GR_O1, &GR_O2);
                break;
          case GRAF_DRAGBOX:
                gr_dragbox(GR_I1, GR_I2, GR_I3, GR_I4, (GRECT *)&GR_I5, 
                           &GR_O1, &GR_O2);
                break;
          case GRAF_MBOX:
                gr_movebox(GR_I1, GR_I2, GR_I3, GR_I4, GR_I5, GR_I6);
                break;
          case GRAF_GROWBOX:
                gr_growbox((GRECT *)&GR_I1, (GRECT *)&GR_I5);
                break;
          case GRAF_SHRINKBOX:
                gr_shrinkbox((GRECT *)&GR_I1, (GRECT *)&GR_I5);
                break;
          case GRAF_WATCHBOX:
                ret = gr_watchbox(GR_TREE, GR_OBJ, GR_INSTATE, GR_OUTSTATE);
                break;
          case GRAF_SLIDEBOX:
                ret = gr_slidebox(GR_TREE, GR_PARENT, GR_OBJ, GR_ISVERT);
                break;
          case GRAF_HANDLE:
                GR_WCHAR = gl_wchar;
                GR_HCHAR = gl_hchar;
                GR_WBOX = gl_wbox;
                GR_HBOX = gl_hbox;
                ret = gl_handle;
                break;
          case GRAF_MOUSE:
                if (GR_MNUMBER > 255)
                {
                  if (GR_MNUMBER == M_OFF)
                    gsx_moff();
                  if (GR_MNUMBER == M_ON)
                    gsx_mon();
                }
                else
                {
                  if (GR_MNUMBER != 255)                
                  {
                    switch(GR_MNUMBER) {
                      case 1:
                        mouse = MICE01;
                        break;
                      case 2:
                        mouse = MICE02;
                        break;
                      case 3:
                        mouse = MICE03;
                        break;
                      case 4:
                        mouse = MICE04;
                        break;
                      case 5:
                        mouse = MICE05;
                        break;
                      case 6:
                        mouse = MICE06;
                        break;
                      case 7:
                        mouse = MICE07;
                        break;
                      default:
                        mouse = MICE00;
                        break;
                    }
                    maddr = *(LONG *) &rs_bitblk[mouse];
                  }
                  else
                    maddr = GR_MADDR;
                  gsx_mfset(maddr);
                }
                break;
          case GRAF_MKSTATE:
                gr_mkstate(&GR_MX, &GR_MY, &GR_MSTATE, &GR_KSTATE);
                break;
                                /* Scrap Manager                        */
          case SCRP_READ:
                ret = sc_read((BYTE*)SC_PATH);
                break;
          case SCRP_WRITE:
                ret = sc_write((const BYTE*)SC_PATH);
                break;
#if CONF_WITH_PCGEM
          case SCRP_CLEAR:
                ret = sc_clear();
                break;
#endif
                                /* File Selector Manager                */
          case FSEL_INPUT:
                ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, NULL);
                break;
          case FSEL_EXINPUT:
                ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, (BYTE *)FS_ILABEL);
                break;
                                /* Window Manager                       */
          case WIND_CREATE:
                ret = wm_create(WM_KIND, (GRECT *)&WM_WX);
                break;
          case WIND_OPEN:
                wm_open(WM_HANDLE, (GRECT *)&WM_WX);
                break;
          case WIND_CLOSE:
                wm_close(WM_HANDLE);
                break;
          case WIND_DELETE:
                wm_delete(WM_HANDLE);
                break;
          case WIND_GET:
                wm_get(WM_HANDLE, WM_WFIELD, &WM_OX);
                break;
          case WIND_SET:
                  wm_set(WM_HANDLE, WM_WFIELD, &WM_IX);
                  break;
          case WIND_FIND:
                ret = wm_find(WM_MX, WM_MY);
                break;
          case WIND_UPDATE:
                wm_update(WM_BEGUP);
                break;
          case WIND_CALC:
                wm_calc(WM_WCTYPE, WM_WCKIND, WM_WCIX, WM_WCIY, 
                        WM_WCIW, WM_WCIH, &WM_WCOX, &WM_WCOY, 
                        &WM_WCOW, &WM_WCOH);
                break;
          case WIND_NEW:
                wm_new();
                break;
                                /* Resource Manager                     */
          case RSRC_LOAD:
                ret = rs_load(pglobal, RS_PFNAME);
                break;
          case RSRC_FREE:
                ret = rs_free(pglobal);
                break;
          case RSRC_GADDR:
                ret = rs_gaddr(pglobal, RS_TYPE, RS_INDEX, &ad_rso);
                break;
          case RSRC_SADDR:
                ret = rs_saddr(pglobal, RS_TYPE, RS_INDEX, RS_INADDR);
                break;
          case RSRC_OBFIX:
                rs_obfix(RS_TREE, RS_OBJ);
                break;
                                /* Shell Manager                        */
          case SHEL_READ:
                sh_read((BYTE*)SH_PCMD, (BYTE*)SH_PTAIL);
                break;
          case SHEL_WRITE:
                ret = sh_write(SH_DOEX, SH_ISGR, SH_ISCR, (const BYTE*)SH_PCMD, (const BYTE*)SH_PTAIL);
                break;
          case SHEL_GET:
                sh_get((void*)SH_PBUFFER, SH_LEN);
                break;
          case SHEL_PUT:
                sh_put((const void *)SH_PDATA, SH_LEN);
                break;
          case SHEL_FIND:
                ret = sh_find((BYTE*)SH_PATH);
                break;
          case SHEL_ENVRN:
                sh_envrn((BYTE**)SH_PATH, (const BYTE*)SH_SRCH);
                break;
#if CONF_WITH_PCGEM
          case SHEL_RDEF:
                sh_rdef((BYTE*)SH_LPCMD, (BYTE*)SH_LPDIR);
                break;
          case SHEL_WDEF:
                sh_wdef((const BYTE*)SH_LPCMD, (const BYTE*)SH_LPDIR);
                break;
#endif
          default:
                unsupported = TRUE;
                break;
        }

        if (unsupported) {
            kprintf("Bad AES function %d\n", opcode);
            if (opcode != 0)    /* Ignore the 0 since some PRGs are this call */
                fm_show(ALNOFUNC, &opcode, 1);
            ret = -1;
        }

        return(ret);
}