Esempio n. 1
0
/*****************************************************************************
 Description : platform related, sctrl register initial,
               set SCTRL to reset device when watchdog freeze
  1.Date: 2012/9/13
    Author : x00138766
    Modification : Created function
*****************************************************************************/
static void __init sctrl_reset_mode_init(void)
{
/*Modify_for_c_reset, l00212112,20130511, starts*/
/*改为报中断给mcu*/
#if 1
	void __iomem *base = NULL;
	unsigned int val = 1;
	unsigned int val_org = 1;

	base = (void __iomem *)IO_ADDRESS(REG_BASE_SC_ON);
	writel(val, SOC_AO_SCTRL_SC_INT_EN0_ADDR(base));

    val = readl(SOC_AO_SCTRL_SC_MCU_WKUP_INT_EN1_ADDR(base));
    printk(KERN_INFO"sctrl_reset_mode_init, val1 = 0x%X\n", val);

    writel((val | (1 << 5)), SOC_AO_SCTRL_SC_MCU_WKUP_INT_EN1_ADDR(base));
    val = readl(SOC_AO_SCTRL_SC_MCU_WKUP_INT_EN1_ADDR(base));
    printk(KERN_INFO"sctrl_reset_mode_init, val1 = 0x%X\n", val);

    val_org = readl(SOC_AO_SCTRL_SC_SYS_CTRL1_ADDR(base));
    printk(KERN_INFO"sctrl_reset_mode_init, val_org = 0x%X\n", val_org);
    val_org = (~(1<<WDT_RESET_DEVICE_MASK_BIT)) & val_org;
    val = (~(1<<WDT_RESET_DEVICE_CFG_BIT)) & val_org;
    printk(KERN_INFO"sctrl_reset_mode_init, val_new = 0x%X\n", val);
    writel(val, SOC_AO_SCTRL_SC_SYS_CTRL1_ADDR(base));
#else
	void __iomem *base = NULL;
	unsigned int val = (1<<WDT_RESET_DEVICE_MASK_BIT | 1<<WDT_RESET_DEVICE_CFG_BIT);
	base = (void __iomem *)IO_ADDRESS(REG_BASE_SC_ON);
	writel(val, SOC_AO_SCTRL_SC_SYS_CTRL1_ADDR(base));

#endif
/*Modify_for_c_reset, l00212112,20130511, ends*/
	return;
}
/*****************************************************************************
 函 数 名  : ccorereset_enable_wdt_irq
 功能描述  : 通过写寄存器实现其他核中断到a核
 输入参数  : 无
 输出参数  : 无
 返 回 值  : int
*****************************************************************************/
static int ccorereset_enable_wdt_irq(void)
{
#ifdef _DRV_LLT_
#else
	unsigned long sctrl_on  = (unsigned long)HISI_VA_ADDRESS(SOC_AO_SCTRL_BASE_ADDR);

    unsigned long uvalue = 0;


    /*WatchDog1 HIFI WatchDog超时复位请求*/
    uvalue = readl((void __iomem *)SOC_AO_SCTRL_SC_MCU_WKUP_INT_EN1_ADDR(sctrl_on));
    printk(KERN_INFO "%s: org val = 0x%lx\n", __FUNCTION__, uvalue);

    writel((uvalue | (1 << 6)), (void __iomem *)SOC_AO_SCTRL_SC_MCU_WKUP_INT_EN1_ADDR(sctrl_on));
    uvalue = readl((void __iomem *)SOC_AO_SCTRL_SC_MCU_WKUP_INT_EN1_ADDR(sctrl_on));
    printk(KERN_INFO "%s: new val = 0x%lx\n", __FUNCTION__, uvalue);

#if 0
        unsigned int  sc_int_en0_0awd           : 1;  /* bit[0] : [0]: ACPU Watchdog复位请求中断,送给MCU。 */
        unsigned int  sc_int_en0_1cm3wdg0       : 1;  /* bit[1] : [1]: CM3 Watchdog0复位请求中断,送给ACPU。 */
        unsigned int  sc_int_en0_2hifiwd        : 1;  /* bit[2] : [2]: HIFI Watchdog复位请求中断,送给MCU和ACPU。 */
        unsigned int  sc_int_en0_3bakwd         : 1;  /* bit[3] : [3]: 备份Watchdog复位请求中断,送给MCU和ACPU。 */
        unsigned int  sc_int_en0_4acpu_sft_fiq  : 1;  /* bit[4] : [4]: acpu fiq int,送给acpu,用于调试,由acpu_sft_fiq_req配置产生。 */
#endif
    writel(0x1f, (void __iomem *)SOC_AO_SCTRL_SC_INT_EN_SET_ADDR(sctrl_on));
    uvalue = readl((void __iomem *)SOC_AO_SCTRL_SC_INT_EN_SET_ADDR(sctrl_on));
    printk(KERN_INFO "%s: new uvalue = 0x%lx\n", __FUNCTION__, uvalue);

#endif
    return 0;
}