Esempio n. 1
0
void GIF_GetInfo(gif_info_struct *out)
{
	kal_uint32 reg;

	// Image descriptor
	reg = DRV_Reg32(GIF_IMG_REG_1);
	out->height = (kal_uint16)(reg & 0xFFFF); 
	out->width = (kal_uint16)(reg >> 16);
	
	reg = DRV_Reg32(GIF_IMG_REG_2);
	out->y = (kal_uint16)(reg & 0xFFFF); 
	out->x = (kal_uint16)(reg >> 16);
	
	reg = DRV_Reg32(GIF_IMG_REG_3);
	out->LCT_size = (reg & GIF_IMG_REG3_LCT_SIZE); 
	out->interlace = (reg & GIF_IMG_REG3_LCT_INTERLACE) >> 6;
	out->LCT_flag = (reg & GIF_IMG_REG3_LCT_FLG) >> 7;

	// Logical screen descriptor
	reg = DRV_Reg32(GIF_LSD_REG_1);
	out->lheight = (kal_uint16)(reg & 0xFFFF); 
	out->lwidth = (kal_uint16)(reg >> 16);

	reg = DRV_Reg32(GIF_LSD_REG_2);
	out->bg = (reg & GIF_LSD2_BG) >> 8; 
	out->GCT_size = (reg & GIF_LSD2_GCT_SIZE) >> 16; 	
	out->bpp = (reg & GIF_LSD2_BPP) >> 20; 
	out->GCT_flag= (reg & GIF_LSD2_GCT_FLG) >> 23;
	
}
Esempio n. 2
0
void mtk_wdt_init(void)
{
    unsigned int tmp;
    unsigned int interval_val = DRV_Reg32(MTK_WDT_INTERVAL);
    mtk_wdt_mode_config(FALSE, FALSE, FALSE, FALSE, FALSE);
    printf("UB wdt init\n");

    /* Update interval register value and check reboot flag */
    if( (interval_val & RGU_TRIGGER_RESET_MASK) == IS_POWER_ON_RESET )
        is_rgu_trigger_rst = 0; // Power off and power on reset
    else
        is_rgu_trigger_rst = 1; // RGU trigger reset

    interval_val &= ~(RGU_TRIGGER_RESET_MASK|MAGIC_NUM_MASK);
    interval_val |= (U_BOOT_MAGIC|IS_POWER_ON_RESET);

    /* Write back INTERVAL REG */
    DRV_WriteReg32(MTK_WDT_INTERVAL, interval_val);
    /* Setting timeout 10s */
    mtk_wdt_set_time_out_value(10);

    /*set spm_sysrst & pcm_wdt_rst to be reset mode*/
    tmp = DRV_Reg32(MTK_WDT_REQ_IRQ_EN);
    tmp |= MTK_WDT_REQ_IRQ_EN_KEY;
    tmp &= ~(MTK_WDT_REQ_IRQ_EN_SPM | MTK_WDT_REQ_IRQ_EN_PCM);
    DRV_WriteReg32(MTK_WDT_REQ_IRQ_EN, tmp);

    mtk_wdt_mode_config(TRUE, TRUE, FALSE, FALSE, TRUE);
    mtk_wdt_restart();
}
Esempio n. 3
0
static void __gpt_get_cnt(struct gpt_device *dev, unsigned int *ptr)
{
    *ptr = DRV_Reg32(dev->base_addr + GPT_CNT);
    if (dev->features & GPT_FEAT_64_BIT) {
        *(++ptr) = DRV_Reg32(dev->base_addr + GPT_CNTH);
    } 
}
Esempio n. 4
0
static void mt_fh_hal_popod_save(void)
{
    const unsigned int  pll_id  = FH_MAIN_PLLID;

	FH_MSG_DEBUG("EN: %s",__func__);

	//disable maipll SSC mode
	if(g_fh_pll[pll_id].fh_status == FH_FH_ENABLE_SSC){
    	unsigned int	fh_dds = 0;
    	unsigned int	pll_dds = 0;
    	const unsigned int  reg_cfg = g_reg_cfg[pll_id];

	    //only when SSC is enable, turn off MAINPLL hopping
		fh_set_field(reg_cfg, FH_FRDDSX_EN, 0);  //disable SSC mode
		fh_set_field(reg_cfg, FH_SFSTRX_EN, 0);  //disable dvfs mode
		fh_set_field(reg_cfg, FH_FHCTLX_EN, 0);  //disable hopping control

		pll_dds =  (DRV_Reg32(g_reg_dds[pll_id])) & MASK21b;
		fh_dds	=  (DRV_Reg32(g_reg_mon[pll_id])) & MASK21b;

		FH_MSG("Org pll_dds:%x fh_dds:%x",pll_dds,fh_dds);

        wait_dds_stable(pll_dds, g_reg_mon[pll_id], 100);

		//write back to ncpo
		fh_write32(g_reg_pll_con1[pll_id],
		    (fh_read32(g_reg_dds[pll_id])&MASK21b)|(fh_read32(MAINPLL_CON1)&0xFFE00000)|(BIT32));
		FH_MSG("MAINPLL_CON1: 0x%08x",(fh_read32(g_reg_pll_con1[pll_id])&MASK21b));

		// switch to register control
		fh_switch2fhctl(pll_id,0);
		mb();
	}
}
static ssize_t cpu_ss_mode_write(struct file *file, const char *buffer, unsigned long count, void *data)
{
    int len = 0, mode = 0;
    char desc[32];

    len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
    if (copy_from_user(desc, buffer, len))
    {
        return 0;
    }
    desc[len] = '\0';

    if (sscanf(desc, "%d", &mode) == 1)
    {
        if (mode)
        {
            printk("[%s]: config cpu speed switch mode = ARMPLL\n", __FUNCTION__);
            mt65xx_reg_sync_writel((DRV_Reg32(TOP_CKMUXSEL) | 0x0004), TOP_CKMUXSEL);
        }
        else
        {
            printk("[%s]: config cpu speed switch mode = CLKSQ\n", __FUNCTION__);
            mt65xx_reg_sync_writel((DRV_Reg32(TOP_CKMUXSEL) & 0x0ff3), TOP_CKMUXSEL);
        }

        return count;
    }
    else
    {
        printk("[%s]: bad argument!! should be \"1\" or \"0\"\n", __FUNCTION__);
    }

    return -EINVAL;
}
int mt_cpu_ss_thread_handler(void *unused)
{
    kal_uint32 flag = 0;

    do
    {
        ktime_t ktime = ktime_set(mt_cpu_ss_period_s, mt_cpu_ss_period_ns);

        wait_event_interruptible(mt_cpu_ss_timer_waiter, mt_cpu_ss_timer_flag != 0);
        mt_cpu_ss_timer_flag = 0;

        if (!flag)
        {
            mt65xx_reg_sync_writel((DRV_Reg32(TOP_CKMUXSEL) & 0x0ff3), TOP_CKMUXSEL);
            flag = 1;
        }
        else
        {
            mt65xx_reg_sync_writel((DRV_Reg32(TOP_CKMUXSEL) | 0x0004), TOP_CKMUXSEL);
            flag = 0;
        }

        if (mt_cpu_ss_debug_mode)
            printk("[%s]: TOP_CKMUXSEL = 0x%x\n", __FUNCTION__, DRV_Reg32(TOP_CKMUXSEL));

        hrtimer_start(&mt_cpu_ss_timer, ktime, HRTIMER_MODE_REL);

    } while (!kthread_should_stop());

    return 0;
}
void mt_mempll_ssc(void)
{
#if !defined(__FPGA__) 
    kal_uint32 reg_val;

    // MT6290(M), Not E1, Because MT6290(M)E1 has WMHEC5471
    if ((DRV_Reg32(HW_CODE_VERSION) == 0x00006290) && (DRV_Reg32(HW_VERSION) != 0x0000CA00)) {
        reg_val = DRV_Reg32(REG_MDCLKCTL_EMIDDS_FH_CTL2) & ~(EMIDDS_FH_CTL2_FRDDS_DNLMT_MASK | EMIDDS_FH_CTL2_FRDDS_UPLMT_MASK);
        if (TRUE == is_mt6290m) {
            // -8%. For PCW is equal to 25MHz, down limit is 2 MHz, Up limit is 0 MHz
            //reg_val |= EMIDDS_FH_CTL2_FRDDS_DNLMT(0x9E) | EMIDDS_FH_CTL2_FRDDS_UPLMT(0x0);
            // -4%. For PCW is equal to 25MHz, down limit is 2 MHz, Up limit is 0 MHz
            reg_val |= EMIDDS_FH_CTL2_FRDDS_DNLMT(0x4F) | EMIDDS_FH_CTL2_FRDDS_UPLMT(0x0);
        } else {
            // -8%. For PCW is equal to 27.79167MHz, down limit is 2.2 MHz, Up limit is 0 MHz
            //reg_val |= EMIDDS_FH_CTL2_FRDDS_DNLMT(0xB0) | EMIDDS_FH_CTL2_FRDDS_UPLMT(0x0);
            // -4%. For PCW is equal to 27.79167MHz, down limit is 1.1 MHz, Up limit is 0 MHz
            reg_val |= EMIDDS_FH_CTL2_FRDDS_DNLMT(0x58) | EMIDDS_FH_CTL2_FRDDS_UPLMT(0x0);
        }
        DRV_WriteReg32(REG_MDCLKCTL_EMIDDS_FH_CTL2, reg_val);
        // Time Step is 0.5 us, Frequency Step is ~0.1MHz
        reg_val = DRV_Reg32(REG_MDCLKCTL_EMIDDS_FH_CTL1) & ~(EMIDDS_FH_CTL1_EMIDDS_FRDDS_DTS_MASK | EMIDDS_FH_CTL1_EMIDDS_FRDDS_DYS_MASK);
        reg_val |= EMIDDS_FH_CTL1_EMIDDS_FSM_EN | EMIDDS_FH_CTL1_EMIDDS_FRDDS_EN | \
                    EMIDDS_FH_CTL1_EMIDDS_FRDDS_DTS(0) | EMIDDS_FH_CTL1_EMIDDS_FRDDS_DYS(0);
        DRV_WriteReg32(REG_MDCLKCTL_EMIDDS_FH_CTL1, reg_val);
        // We need to write EMIDDS_CTL to mask sure that previous settings take effect
        reg_val = DRV_Reg32(REG_MDCLKCTL_EMIDDS_CTL) | EMIDDS_SDM_PCW_CHG;
        DRV_WriteReg32_NPW(REG_MDCLKCTL_EMIDDS_CTL, reg_val);

        Data_Mem_Barrier();
    }
#endif // end if !defined(__FPGA__)
}
Esempio n. 8
0
static int mt_fh_hal_dfs_mpll(unsigned int target_dds)
{
	unsigned long 	flags = 0;
	const unsigned int  pll_id  = FH_M_PLLID;
	const unsigned int  reg_cfg = g_reg_cfg[pll_id];

	FH_MSG("%s, current dds(MPLL_CON1): 0x%x, target dds %d",
	    __func__,(fh_read32(g_reg_pll_con1[pll_id])&MASK21b),
	    target_dds);

	spin_lock_irqsave(&g_fh_lock, flags);

	if(g_fh_pll[pll_id].fh_status == FH_FH_ENABLE_SSC){
        unsigned int	pll_dds = 0;
        unsigned int	fh_dds  = 0;

		fh_set_field(reg_cfg, FH_FRDDSX_EN, 0);  //disable SSC mode
		fh_set_field(reg_cfg, FH_SFSTRX_EN, 0);  //disable dvfs mode
		fh_set_field(reg_cfg, FH_FHCTLX_EN, 0);  //disable hopping control

		pll_dds =  (DRV_Reg32(g_reg_dds[pll_id])) & MASK21b;
		fh_dds	=  (DRV_Reg32(g_reg_mon[pll_id])) & MASK21b;

		FH_MSG(">p:f< %x:%x",pll_dds,fh_dds);

        wait_dds_stable(pll_dds, g_reg_mon[pll_id], 100);
	}

	mt_fh_hal_dvfs(pll_id, target_dds);

	if(g_fh_pll[pll_id].fh_status == FH_FH_ENABLE_SSC){
	    const struct freqhopping_ssc* p_setting = &ssc_mpll_setting[2];

		fh_set_field(reg_cfg, FH_FRDDSX_EN, 0);  //disable SSC mode
		fh_set_field(reg_cfg, FH_SFSTRX_EN, 0);  //disable dvfs mode
		fh_set_field(reg_cfg, FH_FHCTLX_EN, 0);  //disable hopping control

		fh_sync_ncpo_to_fhctl_dds(pll_id);

		FH_MSG("Enable mpll SSC mode");
		FH_MSG("DDS: 0x%08x", (fh_read32(g_reg_dds[pll_id])&MASK21b));

		fh_set_field(reg_cfg,MASK_FRDDSX_DYS,p_setting->df);
		fh_set_field(reg_cfg,MASK_FRDDSX_DTS,p_setting->dt);

		fh_write32(g_reg_updnlmt[pll_id],
		    (PERCENT_TO_DDSLMT((fh_read32(g_reg_dds[pll_id])&MASK21b), p_setting->lowbnd) << 16));
		FH_MSG("UPDNLMT: 0x%08x", fh_read32(g_reg_updnlmt[pll_id]));

		fh_switch2fhctl(pll_id, 1);

		fh_set_field(reg_cfg, FH_FRDDSX_EN, 1);  //enable SSC mode
		fh_set_field(reg_cfg, FH_FHCTLX_EN, 1);  //enable hopping control

		FH_MSG("CFG: 0x%08x", fh_read32(reg_cfg));
	}
	spin_unlock_irqrestore(&g_fh_lock, flags);

    return 0;
}
static void spm_wdt_init(void)
{

   unsigned int tmp;
   // set scpsys reset mode , not trigger irq
   tmp = DRV_Reg32(MTK_WDT_REQ_MODE);
   tmp |=  MTK_WDT_REQ_MODE_KEY;
   tmp |= (MTK_WDT_REQ_MODE_SPM_SCPSYS);
   DRV_WriteReg32(MTK_WDT_REQ_MODE,tmp);

   tmp = DRV_Reg32(MTK_WDT_REQ_IRQ_EN);
   tmp |= MTK_WDT_REQ_IRQ_KEY;
   tmp &= ~(MTK_WDT_REQ_IRQ_SPM_SCPSYS_EN);
   DRV_WriteReg32(MTK_WDT_REQ_IRQ_EN,tmp);
   
	   
   printk( "mtk_wdt_init [MTK_WDT] not use RGU WDT use_SPM_WDT!! ********\n" );
	   
   tmp = DRV_Reg32(MTK_WDT_MODE);
   tmp |= MTK_WDT_MODE_KEY;
   //disable wdt
   tmp &= (~(MTK_WDT_MODE_IRQ|MTK_WDT_MODE_ENABLE|MTK_WDT_MODE_DUAL_MODE));
	   
   // Bit 4: WDT_Auto_restart, this is a reserved bit, we use it as bypass powerkey flag.
   //	   Because HW reboot always need reboot to kernel, we set it always.
   tmp |= MTK_WDT_MODE_AUTO_RESTART;
   //BIt2  ext singal
   tmp |= MTK_WDT_MODE_EXTEN;
   DRV_WriteReg32(MTK_WDT_MODE,tmp);
	   
}
Esempio n. 10
0
void drv_idc_init_uart(void)
{
#if defined(MT6290)
	DRV_WriteReg32(BASE_ADDR_MDINFRAMISC + 0x114, DRV_Reg32(BASE_ADDR_MDINFRAMISC + 0x114) | 0x6);
	DRV_WriteReg32(BASE_ADDR_MDPERIMISC + 0x114, DRV_Reg32(BASE_ADDR_MDPERIMISC + 0x114) | 0x4);
#if __FPGA__
#else
	// set GPIO as default output
	DRV_WriteReg32_NPW(BASE_ADDR_TOPMISC + 0x1D4, DRV_Reg32(BASE_ADDR_TOPMISC + 0x1D4) | 0x200);
#endif
#endif

#if defined(MT6595)
	// Enable GPIO 29, 30 pull-up/pull-down
	DRV_WriteReg32(GPIO_base + 0x110, DRV_Reg32(GPIO_base + 0x110) | 0x6000);
	// Select GPIO 29, 30 pull-up
	DRV_WriteReg32(GPIO_base + 0x210, DRV_Reg32(GPIO_base + 0x210) | 0x6000);
#endif

#if !defined(ATEST_DRV_ENABLE)
	dhl_trace(TRACE_INFO, 0, IDC_UART_INIT_MSG);
#else
	kal_sprintf(idc_dbg_str, "drv_idc: IDC UART Init\n\r");
	DT_IDC_PRINTF(idc_dbg_str);
#endif

	// register isr, enable RX data receive interrupt
	IRQMask(MD_IRQID_IDC2ARM);

	// Initialize IDC UART FIFO threshold
	drv_idc_set_fifo_trigger(1);
	DRV_WriteReg32(IDC_UART_FCR, IDC_UART_FCR_RXTRIG | IDC_UART_FCR_FIFOINI);

	DRV_WriteReg32(IDC_UART_IER, IDC_UART_IER_ERBFI);
	IRQ_Register_LISR(MD_IRQID_IDC2ARM, idc_uart_lisr, "IDC_UART");
	DRV_Register_HISR(DRV_IDC_HISR_ID, idc_uart_hisr);
	IRQSensitivity(MD_IRQID_IDC2ARM, KAL_FALSE);
	IRQClearInt(MD_IRQID_IDC2ARM);

	IRQUnmask(MD_IRQID_IDC2ARM);
	idc_port.intr_en = KAL_TRUE;

	idc_port.schedule_state[0] = IDC_PLAN;
	idc_port.schedule_state[1] = IDC_PLAN;
	idc_port.event_cnt[0] = 0;
	idc_port.event_cnt[1] = 0;
	idc_port.sram_w_ptr = 3;	// 2'b11
	idc_port.sram_usage_bit_map[0] = 0;
	idc_port.sram_usage_bit_map[1] = 0;
	idc_port.rx_buf = 0;


	// Initialize baud rate
	drv_idc_set_baudrate(4000000);

	// initial flags/config of IDC driver
	idc_port.main_state = IDC_IN_USE;

	return;
}
Esempio n. 11
0
/*
 * mt6577_irq_mask_all: mask all IRQ lines. (This is ONLY used for the idle current measurement by the factory mode.)
 * @mask: pointer to struct mtk_irq_mask for storing the original mask value.
 * Return 0 for success; return negative values for failure.
 */
int mt6577_irq_mask_all(struct mtk_irq_mask *mask)
{
    unsigned long flags;

    if (mask) {

        mask->mask0 = DRV_Reg32(GIC_ICDISER0);
        mask->mask1 = DRV_Reg32(GIC_ICDISER1);
        mask->mask2 = DRV_Reg32(GIC_ICDISER2);
        mask->mask3 = DRV_Reg32(GIC_ICDISER3);
        mask->mask4 = DRV_Reg32(GIC_ICDISER4);

        DRV_WriteReg32(GIC_ICDICER0, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER1, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER2, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER3, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER4, 0xFFFFFFFF);
        dsb();

        mask->header = IRQ_MASK_HEADER;
        mask->footer = IRQ_MASK_FOOTER;

        return 0;
    } else {
        return -1;
    }
}
Esempio n. 12
0
static int primary_cpu_enter_wfi(void *data)
{
#if 0
    int i = 0;
#endif
    unsigned int irqstat = 0;
    int cpu = *(int*)data;

    dcm_info("[%s]: thread idle-%d start\n", __func__, cpu);

#ifdef CONFIG_LOCAL_WDT
    mpcore_wk_wdt_stop();
#endif

    mt6577_irq_mask_all(&cpu_irq_mask[cpu]);
    mt6577_irq_unmask_for_sleep(MT6577_KP_IRQ_ID);

    dcm_info("[%s]: cpu%d waiting all threads done\n", __func__, cpu);
    complete(&each_thread_done[cpu]);
    wait_for_completion(&all_threads_done);
    local_irq_disable();
    dcm_info("[%s]: cpu%d before wfi\n", __func__, cpu);

#if 0
    do {
        go_to_idle();
        irqstat = DRV_Reg32(GIC_CPU_BASE + GIC_CPU_INTACK) & 0x3FF; 
        dcm_info("[%s]: cpu%d after wfi(irqstat:0x%x/%u)\n", __func__, cpu, irqstat, irqstat);
        if (irqstat == MT6577_KP_IRQ_ID) {
            break;
        }
    } while (1);
#else
    go_to_idle();
    irqstat = DRV_Reg32(GIC_CPU_BASE + GIC_CPU_INTACK) & 0x3FF; 
    dcm_info("[%s]: cpu%d after wfi(irqstat:0x%x/%u)\n", __func__, cpu, irqstat, irqstat);
#endif

    local_irq_enable();

    spin_lock(&factory_lock);
    mt6577_irq_mask_restore(&cpu_irq_mask[cpu]);
    spin_unlock(&factory_lock);

#if 0
    for (i = 1; i < nr_cpu_ids; i++) {
        wake_flag[i] = 1;
        smp_send_reschedule(i);
    }
#endif
    
#if defined(CONFIG_MTK_LEDS)
    mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_FULL);
#endif

    dcm_info("[%s]: thread idle-%d end\n", __func__, cpu);
    return 0;
}
Esempio n. 13
0
void drv_idc_get_schedule_status(kal_uint32 *schedule_status)
{
	schedule_status[0] = DRV_Reg32(IDC_BSI_SCH_STATUS_3100);
	schedule_status[1] = DRV_Reg32(IDC_BSI_SCH_STATUS_6332) & ~0xFC000000; // 58 ~ 63 is reserved for other utility

	dhl_trace(TRACE_INFO, 0, IDC_SCHEDULE_STATUS_MSG, schedule_status[0], schedule_status[1]);

	return;
}
int mtk_wdt_swsysret_config(int bit,int set_value)
{
    unsigned int wdt_sys_val;
	spin_lock(&rgu_reg_operation_spinlock);
	printk("mtk_wdt_swsysret_config(0x%x,0x%x) \n",bit,set_value);
	switch(bit)
	{
	  case MTK_WDT_SWSYS_RST_MD_RST:
	  	   wdt_sys_val = DRV_Reg32(MTK_WDT_SWSYSRST);
		   printk("fwq2 before set wdt_sys_val =%x\n",wdt_sys_val);
    	   wdt_sys_val |= MTK_WDT_SWSYS_RST_KEY;
	  	   if(1==set_value)
	  	   {
	  	     wdt_sys_val |= MTK_WDT_SWSYS_RST_MD_RST;
	  	   }
		   if(0==set_value)
		   {
		     wdt_sys_val &= ~MTK_WDT_SWSYS_RST_MD_RST;
		   }
		   DRV_WriteReg32(MTK_WDT_SWSYSRST,wdt_sys_val);
	  	break;
	 case MTK_WDT_SWSYS_RST_MD_LITE_RST:
	 	   wdt_sys_val = DRV_Reg32(MTK_WDT_SWSYSRST);
		   printk("fwq2 before set wdt_sys_val =%x\n",wdt_sys_val);
    	   wdt_sys_val |= MTK_WDT_SWSYS_RST_KEY;
	  	   if(1==set_value)
	  	   {
	  	     wdt_sys_val |= MTK_WDT_SWSYS_RST_MD_LITE_RST;
	  	   }
		   if(0==set_value)
		   {
		     wdt_sys_val &= ~MTK_WDT_SWSYS_RST_MD_LITE_RST;
		   }
		   DRV_WriteReg32(MTK_WDT_SWSYSRST,wdt_sys_val);
	  	break;
		
	case 0x30000000:
		// io ring read non reset register
		wdt_sys_val = DRV_Reg32(MTK_WDT_NONRST_REG);
		printk("io ring read raw wdt_sys_val=0x%x",wdt_sys_val);
		//wdt_sys_val = wdt_sys_val & 0xFFFF;
		//printk("io ring read wdt_sys_val=0x%x",wdt_sys_val);
		spin_unlock(&rgu_reg_operation_spinlock);
		return wdt_sys_val;
	  	break;
	default:
		printk("do not handle this command \n");
	  	   
	}
	
	spin_unlock(&rgu_reg_operation_spinlock);
	mdelay(10);
	printk("mtk_wdt_swsysret_config done\n");
    return 0;
}
Esempio n. 15
0
unsigned int hacc_do_aes(AES_OPS ops, unsigned char *src, unsigned char *dst, unsigned int size)
{
	unsigned int i;
	unsigned int *ds, *dt, *vt;

	/* make sure size is aligned to aes block size */
	if ((size % AES_BLK_SZ) != 0) {
		SMSG("[%s] size = %d is not %d bytes alignment\n", MOD, size, AES_BLK_SZ);
		return ERR_HACC_DATA_UNALIGNED;
	}

	vt = (unsigned int *)&hacc_ctx.cfg.config[0];

	/* erase src, cfg, out register */
	DRV_SetReg32(HACC_ACON2, HACC_AES_CLR);

	/* set init config */
	for (i = 0; i < AES_CFG_SZ; i += 4)
		DRV_WriteReg32(HACC_ACFG0 + i, *vt++);

	if (ops == AES_ENC)
		DRV_SetReg32(HACC_ACON, HACC_AES_ENC);
	else
		DRV_ClrReg32(HACC_ACON, HACC_AES_ENC);

	ds = (unsigned int *)src;
	dt = (unsigned int *)dst;

	do {
		/* fill in the data */
		for (i = 0; i < AES_BLK_SZ; i += 4)
			DRV_WriteReg32(HACC_ASRC0 + i, *ds++);

		/* start aes engine */
		DRV_SetReg32(HACC_ACON2, HACC_AES_START);

		/* wait for aes engine ready */
		while ((DRV_Reg32(HACC_ACON2) & HACC_AES_RDY) == 0)
			;

		/* read out the data */
		for (i = 0; i < AES_BLK_SZ; i += 4)
			*dt++ = DRV_Reg32(HACC_AOUT0 + i);

		if (size == 0)
			goto _end;

		size -= AES_BLK_SZ;

	} while (size != 0);

_end:

	return SEC_OK;
}
Esempio n. 16
0
static void mt_auxadc_cal_prepare(void)
{
	unsigned int mt_auxadc_bgr=0;
	mt_auxadc_bgr = DRV_Reg32(AUXADC_BGR);
	printk("[adc_cali]:mt_auxadc_cal_prepare  get AUXADC_BGR 0x%04x \n",mt_auxadc_bgr);
	printk("[adc_cali]:mt_auxadc_cal_prepare  get AUXADC_TS_CON0 0x%04x \n",DRV_Reg32(AUXADC_TS_CON0));
	
	if(mt_auxadc_bgr&0xF0000000)
	{
		AUXADC_SET_BITS(((mt_auxadc_bgr&0xF0000000)>>16),AUXADC_TS_CON0);
	}
Esempio n. 17
0
/*******************************************************************************
 * Function definitions
 *******************************************************************************/
void boot_init_bus()
{
    #if defined(MT6290_S00)
    // For E1 Chip, Add Arbitration Issue Patch When NFI + MSDC Coexist
    DRV_WriteReg32(BASE_MADDR_MDCFGCTL + 0x0030, DRV_Reg32(BASE_MADDR_MDCFGCTL + 0x0030) | (0x1 << 20)); // Set MD Own Bit
    DRV_WriteReg32(BASE_MADDR_APMISC + 0x0030, 0x00000000);
    DRV_WriteReg32(BASE_MADDR_MDCFGCTL + 0x0030, DRV_Reg32(BASE_MADDR_MDCFGCTL + 0x0030) & ~(0x1 << 20)); // Un-Set MD Own Bit
    #else
    
    #endif
}
void mrdump_check_ok(void)
{
    if ((DRV_Reg32(MRDUMP_SIG1_ADDR) == 0x5544524d) && 
	(DRV_Reg32(MRDUMP_SIG2_ADDR) == 0x3030504d)) 
      {
	  DRV_WriteReg32(MRDUMP_SIG1_ADDR, 0);
	  DRV_WriteReg32(MRDUMP_SIG2_ADDR, 0);
	  g_ddr_reserve_enable = 1;
	  g_ddr_reserve_success = 1;
	  print("[MRDUMP] DDR reserve mode success.\n");
      }
}
Esempio n. 19
0
static void mtk_wdt_mode_config(	BOOL dual_mode_en,
                                    BOOL irq,
                                    BOOL ext_en,
                                    BOOL ext_pol,
                                    BOOL wdt_en )
{
    unsigned int tmp;

    printf(" mtk_wdt_mode LK config  mode value=%x\n",DRV_Reg32(MTK_WDT_MODE));
    tmp = DRV_Reg32(MTK_WDT_MODE);
    tmp |= MTK_WDT_MODE_KEY;

    // Bit 0 : Whether enable watchdog or not
    if(wdt_en == TRUE)
        tmp |= MTK_WDT_MODE_ENABLE;
    else
        tmp &= ~MTK_WDT_MODE_ENABLE;

    // Bit 1 : Configure extern reset signal polarity.
    if(ext_pol == TRUE)
        tmp |= MTK_WDT_MODE_EXT_POL;
    else
        tmp &= ~MTK_WDT_MODE_EXT_POL;

    // Bit 2 : Whether enable external reset signal
    if(ext_en == TRUE)
        tmp |= MTK_WDT_MODE_EXTEN;
    else
        tmp &= ~MTK_WDT_MODE_EXTEN;

    // Bit 3 : Whether generating interrupt instead of reset signal
    if(irq == TRUE)
        tmp |= MTK_WDT_MODE_IRQ;
    else
        tmp &= ~MTK_WDT_MODE_IRQ;

    // Bit 6 : Whether enable debug module reset
    if(dual_mode_en == TRUE)
        tmp |= MTK_WDT_MODE_DUAL_MODE;
    else
        tmp &= ~MTK_WDT_MODE_DUAL_MODE;

    // Bit 4: WDT_Auto_restart, this is a reserved bit, we use it as bypass powerkey flag.
    //		Because HW reboot always need reboot to kernel, we set it always.
    tmp |= MTK_WDT_MODE_AUTO_RESTART;

    DRV_WriteReg32(MTK_WDT_MODE,tmp);
    //dual_mode(1); //always dual mode
    //mdelay(100);
    printf(" mtk_wdt_mode_config LK  mode value=%x, tmp:%x\n",DRV_Reg32(MTK_WDT_MODE), tmp);

}
Esempio n. 20
0
chip_ver_t platform_chip_ver(void)
{
    #if 0
    unsigned int hw_subcode = DRV_Reg32(APHW_SUBCODE);
    unsigned int sw_ver = DRV_Reg32(APSW_VER);
    #endif

    /* mt6589/mt6583 share the same hw_code/hw_sub_code/hw_version/sw_version currently */

    chip_ver_t ver = CHIP_6583_E1;

    return ver;
}
Esempio n. 21
0
/*
 * mt_irq_mask_all: mask all IRQ lines. (This is ONLY used for the sleep driver)
 * @mask: pointer to struct mtk_irq_mask for storing the original mask value.
 * Return 0 for success; return negative values for failure.
 */
int mt_irq_mask_all(struct mtk_irq_mask *mask)
{
    if (mask) {

        mask->mask0 = DRV_Reg32(GIC_ICDISER0);
        mask->mask1 = DRV_Reg32(GIC_ICDISER1);
        mask->mask2 = DRV_Reg32(GIC_ICDISER2);
        mask->mask3 = DRV_Reg32(GIC_ICDISER3);
        mask->mask4 = DRV_Reg32(GIC_ICDISER4);
        mask->mask5 = DRV_Reg32(GIC_ICDISER5);
        mask->mask6 = DRV_Reg32(GIC_ICDISER6);
        mask->mask7 = DRV_Reg32(GIC_ICDISER7);

        DRV_WriteReg32(GIC_ICDICER0, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER1, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER2, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER3, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER4, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER5, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER6, 0xFFFFFFFF);
        DRV_WriteReg32(GIC_ICDICER7, 0xFFFFFFFF);

        dsb();

        mask->header = IRQ_MASK_HEADER;
        mask->footer = IRQ_MASK_FOOTER;

        return 0;
    } else {
        return -1;
    }
}
int mtk_wdt_enable(enum wk_wdt_en en)
{
	unsigned int tmp =0;
    
	spin_lock(&rgu_reg_operation_spinlock);
	
    #ifdef CONFIG_KICK_SPM_WDT
	if(WK_WDT_EN ==en)
	{
		spm_wdt_enable_timer();
		printk("wdt enable spm timer\n");
		
		tmp = DRV_Reg32(MTK_WDT_REQ_MODE);
	    tmp |=  MTK_WDT_REQ_MODE_KEY;
	    tmp |= (MTK_WDT_REQ_MODE_SPM_SCPSYS);
	    DRV_WriteReg32(MTK_WDT_REQ_MODE,tmp);
		g_wdt_enable = 1;
	}
	if(WK_WDT_DIS==en)
	{
	    spm_wdt_disable_timer();
		printk("wdt disable spm timer\n ");
		tmp = DRV_Reg32(MTK_WDT_REQ_MODE);
	    tmp |=  MTK_WDT_REQ_MODE_KEY;
	    tmp &= ~(MTK_WDT_REQ_MODE_SPM_SCPSYS);
	    DRV_WriteReg32(MTK_WDT_REQ_MODE,tmp);
		g_wdt_enable = 0;
	}
    #else

	tmp = DRV_Reg32(MTK_WDT_MODE);
	
	tmp |= MTK_WDT_MODE_KEY;
	if(WK_WDT_EN == en)
	{
	  tmp |= MTK_WDT_MODE_ENABLE;
	  g_wdt_enable = 1;
	}
	if(WK_WDT_DIS == en)
	{
	  tmp &= ~MTK_WDT_MODE_ENABLE;
	  g_wdt_enable = 0;
	}
    printk("mtk_wdt_enable value=%x,pid=%d\n",tmp,current->pid);
	DRV_WriteReg32(MTK_WDT_MODE,tmp);
    #endif
	spin_unlock(&rgu_reg_operation_spinlock);

	return 0;
}
Esempio n. 23
0
static int fh_dvfs_proc_read(struct seq_file* m, void* v)
{
	int i = 0;

	FH_MSG("EN: %s",__func__);

	seq_printf(m, "DVFS:\r\n");
	seq_printf(m, "CFG: 0x3 is SSC mode;  0x5 is DVFS mode \r\n");
	for(i = 0;i < FH_PLL_NUM; ++i){
		seq_printf(m, "FHCTL%d:   CFG:0x%08x    DVFS:0x%08x\r\n",
		    i, DRV_Reg32(g_reg_cfg[i]), DRV_Reg32(g_reg_dvfs[i]));
	}
  return 0;
}
Esempio n. 24
0
void mtk_wdt_init(void)
{
		unsigned int tmp;
	unsigned int nonrst;
    unsigned int interval_val = DRV_Reg32(MTK_WDT_INTERVAL);
    mtk_wdt_mode_config(FALSE, FALSE, FALSE, FALSE, FALSE);
    WDTLOG("UB wdt init\n");

    /* Update interval register value and check reboot flag */
    if( (interval_val & RGU_TRIGGER_RESET_MASK) == IS_POWER_ON_RESET )
        is_rgu_trigger_rst = 0; // Power off and power on reset
    else
        is_rgu_trigger_rst = 1; // RGU trigger reset

    interval_val &= ~(RGU_TRIGGER_RESET_MASK|MAGIC_NUM_MASK);
    interval_val |= (U_BOOT_MAGIC|IS_POWER_ON_RESET);

    /* Write back INTERVAL REG */
    DRV_WriteReg32(MTK_WDT_INTERVAL, interval_val);
	/* Setting timeout 10s */
	mtk_wdt_set_time_out_value(10);
	#if (!LK_WDT_DISABLE)
	mtk_wdt_mode_config(TRUE, TRUE, TRUE, FALSE, TRUE);
	mtk_wdt_restart();
	#endif
	/*
	* E3 ECO
       * reset will delay 2ms after set SW_WDT in register
	*/
	nonrst = DRV_Reg32(MTK_WDT_NONRST_REG);
	nonrst = (nonrst | (1<<29)); 
	DRV_WriteReg32(MTK_WDT_NONRST_REG, nonrst);
    dprintf(CRITICAL,"WDT NONRST=0x%x \n\r", DRV_Reg32(MTK_WDT_NONRST_REG));
    #if 0
	int i=0;
    //lk wdt test
	while(1)
	{
	  
	  i++;
	  mdelay(1000);
	  WDTLOG("UB wdt test %d\n" ,i);
      /* Dump RGU regisers */
    WDTLOG("==== fwq Dump RGU Reg ========\n");
    WDTLOG("RGU MODE:     %x\n", DRV_Reg32(MTK_WDT_MODE));
    WDTLOG("RGU LENGTH:   %x\n", DRV_Reg32(MTK_WDT_LENGTH));
    WDTLOG("RGU STA:      %x\n", DRV_Reg32(MTK_WDT_STATUS));
    WDTLOG("RGU INTERVAL: %x\n", DRV_Reg32(MTK_WDT_INTERVAL));
    WDTLOG("RGU SWSYSRST: %x\n", DRV_Reg32(MTK_WDT_SWSYSRST));
    WDTLOG("==== Dump RGU Reg End ====\n");

	if(i<60)
	{
	  WDTLOG("kick lk ext\n" );
	  mtk_wdt_restart();
	}
    }
	#endif
}
Esempio n. 25
0
void mt6577_pmic_low_power_init(void)
{
    unsigned int volt = 0, volt_bias = 0;
    
    /********************
    * PMIC VPROC setting
    *********************/

    upmu_buck_vosel_srclken_0(BUCK_VPROC, 0x08); // VPROC 0.9V in sleep mode

    if (get_chip_ver() >= CHIP_6577_E1)
    {
        upmu_buck_vosel_dvs_00(BUCK_VPROC, 0x08); // 0.900V DVS_VOL_00
        upmu_buck_vosel_dvs_01(BUCK_VPROC, 0x0F); // 1.075V DVS_VOL_01
        upmu_buck_vosel_dvs_10(BUCK_VPROC, 0x13); // 1.175V DVS_VOL_10
        if ((DRV_Reg32(HW_RESV) & (0x1 << 23)) && ((DRV_Reg32(HW_RESV) & (0x1 << 20)) == 0))
        {
            upmu_buck_vosel_dvs_11(BUCK_VPROC, 0x19); // P.K. DVS_VOL_11
        }
        else
        {
            if ((DRV_Reg32(HW_RESV) & (0x1 << 21)))
                volt_bias = 2;
            else if ((DRV_Reg32(HW_RESV) & (0x1 << 22)))
                volt_bias = 1;
            else
                volt_bias = 0;

            volt = (DRV_Reg32(HW_RESV) & 0xE000) >> 13;
            if (volt == 0x0)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x17 + volt_bias));
            else if (volt == 0x1)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x16 + volt_bias));
            else if (volt == 0x2)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x15 + volt_bias));
            else if (volt == 0x3)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x14 + volt_bias));
            else if (volt == 0x4)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x13 + volt_bias));
            else if (volt == 0x5)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x18 + volt_bias));
            else if (volt == 0x6)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x19 + volt_bias));
            else if (volt == 0x7)
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x19 + volt_bias));
            else
                upmu_buck_vosel_dvs_11(BUCK_VPROC, (0x13 + volt_bias));
        }
    }
Esempio n. 26
0
void mt6577_irq_set_sens(unsigned int irq, unsigned int sens)
{
    unsigned long flags;
    unsigned int config;

    if (sens == MT65xx_EDGE_SENSITIVE) {
        config = DRV_Reg32(GIC_DIST_BASE + GIC_DIST_CONFIG + (irq / 16) * 4);
        config |= (0x2 << (irq % 16) * 2);
        DRV_WriteReg32(GIC_DIST_BASE + GIC_DIST_CONFIG + (irq / 16) * 4, config);
    }else {
        config = DRV_Reg32(GIC_DIST_BASE + GIC_DIST_CONFIG + (irq / 16) * 4);
        config &= ~(0x2 << (irq % 16) * 2);
        DRV_WriteReg32(GIC_DIST_BASE + GIC_DIST_CONFIG + (irq / 16) * 4, config);
    }
}
Esempio n. 27
0
int gpt_check_irq(unsigned int id)
{
    unsigned int mask = 0x1 << id;
    unsigned int status = DRV_Reg32(GPT_IRQSTA);

    return (status & mask) ? 1 : 0;
}
Esempio n. 28
0
static void mtk_wdt_reset(char mode)
{
    /* Watchdog Rest */
    unsigned int wdt_mode_val;
    DRV_WriteReg32(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY);

    wdt_mode_val = DRV_Reg32(MTK_WDT_MODE);
    /* clear autorestart bit: autoretart: 1, bypass power key, 0: not bypass power key */
    wdt_mode_val &=(~MTK_WDT_MODE_AUTO_RESTART);
    /* make sure WDT mode is hw reboot mode, can not config isr mode  */
    wdt_mode_val &=(~(MTK_WDT_MODE_IRQ|MTK_WDT_MODE_ENABLE | MTK_WDT_MODE_DUAL_MODE));

    wdt_mode_val &= ~MTK_WDT_MODE_DDRRSV_MODE;

    if(mode) { /* mode != 0 means by pass power key reboot, We using auto_restart bit as by pass power key flag */
        wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN|MTK_WDT_MODE_AUTO_RESTART);
        DRV_WriteReg32(MTK_WDT_MODE, wdt_mode_val);

    } else {
        wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN);
        DRV_WriteReg32(MTK_WDT_MODE,wdt_mode_val);

    }

    gpt_busy_wait_us(100);
    DRV_WriteReg32(MTK_WDT_SWRST, MTK_WDT_SWRST_KEY);
}
Esempio n. 29
0
int mt_cpu_ss_thread_handler(void *unused)
{
	kal_uint32 flag = 0;

	do {
		ktime_t ktime = ktime_set(mt_cpu_ss_period_s, mt_cpu_ss_period_ns);

		wait_event_interruptible(mt_cpu_ss_timer_waiter, mt_cpu_ss_timer_flag != 0);
		mt_cpu_ss_timer_flag = 0;

		if (!flag) {
			mt_cpufreq_clock_switch(0, TOP_CKMUXSEL_CLKSQ);
			flag = 1;
		} else {
			mt_cpufreq_clock_switch(0, TOP_CKMUXSEL_ARMPLL);
			flag = 0;
		}

		if (mt_cpu_ss_debug_mode)
			printk("[%s]: TOP_CKMUXSEL = 0x%x\n", __func__, DRV_Reg32(TOP_CKMUXSEL));

		hrtimer_start(&mt_cpu_ss_timer, ktime, HRTIMER_MODE_REL);

	} while (!kthread_should_stop());

	return 0;
}
Esempio n. 30
0
void drv_idc_set_baudrate(kal_uint32 baudrate)
{
	kal_uint8 tmp_lcr = 0;
	kal_uint32 freq_div = 1;
	kal_uint32 sample_count = 0;

	idc_port.DCB.u4Baud = baudrate;

	if(baudrate)
	{
		do {
			sample_count = (BUS_CLOCK + (freq_div * baudrate / 2)) / (freq_div * baudrate);
			if(sample_count > 0xff) freq_div++;
		} while(sample_count > 0xff);
	}

	// configure register
	// based on sample_count * baud_pulse, baud_rate = system clock frequency / (SAMPLE_COUNT + 1) / {DLM, DLL}
	DRV_WriteReg32(IDC_UART_RATE_STEP, ID_UART_RATE_STEP_COUNT);

	tmp_lcr = DRV_Reg32(IDC_UART_LCR);
	DRV_WriteReg32(IDC_UART_LCR, tmp_lcr | IDC_UART_LCR_DLAB);
	// -- DLAB start --

	DRV_WriteReg32(IDC_UART_DLL, freq_div & 0xFF);
	DRV_WriteReg32(IDC_UART_DLM, (freq_div >> 8) & 0xFF);

	DRV_WriteReg32(IDC_UART_STEP_COUNT, sample_count - 1);
	DRV_WriteReg32(IDC_UART_SAMPLE_COUNT, sample_count >> 1);

	DRV_WriteReg32(IDC_UART_LCR, tmp_lcr);
	// -- DLAB end --
}